From 2555eeadefd6e43552e37be8a60dd35da21337b2 Mon Sep 17 00:00:00 2001 From: rlar Date: Tue, 30 Jul 2013 21:36:37 +0200 Subject: [PATCH] fix the csh-problem $foo[$bar] and $foo[$&baz] --- src/frontend/parser/lexical.c | 2 +- src/frontend/variable.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/frontend/parser/lexical.c b/src/frontend/parser/lexical.c index ae114e4cc..fbda40cd4 100644 --- a/src/frontend/parser/lexical.c +++ b/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; } diff --git a/src/frontend/variable.c b/src/frontend/variable.c index 9997788d9..a960d9708 100644 --- a/src/frontend/variable.c +++ b/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);