From c8da47e131e620b5a1d611ed10450985c8c2e2c5 Mon Sep 17 00:00:00 2001 From: divverent Date: Thu, 28 Feb 2008 21:38:08 +0000 Subject: [PATCH] Reverted Black's filematch changes for now, because they were still broken and we need to release, and I don't see how to fix it. Issue: "ls *.cfg" doesn't show the cfgs from the file system, just from the pk3s (e.g. it missed config.cfg), and on Windows it even showed something even weirder: "*.cfgconfig.cfg". git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8158 d7cf8633-e32d-0410-b094-e92efae38249 --- common.h | 2 +- filematch.c | 22 +++++-------- fs.c | 95 +++++++++-------------------------------------------- menu.c | 5 ++- 4 files changed, 29 insertions(+), 95 deletions(-) diff --git a/common.h b/common.h index b5e6fc0f..1a9659a9 100644 --- a/common.h +++ b/common.h @@ -318,7 +318,7 @@ void stringlistinit(stringlist_t *list); void stringlistfreecontents(stringlist_t *list); void stringlistappend(stringlist_t *list, const char *text); void stringlistsort(stringlist_t *list); -void listdirectory(stringlist_t *list, const char *basepath, const char *path); +void listdirectory(stringlist_t *list, const char *path); char *SearchInfostring(const char *infostring, const char *key); diff --git a/filematch.c b/filematch.c index 622f774b..2a22cb0f 100644 --- a/filematch.c +++ b/filematch.c @@ -76,7 +76,6 @@ void stringlistfreecontents(stringlist_t *list) list->maxstrings = 0; if (list->strings) Z_Free(list->strings); - list->strings = NULL; } void stringlistappend(stringlist_t *list, const char *text) @@ -120,32 +119,29 @@ void stringlistsort(stringlist_t *list) } // operating system specific code -static void adddirentry(stringlist_t *list, const char *path, const char *name) +static void adddirentry(stringlist_t *list, const char *name) { if (strcmp(name, ".") && strcmp(name, "..")) { - char temp[MAX_OSPATH]; - dpsnprintf( temp, sizeof( temp ), "%s%s", path, name ); - stringlistappend(list, temp); + stringlistappend(list, name); } } #ifdef WIN32 #include -void listdirectory(stringlist_t *list, const char *basepath, const char *path) +void listdirectory(stringlist_t *list, const char *path) { int i; char pattern[4096], *c; struct _finddata_t n_file; long hFile; - strlcpy (pattern, basepath, sizeof(pattern)); - strlcat (pattern, path, sizeof (pattern)); + strlcpy (pattern, path, sizeof (pattern)); strlcat (pattern, "*", sizeof (pattern)); // ask for the directory listing handle hFile = _findfirst(pattern, &n_file); if(hFile == -1) return; do { - adddirentry(list, path, n_file.name ); + adddirentry(list, n_file.name ); } while (_findnext(hFile, &n_file) == 0); _findclose(hFile); @@ -157,17 +153,15 @@ void listdirectory(stringlist_t *list, const char *basepath, const char *path) } #else #include -void listdirectory(stringlist_t *list, const char *basepath, const char *path) +void listdirectory(stringlist_t *list, const char *path) { - char fullpath[MAX_OSPATH]; DIR *dir; struct dirent *ent; - dpsnprintf(fullpath, sizeof(fullpath), "%s%s", basepath, *path ? path : "./"); - dir = opendir(fullpath); + dir = opendir(path); if (!dir) return; while ((ent = readdir(dir))) - adddirentry(list, path, ent->d_name); + adddirentry(list, ent->d_name); closedir(dir); } #endif diff --git a/fs.c b/fs.c index 3e3820ed..73e2bd5a 100644 --- a/fs.c +++ b/fs.c @@ -960,11 +960,12 @@ 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)); stringlistinit(&list); - listdirectory(&list, "", dir); + listdirectory(&list, dir); stringlistsort(&list); // add any PAK package in the directory @@ -972,7 +973,8 @@ void FS_AddGameDirectory (const char *dir) { if (!strcasecmp(FS_FileExtension(list.strings[i]), "pak")) { - FS_AddPack_Fullpath(list.strings[i], NULL, false); + dpsnprintf (pakfile, sizeof (pakfile), "%s%s", dir, list.strings[i]); + FS_AddPack_Fullpath(pakfile, NULL, false); } } @@ -981,7 +983,8 @@ void FS_AddGameDirectory (const char *dir) { if (!strcasecmp(FS_FileExtension(list.strings[i]), "pk3")) { - FS_AddPack_Fullpath(list.strings[i], NULL, false); + dpsnprintf (pakfile, sizeof (pakfile), "%s%s", dir, list.strings[i]); + FS_AddPack_Fullpath(pakfile, NULL, false); } } @@ -1318,7 +1321,7 @@ qboolean FS_CheckGameDir(const char *gamedir) qboolean success; stringlist_t list; stringlistinit(&list); - listdirectory(&list, va("%s%s/", fs_basedir, gamedir), ""); + listdirectory(&list, va("%s%s/", fs_basedir, gamedir)); success = list.numstrings > 0; stringlistfreecontents(&list); return success; @@ -2526,6 +2529,7 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet) stringlist_t dirlist; const char *slash, *backslash, *colon, *separator; char *basepath; + char netpath[MAX_OSPATH]; char temp[MAX_OSPATH]; for (i = 0;pattern[i] == '.' || pattern[i] == ':' || pattern[i] == '/' || pattern[i] == '\\';i++) @@ -2594,80 +2598,13 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet) } else { - stringlist_t matchedSet, foundSet; - const char *start = pattern; - - stringlistinit(&matchedSet); - stringlistinit(&foundSet); - // add a first entry to the set - stringlistappend(&matchedSet, ""); - // iterate through pattern's path - while (*start) - { - const char *asterisk, *wildcard, *nextseparator, *prevseparator; - char subpath[MAX_OSPATH]; - char subpattern[MAX_OSPATH]; - - // find the next wildcard - wildcard = strchr(start, '?'); - asterisk = strchr(start, '*'); - if (asterisk && (!wildcard || asterisk < wildcard)) - { - wildcard = asterisk; - } - - if (wildcard) - { - nextseparator = strchr( wildcard, '/' ); - } - else - { - nextseparator = NULL; - } - - if( !nextseparator ) { - nextseparator = start + strlen( start ); - } - - // prevseparator points past the '/' right before the wildcard and nextseparator at the one following it (or at the end of the string) - // copy everything up except nextseperator - strlcpy(subpattern, pattern, min(sizeof(subpattern), (size_t) (nextseparator - pattern + 1))); - // find the last '/' before the wildcard - prevseparator = strrchr( subpattern, '/' ) + 1; - if (!prevseparator) - { - prevseparator = subpattern; - } - // copy everything from start to the previous including the '/' (before the wildcard) - // everything up to start is already included in the path of matchedSet's entries - strlcpy(subpath, start, min(sizeof(subpath), (size_t) ((prevseparator - subpattern) - (start - pattern) + 1))); - - // for each entry in matchedSet try to open the subdirectories specified in subpath - for( dirlistindex = 0 ; dirlistindex < matchedSet.numstrings ; dirlistindex++ ) { - strlcpy( temp, matchedSet.strings[ dirlistindex ], sizeof(temp) ); - strlcat( temp, subpath, sizeof(temp) ); - listdirectory( &foundSet, searchpath->filename, temp ); - } - if( dirlistindex == 0 ) { - break; - } - // reset the current result set - stringlistfreecontents( &matchedSet ); - // match against the pattern - for( dirlistindex = 0 ; dirlistindex < foundSet.numstrings ; dirlistindex++ ) { - const char *direntry = foundSet.strings[ dirlistindex ]; - if (matchpattern(direntry, subpattern, true)) { - stringlistappend( &matchedSet, direntry ); - } - } - stringlistfreecontents( &foundSet ); - - start = nextseparator; - } - - for (dirlistindex = 0;dirlistindex < matchedSet.numstrings;dirlistindex++) - { - const char *temp = matchedSet.strings[dirlistindex]; + // get a directory listing and look at each name + dpsnprintf(netpath, sizeof (netpath), "%s%s", searchpath->filename, basepath); + stringlistinit(&dirlist); + 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)) { for (resultlistindex = 0;resultlistindex < resultlist.numstrings;resultlistindex++) @@ -2681,7 +2618,7 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet) } } } - stringlistfreecontents( &matchedSet ); + stringlistfreecontents(&dirlist); } } diff --git a/menu.c b/menu.c index c8ffdb54..afae9ad2 100644 --- a/menu.c +++ b/menu.c @@ -4468,7 +4468,10 @@ void ModList_RebuildList(void) stringlist_t list; stringlistinit(&list); - listdirectory(&list, fs_basedir, ""); + if (fs_basedir[0]) + listdirectory(&list, fs_basedir); + else + listdirectory(&list, "./"); stringlistsort(&list); modlist_count = 0; modlist_numenabled = fs_numgamedirs; -- 2.39.2