@@ -1,10 +1,10 @@
1{-# LANGUAGE GADTs, RankNTypes, MagicHash, CPP #-}
1{-# LANGUAGE GADTs, RankNTypes, MagicHash, CPP #-}
3module BitsGet
3module BitsGet
9 , readWord8
9 , readWord8
10 , readWord16be
10 , readWord16be
@@ -37,91 +37,12 @@ import GHC.Word
37import GHC.Int
37import GHC.Int
42− RWord8 :: Int -> R Word8
43− RWord16be :: Int -> R Word16
44− RWord32be :: Int -> R Word32
45− RByteString :: Int -> R ByteString
47− RNextTo :: R a -> R b -> R (T a b)
48− RMap :: R b -> (b -> R a) -> R a
49− RMapPure :: R a -> (a -> b) -> R b
50− RList :: Int -> R a -> R [a]
51− RCheck :: R a -> (a -> Bool) -> String -> R a
53data T a b = !a :*: !b deriving (Show)
40data T a b = !a :*: !b deriving (Show)
55−instance Functor R where
56− fmap f m = RMapPure m f
58−instance Show (R a) where
62−size_in_bits :: forall a. R a -- ^ The record
63− -> Int -- ^ Number of bits
64−size_in_bits r = case r of
67− RWord16be n -> min n 16
68− RWord32be n -> min n 16
69− RByteString n -> 8 * n
71− RList n r -> n * size_in_bits r
72− RMap r _ -> size_in_bits r
73− RMapPure r _ -> size_in_bits r
74− RCheck r _ _ -> size_in_bits r
75− RNextTo a b -> size_in_bits a + size_in_bits b
77data S = S !ByteString -- ^ Input
42data S = S !ByteString -- ^ Input
78 !Int -- ^ Bit offset (0-7)
43 !Int -- ^ Bit offset (0-7)
79 deriving (Show)
44 deriving (Show)
81−size_in_bytes :: forall a. R a
83−size_in_bytes r = byte_offset (size_in_bits r + 7)
87− bs <- getByteString (size_in_bytes r)
88− a :*: s <- getR (S bs 0) r
91−getR :: S -> R a -> Get (T a S)
94− RBool -> return (readBool s0)
95− RWord8 n -> return (readWord8 s0 n)
96− RWord16be n -> return (readWord16be s0 n)
97− RWord32be n -> return (readWord32be s0 n)
98− RByteString n -> return (readByteString s0 n)
99− RThis x -> return (x :*: s0)
101− t :*: s <- getR s0 a
102− u :*: s' <- getR s b
105− a :*: s@(S bs o) <- getR s0 r
107− required_bytes = byte_offset (size_in_bits r - o)
108− bs' <- getByteString required_bytes
109− getR (S (bs `append` bs') o) codepath
111− a :*: s <- getR s0 r
114− let loop 0 s acc = return (List.reverse acc :*: s)
116− a :*: s' <- getR s r
117− loop (m-1) s' (a:acc)
120− a :*: s <- getR s0 r
122− then return (a :*: s)
125-- make_mask 3 = 00000111
46-- make_mask 3 = 00000111
126make_mask :: Bits a => Int -> a
47make_mask :: Bits a => Int -> a
127make_mask n = (1 `shiftL` fromIntegral n) - 1
48make_mask n = (1 `shiftL` fromIntegral n) - 1
@@ -388,3 +309,86 @@ shiftr_w16 = shiftR
388shiftr_w32 = shiftR
309shiftr_w32 = shiftR
389shiftr_w64 = shiftR
310shiftr_w64 = shiftR
316+ RWord8 :: Int -> R Word8
317+ RWord16be :: Int -> R Word16
318+ RWord32be :: Int -> R Word32
319+ RByteString :: Int -> R ByteString
321+ RNextTo :: R a -> R b -> R (T a b)
322+ RMap :: R b -> (b -> R a) -> R a
323+ RMapPure :: R a -> (a -> b) -> R b
324+ RList :: Int -> R a -> R [a]
325+ RCheck :: R a -> (a -> Bool) -> String -> R a
327+instance Functor R where
328+ fmap f m = RMapPure m f
330+instance Show (R a) where
334+size_in_bits :: forall a. R a -- ^ The record
335+ -> Int -- ^ Number of bits
336+size_in_bits r = case r of
339+ RWord16be n -> min n 16
340+ RWord32be n -> min n 16
341+ RByteString n -> 8 * n
343+ RList n r -> n * size_in_bits r
344+ RMap r _ -> size_in_bits r
345+ RMapPure r _ -> size_in_bits r
346+ RCheck r _ _ -> size_in_bits r
347+ RNextTo a b -> size_in_bits a + size_in_bits b
349+size_in_bytes :: forall a. R a
351+size_in_bytes r = byte_offset (size_in_bits r + 7)
355+ bs <- getByteString (size_in_bytes r)
356+ a :*: s <- getR (S bs 0) r
359+getR :: S -> R a -> Get (T a S)
362+ RBool -> return (readBool s0)
363+ RWord8 n -> return (readWord8 s0 n)
364+ RWord16be n -> return (readWord16be s0 n)
365+ RWord32be n -> return (readWord32be s0 n)
366+ RByteString n -> return (readByteString s0 n)
367+ RThis x -> return (x :*: s0)
369+ t :*: s <- getR s0 a
370+ u :*: s' <- getR s b
373+ a :*: s@(S bs o) <- getR s0 r
375+ required_bytes = byte_offset (size_in_bits r - o)
376+ bs' <- getByteString required_bytes
377+ getR (S (bs `append` bs') o) codepath
379+ a :*: s <- getR s0 r
382+ let loop 0 s acc = return (List.reverse acc :*: s)
384+ a :*: s' <- getR s r
385+ loop (m-1) s' (a:acc)
388+ a :*: s <- getR s0 r
390+ then return (a :*: s)