Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/lib/libc/gen/fnmatch.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -p -r1.2 -r1.3 --- src/lib/libc/gen/fnmatch.c 1993/04/10 00:25:35 1.2 +++ src/lib/libc/gen/fnmatch.c 1993/06/16 17:16:13 1.3 @@ -35,112 +35,116 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)fnmatch.c 5.4 (Berkeley) 2/23/91"; +static char sccsid[] = "@(#)fnmatch.c 5.6 (Berkeley) 6/28/92"; #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. */ -#include +#include #include #define EOS '\0' -static char * -rangematch(pattern, test) - register char *pattern, test; -{ - register char c, c2; - int negate, ok; - - if (negate = (*pattern == '!')) - ++pattern; - - /* - * TO DO: quoting - */ - - for (ok = 0; (c = *pattern++) != ']';) { - if (c == EOS) - return(NULL); /* illegal pattern */ - if (*pattern == '-' && (c2 = pattern[1]) != EOS && c2 != ']') { - if (c <= test && test <= c2) - ok = 1; - pattern += 2; - } - else if (c == test) - ok = 1; - } - return(ok == negate ? NULL : pattern); -} +static const char *rangematch __P((const char *, int)); fnmatch(pattern, string, flags) - register const char *pattern; - register const char *string; + register const char *pattern, *string; int flags; { register char c; - char test, *rangematch(); + char test; for (;;) switch (c = *pattern++) { case EOS: - return(!(*string == EOS)); + return (*string == EOS ? 0 : FNM_NOMATCH); case '?': - if (((test = *string++) == EOS) || - ((test == '/') && (flags & FNM_PATHNAME))) - return(1); + if ((test = *string++) == EOS || + test == '/' && flags & FNM_PATHNAME) + return (FNM_NOMATCH); break; case '*': c = *pattern; - /* collapse multiple stars */ + /* Collapse multiple stars. */ 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) - return(index(string, '/') != NULL); + return (index(string, '/') == NULL ? + 0 : FNM_NOMATCH); else - return(0); - else if ((c == '/') && (flags & FNM_PATHNAME)) { + return (0); + else if (c == '/' && flags & FNM_PATHNAME) { if ((string = index(string, '/')) == NULL) - return(1); + return (FNM_NOMATCH); break; } - /* general case, use recursion */ + /* General case, use recursion. */ while ((test = *string) != EOS) { if (!fnmatch(pattern, string, flags)) - return(0); + return (0); if (test == '/' && flags & FNM_PATHNAME) break; ++string; } - return(1); + return (FNM_NOMATCH); case '[': if ((test = *string++) == EOS || test == '/' && flags & FNM_PATHNAME) - return(1); + return (FNM_NOMATCH); if ((pattern = rangematch(pattern, test)) == NULL) - return(1); + return (FNM_NOMATCH); break; case '\\': - if (flags & FNM_QUOTE) { + if (!(flags & FNM_NOESCAPE)) { if ((c = *pattern++) == EOS) { c = '\\'; --pattern; } if (c != *string++) - return(1); + return (FNM_NOMATCH); break; } /* FALLTHROUGH */ default: if (c != *string++) - return(1); + return (FNM_NOMATCH); break; } + /* NOTREACHED */ +} + +static const char * +rangematch(pattern, test) + register const char *pattern; + register int test; +{ + register char c, c2; + int negate, ok; + + if (negate = (*pattern == '!')) + ++pattern; + + /* + * XXX + * TO DO: quoting + */ + for (ok = 0; (c = *pattern++) != ']';) { + if (c == EOS) + return (NULL); /* Illegal pattern. */ + if (*pattern == '-' && (c2 = pattern[1]) != EOS && c2 != ']') { + if (c <= test && test <= c2) + ok = 1; + pattern += 2; + } + else if (c == test) + ok = 1; + } + return (ok == negate ? NULL : pattern); }