From 6eb05f5bd007561fac9dcd3328d888d06d2a3712 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 16 Jul 2026 22:02:49 +0200 Subject: Fehlerbehandlung hinzugefügt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/simple.c | 75 ++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 20 deletions(-) (limited to 'src/simple.c') diff --git a/src/simple.c b/src/simple.c index 36f7e48..da79562 100644 --- a/src/simple.c +++ b/src/simple.c @@ -1,6 +1,7 @@ // Standard C #include #include +#include // System #include @@ -12,38 +13,61 @@ static void usage(void) { (void) fprintf(stderr, "compress [-d] infile outfile\n"); +} + +static void +error(const char *msg) +{ + perror(msg); exit(EXIT_FAILURE); } -unsigned long +size_t get_filesize(FILE *file) { - (void) fseek(file, 0, SEEK_END); - unsigned long size = ftell(file); - (void) fseek(file, 0, SEEK_SET); - return size; + long current_pos = ftell(file); + if ( current_pos == -1 ) { + error("ftell() failed"); + } + + if ( fseek(file, 0, SEEK_END) != 0 ) { + error("fseek() failed"); + } + + long size = ftell(file); + if ( size == -1 ) { + error("ftell() failed"); + } + + if ( fseek(file, current_pos, SEEK_SET) != 0 ) { + error("fseek() failed"); + } + + return (size_t) size; } void do_compress(FILE *in_file, FILE *out_file, int compress_level) { - const unsigned long in_size = get_filesize(in_file); + size_t 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); + size_t 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); + 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); + (void) fprintf(stderr, "Error: %s\n", zError(error)); } free(out_data); @@ -53,26 +77,32 @@ do_compress(FILE *in_file, FILE *out_file, int compress_level) void do_uncompress(FILE *in_file, FILE *out_file) { - const unsigned long in_size = get_filesize(in_file); + size_t 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; + size_t out_size = 0; + memcpy(&out_size, in_data, sizeof out_size); + unsigned char *out_data = malloc(out_size); - unsigned long tmp = in_size - sizeof(unsigned long); + const size_t compressed_data_size = in_size - sizeof(size_t); + size_t consumed_size = compressed_data_size; - const int error = uncompress2(out_data, - &out_size, - in_data + sizeof(unsigned long), - &tmp); + const int error = uncompress2(out_data, &out_size, + in_data + sizeof(size_t), + &consumed_size); if ( !error ) { + if ( compressed_data_size != consumed_size ) { + (void) fputs("Warning: Trailing data detected.\n", stderr); + } + (void) fwrite(out_data, 1, out_size, out_file); } else { - printf("Error: %d\n", error); + (void) fprintf(stderr, "Error: %s\n", zError(error)); } free(out_data); @@ -82,8 +112,13 @@ do_uncompress(FILE *in_file, FILE *out_file) int main(int argc, char *argv[]) { + enum { + COMPRESSION_STD = 5, + COMPRESSION_BEST = 9 + }; + int decompress = 0; - int compress_level = 5; + int compress_level = COMPRESSION_STD; int opt = 0; while ( (opt = getopt(argc, argv, "dl")) != -1 ) { @@ -93,13 +128,13 @@ main(int argc, char *argv[]) break; case 'l': - compress_level = 9; + compress_level = COMPRESSION_BEST; break; case '?': default: usage(); - break; + return EXIT_SUCCESS; } } argc -= optind; -- cgit v1.3