From ed11fb58e2d8d4cfbf07fd14f60250f339b1d462 Mon Sep 17 00:00:00 2001 From: VIliam Date: Sun, 19 Jan 2025 20:53:25 +0100 Subject: [PATCH] skuska --- sk1/compressor.c | 51 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/sk1/compressor.c b/sk1/compressor.c index c6698e0..fc6ebcd 100644 --- a/sk1/compressor.c +++ b/sk1/compressor.c @@ -194,17 +194,54 @@ 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) { - size_t size; - unsigned char* data = read_file(input_file_name, &size); - if (!data) return -1; + 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; + } + + // Reconstruct Huffman tree (you should deserialize it from the file) + // Placeholder: This assumes you rebuild the same tree during decompression + HuffmanNode* root = /* Deserialize tree here */; + if (!root) { + fclose(input_file); + fclose(output_file); + return -1; + } + + // Decompress data + 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); printf("Decompressing using Huffman coding...\n"); - - int result = write_file(output_file_name, data, size); - free(data); - return result; + return 0; } + int compress_2(const char* input_file_name, const char* output_file_name) { size_t size; unsigned char* data = read_file(input_file_name, &size);