aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpacien2018-11-25 22:34:31 +0100
committerpacien2018-11-25 22:46:42 +0100
commitd353e8312b59818cdae5771549c92c1dc6427c71 (patch)
tree78d997e3a107810eccd946020fc30bfd11dfb665 /src
parent8328b00bbe8660d9265de10daf3c840001260ef4 (diff)
downloadgziplike-d353e8312b59818cdae5771549c92c1dc6427c71.tar.gz
fix bit sequence read at end of stream
Diffstat (limited to 'src')
-rw-r--r--src/bitreader.nim11
-rw-r--r--src/rawblock.nim2
2 files changed, 7 insertions, 6 deletions
diff --git a/src/bitreader.nim b/src/bitreader.nim
index 7afb13d..baa8bf8 100644
--- a/src/bitreader.nim
+++ b/src/bitreader.nim
@@ -48,9 +48,10 @@ proc readBits*[T: SomeUnsignedInt](bitReader: BitReader, bits: int, to: typedesc
48proc readBool*(bitReader: BitReader): bool = 48proc readBool*(bitReader: BitReader): bool =
49 bitReader.readBits(1, uint8) != 0 49 bitReader.readBits(1, uint8) != 0
50 50
51proc readSeq*[T: SomeUnsignedInt](bitReader: BitReader, bitLength: int, to: typedesc[T]): tuple[bitLength: int, data: seq[T]] = 51proc readSeq*[T: SomeUnsignedInt](bitReader: BitReader, maxBitLength: int, to: typedesc[T]): tuple[bitLength: int, data: seq[T]] =
52 result = (0, newSeqOfCap[T](bitLength /^ (sizeof(T) * wordBitLength))) 52 result = (0, newSeqOfCap[T](maxBitLength /^ (sizeof(T) * wordBitLength)))
53 for _, chunkBitLength in chunks(bitLength, T): 53 for _, chunkBitLength in chunks(maxBitLength, T):
54 if bitReader.atEnd(): return 54 if bitReader.atEnd(): return
55 result.bitLength += chunkBitLength 55 let bitsToRead = if bitReader.stream.atEnd(): sizeof(T) * wordBitLength - bitReader.bitOffset else: chunkBitLength
56 result.data.add(bitReader.readBits(chunkBitLength, T)) 56 result.bitLength += bitsToRead
57 result.data.add(bitReader.readBits(bitsToRead, T))
diff --git a/src/rawblock.nim b/src/rawblock.nim
index 0a44550..4a83b1d 100644
--- a/src/rawblock.nim
+++ b/src/rawblock.nim
@@ -16,7 +16,7 @@
16 16
17import integers, bitreader, bitwriter 17import integers, bitreader, bitwriter
18 18
19const maxDataBitLength = high(uint16).int - 1 19const maxDataBitLength = high(uint16).int
20const bitLengthFieldBitLength = 2 * wordBitLength 20const bitLengthFieldBitLength = 2 * wordBitLength
21 21
22type RawBlock* = object 22type RawBlock* = object