(fnmatch): Fix some FNM_FILE_NAME and FNM_LEADING_DIR bugs,
e.g. fnmatch("d*/*1", "d/s/1", FNM_FILE_NAME) incorrectly yielded zero.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
|
/* Copyright 1991, 1992, 1993, 1996, 1997, 2000 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -99,13 +99,10 @@ fnmatch (const char *pattern, const char *string, int flags)
|
|||||||
|
|
||||||
for (c = *p++; c == '?' || c == '*'; c = *p++)
|
for (c = *p++; c == '?' || c == '*'; c = *p++)
|
||||||
{
|
{
|
||||||
if ((flags & FNM_FILE_NAME) && *n == '/')
|
if (c == '?')
|
||||||
/* A slash does not match a wildcard under FNM_FILE_NAME. */
|
|
||||||
return FNM_NOMATCH;
|
|
||||||
else if (c == '?')
|
|
||||||
{
|
{
|
||||||
/* A ? needs to match one character. */
|
/* A ? needs to match one character. */
|
||||||
if (*n == '\0')
|
if (*n == '\0' || (*n == '/' && (flags & FNM_FILE_NAME)))
|
||||||
/* There isn't another character; no match. */
|
/* There isn't another character; no match. */
|
||||||
return FNM_NOMATCH;
|
return FNM_NOMATCH;
|
||||||
else
|
else
|
||||||
@@ -117,7 +114,13 @@ fnmatch (const char *pattern, const char *string, int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (c == '\0')
|
if (c == '\0')
|
||||||
return 0;
|
{
|
||||||
|
if ((flags & (FNM_FILE_NAME | FNM_LEADING_DIR)) == FNM_FILE_NAME)
|
||||||
|
for (; *n != '\0'; n++)
|
||||||
|
if (*n == '/')
|
||||||
|
return FNM_NOMATCH;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
|
char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
|
||||||
@@ -126,6 +129,8 @@ fnmatch (const char *pattern, const char *string, int flags)
|
|||||||
if ((c == '[' || FOLD (*n) == c1) &&
|
if ((c == '[' || FOLD (*n) == c1) &&
|
||||||
fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
|
fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
else if (*n == '/' && (flags & FNM_FILE_NAME))
|
||||||
|
break;
|
||||||
return FNM_NOMATCH;
|
return FNM_NOMATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user