From 8af38da097b8358cb273baa37c748120461c718e Mon Sep 17 00:00:00 2001 From: pacien Date: Fri, 30 Nov 2018 16:57:32 +0100 Subject: isolate bit IO --- src/bitreader.nim | 57 ------------------------------------------------------- 1 file changed, 57 deletions(-) delete mode 100644 src/bitreader.nim (limited to 'src/bitreader.nim') diff --git a/src/bitreader.nim b/src/bitreader.nim deleted file mode 100644 index baa8bf8..0000000 --- a/src/bitreader.nim +++ /dev/null @@ -1,57 +0,0 @@ -# gzip-like LZSS compressor -# Copyright (C) 2018 Pacien TRAN-GIRARD -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - -import streams -import integers - -type BitReader* = ref object - stream: Stream - bitOffset: int - overflowBuffer: uint8 - -proc bitReader*(stream: Stream): BitReader = - BitReader(stream: stream, bitOffset: 0, overflowBuffer: 0) - -proc atEnd*(bitReader: BitReader): bool = - bitReader.bitOffset == 0 and bitReader.stream.atEnd() - -proc readBits*[T: SomeUnsignedInt](bitReader: BitReader, bits: int, to: typedesc[T]): T = - if bits < 0 or bits > sizeof(T) * wordBitLength: raise newException(RangeError, "invalid bit length") - if bits == 0: return 0 - var bitsRead = 0 - if bitReader.bitOffset > 0: - let bitsFromBuffer = min(bits, wordBitLength - bitReader.bitOffset) - result = (bitReader.overflowBuffer shr bitReader.bitOffset).leastSignificantBits(bitsFromBuffer) - bitReader.bitOffset = (bitReader.bitOffset + bitsFromBuffer) mod wordBitLength - bitsRead += bitsFromBuffer - while bits - bitsRead >= wordBitLength: - result = result or (bitReader.stream.readUint8().T shl bitsRead) - bitsRead += wordBitLength - if bits - bitsRead > 0: - bitReader.overflowBuffer = bitReader.stream.readUint8() - bitReader.bitOffset = bits - bitsRead - result = result or (bitReader.overflowBuffer.leastSignificantBits(bitReader.bitOffset).T shl bitsRead) - -proc readBool*(bitReader: BitReader): bool = - bitReader.readBits(1, uint8) != 0 - -proc readSeq*[T: SomeUnsignedInt](bitReader: BitReader, maxBitLength: int, to: typedesc[T]): tuple[bitLength: int, data: seq[T]] = - result = (0, newSeqOfCap[T](maxBitLength /^ (sizeof(T) * wordBitLength))) - for _, chunkBitLength in chunks(maxBitLength, T): - if bitReader.atEnd(): return - let bitsToRead = if bitReader.stream.atEnd(): sizeof(T) * wordBitLength - bitReader.bitOffset else: chunkBitLength - result.bitLength += bitsToRead - result.data.add(bitReader.readBits(bitsToRead, T)) -- cgit v1.2.3