isLarge = idWord .&. 0x80 ≢ 0
rawID = idWord .&. (complement 0x40) .&. (complement 0x80)
adj = if isOdd then -1 else 0
- size ← if isLarge then
- do sz0 ← getWord8
- sz1 ← getWord8
- sz2 ← getWord8
- return $ ( (fromIntegral sz2 `shiftL` 17) .|.
- (fromIntegral sz1 `shiftL` 9) .|.
- (fromIntegral sz0 `shiftL` 1)
- ) + adj
- else
- fmap ((+ adj) ∘ (`shiftL` 1) ∘ fromIntegral) getWord8
- subb ← getLazyByteString $ fromIntegral (size ∷ Word32)
+ size ← if isLarge then
+ do sz0 ← getWord8
+ sz1 ← getWord8
+ sz2 ← getWord8
+ return $ ( (fromIntegral sz2 `shiftL` 17) .|.
+ (fromIntegral sz1 `shiftL` 9) .|.
+ (fromIntegral sz0 `shiftL` 1)
+ ) + adj
+ else
+ fmap ((+ adj) ∘ (`shiftL` 1) ∘ fromIntegral) getWord8
+ subb ← getLazyByteString $ fromIntegral (size ∷ Word32)
return $ runGet (getSubBlock rawID) subb
where
getSubBlock ∷ Word8 → Get SubBlock