@@ -1,13 +1,7 @@
1{-# LANGUAGE GADTs, RankNTypes, MagicHash, CPP #-}
1{-# LANGUAGE GADTs, RankNTypes, MagicHash, CPP #-}
3module BitsGet
3module BitsGet
11 , runBitGet
5 , runBitGet
12 , runBitGetSimple
6 , runBitGetSimple
@@ -16,6 +10,10 @@ module BitsGet
16 , getWord16be
10 , getWord16be
17 , getWord32be
11 , getWord32be
21import Data.Binary.Get ( runGet, Get, needMore, getByteString, getS, putS )
19import Data.Binary.Get ( runGet, Get, needMore, getByteString, getS, putS )
@@ -136,13 +134,16 @@ readWithoutOffset s@(S bs o) shifterL shifterR n
136 in (bn (segs-1) :*: incS s n)
134 in (bn (segs-1) :*: incS s n)
138 | n <= 64 = let segs = byte_offset n
136 | n <= 64 = let segs = byte_offset n
137+ o' = bit_offset (n - 8 + o)
140 bn 0 = fromIntegral (unsafeHead bs)
139 bn 0 = fromIntegral (unsafeHead bs)
141 bn n = (bn (n-1) `shifterL` 8) .|. fromIntegral (unsafeIndex bs n)
140 bn n = (bn (n-1) `shifterL` 8) .|. fromIntegral (unsafeIndex bs n)
142+ msegs = bn segs `shifterL` o'
143 last = (fromIntegral (unsafeIndex bs (segs + 1))) `shifterR` (8 - (bit_offset n))
144 last = (fromIntegral (unsafeIndex bs (segs + 1))) `shifterR` (8 - (bit_offset n))
145− w = bn segs .|. last
146+ w = msegs .|. last
146 in w :*: incS s n
147 in w :*: incS s n
148readWithOffset s@(S bs o) shifterL shifterR n
149readWithOffset s@(S bs o) shifterL shifterR n