diff --git a/sk1/compressor.c b/sk1/compressor.c index 22eaa52..f1f9f59 100644 --- a/sk1/compressor.c +++ b/sk1/compressor.c @@ -59,33 +59,43 @@ int compress_1(const char* input_file_name, const char* output_file_name) { return 0; } int decompress_1(const char* input_file_name, const char* output_file_name) { - FILE* input_file = fopen(input_file_name, "rb"); - if (!input_file) return -1; + size_t size; + unsigned char* data; + if (read_file(input_file_name, &data, &size) != 0) return -1; - FILE* output_file = fopen(output_file_name, "wb"); - if (!output_file) { - fclose(input_file); + unsigned char* decompressed = malloc(size * 255); + if (!decompressed) { + free(data); return -1; } - unsigned char index, byte; - while (fread(&index, 1, 1, input_file) == 1) { - if (fread(&byte, 1, 1, input_file) == 1) { - for (int i = 0; i < index; i++) { - fwrite(&byte, 1, 1, output_file); - } + size_t write_idx = 0; + for (size_t i = 0; i < size;) { + unsigned char byte = data[i++]; + size_t count = 0; + while (i < size && isdigit(data[i])) { + count = count * 10 + (data[i++] - '0'); } - else { - // Якщо ми не змогли прочитати байт, закриваємо файли та повертаємо помилку - fclose(input_file); - fclose(output_file); - return -1; + for (size_t j = 0; j < count; j++) { + if (write_idx >= size * 255) { + size_t new_size = write_idx * 2; + unsigned char* new_buffer = realloc(decompressed, new_size); + if (!new_buffer) { + free(decompressed); + free(data); + return -1; + } + decompressed = new_buffer; + } + decompressed[write_idx++] = byte; } } - fclose(input_file); - fclose(output_file); - return 0; + int result = write_file(output_file_name, decompressed, write_idx); + free(data); + free(decompressed); + + return result == 0 ? (int)write_idx : -1; } // LZ78