summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/fnmatch.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/gen/fnmatch.c')
-rw-r--r--lib/libc/gen/fnmatch.c41
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;
OpenPOWER on IntegriCloud