diff options
Diffstat (limited to 'c/src/lib/libbsp/arm/nds/tools/ndstool/source/ndsextract.cpp')
-rw-r--r-- | c/src/lib/libbsp/arm/nds/tools/ndstool/source/ndsextract.cpp | 288 |
1 files changed, 0 insertions, 288 deletions
diff --git a/c/src/lib/libbsp/arm/nds/tools/ndstool/source/ndsextract.cpp b/c/src/lib/libbsp/arm/nds/tools/ndstool/source/ndsextract.cpp deleted file mode 100644 index 204d5bb47c..0000000000 --- a/c/src/lib/libbsp/arm/nds/tools/ndstool/source/ndsextract.cpp +++ /dev/null @@ -1,288 +0,0 @@ -#include "ndstool.h" -#include "overlay.h" -#include <errno.h> - -/* - * MkDir - */ -void MkDir(char *name) -{ -#ifdef __MINGW32__ - if (mkdir(name)) -#else - if (mkdir(name, S_IRWXU)) -#endif - { - if (errno != EEXIST) - { - fprintf(stderr, "Cannot create directory '%s'.\n", name); - exit(1); - } - } -} - -/* - * ExtractFile - * if rootdir==0 nothing will be written - */ -void ExtractFile(char *rootdir, const char *prefix, char *entry_name, unsigned int file_id) -{ - unsigned int save_filepos = ftell(fNDS); - - // read FAT data - fseek(fNDS, header.fat_offset + 8*file_id, SEEK_SET); - unsigned_int top; - fread(&top, 1, sizeof(top), fNDS); - unsigned_int bottom; - fread(&bottom, 1, sizeof(bottom), fNDS); - unsigned int size = bottom - top; - if (size > (1U << (17 + header.devicecap))) { fprintf(stderr, "File %u: Size is too big. FAT offset 0x%X contains invalid data.\n", file_id, header.fat_offset + 8*file_id); exit(1); } - - // print file info - if (!rootdir || verbose) - { - printf("%5u 0x%08X 0x%08X %9u %s%s\n", file_id, (int)top, (int)bottom, size, prefix, entry_name); - } - - // extract file - if (rootdir) - { - // make filename - char filename[MAXPATHLEN]; - strcpy(filename, rootdir); - strcat(filename, prefix); - strcat(filename, entry_name); - - fseek(fNDS, top, SEEK_SET); - FILE *fo = fopen(filename, "wb"); - if (!fo) { fprintf(stderr, "Cannot create file '%s'.\n", filename); exit(1); } - while (size > 0) - { - unsigned char copybuf[1024]; - unsigned int size2 = (size >= sizeof(copybuf)) ? sizeof(copybuf) : size; - fread(copybuf, 1, size2, fNDS); - fwrite(copybuf, 1, size2, fo); - size -= size2; - } - fclose(fo); - } - - fseek(fNDS, save_filepos, SEEK_SET); -} - -/* - * MatchName - */ -bool MatchName(char *name, char *mask, int level=0) -{ - char *a = name; - char *b = mask; - //for (int i=0; i<level; i++) printf(" "); printf("matching a='%s' b='%s'\n", a, b); - while (1) - { - //for (int i=0; i<level; i++) printf("a=%s b=%s\n", a, b); - if (*b == '*') - { - while (*b == '*') b++; - //for (int i=0; i<level; i++) printf(" "); printf("* '%s' '%s'\n", a, b); - bool match = false; - char *a2 = a; - do - { - if (MatchName(a2, b, level+1)) { a = a2; match = true; break; } - } while (*a2++); - if (!match) return false; - //for (int i=0; i<level; i++) printf(" "); printf("matched a='%s' b='%s'\n", a, b); - } - //for (int i=0; i<level; i++) printf(" "); printf("a=%s b=%s\n", a, b); - if (!*a && !*b) return true; - if (*a && !*b) return false; - if (!*a && *b) return false; - if (*b != '?' && *a != *b) return false; - a++; b++; - } -} - -/* - * ExtractDirectory - * filerootdir can be 0 for just listing files - */ -void ExtractDirectory(const char *prefix, unsigned int dir_id) -{ - char strbuf[MAXPATHLEN]; - unsigned int save_filepos = ftell(fNDS); - - fseek(fNDS, header.fnt_offset + 8*(dir_id & 0xFFF), SEEK_SET); - unsigned_int entry_start; // reference location of entry name - fread(&entry_start, 1, sizeof(entry_start), fNDS); - unsigned_short top_file_id; // file ID of top entry - fread(&top_file_id, 1, sizeof(top_file_id), fNDS); - unsigned_short parent_id; // ID of parent directory or directory count (root) - fread(&parent_id, 1, sizeof(parent_id), fNDS); - - fseek(fNDS, header.fnt_offset + entry_start, SEEK_SET); - - // print directory name - //printf("%04X ", dir_id); - if (!filerootdir || verbose) - { - printf("%s\n", prefix); - } - - for (unsigned int file_id=top_file_id; ; file_id++) - { - unsigned char entry_type_name_length; - fread(&entry_type_name_length, 1, sizeof(entry_type_name_length), fNDS); - unsigned int name_length = entry_type_name_length & 127; - bool entry_type_directory = (entry_type_name_length & 128) ? true : false; - if (name_length == 0) break; - - char entry_name[128]; - memset(entry_name, 0, 128); - fread(entry_name, 1, entry_type_name_length & 127, fNDS); - if (entry_type_directory) - { - unsigned_short dir_id; - fread(&dir_id, 1, sizeof(dir_id), fNDS); - - if (filerootdir) - { - strcpy(strbuf, filerootdir); - strcat(strbuf, prefix); - strcat(strbuf, entry_name); - MkDir(strbuf); - } - - strcpy(strbuf, prefix); - strcat(strbuf, entry_name); - strcat(strbuf, "/"); - ExtractDirectory(strbuf, dir_id); - } - else - { - if (1) - { - bool match = (filemask_num == 0); - for (int i=0; i<filemask_num; i++) - { - //printf("%s %s\n", entry_name, filemasks[i]); - if (MatchName(entry_name, filemasks[i])) { match = true; break; } - } - - //if (!directorycreated) - //{ - //} - - //printf("%d\n", match); - - if (match) ExtractFile(filerootdir, prefix, entry_name, file_id); - } - } - } - - fseek(fNDS, save_filepos, SEEK_SET); -} - -/* - * ExtractFiles - */ -void ExtractFiles(char *ndsfilename) -{ -//printf("%d\n", MatchName("hello", "h*el*lo")); exit(0); // TEST - fNDS = fopen(ndsfilename, "rb"); - if (!fNDS) { fprintf(stderr, "Cannot open file '%s'.\n", ndsfilename); exit(1); } - fread(&header, 512, 1, fNDS); - - if (filerootdir) - { - MkDir(filerootdir); - } - - ExtractDirectory("/", 0xF000); // list or extract - - fclose(fNDS); -} - -/* - * ExtractOverlayFiles2 - */ - void ExtractOverlayFiles2(unsigned int overlay_offset, unsigned int overlay_size) - { - OverlayEntry overlayEntry; - - if (overlay_size) - { - fseek(fNDS, overlay_offset, SEEK_SET); - for (unsigned int i=0; i<overlay_size; i+=sizeof(OverlayEntry)) - { - fread(&overlayEntry, 1, sizeof(overlayEntry), fNDS); - char s[32]; sprintf(s, OVERLAY_FMT, overlayEntry.file_id); - ExtractFile(overlaydir, "/", s, overlayEntry.file_id); - } - } -} - -/* - * ExtractOverlayFiles - */ -void ExtractOverlayFiles() -{ - fNDS = fopen(ndsfilename, "rb"); - if (!fNDS) { fprintf(stderr, "Cannot open file '%s'.\n", ndsfilename); exit(1); } - fread(&header, 512, 1, fNDS); - - if (overlaydir) - { - MkDir(overlaydir); - } - - ExtractOverlayFiles2(header.arm9_overlay_offset, header.arm9_overlay_size); - ExtractOverlayFiles2(header.arm7_overlay_offset, header.arm7_overlay_size); - - fclose(fNDS); -} - -/* - * Extract - */ -void Extract(char *outfilename, bool indirect_offset, unsigned int offset, bool indirect_size, unsigned size, bool with_footer) -{ - fNDS = fopen(ndsfilename, "rb"); - if (!fNDS) { fprintf(stderr, "Cannot open file '%s'.\n", ndsfilename); exit(1); } - fread(&header, 512, 1, fNDS); - - if (indirect_offset) offset = *((unsigned int *)&header + offset/4); - if (indirect_size) size = *((unsigned int *)&header + size/4); - - fseek(fNDS, offset, SEEK_SET); - - FILE *fo = fopen(outfilename, "wb"); - if (!fo) { fprintf(stderr, "Cannot create file '%s'.\n", outfilename); exit(1); } - - unsigned char copybuf[1024]; - while (size > 0) - { - unsigned int size2 = (size >= sizeof(copybuf)) ? sizeof(copybuf) : size; - fread(copybuf, 1, size2, fNDS); - fwrite(copybuf, 1, size2, fo); - size -= size2; - } - - if (with_footer) - { - unsigned_int nitrocode; - fread(&nitrocode, sizeof(nitrocode), 1, fNDS); - if (nitrocode == 0xDEC00621) - { - // 0x2106C0DE, version info, reserved? - for (int i=0; i<3; i++) // write additional 3 words - { - fwrite(&nitrocode, sizeof(nitrocode), 1, fo); - fread(&nitrocode, sizeof(nitrocode), 1, fNDS); // next field - } - } - } - - fclose(fo); - fclose(fNDS); -} |