aboutsummaryrefslogtreecommitdiffstats
path: root/image-parser.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2013-12-05 01:41:05 -0500
committerJason A. Donenfeld <Jason@zx2c4.com>2013-12-05 01:41:05 -0500
commitdd9ab198c68ffdaf0bd473d730645bf9845149da (patch)
tree8b8ebc450ce3003822a3a5cdf619763d2c822c47 /image-parser.c
parentDon't pack struct. (diff)
downloadopenrg-image-parser-dd9ab198c68ffdaf0bd473d730645bf9845149da.tar.xz
openrg-image-parser-dd9ab198c68ffdaf0bd473d730645bf9845149da.zip
Support offsets.HEADmaster
Diffstat (limited to 'image-parser.c')
-rw-r--r--image-parser.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/image-parser.c b/image-parser.c
index b135101..b7fee12 100644
--- a/image-parser.c
+++ b/image-parser.c
@@ -88,15 +88,18 @@ uint32_t checksum(uint8_t *data, uint32_t length)
bool read_file(uint8_t *data, struct File *file)
{
+ /* The first 5 fields are 32 bit unsigned big endian integers. */
uint32_t *packed_integers = (uint32_t *)data;
file->magic = be32toh(packed_integers[0]);
file->size = be32toh(packed_integers[1]);
file->checksum = be32toh(packed_integers[2]);
file->counter = be32toh(packed_integers[3]);
file->start_offset = be32toh(packed_integers[4]);
+ /* The last field of the header is a string of length 0x80. */
memcpy(&file->name, &packed_integers[5], sizeof(file->name));
file->name[0x7f] = '\0';
- file->data = data + HEADER_SIZE;
+
+ file->data = data + HEADER_SIZE + file->start_offset;
file->decompressed_data = NULL;
file->decompressed_size = 0;
if (!strcmp(file->name, "rg_conf")) {
@@ -115,6 +118,7 @@ void print_file(struct File *file, bool valid)
{
printf("==== %s (%s) ====\n", file->name, valid ? "Valid Checksum" : "INVALID CHECKSUM");
printf("Length: %u bytes\n", file->size);
+ printf("Offset: %u bytes\n", file->start_offset);
if (file->decompressed_size)
printf("Decompressed Length: %u bytes\n", file->decompressed_size);
}