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