diff options
author | Jim Meyering <jim@meyering.net> | 2000-10-31 07:07:05 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2000-10-31 07:07:05 +0000 |
commit | 3adf8ab9c64d631c81fdd6ea3c47727071934c79 (patch) | |
tree | d95b23a1624529d0a9b5752c82c9105d3233ddc0 /lib | |
parent | 16b7a20d01165de0ffc5575646d8d1c4bd6b1cd1 (diff) | |
download | coreutils-3adf8ab9c64d631c81fdd6ea3c47727071934c79.tar.xz |
(FOLD): Do not assume that characters are unsigned.
(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.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/fnmatch.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/fnmatch.c b/lib/fnmatch.c index eb45e0197..ce55c7ff0 100644 --- a/lib/fnmatch.c +++ b/lib/fnmatch.c @@ -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 it under the terms of the GNU General Public License as published by @@ -61,7 +61,9 @@ fnmatch (const char *pattern, const char *string, int flags) register char c; /* Note that this evaluates C many times. */ -# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c)) +# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER ((unsigned char) (c)) \ + ? tolower ((unsigned char) (c)) \ + : (c)) while ((c = *p++) != '\0') { @@ -99,13 +101,10 @@ fnmatch (const char *pattern, const char *string, int flags) for (c = *p++; c == '?' || c == '*'; c = *p++) { - if ((flags & FNM_FILE_NAME) && *n == '/') - /* A slash does not match a wildcard under FNM_FILE_NAME. */ - return FNM_NOMATCH; - else if (c == '?') + if (c == '?') { /* A ? needs to match one character. */ - if (*n == '\0') + if (*n == '\0' || (*n == '/' && (flags & FNM_FILE_NAME))) /* There isn't another character; no match. */ return FNM_NOMATCH; else @@ -117,7 +116,13 @@ fnmatch (const char *pattern, const char *string, int flags) } 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; @@ -126,6 +131,8 @@ fnmatch (const char *pattern, const char *string, int flags) if ((c == '[' || FOLD (*n) == c1) && fnmatch (p, n, flags & ~FNM_PERIOD) == 0) return 0; + else if (*n == '/' && (flags & FNM_FILE_NAME)) + break; return FNM_NOMATCH; } |