From ee7833a8f12658f9a1e804aaf4b10107de5d37f7 Mon Sep 17 00:00:00 2001 From: VIliam Date: Sun, 19 Jan 2025 21:51:45 +0100 Subject: [PATCH] skuska --- sk1/compressor.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/sk1/compressor.c b/sk1/compressor.c index 9a9b9d3..66851a2 100644 --- a/sk1/compressor.c +++ b/sk1/compressor.c @@ -123,7 +123,7 @@ void write_bits(FILE* file, const char* bits, unsigned char* buffer, int* bit_po (*bit_pos)++; if (*bit_pos % 8 == 0) { fwrite(buffer, 1, 1, file); - buffer[*bit_pos / 8 - 1] = 0; // Clear the written byte + buffer[*bit_pos / 8 - 1] = 0; } } } @@ -142,14 +142,14 @@ HuffmanNode* deserialize_tree(FILE* file) { if (marker == EOF) return NULL; if (marker == '1') { - // Leaf node: Read the symbol + HuffmanNode* node = (HuffmanNode*)malloc(sizeof(HuffmanNode)); node->symbol = fgetc(file); node->left = node->right = NULL; return node; } - // Internal node: Create a new node and deserialize children + HuffmanNode* node = (HuffmanNode*)malloc(sizeof(HuffmanNode)); node->left = deserialize_tree(file); node->right = deserialize_tree(file); @@ -162,19 +162,17 @@ 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; - // Build Huffman tree HuffmanNode* root = build_huffman_tree(data, size); if (!root) { free(data); return -1; } - // Generate Huffman codes char* codes[256] = {0}; char buffer[256]; generate_huffman_codes(root, codes, buffer, 0); - // Open output file + FILE* output_file = fopen(output_file_name, "wb"); if (!output_file) { perror("Error opening output file"); @@ -183,7 +181,7 @@ int compress_1(const char* input_file_name, const char* output_file_name) { return -1; } - // Compress data + unsigned char bit_buffer[1] = {0}; int bit_pos = 0; @@ -191,7 +189,6 @@ int compress_1(const char* input_file_name, const char* output_file_name) { write_bits(output_file, codes[data[i]], bit_buffer, &bit_pos); } - // Flush remaining bits if (bit_pos % 8 != 0) { fwrite(bit_buffer, 1, 1, output_file); } @@ -200,7 +197,7 @@ int compress_1(const char* input_file_name, const char* output_file_name) { printf("Compressing using Huffman coding...\n"); - // Clean up + for (int i = 0; i < 256; i++) { if (codes[i]) free(codes[i]); } @@ -273,15 +270,14 @@ int compress_2(const char* input_file_name, const char* output_file_name) { return -1; } - size_t search_buffer_size = 1024; // Veľkosť search bufferu - size_t lookahead_buffer_size = 16; // Veľkosť lookahead bufferu + size_t search_buffer_size = 1024; + size_t lookahead_buffer_size = 16; size_t pos = 0; while (pos < size) { size_t best_match_offset = 0; size_t best_match_length = 0; - // Vyhľadaj najlepšiu zhodu v search bufferi for (size_t i = (pos > search_buffer_size ? pos - search_buffer_size : 0); i < pos; i++) { size_t match_length = 0; while (match_length < lookahead_buffer_size && @@ -295,7 +291,6 @@ int compress_2(const char* input_file_name, const char* output_file_name) { } } - // Ulož trojicu (offset, length, next_symbol) unsigned char offset_high = (best_match_offset >> 8) & 0xFF; unsigned char offset_low = best_match_offset & 0xFF; unsigned char length = best_match_length; @@ -306,7 +301,6 @@ int compress_2(const char* input_file_name, const char* output_file_name) { fputc(length, output_file); fputc(next_symbol, output_file); - // Posuň pozíciu v dátach pos += best_match_length + 1; } @@ -351,13 +345,13 @@ int decompress_2(const char* input_file_name, const char* output_file_name) { size_t offset = (offset_high << 8) | offset_low; - // Skopíruj zhodu z histórie + for (size_t i = 0; i < length; i++) { output_buffer[pos] = output_buffer[pos - offset]; pos++; } - // Pridaj ďalší symbol + output_buffer[pos++] = next_symbol; }