diff options
Diffstat (limited to 'src/file.c')
| -rw-r--r-- | src/file.c | 137 |
1 files changed, 0 insertions, 137 deletions
diff --git a/src/file.c b/src/file.c deleted file mode 100644 index d2a9b72..0000000 --- a/src/file.c +++ /dev/null @@ -1,137 +0,0 @@ -/* This file is part of Nekopack. - - Copyright (C) 2017 Jakob Tsar-Fox, All Rights Reserved. - - Nekopack is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at - your option) any later version. - - Nekopack is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Nekopack. If not, see <http://www.gnu.org/licenses/>. */ - -#include <inttypes.h> -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> - -#include "extract.h" -#include "file.h" - -#define ADLR_MAGIC 0x726c6461 -#define SEGM_MAGIC 0x6d676573 -#define INFO_MAGIC 0x6f666e69 -#define TIME_MAGIC 0x656d6974 - -void read_info_chunk(memory_stream *data_stream, file_node *parsed); -void read_adlr_chunk(memory_stream *data_stream, file_node *parsed); -void read_time_chunk(memory_stream *data_stream, file_node *parsed); -void read_segm_chunk(memory_stream *data_stream, file_node *parsed, - uint64_t segment_count); - - -/* Creates a node for a File entry, which can be deferred in a linked - list. NULL will be returned if there isn't enough memory to contain - the node structure. */ -file_node *read_file_entry(memory_stream *data_stream, Bytef *section_end) { - uint32_t entry_magic; - uint64_t entry_size; - file_node *parsed = calloc(sizeof(file_node), 1); - if (parsed == NULL) - return NULL; - while (data_stream->data < section_end) { - read_stream(&entry_magic, &data_stream->data, sizeof(uint32_t)); - read_stream(&entry_size, &data_stream->data, sizeof(uint64_t)); - switch (entry_magic) { - case ADLR_MAGIC: - read_adlr_chunk(data_stream, parsed); - break; - case SEGM_MAGIC: - /* The segment count is not included in the table and - has to be calculated. Segments are 28 bytes each. */ - read_segm_chunk(data_stream, parsed, entry_size / 28); - /* There can't really be a check for this - in read_segm_chunk, so it's done here. */ - if (parsed->segments == NULL) { - free(parsed); - return NULL; - } - break; - case INFO_MAGIC: - read_info_chunk(data_stream, parsed); - break; - case TIME_MAGIC: - read_time_chunk(data_stream, parsed); - break; - default: - printf("Unknown magic: %" PRIx32 "\n", entry_magic); - } - } - return parsed; -} - - -/* Reads the contents of an info chunk into a file node. */ -void read_info_chunk(memory_stream *data_stream, file_node *parsed) { - uint32_t encrypted; - uint64_t decompressed_size, compressed_size; - uint16_t file_name_size; - read_stream(&encrypted, &data_stream->data, sizeof(uint32_t)); - read_stream(&decompressed_size, &data_stream->data, sizeof(uint64_t)); - read_stream(&compressed_size, &data_stream->data, sizeof(uint64_t)); - read_stream(&file_name_size, &data_stream->data, sizeof(uint16_t)); - parsed->encrypted = encrypted; - - char *file_name = malloc(file_name_size * 2 + 2); - read_stream(file_name, &data_stream->data, file_name_size * 2 + 2); - free(file_name); -} - - -/* Reads the contents of a segm chunk into a file node. */ -void read_segm_chunk(memory_stream *data_stream, file_node *parsed, - uint64_t segment_count) { - /* Segments are stored in an array of segment pointers. */ - segment **segments = malloc(sizeof(segment *) * segment_count); - if (segments == NULL) - return; - - for (uint64_t i = 0; i < segment_count; i++) { - segments[i] = malloc(sizeof(segment)); - read_stream(&segments[i]->compressed, - &data_stream->data, - sizeof(uint32_t)); - read_stream(&segments[i]->offset, - &data_stream->data, - sizeof(uint64_t)); - read_stream(&segments[i]->decompressed_size, - &data_stream->data, - sizeof(uint64_t)); - read_stream(&segments[i]->compressed_size, - &data_stream->data, - sizeof(uint64_t)); - parsed->file_size += segments[i]->decompressed_size; - } - parsed->segment_count = segment_count; - parsed->segments = segments; -} - - -/* Reads the contents of an adlr chunk into a file_node. */ -void read_adlr_chunk(memory_stream *data_stream, file_node *parsed) { - uint32_t key; - read_stream(&key, &data_stream->data, sizeof(uint32_t)); - parsed->key = key; -} - - -/* Reads the contents of a time chunk into a file_node. */ -void read_time_chunk(memory_stream *data_stream, file_node *parsed) { - uint64_t timestamp; - read_stream(×tamp, &data_stream->data, sizeof(uint64_t)); -} |