4.4BSD snapshot (revision 8.1)
[unix-history] / usr / src / lib / libc / gen / fnmatch.c
index d9d7ee3..e9ddf34 100644 (file)
@@ -1,6 +1,6 @@
 /*
 /*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
  * Guido van Rossum.
  *
  * This code is derived from software contributed to Berkeley by
  * Guido van Rossum.
@@ -9,90 +9,95 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)fnmatch.c  5.2 (Berkeley) %G%";
+static char sccsid[] = "@(#)fnmatch.c  8.1 (Berkeley) %G%";
 #endif /* LIBC_SCCS and not lint */
 
 /*
 #endif /* LIBC_SCCS and not lint */
 
 /*
- * Function fnmatch() as proposed in Posix 1003.2 B.6 (rev. 9).
+ * Function fnmatch() as proposed in POSIX 1003.2 B.6 (D11.2).
  * Compares a filename or pathname to a pattern.
  */
 
  * Compares a filename or pathname to a pattern.
  */
 
-#include <unistd.h>
+#include <fnmatch.h>
 #include <string.h>
 
 #define        EOS     '\0'
 
 #include <string.h>
 
 #define        EOS     '\0'
 
+static const char *rangematch __P((const char *, int));
+
 fnmatch(pattern, string, flags)
 fnmatch(pattern, string, flags)
-       register char *pattern, *string;
+       register const char *pattern, *string;
        int flags;
 {
        register char c;
        int flags;
 {
        register char c;
-       char test, *rangematch();
+       char test;
 
        for (;;)
                switch (c = *pattern++) {
                case EOS:
 
        for (;;)
                switch (c = *pattern++) {
                case EOS:
-                       return(*string == EOS);
+                       return (*string == EOS ? 0 : FNM_NOMATCH);
                case '?':
                        if ((test = *string++) == EOS ||
                            test == '/' && flags & FNM_PATHNAME)
                case '?':
                        if ((test = *string++) == EOS ||
                            test == '/' && flags & FNM_PATHNAME)
-                               return(0);
+                               return (FNM_NOMATCH);
                        break;
                case '*':
                        c = *pattern;
                        break;
                case '*':
                        c = *pattern;
-                       /* collapse multiple stars */
+                       /* Collapse multiple stars. */
                        while (c == '*')
                                c = *++pattern;
 
                        while (c == '*')
                                c = *++pattern;
 
-                       /* optimize for pattern with * at end or before / */
+                       /* Optimize for pattern with * at end or before /. */
                        if (c == EOS)
                                if (flags & FNM_PATHNAME)
                        if (c == EOS)
                                if (flags & FNM_PATHNAME)
-                                       return(!index(string, '/'));
+                                       return (index(string, '/') == NULL ?
+                                           0 : FNM_NOMATCH);
                                else
                                else
-                                       return(1);
+                                       return (0);
                        else if (c == '/' && flags & FNM_PATHNAME) {
                                if ((string = index(string, '/')) == NULL)
                        else if (c == '/' && flags & FNM_PATHNAME) {
                                if ((string = index(string, '/')) == NULL)
-                                       return(0);
+                                       return (FNM_NOMATCH);
                                break;
                        }
 
                                break;
                        }
 
-                       /* general case, use recursion */
+                       /* General case, use recursion. */
                        while ((test = *string) != EOS) {
                        while ((test = *string) != EOS) {
-                               if (fnmatch(pattern, string, flags))
-                                       return(1);
+                               if (!fnmatch(pattern, string, flags))
+                                       return (0);
                                if (test == '/' && flags & FNM_PATHNAME)
                                        break;
                                ++string;
                        }
                                if (test == '/' && flags & FNM_PATHNAME)
                                        break;
                                ++string;
                        }
-                       return(0);
+                       return (FNM_NOMATCH);
                case '[':
                        if ((test = *string++) == EOS ||
                            test == '/' && flags & FNM_PATHNAME)
                case '[':
                        if ((test = *string++) == EOS ||
                            test == '/' && flags & FNM_PATHNAME)
-                               return(0);
+                               return (FNM_NOMATCH);
                        if ((pattern = rangematch(pattern, test)) == NULL)
                        if ((pattern = rangematch(pattern, test)) == NULL)
-                               return(0);
+                               return (FNM_NOMATCH);
                        break;
                case '\\':
                        break;
                case '\\':
-                       if (flags & FNM_QUOTE) {
+                       if (!(flags & FNM_NOESCAPE)) {
                                if ((c = *pattern++) == EOS) {
                                        c = '\\';
                                        --pattern;
                                }
                                if (c != *string++)
                                if ((c = *pattern++) == EOS) {
                                        c = '\\';
                                        --pattern;
                                }
                                if (c != *string++)
-                                       return(0);
+                                       return (FNM_NOMATCH);
                                break;
                        }
                        /* FALLTHROUGH */
                default:
                        if (c != *string++)
                                break;
                        }
                        /* FALLTHROUGH */
                default:
                        if (c != *string++)
-                               return(0);
+                               return (FNM_NOMATCH);
                        break;
                }
                        break;
                }
+       /* NOTREACHED */
 }
 
 }
 
-static char *
+static const char *
 rangematch(pattern, test)
 rangematch(pattern, test)
-       register char *pattern, test;
+       register const char *pattern;
+       register int test;
 {
        register char c, c2;
        int negate, ok;
 {
        register char c, c2;
        int negate, ok;
@@ -101,12 +106,12 @@ rangematch(pattern, test)
                ++pattern;
 
        /*
                ++pattern;
 
        /*
+        * XXX
         * TO DO: quoting
         */
         * TO DO: quoting
         */
-
        for (ok = 0; (c = *pattern++) != ']';) {
                if (c == EOS)
        for (ok = 0; (c = *pattern++) != ']';) {
                if (c == EOS)
-                       return(NULL);           /* illegal pattern */
+                       return (NULL);          /* Illegal pattern. */
                if (*pattern == '-' && (c2 = pattern[1]) != EOS && c2 != ']') {
                        if (c <= test && test <= c2)
                                ok = 1;
                if (*pattern == '-' && (c2 = pattern[1]) != EOS && c2 != ']') {
                        if (c <= test && test <= c2)
                                ok = 1;
@@ -115,5 +120,5 @@ rangematch(pattern, test)
                else if (c == test)
                        ok = 1;
        }
                else if (c == test)
                        ok = 1;
        }
-       return(ok == negate ? NULL : pattern);
+       return (ok == negate ? NULL : pattern);
 }
 }