diff --git a/deflater.c b/deflater.c new file mode 100644 index 0000000..07134b7 --- /dev/null +++ b/deflater.c @@ -0,0 +1,82 @@ +#include +#include +#include + +#define IN_SIZE_MAX 60000 +#define OUT_SIZE_MAX 60000 + +int main(int argc, char* argv[]) +{ + FILE* fp; + char* inbuf; + char* outbuf; + size_t inlen; + size_t outlen; + z_stream stream; + + /* check command line */ + if (argc != 3) { + fprintf(stderr, + "Compresses a file to DEFLATE format.\n" + "24-08-2002, fox@scene.pl\n" + "Usage: deflater input_file deflated_file\n" + ); + return 3; + } + + /* alloc buffers */ + inbuf = malloc(IN_SIZE_MAX); + outbuf = malloc(OUT_SIZE_MAX); + if (inbuf == NULL || outbuf == NULL) { + fprintf(stderr, "deflater: Out of memory!\n"); + return 1; + } + + /* read input file */ + fp = fopen(argv[1], "rb"); + if (fp == NULL) { + perror(argv[1]); + return 1; + } + inlen = fread(inbuf, 1, IN_SIZE_MAX, fp); + fclose(fp); + + /* compress */ + stream.next_in = inbuf; + stream.avail_in = inlen; + stream.next_out = outbuf; + stream.avail_out = OUT_SIZE_MAX; + stream.zalloc = (alloc_func) 0; + stream.zfree = (free_func) 0; + if (deflateInit2(&stream, Z_BEST_COMPRESSION, Z_DEFLATED, + -MAX_WBITS, 9, Z_DEFAULT_STRATEGY) != Z_OK) { + fprintf(stderr, "deflater: deflateInit2 failed\n"); + return 1; + } + if (deflate(&stream, Z_FINISH) != Z_STREAM_END) { + fprintf(stderr, "deflater: deflate failed\n"); + return 1; + } + if (deflateEnd(&stream) != Z_OK) { + fprintf(stderr, "deflater: deflateEnd failed\n"); + return 1; + } + + /* write output */ + fp = fopen(argv[2], "wb"); + if (fp == NULL) { + perror(argv[2]); + return 1; + } + outlen = fwrite(outbuf, 1, stream.total_out, fp); + fclose(fp); + if (outlen != stream.total_out) { + perror(argv[2]); + return 1; + } + + /* display summary */ + printf("Compressed %s (%d bytes) to %s (%d bytes)\n", + argv[1], inlen, argv[2], outlen); + return 0; +}