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