This commit is contained in:
Džubara 2025-01-19 20:49:03 +01:00
parent 3019edfe78
commit 6b809f03ea

View File

@ -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++) { for (size_t i = 0; i < size; i++) {
write_bits(output_file, codes[data[i]], bit_buffer, &bit_pos); fputs(codes[data[i]], output_file);
}
if (bit_pos % 8 != 0) {
fwrite(bit_buffer, 1, 1, output_file);
} }
fclose(output_file); fclose(output_file);
printf("Compressing using Huffman coding...\n"); printf("Compressing using Huffman coding...\n");
// Clean up
for (int i = 0; i < 256; i++) { for (int i = 0; i < 256; i++) {
if (codes[i]) free(codes[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) { int decompress_1(const char* input_file_name, const char* output_file_name) {
FILE* input_file = fopen(input_file_name, "rb"); size_t size;
if (!input_file) { unsigned char* data = read_file(input_file_name, &size);
perror("Error opening input file"); if (!data) return -1;
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);
printf("Decompressing using Huffman coding...\n"); 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) { int compress_2(const char* input_file_name, const char* output_file_name) {
size_t size; size_t size;