diff options
Diffstat (limited to 'lib/libc/gen/fnmatch.c')
-rw-r--r-- | lib/libc/gen/fnmatch.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/lib/libc/gen/fnmatch.c b/lib/libc/gen/fnmatch.c index dc7f151..f53963a 100644 --- a/lib/libc/gen/fnmatch.c +++ b/lib/libc/gen/fnmatch.c @@ -43,12 +43,16 @@ static char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; * Compares a filename or pathname to a pattern. */ +#include <ctype.h> #include <fnmatch.h> #include <string.h> +#include <stdio.h> + +#include "collate.h" #define EOS '\0' -static const char *rangematch __P((const char *, int, int)); +static const char *rangematch __P((const char *, char, int)); int fnmatch(pattern, string, flags) @@ -61,6 +65,8 @@ fnmatch(pattern, string, flags) for (stringstart = string;;) switch (c = *pattern++) { case EOS: + if ((flags & FNM_LEADING_DIR) && *string == '/') + return (0); return (*string == EOS ? 0 : FNM_NOMATCH); case '?': if (*string == EOS) @@ -125,8 +131,15 @@ fnmatch(pattern, string, flags) } /* FALLTHROUGH */ default: - if (c != *string++) + if (c == *string) + ; + else if ((flags & FNM_CASEFOLD) && + (tolower((unsigned char)c) == + tolower((unsigned char)*string))) + ; + else return (FNM_NOMATCH); + string++; break; } /* NOTREACHED */ @@ -135,7 +148,8 @@ fnmatch(pattern, string, flags) static const char * rangematch(pattern, test, flags) const char *pattern; - int test, flags; + char test; + int flags; { int negate, ok; char c, c2; @@ -147,22 +161,35 @@ rangematch(pattern, test, flags) * consistency with the regular expression syntax. * J.T. Conklin (conklin@ngai.kaleida.com) */ - if (negate = (*pattern == '!' || *pattern == '^')) + if ( (negate = (*pattern == '!' || *pattern == '^')) ) ++pattern; - + + if (flags & FNM_CASEFOLD) + test = tolower((unsigned char)test); + for (ok = 0; (c = *pattern++) != ']';) { if (c == '\\' && !(flags & FNM_NOESCAPE)) c = *pattern++; if (c == EOS) return (NULL); - if (*pattern == '-' + + if (flags & FNM_CASEFOLD) + c = tolower((unsigned char)c); + + if (*pattern == '-' && (c2 = *(pattern+1)) != EOS && c2 != ']') { pattern += 2; if (c2 == '\\' && !(flags & FNM_NOESCAPE)) c2 = *pattern++; if (c2 == EOS) return (NULL); - if (c <= test && test <= c2) + + if (flags & FNM_CASEFOLD) + c2 = tolower((unsigned char)c2); + + if ( __collate_range_cmp(c, test) <= 0 + && __collate_range_cmp(test, c2) <= 0 + ) ok = 1; } else if (c == test) ok = 1; |