[Extractor-gtk-cvslog] SF.net SVN: extractor-gtk: [23] trunk/extractor
Extract files from unusual archive formats
Brought to you by:
someone-guy
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. |