sk1
This commit is contained in:
parent
c12adb9efd
commit
a2f98c8620
@ -59,43 +59,33 @@ 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) {
|
||||
size_t size;
|
||||
unsigned char* data;
|
||||
if (read_file(input_file_name, &data, &size) != 0) return -1;
|
||||
FILE* input_file = fopen(input_file_name, "rb");
|
||||
if (!input_file) return -1;
|
||||
|
||||
unsigned char* decompressed = malloc(size * 255);
|
||||
if (!decompressed) {
|
||||
free(data);
|
||||
FILE* output_file = fopen(output_file_name, "wb");
|
||||
if (!output_file) {
|
||||
fclose(input_file);
|
||||
return -1;
|
||||
}
|
||||
|
||||
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');
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
else {
|
||||
// Якщо ми не змогли прочитати байт, закриваємо файли та повертаємо помилку
|
||||
fclose(input_file);
|
||||
fclose(output_file);
|
||||
return -1;
|
||||
}
|
||||
decompressed = new_buffer;
|
||||
}
|
||||
decompressed[write_idx++] = byte;
|
||||
}
|
||||
}
|
||||
|
||||
int result = write_file(output_file_name, decompressed, write_idx);
|
||||
free(data);
|
||||
free(decompressed);
|
||||
|
||||
return result == 0 ? (int)write_idx : -1;
|
||||
fclose(input_file);
|
||||
fclose(output_file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// LZ78
|
||||
|
||||
Loading…
Reference in New Issue
Block a user