[Extractor-gtk-cvslog] SF.net SVN: extractor-gtk:[109] trunk/extractor
Extract files from unusual archive formats
Brought to you by:
someone-guy
From: <som...@us...> - 2008-08-23 11:21:41
|
Revision: 109 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=109&view=rev Author: someone-guy Date: 2008-08-23 11:21:39 +0000 (Sat, 23 Aug 2008) Log Message: ----------- Incomplete support for Drakensang export.npg file Modified Paths: -------------- trunk/extractor/Makefile trunk/extractor/extractor.c trunk/extractor/formats.h Added Paths: ----------- trunk/extractor/dsnpk.c Modified: trunk/extractor/Makefile =================================================================== --- trunk/extractor/Makefile 2008-08-23 11:21:10 UTC (rev 108) +++ trunk/extractor/Makefile 2008-08-23 11:21:39 UTC (rev 109) @@ -3,6 +3,7 @@ CFLAGS+=-std=c99 -D_XOPEN_SOURCE=500 MODULES= \ bloodrayne.c \ + dsnpk.c \ generic.c \ homeworld2.c \ nwn.c \ Added: trunk/extractor/dsnpk.c =================================================================== --- trunk/extractor/dsnpk.c (rev 0) +++ trunk/extractor/dsnpk.c 2008-08-23 11:21:39 UTC (rev 109) @@ -0,0 +1,73 @@ +/** + * \file dsnpk.c + * \brief routines for handling the Drakensang npk archive file + * + * 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 npk archive file (starts with 0KPN) +static int check_file(FILE *in) { + rewind(in); + return read_le32(in) == TAG('N', 'P', 'K', '0'); +} + +static inline void get_tag(FILE *in, uint32_t *tag, uint64_t *end) { + *tag = read_le32(in); + *end = read_le32(in); + *end += ftell(in); +} + +static file_t *get_list(FILE *in) { + file_t *list = calloc(1, sizeof(file_t)); + int cnt = 0; + uint64_t next_pos = 0; + uint64_t data_offset = 0; + do { + uint32_t tag; + uint16_t nlen; + fseek(in, next_pos, SEEK_SET); + get_tag(in, &tag, &next_pos); + switch (tag) { + case TAG('N', 'P', 'K', '0'): + data_offset = read_le32(in); // offset of data tag + data_offset += 8; // data starts after tag header + break; + case TAG('F', 'I', 'L', 'E'): + add_entry_empty(&list, cnt); + list[cnt].start = data_offset + read_le32(in); + list[cnt].len = read_le32(in); + nlen = read_le16(in); + list[cnt].name = calloc(1, nlen + 1); + fread(list[cnt].name, 1, nlen, in); + cnt++; + break; + case TAG('D', 'I', 'R', '_'): // TODO: descend given directory + break; + case TAG('D', 'E', 'N', 'D'): // TODO: ascend path + break; + default: + // unknown tag + break; + } + } while(!feof(in)); + return list; +} + +const fmt_desc_t dsnpk_fmt = { + "dsnpk", + "NPK (Drakensang)", + "NPK (*.npk)", + "*.npk", + check_file, + get_list, + default_free_list, + default_extract_file, + default_extract_mem, +}; Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-08-23 11:21:10 UTC (rev 108) +++ trunk/extractor/extractor.c 2008-08-23 11:21:39 UTC (rev 109) @@ -19,6 +19,7 @@ //! brief NULL-terminated array of supported formats const fmt_desc_t * const fmts[] = { &bloodrayne_fmt, + &dsnpk_fmt, &generic_fmt, &homeworld2_fmt, &nwn_fmt, Modified: trunk/extractor/formats.h =================================================================== --- trunk/extractor/formats.h 2008-08-23 11:21:10 UTC (rev 108) +++ trunk/extractor/formats.h 2008-08-23 11:21:39 UTC (rev 109) @@ -27,6 +27,7 @@ } fmt_desc_t; extern const fmt_desc_t bloodrayne_fmt; +extern const fmt_desc_t dsnpk_fmt; extern const fmt_desc_t generic_fmt; extern const fmt_desc_t homeworld2_fmt; extern const fmt_desc_t nwn_fmt; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |