[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.
|