Add missing FNM_PERIOD check for '[' range

Don't treat !^ as first characters in the range, just as negate sign
[/] never match if FNM_PATHNAME
This commit is contained in:
Andrey A. Chernov 1997-06-06 22:33:28 +00:00
parent e2dbbd9eea
commit 05a068e60e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=26486
2 changed files with 20 additions and 8 deletions

View file

@ -121,8 +121,13 @@ fnmatch(pattern, string, flags)
case '[':
if (*string == EOS)
return (FNM_NOMATCH);
if (*string == '/' && flags & FNM_PATHNAME)
if (*string == '/' && (flags & FNM_PATHNAME))
return (FNM_NOMATCH);
if (*string == '.' && (flags & FNM_PERIOD) &&
(string == stringstart ||
((flags & FNM_PATHNAME) && *(string - 1) == '/')))
return (FNM_NOMATCH);
switch (rangematch(pattern, *string, flags, &newp)) {
case RANGE_ERROR:
goto norm;
@ -177,10 +182,8 @@ rangematch(pattern, test, flags, newp)
* consistency with the regular expression syntax.
* J.T. Conklin (conklin@ngai.kaleida.com)
*/
if ( (negate = (*pattern == '!' || *pattern == '^')) ) {
first = 0;
if ( (negate = (*pattern == '!' || *pattern == '^')) )
++pattern;
}
if (flags & FNM_CASEFOLD)
test = tolower((unsigned char)test);
@ -197,6 +200,9 @@ rangematch(pattern, test, flags, newp)
if (c == EOS)
return (RANGE_ERROR);
if (c == '/' && (flags & FNM_PATHNAME))
return (RANGE_NOMATCH);
if (flags & FNM_CASEFOLD)
c = tolower((unsigned char)c);

View file

@ -121,8 +121,13 @@ fnmatch(pattern, string, flags)
case '[':
if (*string == EOS)
return (FNM_NOMATCH);
if (*string == '/' && flags & FNM_PATHNAME)
if (*string == '/' && (flags & FNM_PATHNAME))
return (FNM_NOMATCH);
if (*string == '.' && (flags & FNM_PERIOD) &&
(string == stringstart ||
((flags & FNM_PATHNAME) && *(string - 1) == '/')))
return (FNM_NOMATCH);
switch (rangematch(pattern, *string, flags, &newp)) {
case RANGE_ERROR:
goto norm;
@ -177,10 +182,8 @@ rangematch(pattern, test, flags, newp)
* consistency with the regular expression syntax.
* J.T. Conklin (conklin@ngai.kaleida.com)
*/
if ( (negate = (*pattern == '!' || *pattern == '^')) ) {
first = 0;
if ( (negate = (*pattern == '!' || *pattern == '^')) )
++pattern;
}
if (flags & FNM_CASEFOLD)
test = tolower((unsigned char)test);
@ -197,6 +200,9 @@ rangematch(pattern, test, flags, newp)
if (c == EOS)
return (RANGE_ERROR);
if (c == '/' && (flags & FNM_PATHNAME))
return (RANGE_NOMATCH);
if (flags & FNM_CASEFOLD)
c = tolower((unsigned char)c);