diff --git a/arm9/source/filesys/fsdir.c b/arm9/source/filesys/fsdir.c index 6fb3952..a1b0240 100644 --- a/arm9/source/filesys/fsdir.c +++ b/arm9/source/filesys/fsdir.c @@ -2,7 +2,7 @@ void DirEntryCpy(DirEntry* dest, const DirEntry* orig) { memcpy(dest, orig, sizeof(DirEntry)); - dest->name = dest->path + (orig->name - orig->path); + dest->name = dest->path + dest->p_name; } int compDirEntry(const void* e1, const void* e2) { @@ -20,12 +20,6 @@ void SortDirStruct(DirStruct* contents) { // fix entry->names after qsort for (int i = 0; i < (int)contents->n_entries; i++) { DirEntry* entry = &(contents->entry[i]); - if ((entry->type == T_DIR) || (entry->type == T_FILE)) { - char* slash = strrchr(entry->path, '/'); - entry->name = slash ? slash + 1 : entry->path; - } else { - // somewhat hacky, applies to T_DOTDOT and T_ROOT (see fsdrive.c) - entry->name = entry->path + 4; - } + entry->name = entry->path + entry->p_name; } } diff --git a/arm9/source/filesys/fsdir.h b/arm9/source/filesys/fsdir.h index c4d6e18..20014ee 100644 --- a/arm9/source/filesys/fsdir.h +++ b/arm9/source/filesys/fsdir.h @@ -17,6 +17,7 @@ typedef struct { u64 size; EntryType type; u8 marked; + u8 p_name; } DirEntry; typedef struct { diff --git a/arm9/source/filesys/fsdrive.c b/arm9/source/filesys/fsdrive.c index 29a0ab0..106f22a 100644 --- a/arm9/source/filesys/fsdrive.c +++ b/arm9/source/filesys/fsdrive.c @@ -90,15 +90,17 @@ bool GetRootDirContentsWorker(DirStruct* contents) { for (u32 i = 0; (i < NORM_FS+VIRT_FS) && (n_entries < MAX_DIR_ENTRIES); i++) { DirEntry* entry = &(contents->entry[n_entries]); if (!DriveType(drvnum[i])) continue; // drive not available + entry->p_name = 4; + entry->name = entry->path + entry->p_name; memset(entry->path, 0x00, 64); - snprintf(entry->path + 0, 4, "%s", drvnum[i]); + snprintf(entry->path, 4, "%s", drvnum[i]); if ((*(drvnum[i]) >= '7') && (*(drvnum[i]) <= '9') && !(GetMountState() & IMG_NAND)) // Drive 7...9 handling - snprintf(entry->path + 4, 32, "[%s] %s", drvnum[i], + snprintf(entry->name, 32, "[%s] %s", drvnum[i], (*(drvnum[i]) == '7') ? "FAT IMAGE" : (*(drvnum[i]) == '8') ? "BONUS DRIVE" : (*(drvnum[i]) == '9') ? "RAMDRIVE" : "UNK"); else if (*(drvnum[i]) == 'G') // Game drive special handling - snprintf(entry->path + 4, 32, "[%s] %s %s", drvnum[i], + snprintf(entry->name, 32, "[%s] %s %s", drvnum[i], (GetMountState() & GAME_CIA ) ? "CIA" : (GetMountState() & GAME_NCSD ) ? "NCSD" : (GetMountState() & GAME_NCCH ) ? "NCCH" : @@ -108,9 +110,8 @@ bool GetRootDirContentsWorker(DirStruct* contents) { (GetMountState() & SYS_FIRM ) ? "FIRM" : (GetMountState() & GAME_TAD ) ? "DSIWARE" : "UNK", drvname[i]); else if (*(drvnum[i]) == '0') // SD card handling - snprintf(entry->path + 4, 32, "[%s] %s (%s)", drvnum[i], drvname[i], sdlabel); - else snprintf(entry->path + 4, 32, "[%s] %s", drvnum[i], drvname[i]); - entry->name = entry->path + 4; + snprintf(entry->name, 32, "[%s] %s (%s)", drvnum[i], drvname[i], sdlabel); + else snprintf(entry->name, 32, "[%s] %s", drvnum[i], drvname[i]); entry->size = GetTotalSpace(entry->path); entry->type = T_ROOT; entry->marked = 0; @@ -146,7 +147,8 @@ bool GetDirContentsWorker(DirStruct* contents, char* fpath, int fnsize, const ch DirEntry* entry = &(contents->entry[contents->n_entries]); strncpy(entry->path, fpath, 256); entry->path[255] = '\0'; - entry->name = entry->path + (fname - fpath); + entry->p_name = fname - fpath; + entry->name = entry->path + entry->p_name; if (fno.fattrib & AM_DIR) { entry->type = T_DIR; entry->size = 0; @@ -179,7 +181,8 @@ void SearchDirContents(DirStruct* contents, const char* path, const char* patter contents->n_entries = 0; // not required, but so what? } else { // create virtual '..' entry - contents->entry->name = contents->entry->path + 4; + contents->entry->p_name = 4; + contents->entry->name = contents->entry->path + entry->p_name; strncpy(contents->entry->path, "*?*", 4); strncpy(contents->entry->name, "..", 4); contents->entry->type = T_DOTDOT; diff --git a/arm9/source/filesys/fsgame.c b/arm9/source/filesys/fsgame.c index 6de3b59..806c568 100644 --- a/arm9/source/filesys/fsgame.c +++ b/arm9/source/filesys/fsgame.c @@ -14,8 +14,9 @@ void SetDirGoodNames(DirStruct* contents) { if ((GetGoodName(goodname, entry->path, false) != 0) || (plen + 1 + strnlen(goodname, 256) + 1 > 256)) continue; - strncpy(entry->path + plen + 1, goodname, 256 - 1 - plen - 1); - entry->name = entry->path + plen + 1; + entry->p_name = plen + 1; + entry->name = entry->path + entry->p_name; + strncpy(entry->name, goodname, 256 - 1 - entry->p_name); } }