]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - filematch.c
fix incompatible types warnings (and change pointer_* fields back to void *)
[xonotic/darkplaces.git] / filematch.c
index ff243476bc1a208e5e1b90b686e4688a50a89011..a4f670f9732b5b906a9e227be050bb6712d1765a 100644 (file)
@@ -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 <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)
@@ -157,7 +152,7 @@ stringlist_t *listdirectory(char *path)
 }
 #else
 #include <dirent.h>
-stringlist_t *listdirectory(char *path)
+stringlist_t *listdirectory(const char *path)
 {
        DIR *dir;
        struct dirent *ent;