From 54529d0e4292156e5ae2cd1b90f98242b15d70ca Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 27 Aug 2013 14:28:59 +0200 Subject: [PATCH] allow cshell $variable substitution with and without $&var --- src/frontend/variable.c | 42 ++++++++++++++++++++++++++++++++-- src/include/ngspice/cpextern.h | 1 + 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/frontend/variable.c b/src/frontend/variable.c index a960d9708..2c94915c8 100644 --- a/src/frontend/variable.c +++ b/src/frontend/variable.c @@ -676,6 +676,41 @@ char cp_dol = '$'; #define VALIDCHARS "$-_<#?@.()[]&" +char * +span_var_expr(char *t) +{ + int parenthesis = 0; + int brackets = 0; + + while (*t && (isalphanum(*t) || strchr(VALIDCHARS, *t))) + switch (*t++) + { + case '[': + brackets++; + break; + case '(': + parenthesis++; + break; + case ']': + if (brackets <= 0) + return t-1; + if (--brackets <= 0) + return t; + break; + case ')': + if (parenthesis <= 0) + return t-1; + if (--parenthesis <= 0) + return t; + break; + default: + break; + } + + return t; +} + + wordlist * cp_variablesubst(wordlist *wlist) { @@ -694,8 +729,11 @@ cp_variablesubst(wordlist *wlist) t++; s = buf; /* Get s and t past the end of the var name. */ - while (*t && (isalphanum(*t) || strchr(VALIDCHARS, *t))) - *s++ = *t++; + { + char *end = span_var_expr(t); + while (t < end) + *s++ = *t++; + } *s = '\0'; nwl = vareval(buf); if (i) { diff --git a/src/include/ngspice/cpextern.h b/src/include/ngspice/cpextern.h index 2d177e9e3..eee84cc53 100644 --- a/src/include/ngspice/cpextern.h +++ b/src/include/ngspice/cpextern.h @@ -167,6 +167,7 @@ extern void cp_remvar(char *varname); extern void cp_vset(char *varname, enum cp_types type, void *value); extern struct variable *cp_setparse(wordlist *wl); extern wordlist *vareval(char *string); +extern char *span_var_expr(char *t); /* var2.c */ extern void cp_vprint(void);