From 0c375acd686f2e7f3116e243bf9c89a836d5be99 Mon Sep 17 00:00:00 2001 From: pacien Date: Fri, 30 Nov 2018 21:16:04 +0100 Subject: rename main file --- src/gziplike.nim | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/gziplike.nim (limited to 'src/gziplike.nim') diff --git a/src/gziplike.nim b/src/gziplike.nim new file mode 100644 index 0000000..cf76f5e --- /dev/null +++ b/src/gziplike.nim @@ -0,0 +1,56 @@ +# 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 os, streams, sugar +import bitio/bitreader, bitio/bitwriter, blocks/streamblock + +proc transform*(operation: (BitReader, BitWriter) -> void, input, output: string) = + let inputStream = openFileStream(input, fmRead) + defer: inputStream.close() + let outputStream = openFileStream(output, fmWrite) + defer: outputStream.close() + operation(inputStream.bitReader(), outputStream.bitWriter()) + +proc compress*(bitReader: BitReader, bitWriter: BitWriter) = + while not bitReader.atEnd(): + let streamBlock = streamblock.readRaw(bitReader) + streamBlock.writeSerialisedTo(bitWriter) + bitWriter.flush() + +proc decompress*(bitReader: BitReader, bitWriter: BitWriter) = + var hasMore = true + while hasMore: + let streamBlock = streamblock.readSerialised(bitReader) + streamBlock.writeRawTo(bitWriter) + hasMore = not streamBlock.isLast() + bitWriter.flush() + +proc printUsage(output: File) = + output.writeLine("Usage: " & paramStr(0) & " ") + +when isMainModule: + if paramCount() != 3: + stderr.writeLine("Error: invalid argument count.") + printUsage(stderr) + quit(1) + + case paramStr(1): + of "compress": compress.transform(paramStr(2), paramStr(3)) + of "decompress": decompress.transform(paramStr(2), paramStr(3)) + else: + stderr.writeLine("Error: invalid operation.") + printUsage(stderr) + quit(1) -- cgit v1.2.3