device.c, #8/19, use parent wordlist to restore beginning of the list

This commit is contained in:
rlar 2017-06-10 09:34:18 +02:00
parent 01039f81a2
commit 1ff0500117
1 changed files with 5 additions and 17 deletions

View File

@ -1115,6 +1115,7 @@ if_set_binned_model(CKTcircuit *ckt, char *devname, char *param, struct dvec *va
static void
com_alter_common(wordlist *wl, int do_model)
{
wordlist *parent = wl->wl_prev;
wordlist *eqword = NULL, *words;
char *dev, *p;
char *param;
@ -1122,7 +1123,7 @@ com_alter_common(wordlist *wl, int do_model)
struct pnode *names;
/* DIE 2009_02_06 */
int step = 0, i, wlen, maxelem = 3;
int i, wlen, maxelem = 3;
wordlist *wl2 = NULL, *wlin, *rhs;
if (!ft_curckt) {
@ -1146,7 +1147,7 @@ com_alter_common(wordlist *wl, int do_model)
in wl2 have to follow the splitting. wl_splice() will take care of this.
*/
wlin = wl;
while (wl) {
for (; wl; wl = wl->wl_next) {
char *argument = wl->wl_word;
/* searching for '=' ... */
char *eqptr = strchr(argument, '=');
@ -1157,33 +1158,20 @@ com_alter_common(wordlist *wl, int do_model)
or token1=token2
...and if found split argument into three chars and make a new wordlist */
if (eqptr) {
/* We found '=' */
if (strlen(argument) == 1) {
wl2 = wlin;
} else if (strlen(argument) > 1) {
if (strlen(argument) > 1) {
wordlist *wn = NULL;
if (eqptr[1])
wn = wl_cons(copy(eqptr + 1), wn);
wn = wl_cons(copy("="), wn);
if (eqptr > argument)
wn = wl_cons(copy_substring(argument, eqptr), wn);
/* combine wordlists into wn, free wl */
wl_splice(wl, wn);
/* step back in the wordlist, if we have moved forward, to catch 'm1' */
wl2 = wn;
for (i = step; i > 0; i--)
wl2 = wl2->wl_prev;
}
break;
}
/* deal with 'altermod m1 vth0=0.7' by moving
* forward beyond 'm1'
*/
wl = wl->wl_next;
step++;
}
wl2 = parent->wl_next;
if (!wl) {
/* no equal sign found, probably a pre3f4 input format
'alter device value'