X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=filematch.c;h=4bacbc15a1704029ff223c09b98a8c369bff8bf1;hb=c2fce368682ff4578dc47cfb4d7efe6d1284be8b;hp=2a22cb0ff3a22df6eb17920682d8e4977d4d7f3f;hpb=c8da47e131e620b5a1d611ed10450985c8c2e2c5;p=xonotic%2Fdarkplaces.git diff --git a/filematch.c b/filematch.c index 2a22cb0f..4bacbc15 100644 --- a/filematch.c +++ b/filematch.c @@ -1,9 +1,22 @@ +#ifdef WIN32 +#include +#else +#include +#endif + #include "quakedef.h" // LordHavoc: some portable directory listing code I wrote for lmp2pcx, now used in darkplaces to load id1/*.pak and such... int matchpattern(const char *in, const char *pattern, int caseinsensitive) +{ + return matchpattern_with_separator(in, pattern, caseinsensitive, "/\\:", false); +} + +// wildcard_least_one: if true * matches 1 or more characters +// if false * matches 0 or more characters +int matchpattern_with_separator(const char *in, const char *pattern, int caseinsensitive, const char *separators, qboolean wildcard_least_one) { int c1, c2; while (*pattern) @@ -13,21 +26,25 @@ int matchpattern(const char *in, const char *pattern, int caseinsensitive) case 0: return 1; // end of pattern case '?': // match any single character - if (*in == 0 || *in == '/' || *in == '\\' || *in == ':') + if (*in == 0 || strchr(separators, *in)) return 0; // no match in++; pattern++; break; case '*': // match anything until following string - if (!*in) - return 1; // match + if(wildcard_least_one) + { + if (*in == 0 || strchr(separators, *in)) + return 0; // no match + in++; + } pattern++; while (*in) { - if (*in == '/' || *in == '\\' || *in == ':') + if (strchr(separators, *in)) break; // see if pattern matches at this offset - if (matchpattern(in, pattern, caseinsensitive)) + if (matchpattern_with_separator(in, pattern, caseinsensitive, separators, wildcard_least_one)) return 1; // nope, advance to next offset in++; @@ -76,6 +93,7 @@ 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) @@ -87,14 +105,14 @@ void stringlistappend(stringlist_t *list, const char *text) { oldstrings = list->strings; list->maxstrings += 4096; - list->strings = Z_Malloc(list->maxstrings * sizeof(*list->strings)); + list->strings = (char **) Z_Malloc(list->maxstrings * sizeof(*list->strings)); if (list->numstrings) memcpy(list->strings, oldstrings, list->numstrings * sizeof(*list->strings)); if (oldstrings) Z_Free(oldstrings); } textlen = strlen(text) + 1; - list->strings[list->numstrings] = Z_Malloc(textlen); + list->strings[list->numstrings] = (char *) Z_Malloc(textlen); memcpy(list->strings[list->numstrings], text, textlen); list->numstrings++; } @@ -119,31 +137,33 @@ void stringlistsort(stringlist_t *list) } // operating system specific code -static void adddirentry(stringlist_t *list, const char *name) +static void adddirentry(stringlist_t *list, const char *path, const char *name) { if (strcmp(name, ".") && strcmp(name, "..")) { - stringlistappend(list, 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)); + WIN32_FIND_DATA n_file; + HANDLE hFile; + 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) + hFile = FindFirstFile(pattern, &n_file); + if(hFile == INVALID_HANDLE_VALUE) return; do { - adddirentry(list, n_file.name ); - } while (_findnext(hFile, &n_file) == 0); - _findclose(hFile); + adddirentry(list, path, n_file.cFileName); + } while (FindNextFile(hFile, &n_file) != 0); + FindClose(hFile); // convert names to lowercase because windows does not care, but pattern matching code often does for (i = 0;i < list->numstrings;i++) @@ -152,16 +172,17 @@ void listdirectory(stringlist_t *list, const char *path) *c += 'a' - 'A'; } #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))) - adddirentry(list, ent->d_name); + adddirentry(list, path, ent->d_name); closedir(dir); } #endif