From: Sergey Poznyakoff Date: Thu, 6 May 2010 20:18:34 +0000 (+0300) Subject: exclude: Unescape hashed patterns in wildcard mode. X-Git-Tag: v0.1~4167 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=abe9c758009394a09d0cb84cdaae37e5752953f2;p=gnulib.git exclude: Unescape hashed patterns in wildcard mode. * lib/exclude.c (add_exclude): Unescape the pattern before adding it to the hash list. * tests/test-exclude8.sh: New test case. * modules/exclude-tests: Add new test. --- diff --git a/ChangeLog b/ChangeLog index b92862f7b..4581ef9d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2010-05-06 Sergey Poznyakoff + + exclude: Unescape hashed patterns in wildcard mode. + * lib/exclude.c (add_exclude): Unescape the pattern before adding it + to the hash list. + * tests/test-exclude8.sh: New test case. + * modules/exclude-tests: Add new test. + 2010-05-05 Eric Blake verify: automate tests diff --git a/lib/exclude.c b/lib/exclude.c index 34b563671..a68f3cbef 100644 --- a/lib/exclude.c +++ b/lib/exclude.c @@ -134,6 +134,26 @@ fnmatch_pattern_has_wildcards (const char *str, int options) return false; } +static void +unescape_pattern (char *str) +{ + int inset = 0; + char *q = str; + do + { + if (inset) + { + if (*q == ']') + inset = 0; + } + else if (*q == '[') + inset = 1; + else if (*q == '\\') + q++; + } + while ((*str++ = *q++)); +} + /* Return a newly allocated and empty exclude list. */ struct exclude * @@ -480,6 +500,8 @@ add_exclude (struct exclude *ex, char const *pattern, int options) seg = new_exclude_segment (ex, exclude_hash, options); str = xstrdup (pattern); + if (options & EXCLUDE_WILDCARDS) + unescape_pattern (str); p = hash_insert (seg->v.table, str); if (p != str) free (str); diff --git a/modules/exclude-tests b/modules/exclude-tests index ba265edde..3dd02251a 100644 --- a/modules/exclude-tests +++ b/modules/exclude-tests @@ -7,6 +7,7 @@ tests/test-exclude4.sh tests/test-exclude5.sh tests/test-exclude6.sh tests/test-exclude7.sh +tests/test-exclude8.sh Depends-on: progname @@ -21,7 +22,8 @@ TESTS += \ test-exclude4.sh\ test-exclude5.sh\ test-exclude6.sh\ - test-exclude7.sh + test-exclude7.sh\ + test-exclude8.sh check_PROGRAMS += test-exclude test_exclude_LDADD = $(LDADD) @LIBINTL@ diff --git a/tests/test-exclude8.sh b/tests/test-exclude8.sh new file mode 100755 index 000000000..ee14bbcd8 --- /dev/null +++ b/tests/test-exclude8.sh @@ -0,0 +1,40 @@ +#! /bin/sh +# Test suite for exclude. +# Copyright (C) 2010 Free Software Foundation, Inc. +# This file is part of the GNUlib Library. +# +# 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 +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +TMP=excltmp.$$ +LIST=flist.$$ +ERR=0 + +# Test escaped metacharacters. + +cat > $LIST <<'EOT' +f\*e +b[a\*]r +EOT + +cat > $TMP <<'EOT' +f*e: 1 +file: 0 +bar: 1 +EOT + +./test-exclude$EXEEXT -wildcards $LIST -- 'f*e' 'file' 'bar' | + tr -d '\015' | diff -c $TMP - || ERR=1 + +rm -f $TMP $LIST +exit $ERR