[Extractor-gtk-cvslog] SF.net SVN: extractor-gtk:[87] trunk/extractor/nwn.c
Extract files from unusual archive formats
Brought to you by:
someone-guy
|
From: <som...@us...> - 2008-08-22 16:03:59
|
Revision: 87
http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=87&view=rev
Author: someone-guy
Date: 2008-08-22 16:03:53 +0000 (Fri, 22 Aug 2008)
Log Message:
-----------
NWN2 support, hopefully more reliable type detection
Modified Paths:
--------------
trunk/extractor/nwn.c
Modified: trunk/extractor/nwn.c
===================================================================
--- trunk/extractor/nwn.c 2008-08-22 16:03:31 UTC (rev 86)
+++ trunk/extractor/nwn.c 2008-08-22 16:03:53 UTC (rev 87)
@@ -24,12 +24,14 @@
static file_t *get_list(FILE *in) {
file_t *list;
uint32_t count, namepos, tblpos;
+ int version = 0;
int namelen = 16;
int i;
char sig[9] = {0};
rewind(in);
fread(sig, 8, 1, in);
- if (strcmp(sig, "MOD V1.1") == 0) namelen = 32;
+ if (strcmp(sig, "MOD V1.1") == 0) version = 1;
+ if (version) namelen = 32;
fseek(in, 0x10, SEEK_SET);
count = read_le32(in);
if (count > MAX_FILES) count = MAX_FILES;
@@ -48,20 +50,40 @@
fseek(in, tblpos + 8 * i, SEEK_SET);
list[i].start = read_le32(in);
list[i].len = read_le32(in);
- if (type_id == 0x7d9) // script source
- strcat(list[i].name, ".nss");
- else { // generate extension from content start
- char *ptr = &list[i].name[strlen(list[i].name)];
- fseek(in, list[i].start, SEEK_SET);
- *ptr++ = '.';
- fread(ptr, 3, 1, in);
- *ptr = tolower(*ptr);
- ptr++;
- *ptr = tolower(*ptr);
- ptr++;
- *ptr = tolower(*ptr);
- ptr++;
- *ptr = 0;
+ switch (type_id) {
+ case 0x07d9: // script source
+ strcat(list[i].name, ".nss");
+ break;
+ case 0x0bcd: // visual sourcesafe stuff??
+ strcat(list[i].name, ".vss");
+ break;
+ case 0x0000:
+ case 0x0bc1:
+ case 0x0bc3:
+ case 0x0bca:
+ case 0x0bbe:
+ case 0x0bbf: // effect xml files?
+ strcat(list[i].name, ".xml");
+ break;
+ case 0x0003: // act start image
+ strcat(list[i].name, ".img");
+ break;
+ default:
+ {
+ // generate extension from content start
+ char *ptr = &list[i].name[strlen(list[i].name)];
+ fseek(in, list[i].start, SEEK_SET);
+ *ptr++ = '.';
+ fread(ptr, 3, 1, in);
+ *ptr = tolower(*ptr);
+ ptr++;
+ *ptr = tolower(*ptr);
+ ptr++;
+ *ptr = tolower(*ptr);
+ ptr++;
+ *ptr = 0;
+ break;
+ }
}
}
return list;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|