From 1f0c6a7638353d1ebbbc4ba1a8de0887d5f68e98 Mon Sep 17 00:00:00 2001 From: pacien Date: Fri, 30 Nov 2018 21:06:39 +0100 Subject: isolate blocks --- src/blocks/lzssblock.nim | 32 ++++++++++++++++++++++ src/blocks/rawblock.nim | 40 +++++++++++++++++++++++++++ src/blocks/streamblock.nim | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 src/blocks/lzssblock.nim create mode 100644 src/blocks/rawblock.nim create mode 100644 src/blocks/streamblock.nim (limited to 'src/blocks') diff --git a/src/blocks/lzssblock.nim b/src/blocks/lzssblock.nim new file mode 100644 index 0000000..f68f665 --- /dev/null +++ b/src/blocks/lzssblock.nim @@ -0,0 +1,32 @@ +# 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 ../bitio/bitreader, ../bitio/bitwriter + +type LzssBlock* = object + discard + +proc readSerialised*(bitReader: BitReader): LzssBlock = + discard + +proc writeSerialisedTo*(lzssBlock: LzssBlock, bitWriter: BitWriter) = + discard + +proc readRaw*(bitReader: BitReader): LzssBlock = + discard + +proc writeRawTo*(lzssBlock: LzssBlock, bitWriter: BitWriter) = + discard diff --git a/src/blocks/rawblock.nim b/src/blocks/rawblock.nim new file mode 100644 index 0000000..2b32831 --- /dev/null +++ b/src/blocks/rawblock.nim @@ -0,0 +1,40 @@ +# 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 ../bitio/integers, ../bitio/bitreader, ../bitio/bitwriter + +const maxDataBitLength = high(uint16).int +const bitLengthFieldBitLength = 2 * wordBitLength + +type RawBlock* = object + bitLength: int + data: seq[uint8] + +proc readSerialised*(bitReader: BitReader): RawBlock = + let bitLength = bitReader.readBits(bitLengthFieldBitLength, uint16).int + let data = bitReader.readSeq(bitLength, uint8) + RawBlock(bitLength: bitLength, data: data.data) + +proc writeSerialisedTo*(rawBlock: RawBlock, bitWriter: BitWriter) = + bitWriter.writeBits(bitLengthFieldBitLength, rawBlock.bitLength.uint16) + bitWriter.writeSeq(rawBlock.bitLength, rawBlock.data) + +proc readRaw*(bitReader: BitReader, bits: int = maxDataBitLength): RawBlock = + let data = bitReader.readSeq(bits, uint8) + RawBlock(bitLength: data.bitLength, data: data.data) + +proc writeRawTo*(rawBlock: RawBlock, bitWriter: BitWriter) = + bitWriter.writeSeq(rawBlock.bitLength, rawBlock.data) diff --git a/src/blocks/streamblock.nim b/src/blocks/streamblock.nim new file mode 100644 index 0000000..c904af7 --- /dev/null +++ b/src/blocks/streamblock.nim @@ -0,0 +1,68 @@ +# 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 sequtils +import ../bitio/integers, ../bitio/bitreader, ../bitio/bitwriter +import rawblock, lzssblock + +type BlockKind* = enum + uncompressed = 0b00'u8, + lzss = 0b01, + reserved1 = 0b10, + reserved2 = 0b11 + +type StreamBlock* = object + last: bool + case kind: BlockKind + of uncompressed: + rawBlock: RawBlock + of lzss: + lzssBlock: LzssBlock + else: + discard + +proc isLast*(streamBlock: StreamBlock): bool = + streamBlock.last + +proc readSerialised*(bitReader: BitReader): StreamBlock = + result.last = bitReader.readBool() + result.kind = bitReader.readBits(2, uint8).BlockKind + case result.kind: + of uncompressed: result.rawBlock = rawblock.readSerialised(bitReader) + of lzss: result.lzssBlock = lzssblock.readSerialised(bitReader) + else: raise newException(ValueError, "unhandled block type") + +proc writeSerialisedTo*(streamBlock: StreamBlock, bitWriter: BitWriter) = + bitWriter.writeBool(streamBlock.last) + bitWriter.writeBits(2, streamBlock.kind.uint8) + case streamBlock.kind: + of uncompressed: streamBlock.rawBlock.writeSerialisedTo(bitWriter) + of lzss: streamBlock.lzssBlock.writeSerialisedTo(bitWriter) + else: raise newException(ValueError, "unhandled block type") + +proc readRaw*(bitReader: BitReader, kind: BlockKind = uncompressed): StreamBlock = + result.kind = kind + case kind: + of uncompressed: result.rawBlock = rawblock.readRaw(bitReader) + of lzss: result.lzssBlock = lzssblock.readRaw(bitReader) + else: raise newException(ValueError, "unhandled block type") + result.last = bitReader.atEnd() + +proc writeRawTo*(streamBlock: StreamBlock, bitWriter: BitWriter) = + case streamBlock.kind: + of uncompressed: streamBlock.rawBlock.writeRawTo(bitWriter) + of lzss: streamBlock.lzssBlock.writeRawTo(bitWriter) + else: raise newException(ValueError, "unhandled block type") -- cgit v1.2.3