From 05490b39111169c32446e079de90d45d9fafa8dd Mon Sep 17 00:00:00 2001 From: pacien Date: Fri, 23 Nov 2018 12:31:39 +0100 Subject: Implement rawblock --- src/rawblock.nim | 40 +++++++++++++++++++++++++++++++++++++ tests/trawblock.nim | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 src/rawblock.nim create mode 100644 tests/trawblock.nim diff --git a/src/rawblock.nim b/src/rawblock.nim new file mode 100644 index 0000000..bdbfc71 --- /dev/null +++ b/src/rawblock.nim @@ -0,0 +1,40 @@ +# "à-la-gzip" 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 integers, bitstream + +const maxDataBitLength = 100_000_000 * wordBitLength # 100MB +const bitLengthFieldBitLength = 2 * wordBitLength + +type RawBlock* = object + bitLength: int + data: seq[uint8] + +proc readSerialised*(bitStream: BitStream): RawBlock = + let bitLength = bitStream.readBits(bitLengthFieldBitLength, uint16).int + let data = readSeq(bitStream, bitLength, uint8) + RawBlock(bitLength: bitLength, data: data.data) + +proc writeSerialisedTo*(rawBlock: RawBlock, bitStream: BitStream) = + bitStream.writeBits(bitLengthFieldBitLength, rawBlock.bitLength.uint16) + writeSeq(bitStream, rawBlock.bitLength, rawBlock.data) + +proc readRaw*(bitStream: BitStream, bits: int = maxDataBitLength): RawBlock = + let data = readSeq(bitStream, bits, uint8) + RawBlock(bitLength: data.bitLength, data: data.data) + +proc writeRawTo*(rawBlock: RawBlock, bitStream: BitStream) = + writeSeq(bitStream, rawBlock.bitLength, rawBlock.data) diff --git a/tests/trawblock.nim b/tests/trawblock.nim new file mode 100644 index 0000000..1e92c60 --- /dev/null +++ b/tests/trawblock.nim @@ -0,0 +1,57 @@ +# "à-la-gzip" 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 unittest, streams +import bitstream, rawblock + +suite "rawblock": + test "serialise": + let rawStream = newStringStream() + defer: rawStream.close() + rawStream.write(0xFEDC_BA98_7654_3210'u64) + rawStream.setPosition(0) + let rawBitStream = rawStream.bitStream() + let rawBlock = rawblock.readRaw(rawBitStream) + + let outputStream = newStringStream() + defer: outputStream.close() + let outputBitStream = outputStream.bitStream() + rawBlock.writeSerialisedTo(outputBitStream) + outputBitStream.flush() + + outputStream.setPosition(0) + check outputStream.readUint16() == 64 + check outputStream.readUint64() == 0xFEDC_BA98_7654_3210'u64 + check outputStream.atEnd() + + test "deserialise": + let serialisedStream = newStringStream() + defer: serialisedStream.close() + serialisedStream.write(60'u16) + serialisedStream.write(0xFEDC_BA98_7654_3210'u64) + serialisedStream.setPosition(0) + let serialisedBitStream = serialisedStream.bitStream() + let rawBlock = rawBlock.readSerialised(serialisedBitStream) + + let outputStream = newStringStream() + defer: outputStream.close() + let outputBitStream = outputStream.bitStream() + rawBlock.writeRawTo(outputBitStream) + outputBitStream.flush() + + outputStream.setPosition(0) + check outputStream.readUint64 == 0x0EDC_BA98_7654_3210'u64 + check outputStream.atEnd() -- cgit v1.2.3