From: Ulrich Drepper Date: Wed, 28 Apr 1999 09:23:09 +0000 (+0000) Subject: Update. X-Git-Tag: cvs/glibc-2_1_1~118 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=66f93c2d97c7a6299361805091513981b6277893;p=thirdparty%2Fglibc.git Update. 1999-04-28 Ulrich Drepper * posix/fnmatch.c (internal_fnmatch): Finish incomplete no_leading_period change. * posix/testfnm.c: More test cases. --- diff --git a/ChangeLog b/ChangeLog index 38a0b6dfc57..200c811ddaa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +1999-04-28 Ulrich Drepper + + * posix/fnmatch.c (internal_fnmatch): Finish incomplete + no_leading_period change. + + * posix/testfnm.c: More test cases. + 1999-04-27 Ulrich Drepper * include/dirent.h: Remove __getdirentries declaration, add __getdents diff --git a/posix/fnmatch.c b/posix/fnmatch.c index b147f47d360..eb3f1cc2d48 100644 --- a/posix/fnmatch.c +++ b/posix/fnmatch.c @@ -157,7 +157,9 @@ internal_fnmatch (const char *pattern, const char *string, return FNM_NOMATCH; else if (*n == '/' && (flags & FNM_FILE_NAME)) return FNM_NOMATCH; - else if (*n == '.' && no_leading_period) + else if (*n == '.' && no_leading_period + && (n == string + || (n[-1] == '/' && (flags & FNM_FILE_NAME)))) return FNM_NOMATCH; break; @@ -175,7 +177,9 @@ internal_fnmatch (const char *pattern, const char *string, break; case '*': - if (*n == '.' && no_leading_period) + if (*n == '.' && no_leading_period + && (n == string + || (n[-1] == '/' && (flags & FNM_FILE_NAME)))) return FNM_NOMATCH; for (c = *p++; c == '?' || c == '*'; c = *p++) @@ -212,11 +216,17 @@ internal_fnmatch (const char *pattern, const char *string, if (c == '[') { + int flags2 = ((flags & FNM_FILE_NAME) + ? flags : (flags & ~FNM_PERIOD)); + for (--p; n < endp; ++n) if (internal_fnmatch (p, n, - (n == string) && no_leading_period, - ((flags & FNM_FILE_NAME) - ? flags : (flags & ~FNM_PERIOD))) + (no_leading_period + && (n == string + || (n[-1] == '/' + && (flags + & FNM_FILE_NAME)))), + flags2) == 0) return 0; } @@ -231,18 +241,21 @@ internal_fnmatch (const char *pattern, const char *string, } else { + int flags2 = ((flags & FNM_FILE_NAME) + ? flags : (flags & ~FNM_PERIOD)); + if (c == '\\' && !(flags & FNM_NOESCAPE)) c = *p; c = FOLD (c); for (--p; n < endp; ++n) if (FOLD ((unsigned char) *n) == c && (internal_fnmatch (p, n, - ((n == string) - && no_leading_period), - ((flags & FNM_FILE_NAME) - ? flags - : (flags & ~FNM_PERIOD))) - == 0)) + (no_leading_period + && (n == string + || (n[-1] == '/' + && (flags + & FNM_FILE_NAME)))), + flags2) == 0)) return 0; } } @@ -263,7 +276,10 @@ internal_fnmatch (const char *pattern, const char *string, if (*n == '\0') return FNM_NOMATCH; - if (*n == '.' && no_leading_period) + if (*n == '.' && no_leading_period && (n == string + || (n[-1] == '/' + && (flags + & FNM_FILE_NAME)))) return FNM_NOMATCH; if (*n == '/' && (flags & FNM_FILE_NAME)) @@ -297,7 +313,7 @@ internal_fnmatch (const char *pattern, const char *string, # if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) wctype_t wt; # endif - char *startp = p; + const char *startp = p; for (;;) { diff --git a/posix/testfnm.c b/posix/testfnm.c index e300565b1b3..ebdfab41def 100644 --- a/posix/testfnm.c +++ b/posix/testfnm.c @@ -48,6 +48,9 @@ struct { { "a/b", "*[![:digit:]]*/[![:d-d]", FNM_PATHNAME, 0 }, { "a/[", "*[![:digit:]]*/[[:d-d]", FNM_PATHNAME, 0 }, { "a/[", "*[![:digit:]]*/[![:d-d]", FNM_PATHNAME, FNM_NOMATCH }, + { "a.b", "a?b", FNM_PATHNAME|FNM_PERIOD, 0 }, + { "a.b", "a*b", FNM_PATHNAME|FNM_PERIOD, 0 }, + { "a.b", "a[.]b", FNM_PATHNAME|FNM_PERIOD, 0 }, }; int