Ralf Wildenhues wrote: > > +# func_remove_prefix var prefix > > +# removes the given prefix from the value of the shell variable var. > > +# var should be the name of a shell variable. > > +# Its value should not contain a newline and not start or end with > > whitespace. > > +# prefix should not contain the characters "$`\{}|. > > Not sure whether this comment is meant to list the dot as one of the > forbidden characters, but neither prefix nor suffix should contain a > dot in the general case, because the sed script will match any > character at that position.
Good catch. You're right. If the prefix or suffix contains a dot, it needs to be escaped. > Of course, your documentation should also list the characters > [ ] ^ > as forbidden (both prefix and suffix). Likewise for > func_filter_filelist. You're right again. Done as follows: 2009-01-17 Bruno Haible <br...@clisp.org> * gnulib-tool (func_remove_prefix): Escape all dots in the prefix. Update documentation. (func_remove_suffix): Escape all dots in the suffix. Update documentation. (func_filter_filelist): Update documentation. Reported by Ralf Wildenhues. --- gnulib-tool.orig 2009-01-18 04:07:14.000000000 +0100 +++ gnulib-tool 2009-01-18 04:07:08.000000000 +0100 @@ -411,7 +411,7 @@ # removes the given prefix from the value of the shell variable var. # var should be the name of a shell variable. # Its value should not contain a newline and not start or end with whitespace. -# prefix should not contain the characters "$`\{}|. +# prefix should not contain the characters "$`\{}[]^|. if ( foo=bar; eval 'test "${foo#b}" = ar' ) >/dev/null 2>&1; then func_remove_prefix () { @@ -423,6 +423,12 @@ { eval "value=\"\$$1\"" prefix="$2" + case "$prefix" in + *.*) + sed_escape_dots='s/\([.]\)/\\\1/g' + prefix=`echo "$prefix" | sed -e "$sed_escape_dots"` + ;; + esac value=`echo "$value" | sed -e "s|^${prefix}||"` eval "$1=\"\$value\"" } @@ -433,7 +439,7 @@ # removes the given suffix from the value of the shell variable var. # var should be the name of a shell variable. # Its value should not contain a newline and not start or end with whitespace. -# suffix should not contain the characters "$`\{}|. +# suffix should not contain the characters "$`\{}[]^|. if ( foo=bar; eval 'test "${foo%r}" = ba' ) >/dev/null 2>&1; then func_remove_suffix () { @@ -445,6 +451,12 @@ { eval "value=\"\$$1\"" suffix="$2" + case "$suffix" in + *.*) + sed_escape_dots='s/\([.]\)/\\\1/g' + suffix=`echo "$suffix" | sed -e "$sed_escape_dots"` + ;; + esac value=`echo "$value" | sed -e "s|${suffix}\$||"` eval "$1=\"\$value\"" } @@ -1379,7 +1391,7 @@ # elements starting with prefix and ending with suffix are considered. # Processing: removed_prefix and removed_suffix are removed from each element, # added_prefix and added_suffix are added to each element. -# removed_prefix, removed_suffix should not contain the characters "$`\{}|. +# removed_prefix, removed_suffix should not contain the characters "$`\{}[]^|. # added_prefix, added_suffix should not contain the characters \|. func_filter_filelist () {