From c7a8692c9ec712226c377c06ae013f5727c3b470 Mon Sep 17 00:00:00 2001 From: black Date: Thu, 14 Feb 2008 20:12:35 +0000 Subject: [PATCH] Append path in listdirectory automatically. Remove .. and . from directory listings in the Win32 code, too. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8092 d7cf8633-e32d-0410-b094-e92efae38249 --- common.h | 2 +- filematch.c | 26 ++++++++++++++++---------- fs.c | 17 +++++++---------- menu.c | 9 ++++++++- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/common.h b/common.h index d4649583..1a9659a9 100644 --- a/common.h +++ b/common.h @@ -316,7 +316,7 @@ typedef struct stringlist_s int matchpattern(const char *in, const char *pattern, int caseinsensitive); void stringlistinit(stringlist_t *list); void stringlistfreecontents(stringlist_t *list); -void stringlistappend(stringlist_t *list, char *text); +void stringlistappend(stringlist_t *list, const char *text); void stringlistsort(stringlist_t *list); void listdirectory(stringlist_t *list, const char *path); diff --git a/filematch.c b/filematch.c index eeae427d..bb5a942d 100644 --- a/filematch.c +++ b/filematch.c @@ -78,7 +78,7 @@ void stringlistfreecontents(stringlist_t *list) Z_Free(list->strings); } -void stringlistappend(stringlist_t *list, char *text) +void stringlistappend(stringlist_t *list, const char *text) { size_t textlen; char **oldstrings; @@ -119,6 +119,15 @@ void stringlistsort(stringlist_t *list) } // operating system specific code +static void adddirentry( stringlist_t *list, const char *path, const char *name ) +{ + if (strcmp(name, ".") && strcmp(name, "..")) + { + char fullpath[MAX_OSPATH]; + dpsnprintf (fullpath, sizeof (fullpath), "%s%s", path, name); + stringlistappend(list, fullpath); + } +} #ifdef WIN32 #include void listdirectory(stringlist_t *list, const char *path) @@ -127,17 +136,15 @@ void listdirectory(stringlist_t *list, const char *path) char pattern[4096], *c; struct _finddata_t n_file; long hFile; - strlcpy (pattern, path, sizeof (pattern)); + strlcpy (pattern, *path ? path : "./", sizeof (pattern)); strlcat (pattern, "*", sizeof (pattern)); // ask for the directory listing handle hFile = _findfirst(pattern, &n_file); if(hFile == -1) return; - // start a new chain with the the first name - stringlistappend(list, n_file.name); - // iterate through the directory - while (_findnext(hFile, &n_file) == 0) - stringlistappend(list, n_file.name); + do { + adddirentry(list, path, n_file.name ); + } while (_findnext(hFile, &n_file) == 0); _findclose(hFile); // convert names to lowercase because windows does not care, but pattern matching code often does @@ -152,12 +159,11 @@ void listdirectory(stringlist_t *list, const char *path) { DIR *dir; struct dirent *ent; - dir = opendir(path); + dir = opendir( *path ? path : "./" ); if (!dir) return; while ((ent = readdir(dir))) - if (strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..")) - stringlistappend(list, ent->d_name); + adddirentry(list, path, ent->d_name); closedir(dir); } #endif diff --git a/fs.c b/fs.c index eee8a47d..ad6e55b5 100644 --- a/fs.c +++ b/fs.c @@ -960,7 +960,6 @@ void FS_AddGameDirectory (const char *dir) int i; stringlist_t list; searchpath_t *search; - char pakfile[MAX_OSPATH]; strlcpy (fs_gamedir, dir, sizeof (fs_gamedir)); @@ -973,8 +972,7 @@ void FS_AddGameDirectory (const char *dir) { if (!strcasecmp(FS_FileExtension(list.strings[i]), "pak")) { - dpsnprintf (pakfile, sizeof (pakfile), "%s%s", dir, list.strings[i]); - FS_AddPack_Fullpath(pakfile, NULL, false); + FS_AddPack_Fullpath(list.strings[i], NULL, false); } } @@ -983,8 +981,7 @@ void FS_AddGameDirectory (const char *dir) { if (!strcasecmp(FS_FileExtension(list.strings[i]), "pk3")) { - dpsnprintf (pakfile, sizeof (pakfile), "%s%s", dir, list.strings[i]); - FS_AddPack_Fullpath(pakfile, NULL, false); + FS_AddPack_Fullpath(list.strings[i], NULL, false); } } @@ -2605,17 +2602,17 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet) listdirectory(&dirlist, netpath); for (dirlistindex = 0;dirlistindex < dirlist.numstrings;dirlistindex++) { - dpsnprintf(temp, sizeof(temp), "%s%s", basepath, dirlist.strings[dirlistindex]); - if (matchpattern(temp, (char *)pattern, true)) + const char *direntry = dirlist.strings[dirlistindex]; + if (matchpattern(direntry, (char *)pattern, true)) { for (resultlistindex = 0;resultlistindex < resultlist.numstrings;resultlistindex++) - if (!strcmp(resultlist.strings[resultlistindex], temp)) + if (!strcmp(resultlist.strings[resultlistindex], direntry)) break; if (resultlistindex == resultlist.numstrings) { - stringlistappend(&resultlist, temp); + stringlistappend(&resultlist, direntry); if (!quiet && developer_loading.integer) - Con_Printf("SearchDirFile: %s\n", temp); + Con_Printf("SearchDirFile: %s\n", direntry); } } } diff --git a/menu.c b/menu.c index afae9ad2..5ba0fe60 100644 --- a/menu.c +++ b/menu.c @@ -4466,12 +4466,19 @@ void ModList_RebuildList(void) { int i,j; stringlist_t list; + int basedirlength; stringlistinit(&list); if (fs_basedir[0]) + { listdirectory(&list, fs_basedir); + basedirlength = strlen( fs_basedir ); + } else + { listdirectory(&list, "./"); + basedirlength = 2; + } stringlistsort(&list); modlist_count = 0; modlist_numenabled = fs_numgamedirs; @@ -4486,7 +4493,7 @@ void ModList_RebuildList(void) if (FS_CheckNastyPath (list.strings[i], true)) continue; if (!FS_CheckGameDir(list.strings[i])) continue; - strlcpy (modlist[modlist_count].dir, list.strings[i], sizeof(modlist[modlist_count].dir)); + strlcpy (modlist[modlist_count].dir, list.strings[i] + basedirlength, sizeof(modlist[modlist_count].dir)); //check currently loaded mods modlist[modlist_count].loaded = false; if (fs_numgamedirs) -- 2.39.2