diff --git a/src/frontend/com_let.c b/src/frontend/com_let.c index 6e8b26da2..d6edb7c22 100644 --- a/src/frontend/com_let.c +++ b/src/frontend/com_let.c @@ -17,7 +17,6 @@ com_let(wordlist *wl) char *p, *q, *s; int indices[MAXDIMS]; int numdims; - wordlist fake_wl; int need_open; int offset, length; struct pnode *names; @@ -27,7 +26,6 @@ com_let(wordlist *wl) int newvec; char *rhs; - fake_wl.wl_next = NULL; if (!wl) { com_display(NULL); @@ -80,8 +78,7 @@ com_let(wordlist *wl) /* evaluate expression between s and q */ /* va, indexing */ - fake_wl.wl_word = s; - names = ft_getpnames(&fake_wl, TRUE); + names = ft_getpnames_from_string(s, TRUE); if (!names) { /* XXX error message */ tfree(p); @@ -130,10 +127,9 @@ com_let(wordlist *wl) } /* evaluate rhs */ - fake_wl.wl_word = rhs; - names = ft_getpnames(&fake_wl, TRUE); + names = ft_getpnames_from_string(rhs, TRUE); if (names == NULL) { - /* XXX error message */ + fprintf(cp_err, "Error: RHS \"%s\" invalid\n", rhs); tfree(p); return; } diff --git a/src/frontend/evaluate.c b/src/frontend/evaluate.c index 3dca17c92..7d6bda087 100644 --- a/src/frontend/evaluate.c +++ b/src/frontend/evaluate.c @@ -812,7 +812,7 @@ op_ind(struct pnode *arg1, struct pnode *arg2) /* Apply a function to an argument. Complex functions are called as follows: * cx_something(data, type, length, &newlength, &newtype), - * and returns a char * that is cast to complex or double. + * and returns a void * that is cast to complex or double. */ static void * diff --git a/src/frontend/parse.c b/src/frontend/parse.c index 16d62c724..c4e2f775a 100644 --- a/src/frontend/parse.c +++ b/src/frontend/parse.c @@ -30,26 +30,16 @@ void db_print_pnode_tree(struct pnode *p, char *print); struct pnode * -ft_getpnames(wordlist *wl, bool check) +ft_getpnames_from_string(const char *sz, bool check) { - struct pnode *pn = NULL; - char *xsbuf, *sbuf; - int rv; + struct pnode *pn; - if (!wl) { - fprintf(cp_err, "Warning: NULL arithmetic expression\n"); - return (NULL); + /* The first argument to PPparse is not const char **, but it does not + * appear to modify the string that is being parsed */ + if (PPparse((char **) &sz, &pn) != 0) { + return (struct pnode *) NULL; } - xsbuf = sbuf = wl_flatten(wl); - - rv = PPparse(&sbuf, &pn); - - tfree(xsbuf); - - if (rv) - return (NULL); - /* If validation is requested, do it and return NULL on failure. The * structure must also be freed if the check fails since it is not * being returned. */ @@ -58,7 +48,26 @@ ft_getpnames(wordlist *wl, bool check) return (struct pnode *) NULL; } - return (pn); + return pn; +} /* end of function ft_getpnames_from_string */ + + + +struct pnode * +ft_getpnames(const wordlist *wl, bool check) +{ + /* Validate input */ + if (!wl) { + (void) fprintf(cp_err, "Warning: NULL arithmetic expression\n"); + return (struct pnode *) NULL; + } + + /* Convert the list to a string then parse the string */ + const char * const sz = wl_flatten(wl); + struct pnode * const pn = ft_getpnames_from_string(sz, check); + txfree((void *) sz); + + return pn; /* Return the parsed result */ } /* end of function ft_getpnames */ diff --git a/src/include/ngspice/fteext.h b/src/include/ngspice/fteext.h index d8b5aafd6..6c35ae118 100644 --- a/src/include/ngspice/fteext.h +++ b/src/include/ngspice/fteext.h @@ -268,7 +268,8 @@ extern bool ft_stricterror; extern struct func ft_funcs[]; extern struct func func_not; extern struct func func_uminus; -extern struct pnode *ft_getpnames(wordlist *wl, bool check); +extern struct pnode *ft_getpnames(const wordlist *wl, bool check); +struct pnode *ft_getpnames_from_string(const char *sz, bool check); extern struct pnode *alloc_pnode(void); #define free_pnode(ptr) \ do { \