Hufflepdf/src/Data/ByteString/Char8/Util.hs

50 lines
1.5 KiB
Haskell
Raw Normal View History

2019-05-24 10:48:09 +02:00
module Data.ByteString.Char8.Util (
decodeHex
, fromInt
, hexString
, previous
2019-05-24 10:48:09 +02:00
, subBS
, toInt
, toBytes
, utf16BEToutf8
2019-05-24 10:48:09 +02:00
) where
import Data.ByteString (ByteString, snoc)
import qualified Data.ByteString as BS (empty, foldl, pack, singleton)
import qualified Data.ByteString.Char8 as Char8 (drop, index, take, unpack)
import Data.Text.Encoding (encodeUtf8, decodeUtf16BE)
2019-05-24 10:48:09 +02:00
import Prelude hiding (length)
previous :: Char -> Int -> ByteString -> Int
previous char position byteString
| Char8.index byteString position == char = position
2019-05-24 10:48:09 +02:00
| otherwise = previous char (position - 1) byteString
subBS :: Int -> Int -> ByteString -> ByteString
subBS offset length = Char8.take length . Char8.drop offset
hexString :: (Num a, Read a) => String -> a
hexString s = read $ "0x" ++ s
fromInt :: Int -> ByteString
fromInt n
| n < 0x100 = BS.singleton $ toEnum n
| otherwise = fromInt (n `div` 0x100) `snoc` (toEnum (n `mod` 0x100))
toBytes :: Int -> Int -> ByteString
toBytes 0 _ = BS.empty
toBytes size n = toBytes (size - 1) (n `div` 0x100) `snoc` (toEnum (n `mod` 0x100))
toInt :: ByteString -> Int
toInt = BS.foldl (\n w -> 0x100*n + fromEnum w) 0
decodeHex :: ByteString -> ByteString
decodeHex = BS.pack . fmap hexString . pairDigits . Char8.unpack
where
pairDigits "" = []
pairDigits [c] = [[c]]
pairDigits (firstChar:secondChar:end) = (firstChar:[secondChar]):pairDigits end
utf16BEToutf8 :: ByteString -> ByteString
utf16BEToutf8 = encodeUtf8 . decodeUtf16BE