fix the csh-problem $foo[$bar] and $foo[$&baz]
This commit is contained in:
parent
909f087237
commit
2555eeadef
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue