package bash tags 345861 + patch thankyou Hi,
it turned out to be a one-liner. The first part of subst.c:parameter_brace_expand() contains an if-block that is to take care of some "special cases" like ${!VAR}, $# and even things like ${!#}... but it is also entered for plain length expansions like ${#VAR}: ] 5795 sindex = *indexp; ] 5796 t_index = ++sindex; ] 5797 name = string_extract (string, &t_index, "#%:-=?+/}", EX_VARNAME); ] 5798 ] 5799 ret = 0; ] 5800 tflag = 0; ] 5801 ] 5802 /* If the name really consists of a special variable, then make sure ] 5803 that we have the entire name. We don't allow indirect references ] 5804 to special variables except `#', `?', `@' and `*'. */ ] 5805 if ((sindex == t_index && ] 5806 (string[t_index] == '-' || ] 5807 string[t_index] == '?' || ] 5808 string[t_index] == '#')) || ] 5809 (sindex == t_index - 1 && string[sindex] == '!' && ] 5810 (string[t_index] == '#' || ] 5811 string[t_index] == '?' || ] 5812 string[t_index] == '@' || ] 5813 string[t_index] == '*'))) ] 5814 { ] 5815 t_index++; ] 5816 free (name); ] 5817 temp1 = string_extract (string, &t_index, "#%:-=?+/}", 0); ] 5818 name = (char *)xmalloc (3 + (strlen (temp1))); ] 5819 *name = string[sindex]; ] 5820 if (string[sindex] == '!') ] 5821 { ] 5822 /* indirect reference of $#, $?, $@, or $* */ ] 5823 name[1] = string[sindex + 1]; ] 5824 strcpy (name + 2, temp1); ] 5825 } ] 5826 else ] 5827 strcpy (name + 1, temp1); ] 5828 free (temp1); ] 5829 } In my problem case above, while trying to expand ${#LOGNAME[$(( 0+0 ))]}: ] 5797: name = "" // first character is '#' ] [...] ] 5817: temp1 = "LOGNAME[$(( 0" // '+' is in the delimiter list I've changed the fourth parameter in 5817 to EX_VARNAME, so everything inside [] is skipped - this is already done in 5797, and I can see no reason why it shouldn't be there in 5817 (at least I can see no harm arising from having it there). Diff and dpatch attached, has already been tested locally (no obvious regressions, and fixes my bug). HTH, Jan -- Jan C. Nordholz <jckn At gmx net>
--- ../bash-3.1/subst.c 2006-01-14 01:12:02.000000000 +0100 +++ subst.c 2006-01-14 01:12:39.000000000 +0100 @@ -5814,7 +5814,7 @@ { t_index++; free (name); - temp1 = string_extract (string, &t_index, "#%:-=?+/}", 0); + temp1 = string_extract (string, &t_index, "#%:-=?+/}", EX_VARNAME); name = (char *)xmalloc (3 + (strlen (temp1))); *name = string[sindex]; if (string[sindex] == '!')
#! /bin/sh -e if [ $# -eq 3 -a "$2" = '-d' ]; then pdir="-d $3" elif [ $# -ne 1 ]; then echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" exit 1 fi case "$1" in -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; *) echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" exit 1 esac exit 0 DP: ignore array subscript while determining variable name for length DP: substitution DP: (#345861) --- ../bash-3.1/subst.c 2006-01-14 01:12:02.000000000 +0100 +++ subst.c 2006-01-14 01:12:39.000000000 +0100 @@ -5814,7 +5814,7 @@ { t_index++; free (name); - temp1 = string_extract (string, &t_index, "#%:-=?+/}", 0); + temp1 = string_extract (string, &t_index, "#%:-=?+/}", EX_VARNAME); name = (char *)xmalloc (3 + (strlen (temp1))); *name = string[sindex]; if (string[sindex] == '!')
signature.asc
Description: Digital signature