diff options
| author | jakob <jakob@memeware.net> | 2017-01-13 20:54:39 -0500 |
|---|---|---|
| committer | jakob <jakob@memeware.net> | 2017-01-13 20:54:39 -0500 |
| commit | d6a443127b6f8173aeab214942e0b6f31f7c4224 (patch) | |
| tree | 0a148b4b77019e559342aee9bd12923c98d6d90b /src/main.c | |
| parent | b51100b3330605a6c9bdb3e07e7f9981ff73f6ec (diff) | |
Fixed memory leaking issues and introduced a feature to list the contents of an archive.
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 30 |
1 files changed, 29 insertions, 1 deletions
@@ -22,6 +22,7 @@ #include <string.h> #include "cli.h" +#include "decompress.h" #include "extract.h" #define XP3_MAGIC "XP3\x0d\x0a\x20\x0a\x1a\x8b\x67\x01" @@ -51,7 +52,34 @@ int main(int argc, char *argv[]) { int archive_version = get_archive_version(archive); uint64_t table_offset = get_table_offset(archive, archive_version); - extract(archive, table_offset); + + uint8_t compressed; + uint64_t compressed_size, decompressed_size; + fseek(archive, table_offset, SEEK_SET); + fread(&compressed, sizeof(uint8_t), 1, archive); + fread(&compressed_size, sizeof(uint64_t), 1, archive); + fread(&decompressed_size, sizeof(uint64_t), 1, archive); + + /* Every task that hasn't already been handled needs a decompressed + instance of the archive table. Decompression done in memory + because it's $CURRENT_YEAR. */ + memory_stream data_stream; + memory_stream compressed_data = read_to_stream(archive, compressed_size); + if (compressed) { + data_stream = decompress_stream(compressed_data, decompressed_size); + free(compressed_data.start); + } else { + data_stream = compressed_data; + } + + switch (arguments.mode) { + case EXTRACT: + extract(data_stream, archive); + break; + case LIST: + list(data_stream); + } + free(data_stream.start); fclose(archive); return 0; } |