| version 1.17, 2000/01/22 22:19:10 |
version 1.18, 2000/06/28 01:13:36 |
| Line 53 __RCSID("$NetBSD$"); |
|
| Line 53 __RCSID("$NetBSD$"); |
|
| #include "namespace.h" |
#include "namespace.h" |
| |
|
| #include <assert.h> |
#include <assert.h> |
| |
#include <ctype.h> |
| #include <fnmatch.h> |
#include <fnmatch.h> |
| #include <string.h> |
#include <string.h> |
| |
|
| Line 64 __weak_alias(fnmatch,_fnmatch) |
|
| Line 65 __weak_alias(fnmatch,_fnmatch) |
|
| |
|
| static const char *rangematch __P((const char *, int, int)); |
static const char *rangematch __P((const char *, int, int)); |
| |
|
| |
static __inline int |
| |
foldcase(int ch, int flags) |
| |
{ |
| |
|
| |
if ((flags & FNM_CASEFOLD) != 0 && isupper(ch)) |
| |
return (tolower(ch)); |
| |
return (ch); |
| |
} |
| |
|
| |
#define FOLDCASE(ch, flags) foldcase((unsigned char)(ch), (flags)) |
| |
|
| int |
int |
| fnmatch(pattern, string, flags) |
fnmatch(pattern, string, flags) |
| const char *pattern, *string; |
const char *pattern, *string; |
| Line 76 fnmatch(pattern, string, flags) |
|
| Line 88 fnmatch(pattern, string, flags) |
|
| _DIAGASSERT(string != NULL); |
_DIAGASSERT(string != NULL); |
| |
|
| for (stringstart = string;;) |
for (stringstart = string;;) |
| switch (c = *pattern++) { |
switch (c = FOLDCASE(*pattern++, flags)) { |
| case EOS: |
case EOS: |
| return (*string == EOS ? 0 : FNM_NOMATCH); |
return (*string == EOS ? 0 : FNM_NOMATCH); |
| case '?': |
case '?': |
| Line 91 fnmatch(pattern, string, flags) |
|
| Line 103 fnmatch(pattern, string, flags) |
|
| ++string; |
++string; |
| break; |
break; |
| case '*': |
case '*': |
| c = *pattern; |
c = FOLDCASE(*pattern, flags); |
| /* Collapse multiple stars. */ |
/* Collapse multiple stars. */ |
| while (c == '*') |
while (c == '*') |
| c = *++pattern; |
c = FOLDCASE(*++pattern, flags); |
| |
|
| if (*string == '.' && (flags & FNM_PERIOD) && |
if (*string == '.' && (flags & FNM_PERIOD) && |
| (string == stringstart || |
(string == stringstart || |
| Line 115 fnmatch(pattern, string, flags) |
|
| Line 127 fnmatch(pattern, string, flags) |
|
| } |
} |
| |
|
| /* General case, use recursion. */ |
/* General case, use recursion. */ |
| while ((test = *string) != EOS) { |
while ((test = FOLDCASE(*string, flags)) != EOS) { |
| if (!fnmatch(pattern, string, flags & ~FNM_PERIOD)) |
if (!fnmatch(pattern, string, |
| |
flags & ~FNM_PERIOD)) |
| return (0); |
return (0); |
| if (test == '/' && flags & FNM_PATHNAME) |
if (test == '/' && flags & FNM_PATHNAME) |
| break; |
break; |
| Line 129 fnmatch(pattern, string, flags) |
|
| Line 142 fnmatch(pattern, string, flags) |
|
| if (*string == '/' && flags & FNM_PATHNAME) |
if (*string == '/' && flags & FNM_PATHNAME) |
| return (FNM_NOMATCH); |
return (FNM_NOMATCH); |
| if ((pattern = |
if ((pattern = |
| rangematch(pattern, *string, flags)) == NULL) |
rangematch(pattern, FOLDCASE(*string, flags), |
| |
flags)) == NULL) |
| return (FNM_NOMATCH); |
return (FNM_NOMATCH); |
| ++string; |
++string; |
| break; |
break; |
| case '\\': |
case '\\': |
| if (!(flags & FNM_NOESCAPE)) { |
if (!(flags & FNM_NOESCAPE)) { |
| if ((c = *pattern++) == EOS) { |
if ((c = FOLDCASE(*pattern++, flags)) == EOS) { |
| c = '\\'; |
c = '\\'; |
| --pattern; |
--pattern; |
| } |
} |
| } |
} |
| /* FALLTHROUGH */ |
/* FALLTHROUGH */ |
| default: |
default: |
| if (c != *string++) |
if (c != FOLDCASE(*string++, flags)) |
| return (FNM_NOMATCH); |
return (FNM_NOMATCH); |
| break; |
break; |
| } |
} |
| Line 169 rangematch(pattern, test, flags) |
|
| Line 183 rangematch(pattern, test, flags) |
|
| if ((negate = (*pattern == '!' || *pattern == '^')) != 0) |
if ((negate = (*pattern == '!' || *pattern == '^')) != 0) |
| ++pattern; |
++pattern; |
| |
|
| for (ok = 0; (c = *pattern++) != ']';) { |
for (ok = 0; (c = FOLDCASE(*pattern++, flags)) != ']';) { |
| if (c == '\\' && !(flags & FNM_NOESCAPE)) |
if (c == '\\' && !(flags & FNM_NOESCAPE)) |
| c = *pattern++; |
c = FOLDCASE(*pattern++, flags); |
| if (c == EOS) |
if (c == EOS) |
| return (NULL); |
return (NULL); |
| if (*pattern == '-' |
if (*pattern == '-' |
| && (c2 = *(pattern+1)) != EOS && c2 != ']') { |
&& (c2 = FOLDCASE(*(pattern+1), flags)) != EOS && |
| |
c2 != ']') { |
| pattern += 2; |
pattern += 2; |
| if (c2 == '\\' && !(flags & FNM_NOESCAPE)) |
if (c2 == '\\' && !(flags & FNM_NOESCAPE)) |
| c2 = *pattern++; |
c2 = FOLDCASE(*pattern++, flags); |
| if (c2 == EOS) |
if (c2 == EOS) |
| return (NULL); |
return (NULL); |
| if (c <= test && test <= c2) |
if (c <= test && test <= c2) |