mirror of
https://github.com/pfusik/zlib6502.git
synced 2024-06-09 04:29:30 +00:00
Command-line utility to compress to DEFLATE using zlib.
This commit is contained in:
parent
3a52942f94
commit
16403f6976
82
deflater.c
Normal file
82
deflater.c
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user