on master help sign in
Fix bug in getWord16be, found by QuickCheck
fc5cdf0Lennart Kolmodin
BitsGet.hs+7−4
@@ -148,16 +148,19 @@ readWithoutOffset s@(S bs o) shifterL shifterR n
148readWithOffset s@(S bs o) shifterL shifterR n
148readWithOffset s@(S bs o) shifterL shifterR n
149 | n <= 64 = let bits_in_msb = 8 - o
149 | n <= 64 = let bits_in_msb = 8 - o
150 (n',top) = (n - bits_in_msb
150 (n',top) = (n - bits_in_msb
151− , (fromIntegral (unsafeHead bs) .&. make_mask bits_in_msb) `shifterL` (n - bits_in_msb))
151+ , (fromIntegral (unsafeHead bs) .&. make_mask bits_in_msb) `shifterL` n')
152
152
153− segs = byte_offset n
153+ segs = byte_offset n'
154
154
155+ bn 0 = 0
155 bn 1 = fromIntegral (unsafeIndex bs 1)
156 bn 1 = fromIntegral (unsafeIndex bs 1)
156 bn n = (bn (n-1) `shifterL` 8) .|. fromIntegral (unsafeIndex bs n)
157 bn n = (bn (n-1) `shifterL` 8) .|. fromIntegral (unsafeIndex bs n)
157
158
158− mseg = bn segs
159+ o' = bit_offset n'
159
160
161+ mseg = bn segs `shifterL` o'
162+
160− last | bit_offset n' > 0 = (fromIntegral (unsafeIndex bs (segs + 1))) `shifterR` (8 - (bit_offset n'))
163+ last | o' > 0 = (fromIntegral (unsafeIndex bs (segs + 1))) `shifterR` (8 - o')
161 | otherwise = 0
164 | otherwise = 0
162
165
163 w = top .|. mseg .|. last
166 w = top .|. mseg .|. last