]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/filematch.c
allow undo “make detail/structural”, <3 @SpiKe, thanks @Garux, fix #76
[xonotic/netradiant.git] / libs / filematch.c
index f3e3ea443e3eece3b9c09f4aa3532a0719f3eba0..5b01db735b770a40ef291c32b68ff2ecb768c3af 100644 (file)
@@ -1,68 +1,74 @@
-#include "matchpattern.h"
+#include <string.h>
+#include "filematch.h"
 
 // LordHavoc: some portable directory listing code I wrote for lmp2pcx, now used in darkplaces to load id1/*.pak and such...
 
-int matchpattern(const char *in, const char *pattern, int caseinsensitive)
-{
-       return matchpattern_with_separator(in, pattern, caseinsensitive, "/\\:", false);
+int matchpattern( const char *in, const char *pattern, int caseinsensitive ){
+       return matchpattern_with_separator( in, pattern, caseinsensitive, "/\\:", 0 );
 }
 
 // wildcard_least_one: if true * matches 1 or more characters
 //                     if false * matches 0 or more characters
-int matchpattern_with_separator(const char *in, const char *pattern, int caseinsensitive, const char *separators, int wildcard_least_one)
-{
+int matchpattern_with_separator( const char *in, const char *pattern, int caseinsensitive, const char *separators, int wildcard_least_one ){
        int c1, c2;
-       while (*pattern)
+       while ( *pattern )
        {
-               switch (*pattern)
+               switch ( *pattern )
                {
                case 0:
                        return 1; // end of pattern
                case '?': // match any single character
-                       if (*in == 0 || strchr(separators, *in))
+                       if ( *in == 0 || strchr( separators, *in ) ) {
                                return 0; // no match
+                       }
                        in++;
                        pattern++;
                        break;
                case '*': // match anything until following string
-                       if(wildcard_least_one)
-                       {
-                               if (*in == 0 || strchr(separators, *in))
+                       if ( wildcard_least_one ) {
+                               if ( *in == 0 || strchr( separators, *in ) ) {
                                        return 0; // no match
+                               }
                                in++;
                        }
                        pattern++;
-                       while (*in)
+                       while ( *in )
                        {
-                               if (strchr(separators, *in))
+                               if ( strchr( separators, *in ) ) {
                                        break;
+                               }
                                // see if pattern matches at this offset
-                               if (matchpattern_with_separator(in, pattern, caseinsensitive, separators, wildcard_least_one))
+                               if ( matchpattern_with_separator( in, pattern, caseinsensitive, separators, wildcard_least_one ) ) {
                                        return 1;
+                               }
                                // nope, advance to next offset
                                in++;
                        }
                        break;
                default:
-                       if (*in != *pattern)
-                       {
-                               if (!caseinsensitive)
+                       if ( *in != *pattern ) {
+                               if ( !caseinsensitive ) {
                                        return 0; // no match
+                               }
                                c1 = *in;
-                               if (c1 >= 'A' && c1 <= 'Z')
+                               if ( c1 >= 'A' && c1 <= 'Z' ) {
                                        c1 += 'a' - 'A';
+                               }
                                c2 = *pattern;
-                               if (c2 >= 'A' && c2 <= 'Z')
+                               if ( c2 >= 'A' && c2 <= 'Z' ) {
                                        c2 += 'a' - 'A';
-                               if (c1 != c2)
+                               }
+                               if ( c1 != c2 ) {
                                        return 0; // no match
+                               }
                        }
                        in++;
                        pattern++;
                        break;
                }
        }
-       if (*in)
+       if ( *in ) {
                return 0; // reached end of pattern but not end of input
+       }
        return 1; // success
 }