From 6b809f03ea5cfa1ff0ea9544d6cdff88536eb35a Mon Sep 17 00:00:00 2001 From: VIliam Date: Sun, 19 Jan 2025 20:49:03 +0100 Subject: [PATCH] skuska --- sk1/compressor.c | 68 +++++++++--------------------------------------- 1 file changed, 12 insertions(+), 56 deletions(-) diff --git a/sk1/compressor.c b/sk1/compressor.c index e553728..931065b 100644 --- a/sk1/compressor.c +++ b/sk1/compressor.c @@ -143,7 +143,7 @@ int compress_1(const char* input_file_name, const char* output_file_name) { unsigned char* data = read_file(input_file_name, &size); if (!data) return -1; - + HuffmanNode* root = build_huffman_tree(data, size); if (!root) { free(data); @@ -165,25 +165,18 @@ int compress_1(const char* input_file_name, const char* output_file_name) { } - serialize_tree(root, output_file); - - unsigned char bit_buffer[1] = {0}; - int bit_pos = 0; + + for (size_t i = 0; i < size; i++) { - write_bits(output_file, codes[data[i]], bit_buffer, &bit_pos); - } - - - if (bit_pos % 8 != 0) { - fwrite(bit_buffer, 1, 1, output_file); + fputs(codes[data[i]], output_file); } fclose(output_file); printf("Compressing using Huffman coding...\n"); - + // Clean up for (int i = 0; i < 256; i++) { if (codes[i]) free(codes[i]); } @@ -194,54 +187,17 @@ int compress_1(const char* input_file_name, const char* output_file_name) { } - int decompress_1(const char* input_file_name, const char* output_file_name) { - FILE* input_file = fopen(input_file_name, "rb"); - if (!input_file) { - perror("Error opening input file"); - return -1; - } - - FILE* output_file = fopen(output_file_name, "wb"); - if (!output_file) { - perror("Error opening output file"); - fclose(input_file); - return -1; - } - - - HuffmanNode* root = deserialize_tree(input_file); - if (!root) { - fclose(input_file); - fclose(output_file); - return -1; - } - - - unsigned char bit_buffer[1]; - int bit_pos = 0; - HuffmanNode* current = root; - - while (1) { - int bit = read_bit(input_file, bit_buffer, &bit_pos); - if (bit == -1) break; - - current = (bit == 0) ? current->left : current->right; - - if (!current->left && !current->right) { - fputc(current->symbol, output_file); - current = root; - } - } - - fclose(input_file); - fclose(output_file); - free_huffman_tree(root); + size_t size; + unsigned char* data = read_file(input_file_name, &size); + if (!data) return -1; printf("Decompressing using Huffman coding...\n"); - return 0; -} + int result = write_file(output_file_name, data, size); + free(data); + return result; +} int compress_2(const char* input_file_name, const char* output_file_name) { size_t size;