// 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++;
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;
// operating system specific code
#ifdef WIN32
#include <io.h>
-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)
}
#else
#include <dirent.h>
-stringlist_t *listdirectory(char *path)
+stringlist_t *listdirectory(const char *path)
{
DIR *dir;
struct dirent *ent;