From 3deeb59da9ad8eeeff9986863d41f13a711eef8e Mon Sep 17 00:00:00 2001 From: "Andrey A. Chernov" Date: Wed, 23 Oct 1996 16:40:20 +0000 Subject: [PATCH] GNU-style changes: 1) Rename FNM_ICASE to FNM_CASEFOLD 2) Add FNM_LEADING_DIR Add proper (unsigned char) casts to tolower(). Use 'char' function argument for proper sign extension --- lib/libc/gen/fnmatch.3 | 8 +++++++- lib/libc/gen/fnmatch.c | 24 ++++++++++++++---------- sys/libkern/fnmatch.c | 24 ++++++++++++++---------- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/lib/libc/gen/fnmatch.3 b/lib/libc/gen/fnmatch.3 index 4363426c0e35..bc007870596d 100644 --- a/lib/libc/gen/fnmatch.3 +++ b/lib/libc/gen/fnmatch.3 @@ -99,7 +99,13 @@ Additionally, if .Dv FNM_PATHNAME is set, a period is ``leading'' if it immediately follows a slash. -.It Dv FNM_ICASE +.It Dv FNM_LEADING_DIR +Ignore +.Nm /* +rest after successful +.Fa pattern +matching. +.It Dv FNM_CASEFOLD Ignore case distinctions in both the .Fa pattern and the diff --git a/lib/libc/gen/fnmatch.c b/lib/libc/gen/fnmatch.c index 1fa1db5f8b2b..3bf9e1797ae7 100644 --- a/lib/libc/gen/fnmatch.c +++ b/lib/libc/gen/fnmatch.c @@ -51,7 +51,7 @@ static char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; #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) @@ -64,6 +64,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) @@ -130,8 +132,9 @@ fnmatch(pattern, string, flags) default: if (c == *string) ; - else if ((flags & FNM_ICASE) && - (tolower(c) == tolower(*string))) + else if ((flags & FNM_CASEFOLD) && + (tolower((unsigned char)c) == + tolower((unsigned char)*string))) ; else return (FNM_NOMATCH); @@ -144,7 +147,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; @@ -159,8 +163,8 @@ rangematch(pattern, test, flags) if ( (negate = (*pattern == '!' || *pattern == '^')) ) ++pattern; - if (flags & FNM_ICASE) - test = tolower(test); + if (flags & FNM_CASEFOLD) + test = tolower((unsigned char)test); for (ok = 0; (c = *pattern++) != ']';) { if (c == '\\' && !(flags & FNM_NOESCAPE)) @@ -168,8 +172,8 @@ rangematch(pattern, test, flags) if (c == EOS) return (NULL); - if (flags & FNM_ICASE) - c = tolower(c); + if (flags & FNM_CASEFOLD) + c = tolower((unsigned char)c); if (*pattern == '-' && (c2 = *(pattern+1)) != EOS && c2 != ']') { @@ -179,8 +183,8 @@ rangematch(pattern, test, flags) if (c2 == EOS) return (NULL); - if (flags & FNM_ICASE) - c2 = tolower(c2); + if (flags & FNM_CASEFOLD) + c2 = tolower((unsigned char)c2); if ( collate_range_cmp(c, test) <= 0 && collate_range_cmp(test, c2) <= 0 diff --git a/sys/libkern/fnmatch.c b/sys/libkern/fnmatch.c index 1fa1db5f8b2b..3bf9e1797ae7 100644 --- a/sys/libkern/fnmatch.c +++ b/sys/libkern/fnmatch.c @@ -51,7 +51,7 @@ static char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; #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) @@ -64,6 +64,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) @@ -130,8 +132,9 @@ fnmatch(pattern, string, flags) default: if (c == *string) ; - else if ((flags & FNM_ICASE) && - (tolower(c) == tolower(*string))) + else if ((flags & FNM_CASEFOLD) && + (tolower((unsigned char)c) == + tolower((unsigned char)*string))) ; else return (FNM_NOMATCH); @@ -144,7 +147,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; @@ -159,8 +163,8 @@ rangematch(pattern, test, flags) if ( (negate = (*pattern == '!' || *pattern == '^')) ) ++pattern; - if (flags & FNM_ICASE) - test = tolower(test); + if (flags & FNM_CASEFOLD) + test = tolower((unsigned char)test); for (ok = 0; (c = *pattern++) != ']';) { if (c == '\\' && !(flags & FNM_NOESCAPE)) @@ -168,8 +172,8 @@ rangematch(pattern, test, flags) if (c == EOS) return (NULL); - if (flags & FNM_ICASE) - c = tolower(c); + if (flags & FNM_CASEFOLD) + c = tolower((unsigned char)c); if (*pattern == '-' && (c2 = *(pattern+1)) != EOS && c2 != ']') { @@ -179,8 +183,8 @@ rangematch(pattern, test, flags) if (c2 == EOS) return (NULL); - if (flags & FNM_ICASE) - c2 = tolower(c2); + if (flags & FNM_CASEFOLD) + c2 = tolower((unsigned char)c2); if ( collate_range_cmp(c, test) <= 0 && collate_range_cmp(test, c2) <= 0