Thread: [Extractor-gtk-cvslog] SF.net SVN: extractor-gtk: [20] trunk/extractor
Extract files from unusual archive formats
Brought to you by:
someone-guy
From: <som...@us...> - 2007-08-01 02:03:04
|
Revision: 20 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=20&view=rev Author: someone-guy Date: 2007-07-31 19:03:02 -0700 (Tue, 31 Jul 2007) Log Message: ----------- get rid of some useless casts Modified Paths: -------------- trunk/extractor/bloodrayne.c trunk/extractor/extractor.c trunk/extractor/generic.c trunk/extractor/helpers.c trunk/extractor/homeworld2.c Modified: trunk/extractor/bloodrayne.c =================================================================== --- trunk/extractor/bloodrayne.c 2006-09-20 19:10:48 UTC (rev 19) +++ trunk/extractor/bloodrayne.c 2007-08-01 02:03:02 UTC (rev 20) @@ -30,7 +30,7 @@ fseek(in, 0x108, SEEK_SET); tblpos = read_le32(in); namepos = tblpos + 20 * count; - list = (file_t *)calloc(count + 1, sizeof(file_t)); + list = calloc(count + 1, sizeof(file_t)); for (i = 0; i < count; i++) { int nameoff; fseek(in, tblpos + 20 * i, SEEK_SET); Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2006-09-20 19:10:48 UTC (rev 19) +++ trunk/extractor/extractor.c 2007-08-01 02:03:02 UTC (rev 20) @@ -69,7 +69,7 @@ file_t *file; FILE *out; gtk_tree_model_get(model, iter, PTR_COL, &file, -1); - fname = (char *)malloc(strlen(data) + strlen(file->name) + 2); + fname = malloc(strlen(data) + strlen(file->name) + 2); strcpy(fname, data); strcat(fname, "/"); strcat(fname, file->name); Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2006-09-20 19:10:48 UTC (rev 19) +++ trunk/extractor/generic.c 2007-08-01 02:03:02 UTC (rev 20) @@ -20,7 +20,7 @@ static file_t *get_list(FILE *in) { register uint32_t t = 0; int cnt = 0; - file_t *list = (file_t *)calloc(1, sizeof(file_t)); + file_t *list = calloc(1, sizeof(file_t)); rewind(in); while (!feof(in)) { t = t << 8 | fgetc(in); @@ -30,7 +30,7 @@ memset(&list[cnt + 1], 0, sizeof(file_t)); list[cnt].start = ftell(in) - 4; list[cnt].len = read_le32(in); - list[cnt].name = (char *)malloc(50); + list[cnt].name = malloc(50); snprintf(list[cnt].name, 50, "%i.riff", cnt); cnt++; break; @@ -41,7 +41,7 @@ memset(&list[cnt + 1], 0, sizeof(file_t)); list[cnt].start = ftell(in) - 2; list[cnt].len = read_le32(in); - list[cnt].name = (char *)malloc(50); + list[cnt].name = malloc(50); snprintf(list[cnt].name, 50, "%i.bmp", cnt); cnt++; break; Modified: trunk/extractor/helpers.c =================================================================== --- trunk/extractor/helpers.c 2006-09-20 19:10:48 UTC (rev 19) +++ trunk/extractor/helpers.c 2007-08-01 02:03:02 UTC (rev 20) @@ -18,7 +18,7 @@ * \return pointer to string, must be freed by caller */ char *read_cstring(FILE *f) { - char *name = (char *)malloc(DEF_CSTR_SIZE); + char *name = malloc(DEF_CSTR_SIZE); int size = DEF_CSTR_SIZE, used = 0; while ((name[used++] = fgetc(f))) { if (used == size) { Modified: trunk/extractor/homeworld2.c =================================================================== --- trunk/extractor/homeworld2.c 2006-09-20 19:10:48 UTC (rev 19) +++ trunk/extractor/homeworld2.c 2007-08-01 02:03:02 UTC (rev 20) @@ -38,8 +38,8 @@ tblpos = read_le32(in) + 0xb4; count = read_le16(in); namepos = read_le32(in) + 0xb4; - pathmap = (char **)calloc(count, sizeof(char *)); - paths = (char **)calloc(pathcount, sizeof(char *)); + pathmap = calloc(count, sizeof(char *)); + paths = calloc(pathcount, sizeof(char *)); for (i = 0; i < pathcount; i++) { int j; uint32_t path_string_pos; @@ -70,7 +70,7 @@ if (!pathmap[i]) list[i].name = name; else { - list[i].name = (char *)malloc(strlen(pathmap[i]) + strlen(name) + 2); + list[i].name = malloc(strlen(pathmap[i]) + strlen(name) + 2); strcpy(list[i].name, pathmap[i]); strcat(list[i].name, "\\"); strcat(list[i].name, name); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2007-08-01 02:08:46
|
Revision: 21 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=21&view=rev Author: someone-guy Date: 2007-07-31 19:08:45 -0700 (Tue, 31 Jul 2007) Log Message: ----------- More missed casts Modified Paths: -------------- trunk/extractor/generic.c trunk/extractor/homeworld2.c trunk/extractor/nwn.c Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2007-08-01 02:03:02 UTC (rev 20) +++ trunk/extractor/generic.c 2007-08-01 02:08:45 UTC (rev 21) @@ -26,7 +26,7 @@ t = t << 8 | fgetc(in); switch (t) { case TAG('R', 'I', 'F', 'F'): - list = (file_t *)realloc(list, (cnt + 2) * sizeof(file_t)); + list = realloc(list, (cnt + 2) * sizeof(file_t)); memset(&list[cnt + 1], 0, sizeof(file_t)); list[cnt].start = ftell(in) - 4; list[cnt].len = read_le32(in); @@ -37,7 +37,7 @@ } switch (t & 0xffff) { case TAG(' ', ' ', 'B', 'M') & 0xffff: - list = (file_t *)realloc(list, (cnt + 2) * sizeof(file_t)); + list = realloc(list, (cnt + 2) * sizeof(file_t)); memset(&list[cnt + 1], 0, sizeof(file_t)); list[cnt].start = ftell(in) - 2; list[cnt].len = read_le32(in); Modified: trunk/extractor/homeworld2.c =================================================================== --- trunk/extractor/homeworld2.c 2007-08-01 02:03:02 UTC (rev 20) +++ trunk/extractor/homeworld2.c 2007-08-01 02:08:45 UTC (rev 21) @@ -55,7 +55,7 @@ for (j = start_index; j < end_index; j++) pathmap[j] = paths[i]; } - list = (file_t *)calloc(count + 1, sizeof(file_t)); + list = calloc(count + 1, sizeof(file_t)); for (i = 0; i < count; i++) { char *name; uint32_t name_string_pos; Modified: trunk/extractor/nwn.c =================================================================== --- trunk/extractor/nwn.c 2007-08-01 02:03:02 UTC (rev 20) +++ trunk/extractor/nwn.c 2007-08-01 02:08:45 UTC (rev 21) @@ -30,7 +30,7 @@ read_le32(in); // offset for module description namepos = read_le32(in); tblpos = read_le32(in); - list = (file_t *)calloc(count + 1, sizeof(file_t)); + list = calloc(count + 1, sizeof(file_t)); for (i = 0; i < count; i++) { uint32_t type_id; fseek(in, namepos + 24 * i, SEEK_SET); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2007-08-01 02:37:00
|
Revision: 22 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=22&view=rev Author: someone-guy Date: 2007-07-31 19:36:56 -0700 (Tue, 31 Jul 2007) Log Message: ----------- Add read_be32 function Modified Paths: -------------- trunk/extractor/helpers.c trunk/extractor/helpers.h Modified: trunk/extractor/helpers.c =================================================================== --- trunk/extractor/helpers.c 2007-08-01 02:08:45 UTC (rev 21) +++ trunk/extractor/helpers.c 2007-08-01 02:36:56 UTC (rev 22) @@ -37,6 +37,13 @@ return (t[3] << 8 | t[2]) << 16 | (t[1] << 8 | t[0]); } +//! read a 32 bit big-endian value from file +uint32_t read_be32(FILE *f) { + unsigned char t[4]; + fread(t, 4, 1, f); + return (t[0] << 8 | t[1]) << 16 | (t[2] << 8 | t[3]); +} + //! read a 16 bit little-endian value from file uint16_t read_le16(FILE *f) { unsigned char t[2]; Modified: trunk/extractor/helpers.h =================================================================== --- trunk/extractor/helpers.h 2007-08-01 02:08:45 UTC (rev 21) +++ trunk/extractor/helpers.h 2007-08-01 02:36:56 UTC (rev 22) @@ -3,6 +3,7 @@ char *read_cstring(FILE *f); uint16_t read_le16(FILE *f); uint32_t read_le32(FILE *f); +uint32_t read_be32(FILE *f); int fcopy(FILE *in, FILE *out, int len); #define TAG(a, b, c, d) ((uint32_t)(a << 8 | b) << 16 | (c << 8 | d)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2007-08-01 02:44:21
|
Revision: 23 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=23&view=rev Author: someone-guy Date: 2007-07-31 19:44:18 -0700 (Tue, 31 Jul 2007) Log Message: ----------- Support for Wing Commander IV .tre files Modified Paths: -------------- trunk/extractor/Makefile trunk/extractor/extractor.c trunk/extractor/formats.h Added Paths: ----------- trunk/extractor/xtre.c Modified: trunk/extractor/Makefile =================================================================== --- trunk/extractor/Makefile 2007-08-01 02:36:56 UTC (rev 22) +++ trunk/extractor/Makefile 2007-08-01 02:44:18 UTC (rev 23) @@ -3,6 +3,7 @@ MODULES=nwn.c \ homeworld2.c \ bloodrayne.c \ + xtre.c \ generic.c \ all: extractor Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2007-08-01 02:36:56 UTC (rev 22) +++ trunk/extractor/extractor.c 2007-08-01 02:44:18 UTC (rev 23) @@ -21,6 +21,7 @@ &nwn_fmt, &homeworld2_fmt, &bloodrayne_fmt, + &xtre_fmt, &generic_fmt, NULL }; Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2007-08-01 02:36:56 UTC (rev 22) +++ trunk/extractor/formats.h 2007-08-01 02:44:18 UTC (rev 23) @@ -24,6 +24,7 @@ extern fmt_desc_t nwn_fmt; extern fmt_desc_t homeworld2_fmt; extern fmt_desc_t bloodrayne_fmt; +extern fmt_desc_t xtre_fmt; extern fmt_desc_t generic_fmt; #endif Added: trunk/extractor/xtre.c =================================================================== --- trunk/extractor/xtre.c (rev 0) +++ trunk/extractor/xtre.c 2007-08-01 02:44:18 UTC (rev 23) @@ -0,0 +1,77 @@ +/** + * \file xtre.c + * \brief routines for handling the Wing Commander IV archive files + * + * Copyright (C) 2007 Reimar Döffinger + * License: GPL v2 (see LICENSE file) + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include <inttypes.h> +#include "formats.h" +#include "helpers.h" + +//! check for xtre archive +static int check_file(FILE *in) { + char sig[5] = {0}; + rewind(in); + fread(sig, 4, 1, in); + return (strcmp(sig, "XTRE") == 0); +} + +static file_t *get_list(FILE *in) { + file_t *list; + uint32_t count, tblpos, tblend; + int i; + fseek(in, 0x10, SEEK_SET); + tblpos = read_le32(in); + tblend = read_le32(in); + if (tblend < tblpos) count = 0; + else count = (tblend - tblpos) / 8; + list = calloc(count + 1, sizeof(file_t)); + for (i = 0; i < count; i++) { + uint32_t sig; + char *formatstr; + fseek(in, tblpos + 8 * i, SEEK_SET); + list[i].start = read_le32(in); + list[i].len = read_le32(in); + fseek(in, list[i].start, SEEK_SET); + sig = read_be32(in); + switch (sig) { + case TAG('R', 'I', 'F', 'F'): + fseek(in, 4, SEEK_CUR); + sig = read_be32(in); + switch (sig) { + case TAG('W', 'A', 'V', 'E'): + formatstr = "%i.wav"; + break; + case TAG('A', 'V', 'I', ' '): + formatstr = "%i.avi"; + break; + default: + formatstr = "%i.riff"; + } + break; + case TAG('F', 'O', 'R', 'M'): + formatstr = "%i.frm"; + break; + default: + formatstr = "%i.bin"; + } + list[i].name = malloc(50); + snprintf(list[i].name, 50, formatstr, i); + } + return list; +} + +fmt_desc_t xtre_fmt = { + "Wing Commander IV", + "Wing Commander IV (*.tre)", + "*.tre", + check_file, + get_list, + default_free_list, + default_extract_file, +}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2007-09-15 23:07:56
|
Revision: 28 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=28&view=rev Author: someone-guy Date: 2007-09-15 16:07:54 -0700 (Sat, 15 Sep 2007) Log Message: ----------- Add a default free function that does not free priv data, so it can be misused to directly store int data. Modified Paths: -------------- trunk/extractor/helpers.c trunk/extractor/helpers.h Modified: trunk/extractor/helpers.c =================================================================== --- trunk/extractor/helpers.c 2007-08-30 10:56:42 UTC (rev 27) +++ trunk/extractor/helpers.c 2007-09-15 23:07:54 UTC (rev 28) @@ -92,6 +92,17 @@ } /** + * \brief default free function for file list, which does not try to free priv data + * \param list list to free + */ +void default_free_ignorepriv(file_t *list) { + file_t *i; + for (i = list; i->name; i++) + free(i->name); + free(list); +} + +/** * \brief default file-extract function * \param in archive file * \param file description struct of file to extract Modified: trunk/extractor/helpers.h =================================================================== --- trunk/extractor/helpers.h 2007-08-30 10:56:42 UTC (rev 27) +++ trunk/extractor/helpers.h 2007-09-15 23:07:54 UTC (rev 28) @@ -9,5 +9,6 @@ struct file_s; void default_free_list(struct file_s *list); +void default_free_ignorepriv(struct file_s *list); int default_extract_file(FILE *in, struct file_s *file, FILE *out); #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2007-09-16 10:29:18
|
Revision: 30 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=30&view=rev Author: someone-guy Date: 2007-09-16 03:29:17 -0700 (Sun, 16 Sep 2007) Log Message: ----------- Add and use a peek_le32 function Modified Paths: -------------- trunk/extractor/generic.c trunk/extractor/helpers.c trunk/extractor/helpers.h Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2007-09-15 23:08:02 UTC (rev 29) +++ trunk/extractor/generic.c 2007-09-16 10:29:17 UTC (rev 30) @@ -38,7 +38,7 @@ case TAG('R', 'I', 'F', 'F'): add_entry(&list, cnt, "riff"); list[cnt].start = ftell(in) - 4; - list[cnt].len = read_le32(in); + list[cnt].len = peek_le32(in); cnt++; break; } @@ -46,7 +46,7 @@ case TAG(0, 'F', 'W', 'S'): add_entry(&list, cnt, "swf"); list[cnt].start = ftell(in) - 3; - list[cnt].len = read_le32(in); + list[cnt].len = peek_le32(in); cnt++; break; case 0xffd8ff: @@ -61,7 +61,7 @@ case TAG(0, 0, 'B', 'M'): add_entry(&list, cnt, "bmp"); list[cnt].start = ftell(in) - 2; - list[cnt].len = read_le32(in); + list[cnt].len = peek_le32(in); cnt++; break; case 0xffd9: Modified: trunk/extractor/helpers.c =================================================================== --- trunk/extractor/helpers.c 2007-09-15 23:08:02 UTC (rev 29) +++ trunk/extractor/helpers.c 2007-09-16 10:29:17 UTC (rev 30) @@ -37,6 +37,13 @@ return (t[3] << 8 | t[2]) << 16 | (t[1] << 8 | t[0]); } +//! as read_le32 but do not advance file pointer +uint32_t peek_le32(FILE *f) { + uint32_t res = read_le32(f); + fseek(f, -4, SEEK_CUR); + return res; +} + //! read a 32 bit big-endian value from file uint32_t read_be32(FILE *f) { unsigned char t[4]; Modified: trunk/extractor/helpers.h =================================================================== --- trunk/extractor/helpers.h 2007-09-15 23:08:02 UTC (rev 29) +++ trunk/extractor/helpers.h 2007-09-16 10:29:17 UTC (rev 30) @@ -3,6 +3,7 @@ char *read_cstring(FILE *f); uint16_t read_le16(FILE *f); uint32_t read_le32(FILE *f); +uint32_t peek_le32(FILE *f); uint32_t read_be32(FILE *f); int fcopy(FILE *in, FILE *out, int len); #define TAG(a, b, c, d) ((uint32_t)(a << 8 | b) << 16 | (c << 8 | d)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-19 20:42:43
|
Revision: 52 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=52&view=rev Author: someone-guy Date: 2008-02-19 12:42:38 -0800 (Tue, 19 Feb 2008) Log Message: ----------- Do not use system-reserved names for header inclusion guards Modified Paths: -------------- trunk/extractor/formats.h trunk/extractor/helpers.h Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-02-19 20:08:53 UTC (rev 51) +++ trunk/extractor/formats.h 2008-02-19 20:42:38 UTC (rev 52) @@ -1,5 +1,5 @@ -#ifndef _FORMATS_H -#define _FORMATS_H +#ifndef FORMATS_H +#define FORMATS_H //! struct describing a file in the archive typedef struct file_s { char *name; ///< filename Modified: trunk/extractor/helpers.h =================================================================== --- trunk/extractor/helpers.h 2008-02-19 20:08:53 UTC (rev 51) +++ trunk/extractor/helpers.h 2008-02-19 20:42:38 UTC (rev 52) @@ -1,5 +1,5 @@ -#ifndef _HELPERS_H -#define _HELPERS_H +#ifndef HELPERS_H +#define HELPERS_H char *read_cstring(FILE *f); uint16_t read_le16(FILE *f); uint32_t read_le32(FILE *f); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-19 20:54:40
|
Revision: 53 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=53&view=rev Author: someone-guy Date: 2008-02-19 12:54:36 -0800 (Tue, 19 Feb 2008) Log Message: ----------- Properly limit number of listed files Modified Paths: -------------- trunk/extractor/bloodrayne.c trunk/extractor/formats.h trunk/extractor/generic.c trunk/extractor/homeworld2.c trunk/extractor/nwn.c trunk/extractor/xtre.c Modified: trunk/extractor/bloodrayne.c =================================================================== --- trunk/extractor/bloodrayne.c 2008-02-19 20:42:38 UTC (rev 52) +++ trunk/extractor/bloodrayne.c 2008-02-19 20:54:36 UTC (rev 53) @@ -27,6 +27,7 @@ int i; fseek(in, 0x58, SEEK_SET); count = read_le32(in); + if (count > MAX_FILES) count = MAX_FILES; fseek(in, 0x108, SEEK_SET); tblpos = read_le32(in); namepos = tblpos + 20 * count; Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-02-19 20:42:38 UTC (rev 52) +++ trunk/extractor/formats.h 2008-02-19 20:54:36 UTC (rev 53) @@ -1,5 +1,8 @@ #ifndef FORMATS_H #define FORMATS_H + +#define MAX_FILES 100000 + //! struct describing a file in the archive typedef struct file_s { char *name; ///< filename Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2008-02-19 20:42:38 UTC (rev 52) +++ trunk/extractor/generic.c 2008-02-19 20:54:36 UTC (rev 53) @@ -47,7 +47,7 @@ int cnt = 0; file_t *list = calloc(1, sizeof(file_t)); rewind(in); - while (!feof(in) && cnt + 3 < SIZE_MAX / sizeof(file_t)) { + while (!feof(in) && cnt < MAX_FILES) { int i; t = t << 8 | fgetc(in); switch (t) { Modified: trunk/extractor/homeworld2.c =================================================================== --- trunk/extractor/homeworld2.c 2008-02-19 20:42:38 UTC (rev 52) +++ trunk/extractor/homeworld2.c 2008-02-19 20:54:36 UTC (rev 53) @@ -37,6 +37,7 @@ pathcount = read_le16(in); // number of paths tblpos = read_le32(in) + 0xb4; count = read_le16(in); + if (count > MAX_FILES) count = MAX_FILES; namepos = read_le32(in) + 0xb4; pathmap = calloc(count, sizeof(char *)); paths = calloc(pathcount, sizeof(char *)); Modified: trunk/extractor/nwn.c =================================================================== --- trunk/extractor/nwn.c 2008-02-19 20:42:38 UTC (rev 52) +++ trunk/extractor/nwn.c 2008-02-19 20:54:36 UTC (rev 53) @@ -27,6 +27,7 @@ int i; fseek(in, 0x10, SEEK_SET); count = read_le32(in); + if (count > MAX_FILES) count = MAX_FILES; read_le32(in); // offset for module description namepos = read_le32(in); tblpos = read_le32(in); Modified: trunk/extractor/xtre.c =================================================================== --- trunk/extractor/xtre.c 2008-02-19 20:42:38 UTC (rev 52) +++ trunk/extractor/xtre.c 2008-02-19 20:54:36 UTC (rev 53) @@ -30,6 +30,7 @@ tblend = read_le32(in); if (tblend < tblpos) count = 0; else count = (tblend - tblpos) / 8; + if (count > MAX_FILES) count = MAX_FILES; list = calloc(count + 1, sizeof(file_t)); for (i = 0; i < count; i++) { uint32_t sig; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-19 21:12:33
|
Revision: 54 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=54&view=rev Author: someone-guy Date: 2008-02-19 13:12:31 -0800 (Tue, 19 Feb 2008) Log Message: ----------- Add wad support Modified Paths: -------------- trunk/extractor/Makefile trunk/extractor/extractor.c trunk/extractor/formats.h Added Paths: ----------- trunk/extractor/wad.c Modified: trunk/extractor/Makefile =================================================================== --- trunk/extractor/Makefile 2008-02-19 20:54:36 UTC (rev 53) +++ trunk/extractor/Makefile 2008-02-19 21:12:31 UTC (rev 54) @@ -4,6 +4,7 @@ homeworld2.c \ bloodrayne.c \ xtre.c \ + wad.c \ generic.c \ all: extractor Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-02-19 20:54:36 UTC (rev 53) +++ trunk/extractor/extractor.c 2008-02-19 21:12:31 UTC (rev 54) @@ -22,6 +22,7 @@ &homeworld2_fmt, &bloodrayne_fmt, &xtre_fmt, + &wad_fmt, &generic_fmt, NULL }; Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-02-19 20:54:36 UTC (rev 53) +++ trunk/extractor/formats.h 2008-02-19 21:12:31 UTC (rev 54) @@ -28,6 +28,7 @@ extern fmt_desc_t homeworld2_fmt; extern fmt_desc_t bloodrayne_fmt; extern fmt_desc_t xtre_fmt; +extern fmt_desc_t wad_fmt; extern fmt_desc_t generic_fmt; #endif Added: trunk/extractor/wad.c =================================================================== --- trunk/extractor/wad.c (rev 0) +++ trunk/extractor/wad.c 2008-02-19 21:12:31 UTC (rev 54) @@ -0,0 +1,60 @@ +/** + * \file wad.c + * \brief routines for handling the Doom etc. WAD archive files + * + * Copyright (C) 2008 Reimar Döffinger + * License: GPL v2 (see LICENSE file) + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include "formats.h" +#include "helpers.h" + +//! check if this is a WAD archive file (starts with IWAD, PWAD, WAD3) +static int check_file(FILE *in) { + char sig[5] = {0}; + rewind(in); + fread(sig, 4, 1, in); + return strcmp(sig, "IWAD") == 0 || strcmp(sig, "PWAD") == 0 || strcmp(sig, "WAD3") == 0; +} + +static file_t *get_list(FILE *in) { + char sig[5] = {0}; + file_t *list; + uint32_t count, tblpos; + int i; + int v3; + rewind(in); + fread(sig, 4, 1, in); + v3 = strcmp(sig, "WAD3") == 0; + count = read_le32(in); + if (count > MAX_FILES) count = MAX_FILES; + tblpos = read_le32(in); + list = calloc(count + 1, sizeof(file_t)); + for (i = 0; i < count; i++) { + fseek(in, tblpos + (v3 ? 32 : 16) * i, SEEK_SET); + list[i].start = read_le32(in); + list[i].len = read_le32(in); + if (v3) { + int size2 = read_le32(in); + // should always be equal... + if (size2 > list[i].len) list[i].len = size2; + read_le32(in); // unknown + } + list[i].name = calloc(1, 17); + fread(list[i].name, 1, v3 ? 16 : 8, in); + } + return list; +} + +fmt_desc_t wad_fmt = { + "WAD (Doom etc.)", + "WAD (*.wad)", + "*.wad;*.WAD", + check_file, + get_list, + default_free_list, + default_extract_file, +}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-19 21:22:58
|
Revision: 55 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=55&view=rev Author: someone-guy Date: 2008-02-19 13:22:54 -0800 (Tue, 19 Feb 2008) Log Message: ----------- Lots of missing const Modified Paths: -------------- trunk/extractor/bloodrayne.c trunk/extractor/extractor.c trunk/extractor/formats.h trunk/extractor/generic.c trunk/extractor/homeworld2.c trunk/extractor/nwn.c trunk/extractor/wad.c trunk/extractor/xtre.c Modified: trunk/extractor/bloodrayne.c =================================================================== --- trunk/extractor/bloodrayne.c 2008-02-19 21:12:31 UTC (rev 54) +++ trunk/extractor/bloodrayne.c 2008-02-19 21:22:54 UTC (rev 55) @@ -44,7 +44,7 @@ return list; } -fmt_desc_t bloodrayne_fmt = { +const fmt_desc_t bloodrayne_fmt = { "BloodRayne", "BloodRayne (*.pod)", "*.pod;*.POD", Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-02-19 21:12:31 UTC (rev 54) +++ trunk/extractor/extractor.c 2008-02-19 21:22:54 UTC (rev 55) @@ -17,7 +17,7 @@ #include "formats.h" //! brief NULL-terminated array of supported formats -fmt_desc_t *fmts[] = { +const fmt_desc_t * const fmts[] = { &nwn_fmt, &homeworld2_fmt, &bloodrayne_fmt, @@ -45,7 +45,7 @@ }; //! types of columns in the file list table -int coltypes[] = { +const int coltypes[] = { [FNAME_COL] = G_TYPE_STRING, [SIZE_COL] = G_TYPE_INT, [COMPR_COL] = G_TYPE_BOOLEAN, @@ -57,7 +57,7 @@ GtkTreeSelection *selection; FILE *input_file = NULL; file_t *flist = NULL; -fmt_desc_t *cur_fmt = NULL; +const fmt_desc_t *cur_fmt = NULL; /** * \brief extracts the file specified by iter @@ -112,7 +112,7 @@ } } -static int open_file(char *fname, fmt_desc_t *fmt) { +static int open_file(const char *fname, const fmt_desc_t *fmt) { if (!fmt) fmt = &generic_fmt; // close previous file and free its data @@ -139,7 +139,7 @@ const char *filter = gtk_file_filter_get_name(gtk_file_chooser_get_filter( GTK_FILE_CHOOSER(widget))); - fmt_desc_t **fmt = fmts; + const fmt_desc_t * const *fmt = fmts; gchar *fname = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); while ((*fmt)->desc && strcmp(filter, _((*fmt)->desc)) != 0) fmt++; if (!(*fmt)->desc) { Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-02-19 21:12:31 UTC (rev 54) +++ trunk/extractor/formats.h 2008-02-19 21:22:54 UTC (rev 55) @@ -24,11 +24,11 @@ int (*extract_file)(FILE *in, file_t *file, FILE *out); ///< extract a file } fmt_desc_t; -extern fmt_desc_t nwn_fmt; -extern fmt_desc_t homeworld2_fmt; -extern fmt_desc_t bloodrayne_fmt; -extern fmt_desc_t xtre_fmt; -extern fmt_desc_t wad_fmt; -extern fmt_desc_t generic_fmt; +extern const fmt_desc_t nwn_fmt; +extern const fmt_desc_t homeworld2_fmt; +extern const fmt_desc_t bloodrayne_fmt; +extern const fmt_desc_t xtre_fmt; +extern const fmt_desc_t wad_fmt; +extern const fmt_desc_t generic_fmt; #endif Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2008-02-19 21:12:31 UTC (rev 54) +++ trunk/extractor/generic.c 2008-02-19 21:22:54 UTC (rev 55) @@ -166,7 +166,7 @@ return list; } -fmt_desc_t generic_fmt = { +const fmt_desc_t generic_fmt = { "Generic File", "Generic File", "*", Modified: trunk/extractor/homeworld2.c =================================================================== --- trunk/extractor/homeworld2.c 2008-02-19 21:12:31 UTC (rev 54) +++ trunk/extractor/homeworld2.c 2008-02-19 21:22:54 UTC (rev 55) @@ -85,7 +85,7 @@ return list; } -fmt_desc_t homeworld2_fmt = { +const fmt_desc_t homeworld2_fmt = { "Homeworld 2", "Homeworld 2 (*.big)", "*.big", Modified: trunk/extractor/nwn.c =================================================================== --- trunk/extractor/nwn.c 2008-02-19 21:12:31 UTC (rev 54) +++ trunk/extractor/nwn.c 2008-02-19 21:22:54 UTC (rev 55) @@ -62,7 +62,7 @@ return list; } -fmt_desc_t nwn_fmt = { +const fmt_desc_t nwn_fmt = { "Neverwinter Nights", "Neverwinter Nights (*.mod;*.nwm;*.sav)", "*.mod;*.nwm;*.sav", Modified: trunk/extractor/wad.c =================================================================== --- trunk/extractor/wad.c 2008-02-19 21:12:31 UTC (rev 54) +++ trunk/extractor/wad.c 2008-02-19 21:22:54 UTC (rev 55) @@ -49,7 +49,7 @@ return list; } -fmt_desc_t wad_fmt = { +const fmt_desc_t wad_fmt = { "WAD (Doom etc.)", "WAD (*.wad)", "*.wad;*.WAD", Modified: trunk/extractor/xtre.c =================================================================== --- trunk/extractor/xtre.c 2008-02-19 21:12:31 UTC (rev 54) +++ trunk/extractor/xtre.c 2008-02-19 21:22:54 UTC (rev 55) @@ -67,7 +67,7 @@ return list; } -fmt_desc_t xtre_fmt = { +const fmt_desc_t xtre_fmt = { "Wing Commander IV", "Wing Commander IV (*.tre)", "*.tre", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-22 21:59:10
|
Revision: 56 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=56&view=rev Author: someone-guy Date: 2008-02-22 13:59:06 -0800 (Fri, 22 Feb 2008) Log Message: ----------- Add HalfLife PAK format Modified Paths: -------------- trunk/extractor/Makefile trunk/extractor/extractor.c trunk/extractor/formats.h Added Paths: ----------- trunk/extractor/pak.c Modified: trunk/extractor/Makefile =================================================================== --- trunk/extractor/Makefile 2008-02-19 21:22:54 UTC (rev 55) +++ trunk/extractor/Makefile 2008-02-22 21:59:06 UTC (rev 56) @@ -5,6 +5,7 @@ bloodrayne.c \ xtre.c \ wad.c \ + pak.c \ generic.c \ all: extractor Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-02-19 21:22:54 UTC (rev 55) +++ trunk/extractor/extractor.c 2008-02-22 21:59:06 UTC (rev 56) @@ -23,6 +23,7 @@ &bloodrayne_fmt, &xtre_fmt, &wad_fmt, + &pak_fmt, &generic_fmt, NULL }; Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-02-19 21:22:54 UTC (rev 55) +++ trunk/extractor/formats.h 2008-02-22 21:59:06 UTC (rev 56) @@ -29,6 +29,7 @@ extern const fmt_desc_t bloodrayne_fmt; extern const fmt_desc_t xtre_fmt; extern const fmt_desc_t wad_fmt; +extern const fmt_desc_t pak_fmt; extern const fmt_desc_t generic_fmt; #endif Added: trunk/extractor/pak.c =================================================================== --- trunk/extractor/pak.c (rev 0) +++ trunk/extractor/pak.c 2008-02-22 21:59:06 UTC (rev 56) @@ -0,0 +1,51 @@ +/** + * \file wad.c + * \brief routines for handling the HalfLife PAK archive files + * + * Copyright (C) 2008 Reimar Döffinger + * License: GPL v2 (see LICENSE file) + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include "formats.h" +#include "helpers.h" + +//! check if this is a PAK archive file (starts with PACK) +static int check_file(FILE *in) { + char sig[5] = {0}; + rewind(in); + fread(sig, 4, 1, in); + return strcmp(sig, "PACK") == 0; +} + +static file_t *get_list(FILE *in) { + file_t *list; + uint32_t count, tblpos; + int i; + rewind(in); + fseek(in, 4, SEEK_SET); + tblpos = read_le32(in); + count = read_le32(in) / 64; + if (count > MAX_FILES) count = MAX_FILES; + list = calloc(count + 1, sizeof(file_t)); + for (i = 0; i < count; i++) { + fseek(in, tblpos + 64 * i, SEEK_SET); + list[i].name = calloc(1, 57); + fread(list[i].name, 1, 56, in); + list[i].start = read_le32(in); + list[i].len = read_le32(in); + } + return list; +} + +const fmt_desc_t pak_fmt = { + "PAK (HalfLife)", + "PAK (*.pak)", + "*.pak;*.PAK", + check_file, + get_list, + default_free_list, + default_extract_file, +}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-22 22:14:34
|
Revision: 59 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=59&view=rev Author: someone-guy Date: 2008-02-22 14:14:31 -0800 (Fri, 22 Feb 2008) Log Message: ----------- Get rid of useless () Modified Paths: -------------- trunk/extractor/bloodrayne.c trunk/extractor/homeworld2.c trunk/extractor/nwn.c trunk/extractor/xtre.c Modified: trunk/extractor/bloodrayne.c =================================================================== --- trunk/extractor/bloodrayne.c 2008-02-22 22:05:39 UTC (rev 58) +++ trunk/extractor/bloodrayne.c 2008-02-22 22:14:31 UTC (rev 59) @@ -18,7 +18,7 @@ char sig[5] = {0}; rewind(in); fread(sig, 4, 1, in); - return (strcmp(sig, "POD3") == 0); + return strcmp(sig, "POD3") == 0; } static file_t *get_list(FILE *in) { Modified: trunk/extractor/homeworld2.c =================================================================== --- trunk/extractor/homeworld2.c 2008-02-22 22:05:39 UTC (rev 58) +++ trunk/extractor/homeworld2.c 2008-02-22 22:14:31 UTC (rev 59) @@ -18,7 +18,7 @@ char sig[9] = {0}; rewind(in); fread(sig, 8, 1, in); - return (strcmp(sig, "_ARCHIVE") == 0); + return strcmp(sig, "_ARCHIVE") == 0; } static file_t *get_list(FILE *in) { Modified: trunk/extractor/nwn.c =================================================================== --- trunk/extractor/nwn.c 2008-02-22 22:05:39 UTC (rev 58) +++ trunk/extractor/nwn.c 2008-02-22 22:14:31 UTC (rev 59) @@ -18,7 +18,7 @@ char sig[9] = {0}; rewind(in); fread(sig, 8, 1, in); - return (strcmp(sig, "MOD V1.0") == 0); + return strcmp(sig, "MOD V1.0") == 0; } static file_t *get_list(FILE *in) { Modified: trunk/extractor/xtre.c =================================================================== --- trunk/extractor/xtre.c 2008-02-22 22:05:39 UTC (rev 58) +++ trunk/extractor/xtre.c 2008-02-22 22:14:31 UTC (rev 59) @@ -18,7 +18,7 @@ char sig[5] = {0}; rewind(in); fread(sig, 4, 1, in); - return (strcmp(sig, "XTRE") == 0); + return strcmp(sig, "XTRE") == 0; } static file_t *get_list(FILE *in) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-22 22:15:00
|
Revision: 61 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=61&view=rev Author: someone-guy Date: 2008-02-22 14:14:58 -0800 (Fri, 22 Feb 2008) Log Message: ----------- extract_file has no reason to modify file_t, so make the argument const. Modified Paths: -------------- trunk/extractor/formats.h trunk/extractor/helpers.c trunk/extractor/helpers.h Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-02-22 22:14:43 UTC (rev 60) +++ trunk/extractor/formats.h 2008-02-22 22:14:58 UTC (rev 61) @@ -21,7 +21,7 @@ int (*check_file)(FILE *in); ///< check function for format autodetection file_t *(*get_list)(FILE *in); ///< get a list of files in archive void (*free_list)(file_t *list); ///< free file list obtained via get_list - int (*extract_file)(FILE *in, file_t *file, FILE *out); ///< extract a file + int (*extract_file)(FILE *in, const file_t *file, FILE *out); ///< extract a file } fmt_desc_t; extern const fmt_desc_t nwn_fmt; Modified: trunk/extractor/helpers.c =================================================================== --- trunk/extractor/helpers.c 2008-02-22 22:14:43 UTC (rev 60) +++ trunk/extractor/helpers.c 2008-02-22 22:14:58 UTC (rev 61) @@ -118,7 +118,7 @@ * \param out file to write data into * \return number of bytes written to out */ -int default_extract_file(FILE *in, file_t *file, FILE *out) { +int default_extract_file(FILE *in, const file_t *file, FILE *out) { fseek(in, file->start, SEEK_SET); return fcopy(in, out, file->len); } Modified: trunk/extractor/helpers.h =================================================================== --- trunk/extractor/helpers.h 2008-02-22 22:14:43 UTC (rev 60) +++ trunk/extractor/helpers.h 2008-02-22 22:14:58 UTC (rev 61) @@ -12,5 +12,5 @@ struct file_s; void default_free_list(struct file_s *list); void default_free_ignorepriv(struct file_s *list); -int default_extract_file(FILE *in, struct file_s *file, FILE *out); +int default_extract_file(FILE *in, const struct file_s *file, FILE *out); #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-22 22:18:22
|
Revision: 62 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=62&view=rev Author: someone-guy Date: 2008-02-22 14:18:20 -0800 (Fri, 22 Feb 2008) Log Message: ----------- Sort alphabetically Modified Paths: -------------- trunk/extractor/Makefile trunk/extractor/extractor.c trunk/extractor/formats.h Modified: trunk/extractor/Makefile =================================================================== --- trunk/extractor/Makefile 2008-02-22 22:14:58 UTC (rev 61) +++ trunk/extractor/Makefile 2008-02-22 22:18:20 UTC (rev 62) @@ -1,12 +1,13 @@ CC=gcc CFLAGS=-Wall -g -O -MODULES=nwn.c \ - homeworld2.c \ - bloodrayne.c \ - xtre.c \ - wad.c \ - pak.c \ - generic.c \ +MODULES= \ + bloodrayne.c \ + generic.c \ + homeworld2.c \ + nwn.c \ + pak.c \ + wad.c \ + xtre.c \ all: extractor Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-02-22 22:14:58 UTC (rev 61) +++ trunk/extractor/extractor.c 2008-02-22 22:18:20 UTC (rev 62) @@ -18,13 +18,13 @@ //! brief NULL-terminated array of supported formats const fmt_desc_t * const fmts[] = { + &bloodrayne_fmt, + &generic_fmt, + &homeworld2_fmt, &nwn_fmt, - &homeworld2_fmt, - &bloodrayne_fmt, + &pak_fmt, + &wad_fmt, &xtre_fmt, - &wad_fmt, - &pak_fmt, - &generic_fmt, NULL }; Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-02-22 22:14:58 UTC (rev 61) +++ trunk/extractor/formats.h 2008-02-22 22:18:20 UTC (rev 62) @@ -24,12 +24,12 @@ int (*extract_file)(FILE *in, const file_t *file, FILE *out); ///< extract a file } fmt_desc_t; +extern const fmt_desc_t bloodrayne_fmt; +extern const fmt_desc_t generic_fmt; +extern const fmt_desc_t homeworld2_fmt; extern const fmt_desc_t nwn_fmt; -extern const fmt_desc_t homeworld2_fmt; -extern const fmt_desc_t bloodrayne_fmt; +extern const fmt_desc_t pak_fmt; +extern const fmt_desc_t wad_fmt; extern const fmt_desc_t xtre_fmt; -extern const fmt_desc_t wad_fmt; -extern const fmt_desc_t pak_fmt; -extern const fmt_desc_t generic_fmt; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-02-22 22:59:56
|
Revision: 64 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=64&view=rev Author: someone-guy Date: 2008-02-22 14:59:54 -0800 (Fri, 22 Feb 2008) Log Message: ----------- More missing const Modified Paths: -------------- trunk/extractor/generic.c trunk/extractor/xtre.c Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2008-02-22 22:34:11 UTC (rev 63) +++ trunk/extractor/generic.c 2008-02-22 22:59:54 UTC (rev 64) @@ -17,7 +17,7 @@ return 0; } -static void add_entry(file_t **list, int cnt, char *ext) { +static void add_entry(file_t **list, int cnt, const char *ext) { file_t *l = *list; l = realloc(l, (cnt + 2) * sizeof(file_t)); memset(&l[cnt + 1], 0, sizeof(file_t)); Modified: trunk/extractor/xtre.c =================================================================== --- trunk/extractor/xtre.c 2008-02-22 22:34:11 UTC (rev 63) +++ trunk/extractor/xtre.c 2008-02-22 22:59:54 UTC (rev 64) @@ -34,7 +34,7 @@ list = calloc(count + 1, sizeof(file_t)); for (i = 0; i < count; i++) { uint32_t sig; - char *formatstr; + const char *formatstr; fseek(in, tblpos + 8 * i, SEEK_SET); list[i].start = read_le32(in); list[i].len = read_le32(in); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-03-08 21:12:56
|
Revision: 71 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=71&view=rev Author: someone-guy Date: 2008-03-08 13:12:54 -0800 (Sat, 08 Mar 2008) Log Message: ----------- Add a extract-to-memory function for preview since Windows has no sane way to handle temporary files. Modified Paths: -------------- trunk/extractor/bloodrayne.c trunk/extractor/extractor.c trunk/extractor/formats.h trunk/extractor/generic.c trunk/extractor/helpers.c trunk/extractor/helpers.h trunk/extractor/homeworld2.c trunk/extractor/nwn.c trunk/extractor/pak.c trunk/extractor/wad.c trunk/extractor/xtre.c Modified: trunk/extractor/bloodrayne.c =================================================================== --- trunk/extractor/bloodrayne.c 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/bloodrayne.c 2008-03-08 21:12:54 UTC (rev 71) @@ -52,4 +52,5 @@ get_list, default_free_list, default_extract_file, + default_extract_mem, }; Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/extractor.c 2008-03-08 21:12:54 UTC (rev 71) @@ -202,7 +202,6 @@ GtkTreeIter iter; GtkWidget *preview_win = data; file_t *file; - FILE *tmpf; int size; uint8_t *tmpdata; GdkPixbufLoader *pbl; @@ -214,15 +213,9 @@ if (!gtk_tree_model_get_iter(model, &iter, path)) return; gtk_tree_model_get(model, &iter, PTR_COL, &file, -1); - tmpf = tmpfile(); - cur_fmt->extract_file(input_file, file, tmpf); - fseek(tmpf, 0, SEEK_END); - size = ftell(tmpf); - if (size > MAX_IMG_SZ) size = MAX_IMG_SZ; - rewind(tmpf); - tmpdata = malloc(size); - fread(tmpdata, 1, size, tmpf); - fclose(tmpf); + tmpdata = malloc(MAX_IMG_SZ); + size = cur_fmt->extract_mem(input_file, file, tmpdata, MAX_IMG_SZ); + if (size > MAX_IMG_SZ || size < 0) size = MAX_IMG_SZ; pbl = gdk_pixbuf_loader_new(); gdk_pixbuf_loader_write(pbl, tmpdata, size, NULL); free(tmpdata); Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/formats.h 2008-03-08 21:12:54 UTC (rev 71) @@ -22,6 +22,7 @@ file_t *(*get_list)(FILE *in); ///< get a list of files in archive void (*free_list)(file_t *list); ///< free file list obtained via get_list int (*extract_file)(FILE *in, const file_t *file, FILE *out); ///< extract a file + int (*extract_mem)(FILE *in, const file_t *file, uint8_t *out, int out_size); ///< extract a file to a buffer } fmt_desc_t; extern const fmt_desc_t bloodrayne_fmt; Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/generic.c 2008-03-08 21:12:54 UTC (rev 71) @@ -197,4 +197,5 @@ get_list, default_free_ignorepriv, default_extract_file, + default_extract_mem, }; Modified: trunk/extractor/helpers.c =================================================================== --- trunk/extractor/helpers.c 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/helpers.c 2008-03-08 21:12:54 UTC (rev 71) @@ -123,3 +123,16 @@ return fcopy(in, out, file->len); } +/** + * \brief default file-extract-to-memory function + * \param in archive file + * \param file description struct of file to extract + * \param out buffer to write data into + * \param size size of buffer + * \return number of bytes written to out + */ +int default_extract_mem(FILE *in, const file_t *file, uint8_t *out, int size) { + if (size > file->len) size = file->len; + fseek(in, file->start, SEEK_SET); + return fread(out, 1, size, in); +} Modified: trunk/extractor/helpers.h =================================================================== --- trunk/extractor/helpers.h 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/helpers.h 2008-03-08 21:12:54 UTC (rev 71) @@ -13,4 +13,5 @@ void default_free_list(struct file_s *list); void default_free_ignorepriv(struct file_s *list); int default_extract_file(FILE *in, const struct file_s *file, FILE *out); +int default_extract_mem(FILE *in, const struct file_s *file, uint8_t *out, int size); #endif Modified: trunk/extractor/homeworld2.c =================================================================== --- trunk/extractor/homeworld2.c 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/homeworld2.c 2008-03-08 21:12:54 UTC (rev 71) @@ -93,4 +93,5 @@ get_list, default_free_list, default_extract_file, + default_extract_mem, }; Modified: trunk/extractor/nwn.c =================================================================== --- trunk/extractor/nwn.c 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/nwn.c 2008-03-08 21:12:54 UTC (rev 71) @@ -70,4 +70,5 @@ get_list, default_free_list, default_extract_file, + default_extract_mem, }; Modified: trunk/extractor/pak.c =================================================================== --- trunk/extractor/pak.c 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/pak.c 2008-03-08 21:12:54 UTC (rev 71) @@ -48,4 +48,5 @@ get_list, default_free_list, default_extract_file, + default_extract_mem, }; Modified: trunk/extractor/wad.c =================================================================== --- trunk/extractor/wad.c 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/wad.c 2008-03-08 21:12:54 UTC (rev 71) @@ -57,4 +57,5 @@ get_list, default_free_list, default_extract_file, + default_extract_mem, }; Modified: trunk/extractor/xtre.c =================================================================== --- trunk/extractor/xtre.c 2008-03-08 20:11:07 UTC (rev 70) +++ trunk/extractor/xtre.c 2008-03-08 21:12:54 UTC (rev 71) @@ -75,4 +75,5 @@ get_list, default_free_list, default_extract_file, + default_extract_mem, }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-04-06 20:08:52
|
Revision: 73 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=73&view=rev Author: someone-guy Date: 2008-04-06 13:08:48 -0700 (Sun, 06 Apr 2008) Log Message: ----------- Add read_be16 helper Modified Paths: -------------- trunk/extractor/helpers.c trunk/extractor/helpers.h Modified: trunk/extractor/helpers.c =================================================================== --- trunk/extractor/helpers.c 2008-03-08 21:14:45 UTC (rev 72) +++ trunk/extractor/helpers.c 2008-04-06 20:08:48 UTC (rev 73) @@ -60,6 +60,13 @@ return t[1] << 8 | t[0]; } +//! read a 16 bit big-endian value from file +uint16_t read_be16(FILE *f) { + unsigned char t[2]; + fread(t, 2, 1, f); + return t[0] << 8 | t[1]; +} + #define BLOCK_SIZE 4096 /** * \brief copy data from one file into another Modified: trunk/extractor/helpers.h =================================================================== --- trunk/extractor/helpers.h 2008-03-08 21:14:45 UTC (rev 72) +++ trunk/extractor/helpers.h 2008-04-06 20:08:48 UTC (rev 73) @@ -5,6 +5,7 @@ uint32_t read_le32(FILE *f); uint32_t peek_le32(FILE *f); uint32_t read_be32(FILE *f); +uint16_t read_be16(FILE *f); int fcopy(FILE *in, FILE *out, int len); #define TAG(a, b, c, d) ((uint32_t)((a) << 8 | (b)) << 16 | ((c) << 8 | (d))) #define HUGETAG(a, b, c, d, e, f, g, h) (((uint64_t)(TAG(a, b, c, d)) << 32) | TAG(e, f, g, h)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-04-06 20:09:23
|
Revision: 74 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=74&view=rev Author: someone-guy Date: 2008-04-06 13:09:20 -0700 (Sun, 06 Apr 2008) Log Message: ----------- Move add_entry to global helpers.c/h Modified Paths: -------------- trunk/extractor/generic.c trunk/extractor/helpers.c trunk/extractor/helpers.h Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2008-04-06 20:08:48 UTC (rev 73) +++ trunk/extractor/generic.c 2008-04-06 20:09:20 UTC (rev 74) @@ -17,15 +17,6 @@ return 0; } -static void add_entry(file_t **list, int cnt, const char *ext) { - file_t *l = *list; - l = realloc(l, (cnt + 2) * sizeof(file_t)); - memset(&l[cnt + 1], 0, sizeof(file_t)); - l[cnt].name = malloc(50); - snprintf(l[cnt].name, 50, "%i.%s", cnt, ext); - *list = l; -} - static int is_valid_fourcc(uint32_t id) { static const char valid_chars[] = "0123456789abcdefghijklmnopqrstuvwxyz" Modified: trunk/extractor/helpers.c =================================================================== --- trunk/extractor/helpers.c 2008-04-06 20:08:48 UTC (rev 73) +++ trunk/extractor/helpers.c 2008-04-06 20:09:20 UTC (rev 74) @@ -7,6 +7,7 @@ */ #include <stdlib.h> #include <stdio.h> +#include <string.h> #include <inttypes.h> #include "helpers.h" #include "formats.h" @@ -67,6 +68,21 @@ return t[0] << 8 | t[1]; } +/** + * \brief append a new entry to a file list + * \param list file list to append to + * \param cnt current number of entries in list + * \param ext extension of entry to add + */ +void add_entry(struct file_s **list, int cnt, const char *ext) { + file_t *l = *list; + l = realloc(l, (cnt + 2) * sizeof(file_t)); + memset(&l[cnt + 1], 0, sizeof(file_t)); + l[cnt].name = malloc(50); + snprintf(l[cnt].name, 50, "%i.%s", cnt, ext); + *list = l; +} + #define BLOCK_SIZE 4096 /** * \brief copy data from one file into another Modified: trunk/extractor/helpers.h =================================================================== --- trunk/extractor/helpers.h 2008-04-06 20:08:48 UTC (rev 73) +++ trunk/extractor/helpers.h 2008-04-06 20:09:20 UTC (rev 74) @@ -11,6 +11,7 @@ #define HUGETAG(a, b, c, d, e, f, g, h) (((uint64_t)(TAG(a, b, c, d)) << 32) | TAG(e, f, g, h)) struct file_s; +void add_entry(struct file_s **list, int cnt, const char *ext); void default_free_list(struct file_s *list); void default_free_ignorepriv(struct file_s *list); int default_extract_file(FILE *in, const struct file_s *file, FILE *out); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <som...@us...> - 2008-04-06 20:09:59
|
Revision: 75 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=75&view=rev Author: someone-guy Date: 2008-04-06 13:09:49 -0700 (Sun, 06 Apr 2008) Log Message: ----------- Add parsing support for Metal Gear Solid: The Twin Snakes vox.dat file Modified Paths: -------------- trunk/extractor/Makefile trunk/extractor/extractor.c trunk/extractor/formats.h Added Paths: ----------- trunk/extractor/solid.c Modified: trunk/extractor/Makefile =================================================================== --- trunk/extractor/Makefile 2008-04-06 20:09:20 UTC (rev 74) +++ trunk/extractor/Makefile 2008-04-06 20:09:49 UTC (rev 75) @@ -9,6 +9,7 @@ homeworld2.c \ nwn.c \ pak.c \ + solid.c \ wad.c \ xtre.c \ Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-04-06 20:09:20 UTC (rev 74) +++ trunk/extractor/extractor.c 2008-04-06 20:09:49 UTC (rev 75) @@ -23,6 +23,7 @@ &homeworld2_fmt, &nwn_fmt, &pak_fmt, + &solid_fmt, &wad_fmt, &xtre_fmt, NULL Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-04-06 20:09:20 UTC (rev 74) +++ trunk/extractor/formats.h 2008-04-06 20:09:49 UTC (rev 75) @@ -30,6 +30,7 @@ extern const fmt_desc_t homeworld2_fmt; extern const fmt_desc_t nwn_fmt; extern const fmt_desc_t pak_fmt; +extern const fmt_desc_t solid_fmt; extern const fmt_desc_t wad_fmt; extern const fmt_desc_t xtre_fmt; Added: trunk/extractor/solid.c =================================================================== --- trunk/extractor/solid.c (rev 0) +++ trunk/extractor/solid.c 2008-04-06 20:09:49 UTC (rev 75) @@ -0,0 +1,105 @@ +/** + * \file solid.c + * \brief routines for handling the GameCube Metal Gear Solid: Twin Snakes vox.dat format + * + * Copyright (C) 2008 Reimar Döffinger + * License: GPL v2 (see LICENSE file) + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include "formats.h" +#include "helpers.h" + +//! this is only a heuristic check, hopefully it is reliable enough +static int check_file(FILE *in) { + rewind(in); + return read_be32(in) == 0x10 && read_be32(in) == 0x10 && read_be32(in) == 0; +} + +enum { + LANG_ANY, + LANG_EN, + LANG_FR, + LANG_DE, + LANG_IT, + LANG_ES, +}; + +static const char *langstr(int lang) { + switch (lang) { + case LANG_ANY: return ""; + case LANG_EN : return "en"; + case LANG_FR : return "fr"; + case LANG_DE : return "de"; + case LANG_IT : return "it"; + case LANG_ES : return "es"; + } + return "nn"; +} + +enum { + TYPE_AUDIO = 0x01, + TYPE_SUB = 0x04, + TYPE_T6 = 0x06, // subtitle references? (unsure) + TYPE_T7 = 0x07, + TYPE_INDEX = 0x10, + TYPE_PADDING = 0xf0, +}; + +static const char *typestr(int type) { + switch (type) { + case TYPE_AUDIO : return "ogg"; + case TYPE_SUB : return "sub"; + case TYPE_T6 : return "t6"; + case TYPE_T7 : return "t7"; + case TYPE_INDEX : return "idx"; // should never be used + case TYPE_PADDING: return "pad"; // should not be used either + } + return "bin"; +} + +static file_t *get_list(FILE *in) { + int cnt = 0; + file_t *list = calloc(1, sizeof(file_t)); + rewind(in); + while (cnt < MAX_FILES) { + int lang = read_be16(in); + int type = read_be16(in); + uint32_t len = read_be32(in); + if (feof(in)) break; + if (type == TYPE_INDEX) { + char ext[8]; + read_be32(in); // unknown, always 0? + lang = read_be16(in); + type = read_be16(in); + if (*langstr(lang)) + snprintf(ext, sizeof(ext), "%s.%s", langstr(lang), typestr(type)); + else + snprintf(ext, sizeof(ext), "%s", typestr(type)); + add_entry(&list, cnt, ext); + list[cnt].start = ftell(in) - 16; + cnt++; + } else if (type == TYPE_PADDING) { + uint64_t pos = ftell(in); + len = 16; // should be already 16, just to be sure + pos = (pos + 0x800) & ~0x7ff; + fseek(in, pos, SEEK_SET); + } else + fseek(in, 8, SEEK_CUR); + fseek(in, len - 16, SEEK_CUR); + } + return list; +} + +const fmt_desc_t solid_fmt = { + "MetalGear Solid: TS", + "MetalGear Solid: TS (vox.dat)", + "vox.dat", + check_file, + get_list, + default_free_list, + default_extract_file, + default_extract_mem, +}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |