fix the csh-problem $foo[$bar] and $foo[$&baz]

This commit is contained in:
rlar 2013-07-30 21:36:37 +02:00
parent 909f087237
commit 2555eeadef
2 changed files with 20 additions and 1 deletions

View File

@ -320,7 +320,7 @@ nloop:
goto ldefault;
case '&': /* va: $&name is one word */
if ((i == 1) && (buf[i-1] == '$') && (c == '&')) {
if ((i >= 1) && (buf[i-1] == '$') && (c == '&')) {
buf[i++] = (char) c;
break;
}

View File

@ -846,6 +846,24 @@ vareval(char *string)
/* Now parse and deal with 'range' ... */
if (range) {
/* rather crude fix when range itself is a $expression */
wordlist *r = NULL;
if (*range == '$') {
char *t = ++range;
if (*t == '&')
t++;
while (isalphanum(*t))
t++;
*t = '\0';
r = vareval(range);
if (!r || r->wl_next) {
fprintf(cp_err, "Error: %s: illegal index.\n", string);
tfree(oldstring);
wl_free(r);
return NULL;
}
range = r->wl_word;
}
for (low = 0; isdigit(*range); range++)
low = low * 10 + *range - '0';
if ((*range == '-') && isdigit(range[1]))
@ -857,6 +875,7 @@ vareval(char *string)
up = low;
up--, low--;
wl = wl_range(wl, low, up);
wl_free(r);
}
tfree(oldstring);
return (wl);