]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - filematch.c
fix some bugs with r_fullbright, no lights, and other such cases
[xonotic/darkplaces.git] / filematch.c
index 9ac649134b57beb5d40dce1eb8b2185ba787e3fe..ff243476bc1a208e5e1b90b686e4688a50a89011 100644 (file)
@@ -3,8 +3,9 @@
 
 // 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)
@@ -39,7 +40,18 @@ int matchpattern(char *in, char *pattern)
                        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;
@@ -113,7 +125,7 @@ stringlist_t *stringlistsort(stringlist_t *start)
 #include <io.h>
 stringlist_t *listdirectory(char *path)
 {
-       char pattern[4096];
+       char pattern[4096], *c;
        struct _finddata_t n_file;
     long hFile;
        stringlist_t *start, *current;
@@ -129,8 +141,16 @@ stringlist_t *listdirectory(char *path)
                while (_findnext(hFile, &n_file) == 0)
                        current = stringlistappend(current, n_file.name);
                _findclose(hFile);
+
+               // convert names to lowercase because windows does not care, but pattern matching code often does
+               for (current = start;current;current = current->next)
+                       for (c = current->text;*c;c++)
+                               if (*c >= 'A' && *c <= 'Z')
+                                       *c += 'a' - 'A';
+
                // sort the list alphanumerically
-               return stringlistsort(start);
+               start = stringlistsort(start);
+               return start;
        }
        else
                return NULL;