#define _CRT_SECURE_NO_DEPRECATE #include #include #include #include #include void dumplumpent(FILE *f) { unsigned int unk1, namelen; char *name = NULL; unsigned int unk2, unk3, unk4, unk5, unk6, unk7, datalen; unsigned char *data = NULL; unsigned short term; FILE *fo; int i; fread(&unk1, 4, 1, f); fread(&namelen, 4, 1, f); if(namelen) { name = malloc(namelen + 1); fread(name, namelen, 1, f); name[namelen] = 0; } fread(&unk2, 4, 1, f); fread(&unk3, 4, 1, f); fread(&unk4, 4, 1, f); fread(&unk5, 4, 1, f); fread(&unk6, 4, 1, f); fread(&unk7, 4, 1, f); fread(&datalen, 4, 1, f); if(datalen) { data = malloc(datalen); fread(data, datalen, 1, f); } fread(&term, 2, 1, f); printf("unk1 %08X, unk2 %08X, unk3 %08X, unk4 %08X, unk5 %08X, unk6 %08X, unk7 %08X, term %04X, datalen %08X, name %s\n", \ unk1, unk2, unk3, unk4, unk5, unk6, unk7, term, datalen, name); if(name) { for(i = 0; i < (int)strlen(name); i++) { if(name[i] == '/') { name[i] = 0; _mkdir(name); name[i] = '/'; } } fo = fopen(name, "wb"); if(fo) { if(data) fwrite(data, datalen, 1, fo); fclose(fo); } } if(name) free(name); if(data) free(data); return; } void dumplumphdr(FILE *f) { int lumpnum, lumpnamelen; char *lumpname = NULL; int numentries; int i; fread(&lumpnum, 4, 1, f); fread(&lumpnamelen, 4, 1, f); if(lumpnamelen) { lumpname = malloc(lumpnamelen + 1); fread(lumpname, lumpnamelen, 1, f); lumpname[lumpnamelen] = 0; } fread(&numentries, 4, 1, f); printf("lumpnum %08X, numentries %08X, lumpnamelen %08X, lumpname %s\n", lumpnum, numentries, lumpnamelen, lumpname); for(i = 0; i < numentries; i++) dumplumpent(f); } void dumplump(const char *filename) { FILE *f; int flen; f = fopen(filename, "rb"); fseek(f, 0, SEEK_END); flen = ftell(f); fseek(f, 0, SEEK_SET); printf("%s\n", filename); dumplumphdr(f); printf("\n"); fclose(f); } int main(int argc, char **argv) { char filenamebuf[512]; WIN32_FIND_DATA fd; HANDLE h; int i, hasnumext; h = FindFirstFile("data\\lump\\*", &fd); if(h == INVALID_HANDLE_VALUE) return 2; do { hasnumext = 0; for(i = (int)strlen(fd.cFileName) - 1; i >= 0; i--) { if(fd.cFileName[i] >= '0' && fd.cFileName[i] <= '9') { if(hasnumext == 0 || hasnumext == 1) { hasnumext = 1; } else { hasnumext = -1; break; } } else if(fd.cFileName[i] == '.') { if(hasnumext == 1) { hasnumext = 2; break; } else { hasnumext = -2; break; } } else { hasnumext = -3; break; } } sprintf(filenamebuf, "data/lump/%s", fd.cFileName); if(hasnumext == 2) { dumplump(filenamebuf); } else { printf("skipping %s\n", fd.cFileName); } } while(FindNextFile(h, &fd)); FindClose(h); return 0; }