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