X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=filematch.c;h=622f774bc204fdcf680a6c066c485e77781f389f;hb=85ff1e4d0bb64c1f3d856d5ed661cc18c453db75;hp=f75ba870b7fc986cec876acd31abea40b99bc9aa;hpb=e2d477a56a27463c71dc912f29965c671b583c59;p=xonotic%2Fdarkplaces.git diff --git a/filematch.c b/filematch.c index f75ba870..622f774b 100644 --- a/filematch.c +++ b/filematch.c @@ -76,9 +76,10 @@ void stringlistfreecontents(stringlist_t *list) list->maxstrings = 0; if (list->strings) Z_Free(list->strings); + list->strings = NULL; } -void stringlistappend(stringlist_t *list, char *text) +void stringlistappend(stringlist_t *list, const char *text) { size_t textlen; char **oldstrings; @@ -108,7 +109,7 @@ void stringlistsort(stringlist_t *list) { for (j = i + 1;j < list->numstrings;j++) { - if (strcmp(list->strings[i], list->strings[j]) > 0) + if (strcasecmp(list->strings[i], list->strings[j]) > 0) { temp = list->strings[i]; list->strings[i] = list->strings[j]; @@ -119,25 +120,33 @@ 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 temp[MAX_OSPATH]; + dpsnprintf( temp, sizeof( temp ), "%s%s", path, name ); + stringlistappend(list, temp); + } +} #ifdef WIN32 #include -void listdirectory(stringlist_t *list, const char *path) +void listdirectory(stringlist_t *list, const char *basepath, const char *path) { int i; char pattern[4096], *c; struct _finddata_t n_file; long hFile; - strlcpy (pattern, path, sizeof (pattern)); + strlcpy (pattern, basepath, sizeof(pattern)); + strlcat (pattern, 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 @@ -148,16 +157,17 @@ void listdirectory(stringlist_t *list, const char *path) } #else #include -void listdirectory(stringlist_t *list, const char *path) +void listdirectory(stringlist_t *list, const char *basepath, const char *path) { + char fullpath[MAX_OSPATH]; DIR *dir; struct dirent *ent; - dir = opendir(path); + dpsnprintf(fullpath, sizeof(fullpath), "%s%s", basepath, *path ? path : "./"); + dir = opendir(fullpath); 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