X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=filematch.c;h=a4f670f9732b5b906a9e227be050bb6712d1765a;hb=d3ce8008cff1349ff9fe884d75f0f5bac3a5f872;hp=ff243476bc1a208e5e1b90b686e4688a50a89011;hpb=f2f57632842a5978151c1dfb081872923d37389c;p=xonotic%2Fdarkplaces.git diff --git a/filematch.c b/filematch.c index ff243476..a4f670f9 100644 --- a/filematch.c +++ b/filematch.c @@ -10,8 +10,10 @@ int matchpattern(char *in, char *pattern, int caseinsensitive) { switch (*pattern) { + case 0: + return 1; // end of pattern case '?': // match any single character - if (!*in) + if (*in == 0 || *in == '/' || *in == '\\' || *in == ':') return 0; // no match in++; pattern++; @@ -19,23 +21,16 @@ int matchpattern(char *in, char *pattern, int caseinsensitive) case '*': // match anything until following string if (!*in) return 1; // match - while (*pattern == '*') - pattern++; - if (*pattern == '?') - { - // *? (weird) - break; - } - else if (*pattern) - { - // *text (typical) - while (*in && *in != *pattern) - in++; - } - else + pattern++; + while (*in) { - // *null (* at end of pattern) - return 1; + if (*in == '/' || *in == '\\' || *in == ':') + break; + // see if pattern matches at this offset + if (matchpattern(in, pattern, caseinsensitive)) + return 1; + // nope, advance to next offset + in++; } break; default: @@ -123,14 +118,14 @@ stringlist_t *stringlistsort(stringlist_t *start) // operating system specific code #ifdef WIN32 #include -stringlist_t *listdirectory(char *path) +stringlist_t *listdirectory(const char *path) { char pattern[4096], *c; struct _finddata_t n_file; long hFile; stringlist_t *start, *current; - strcpy(pattern, path); - strcat(pattern, "\\*"); + strlcpy (pattern, path, sizeof (pattern)); + strlcat (pattern, "\\*", sizeof (pattern)); // ask for the directory listing handle hFile = _findfirst(pattern, &n_file); if(hFile != -1) @@ -157,7 +152,7 @@ stringlist_t *listdirectory(char *path) } #else #include -stringlist_t *listdirectory(char *path) +stringlist_t *listdirectory(const char *path) { DIR *dir; struct dirent *ent;