X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=filematch.c;h=1f5b1395934eaea0593c4da05ce37d849fe10b70;hb=7114d518a61fdde372146e27437ba6be5bf2797b;hp=bb5a942d982312a1525d337b8e41aacd1b144cfd;hpb=c7a8692c9ec712226c377c06ae013f5727c3b470;p=xonotic%2Fdarkplaces.git diff --git a/filematch.c b/filematch.c index bb5a942d..1f5b1395 100644 --- a/filematch.c +++ b/filematch.c @@ -4,6 +4,11 @@ // 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); +} + +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,18 +18,21 @@ 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(wildcard_least_one) + if (*in == 0 || strchr(separators, *in)) + return 0; // no match if (!*in) return 1; // match pattern++; while (*in) { - if (*in == '/' || *in == '\\' || *in == ':') + if (strchr(separators, *in)) break; // see if pattern matches at this offset if (matchpattern(in, pattern, caseinsensitive)) @@ -76,6 +84,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) @@ -119,24 +128,25 @@ 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 *path, const char *name) { if (strcmp(name, ".") && strcmp(name, "..")) { - char fullpath[MAX_OSPATH]; - dpsnprintf (fullpath, sizeof (fullpath), "%s%s", path, name); - stringlistappend(list, fullpath); + 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 ? 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); @@ -155,11 +165,13 @@ 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 ? path : "./" ); + dpsnprintf(fullpath, sizeof(fullpath), "%s%s", basepath, *path ? path : "./"); + dir = opendir(fullpath); if (!dir) return; while ((ent = readdir(dir)))