Browse Source

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

pre-master-46
rlar 13 years ago
parent
commit
2555eeadef
  1. 2
      src/frontend/parser/lexical.c
  2. 19
      src/frontend/variable.c

2
src/frontend/parser/lexical.c

@ -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;
}

19
src/frontend/variable.c

@ -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…
Cancel
Save