X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=filematch.c;h=e4a81fdbc23942df27e3398feeccb65f86035fdc;hb=4d4b99bc56915c31fdd88790ac329d125a75a308;hp=9e0eceafdf3c2726d8e50bc1f9bc58d1f467b4f4;hpb=e76cee9d87cd85055a93db1e520f47f43241cc0d;p=xonotic%2Fdarkplaces.git diff --git a/filematch.c b/filematch.c index 9e0eceaf..e4a81fdb 100644 --- a/filematch.c +++ b/filematch.c @@ -3,14 +3,17 @@ // LordHavoc: some portable directory listing code I wrote for lmp2pcx, now used in darkplaces to load id1/*.pak and such... -int matchpattern(char *in, char *pattern) +int matchpattern(char *in, char *pattern, int caseinsensitive) { + int c1, c2; while (*pattern) { 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++; @@ -18,28 +21,32 @@ int matchpattern(char *in, char *pattern) 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: if (*in != *pattern) - return 0; // no match + { + if (!caseinsensitive) + return 0; // no match + c1 = *in; + if (c1 >= 'A' && c1 <= 'Z') + c1 += 'a' - 'A'; + c2 = *pattern; + if (c2 >= 'A' && c2 <= 'Z') + c2 += 'a' - 'A'; + if (c1 != c2) + return 0; // no match + } in++; pattern++; break; @@ -117,8 +124,8 @@ stringlist_t *listdirectory(char *path) 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)