From f010c2032f4054f2eae544166814d95c8c5ff3d9 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sun, 12 Jul 2026 22:55:49 +0200 Subject: compress und uncompress Funktionen --- src/simple.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 22 deletions(-) (limited to 'src/simple.c') diff --git a/src/simple.c b/src/simple.c index 5209841..36f7e48 100644 --- a/src/simple.c +++ b/src/simple.c @@ -15,21 +15,85 @@ usage(void) exit(EXIT_FAILURE); } +unsigned long +get_filesize(FILE *file) +{ + (void) fseek(file, 0, SEEK_END); + unsigned long size = ftell(file); + (void) fseek(file, 0, SEEK_SET); + return size; +} + +void +do_compress(FILE *in_file, FILE *out_file, int compress_level) +{ + const unsigned long in_size = get_filesize(in_file); + + (void) fwrite(&in_size, sizeof in_size, 1, out_file); + + unsigned char *in_data = malloc(in_size); + (void) fread(in_data, 1, in_size, in_file); + + unsigned long out_size = compressBound(in_size); + unsigned char *out_data = malloc(out_size); + + const int error = compress2(out_data, &out_size, in_data, in_size, compress_level); + + if ( !error ) { + (void) fwrite(out_data, 1, out_size, out_file); + } + else { + printf("Error: %d\n", error); + } + + free(out_data); + free(in_data); +} + +void +do_uncompress(FILE *in_file, FILE *out_file) +{ + const unsigned long in_size = get_filesize(in_file); + + unsigned char *in_data = malloc(in_size); + (void) fread(in_data, 1, in_size, in_file); + + unsigned long out_size = *(unsigned long *) in_data; + unsigned char *out_data = malloc(out_size); + + unsigned long tmp = in_size - sizeof(unsigned long); + + const int error = uncompress2(out_data, + &out_size, + in_data + sizeof(unsigned long), + &tmp); + + if ( !error ) { + (void) fwrite(out_data, 1, out_size, out_file); + } + else { + printf("Error: %d\n", error); + } + + free(out_data); + free(in_data); +} + int main(int argc, char *argv[]) { - // int compress = 1; - int level = 5; + int decompress = 0; + int compress_level = 5; int opt = 0; while ( (opt = getopt(argc, argv, "dl")) != -1 ) { switch ( opt ) { case 'd': - // compress = 0; // decompress + decompress = 1; break; case 'l': - level = 9; + compress_level = 9; break; case '?': @@ -48,28 +112,13 @@ main(int argc, char *argv[]) FILE *in_file = fopen(argv[0], "rb"); FILE *out_file = fopen(argv[1], "wb"); - (void) fseek(in_file, 0, SEEK_END); - unsigned long insize = ftell(in_file); // max 2GB... - (void) fseek(in_file, 0, SEEK_SET); - - unsigned char *indata = malloc(insize); - (void) fread(indata, 1, insize, in_file); - - unsigned long outsize = compressBound(insize); - unsigned char *outdata = malloc(outsize); - - int res = compress2(outdata, &outsize, indata, insize, level); - - if ( res == Z_OK ) { - (void) fwrite(outdata, 1, outsize, out_file); + if ( !decompress ) { + do_compress(in_file, out_file, compress_level); } else { - printf("Error: %d\n", res); + do_uncompress(in_file, out_file); } - free(outdata); - free(indata); - (void) fclose(out_file); (void) fclose(in_file); -- cgit v1.3