diff --git a/examples/tgzip/makefile.elf b/examples/tgzip/makefile.elf new file mode 100644 index 0000000..cffe133 --- /dev/null +++ b/examples/tgzip/makefile.elf @@ -0,0 +1,30 @@ +## +## tgzip - gzip compressor example +## +## GCC makefile (Linux, FreeBSD, BeOS and QNX) +## +## Copyright (c) 2003 by Joergen Ibsen / Jibz +## Copyright (c) 2014 by Paul Sokolovsky +## +## http://www.ibsensoftware.com/ +## + +target = tgzip +objects = tgzip.o +libs = ../../lib/libtinf.a + +cflags = -s -Wall -Os -I../../src +ldflags = $(cflags) -Wl,-Map,ld.map + +.PHONY: all clean + +all: $(target) + +$(target): $(objects) $(libs) + gcc $(ldflags) -o $@ $^ $(libs) + +%.o : %.c + gcc $(cflags) -c $< + +clean: + $(RM) $(objects) $(target) diff --git a/examples/tgzip/tgzip.c b/examples/tgzip/tgzip.c new file mode 100644 index 0000000..f79f67b --- /dev/null +++ b/examples/tgzip/tgzip.c @@ -0,0 +1,115 @@ +/* + * tgzip - gzip compressor example + * + * Copyright (c) 2003 by Joergen Ibsen / Jibz + * Copyright (c) 2014 by Paul Sokolovsky + * + * http://www.ibsensoftware.com/ + * + * This software is provided 'as-is', without any express + * or implied warranty. In no event will the authors be + * held liable for any damages arising from the use of + * this software. + * + * Permission is granted to anyone to use this software + * for any purpose, including commercial applications, + * and to alter it and redistribute it freely, subject to + * the following restrictions: + * + * 1. The origin of this software must not be + * misrepresented; you must not claim that you + * wrote the original software. If you use this + * software in a product, an acknowledgment in + * the product documentation would be appreciated + * but is not required. + * + * 2. Altered source versions must be plainly marked + * as such, and must not be misrepresented as + * being the original software. + * + * 3. This notice may not be removed or altered from + * any source distribution. + */ + +#include +#include + +#include "tinf.h" +#include "defl_static.h" +#include "genlz77.h" + +void exit_error(const char *what) +{ + printf("ERROR: %s\n", what); + exit(1); +} + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout; + unsigned int len; + unsigned char *source; + + printf("tgzip - example from the uzlib library\n\n"); + + if (argc < 3) + { + printf( + "Syntax: tgunzip \n\n" + "Both input and output are kept in memory, so do not use this on huge files.\n"); + + return 1; + } + + /* -- open files -- */ + + if ((fin = fopen(argv[1], "rb")) == NULL) exit_error("source file"); + + if ((fout = fopen(argv[2], "wb")) == NULL) exit_error("destination file"); + + /* -- read source -- */ + + fseek(fin, 0, SEEK_END); + + len = ftell(fin); + + fseek(fin, 0, SEEK_SET); + + source = (unsigned char *)malloc(len); + + if (source == NULL) exit_error("memory"); + + if (fread(source, 1, len, fin) != len) exit_error("read"); + + fclose(fin); + + /* -- compress data -- */ + + struct Outbuf out = {0}; + zlib_start_block(&out); + tinf_compress(&out, source, len); + zlib_finish_block(&out); + + printf("compressed to %u raw bytes\n", out.outlen); + + /* -- write output -- */ + + putc(0x1f, fout); + putc(0x8b, fout); + putc(0x08, fout); + putc(0x00, fout); // FLG + int mtime = 0; + fwrite(&mtime, sizeof(mtime), 1, fout); + putc(0x04, fout); // XFL + putc(0x03, fout); // OS + + fwrite(out.outbuf, 1, out.outlen, fout); + + unsigned crc = tinf_crc32(source, len); + fwrite(&crc, sizeof(crc), 1, fout); + fwrite(&len, sizeof(len), 1, fout); + + fclose(fout); + + return 0; +}