From: Paul Eggert Date: Mon, 30 Apr 2012 00:02:13 +0000 (-0700) Subject: exclude: handle wildcards with FNM_NOESCAPE and with trailing \ X-Git-Tag: v0.1~721 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=f58a007d877819767440ee92d181fef6b0039706;p=gnulib.git exclude: handle wildcards with FNM_NOESCAPE and with trailing \ * lib/exclude.c (unescape_pattern): Don't worry about unescaped [; it's not possible here. Handle the case of \ at end of pattern without dumping core. (add_exclude): Do not unescape the pattern if FNM_NOESCAPE is used. --- diff --git a/ChangeLog b/ChangeLog index baff3762c..ae5ca9e49 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2012-04-29 Paul Eggert + exclude: handle wildcards with FNM_NOESCAPE and with trailing \ + * lib/exclude.c (unescape_pattern): Don't worry about unescaped [; + it's not possible here. Handle the case of \ at end of pattern + without dumping core. + (add_exclude): Do not unescape the pattern if FNM_NOESCAPE is used. + _Noreturn: future-proof non-GNU and non-MSVC compilers * build-aux/snippet/_Noreturn.h (_Noreturn): * m4/gnulib-common.m4 (gl_COMMON_BODY): diff --git a/lib/exclude.c b/lib/exclude.c index d135b09df..5aa6a7fed 100644 --- a/lib/exclude.c +++ b/lib/exclude.c @@ -140,20 +140,9 @@ fnmatch_pattern_has_wildcards (const char *str, int options) static void unescape_pattern (char *str) { - int inset = 0; - char *q = str; + char const *q = str; do - { - if (inset) - { - if (*q == ']') - inset = 0; - } - else if (*q == '[') - inset = 1; - else if (*q == '\\') - q++; - } + q += *q == '\\' && q[1]; while ((*str++ = *q++)); } @@ -503,7 +492,7 @@ 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) + if ((options & (EXCLUDE_WILDCARDS | FNM_NOESCAPE)) == EXCLUDE_WILDCARDS) unescape_pattern (str); p = hash_insert (seg->v.table, str); if (p != str)