From c0513ed57382796fdb302bc5abe84144a487fa46 Mon Sep 17 00:00:00 2001 From: rlar Date: Tue, 26 Jul 2016 20:18:33 +0200 Subject: [PATCH] inp.c, rewrite inp_savecurrents() --- src/frontend/inp.c | 200 ++++++++++++++++++++------------------------- 1 file changed, 88 insertions(+), 112 deletions(-) diff --git a/src/frontend/inp.c b/src/frontend/inp.c index 916853b45..3dca5e2b6 100644 --- a/src/frontend/inp.c +++ b/src/frontend/inp.c @@ -56,7 +56,7 @@ static void dotifeval(struct line *deck); static int inp_parse_temper(struct line *deck); static void inp_parse_temper_trees(void); -static void inp_savecurrents(struct line *deck, struct line *options, wordlist **wl, wordlist *con); +static wordlist *inp_savecurrents(struct line *deck, struct line *options, wordlist *wl, wordlist *controls); void line_free_x(struct line *deck, bool recurse); void create_circbyline(char *line); @@ -601,7 +601,7 @@ inp_spsource(FILE *fp, bool comfile, char *filename, bool intfile) /* If user wants all currents saved (.options savecurrents), add .save to wl_first with all terminal currents available on selected devices */ - inp_savecurrents(deck, options, &wl_first, controls); + wl_first = inp_savecurrents(deck, options, wl_first, controls); /* now load deck into ft_curckt -- the current circuit. */ inp_dodeck(deck, tt, wl_first, FALSE, options, filename); @@ -1572,122 +1572,98 @@ inp_evaluate_temper(void) } -/* Enable current measurements by the user. Check, if option savecurrents -is set by the user. We have to do it here prematurely, because options -will be processed later. -Then check, if commands 'save' or '.save' are alraedy there. If not, add -'.save all'. -Then the deck is scanned for known devices, and their current vectors in form of -@q1[ib] are added to new .save lines in wl_first. */ -static void inp_savecurrents(struct line *deck, struct line *options, wordlist **wl, wordlist *con) +/* + * Enable current measurements by the user + * if 'option savecurrents' is set by the user. + * We have to check for this option here prematurely + * because options will be processed later. + * Then append a + * .save all + * statement to 'wl' if no other 'save' has been given so far. + * Then scan the deck for known devices and append + * .save @q1[ib] + * statements to 'wl' for all of their current vectors. + */ + +static wordlist * +inp_savecurrents(struct line *deck, struct line *options, wordlist *wl, wordlist *controls) { - struct line *tmp_deck, *tmp_line; - char beg; - char *devname = NULL, *devline, *newline; - bool goon = FALSE, havesave = FALSE; - wordlist *tmpword; + wordlist *p; /* check if option 'savecurrents' is set */ - for (tmp_line = options; tmp_line; tmp_line = tmp_line->li_next) - if (strstr(tmp_line->li_line, "savecurrents")) { - goon = TRUE; + for (; options; options = options->li_next) + if (strstr(options->li_line, "savecurrents")) break; - } - if (!goon) - return; - /* check if we have a 'save' command in the .control section */ - for (tmpword = con; tmpword; tmpword = tmpword->wl_next) - if(prefix("save", tmpword->wl_word)) { - havesave = TRUE; - break; - } - /* check if wl_first is already there */ - if (*wl) { - /* check if .save is already in wl_first */ - for (tmpword = *wl; tmpword; tmpword = tmpword->wl_next) - if(prefix(".save", tmpword->wl_word)) { - havesave = TRUE; + if (!options) + return wl; + + /* search for 'save' command in the .control section */ + for (p = controls; p; p = p->wl_next) + if(prefix("save", p->wl_word)) + break; + + /* search for '.save' in the 'wl' list */ + if (!p) + for (p = wl; p; p = p->wl_next) + if(prefix(".save", p->wl_word)) break; - } + + /* if not found, then add '.save all' */ + if (!p) + p = wl_cons(copy(".save all"), NULL); + else + p = NULL; + + /* Scan the deck for devices with their terminals. + * We currently serve bipolars, resistors, MOS1, capacitors, inductors, + * controlled current sources. Others may follow. + */ + for (deck = deck->li_next; deck; deck = deck->li_next) { + char *newline, *devname, *devline = deck->li_line; + + switch (devline[0]) { + case 'm': + devname = gettok(&devline); + newline = tprintf(".save @%s[id] @%s[is] @%s[ig] @%s[ib]", + devname, devname, devname, devname); + break; + case 'j': + devname = gettok(&devline); + newline = tprintf(".save @%s[id] @%s[is] @%s[ig] @%s[igd]", + devname, devname, devname, devname); + break; + case 'q': + devname = gettok(&devline); + newline = tprintf(".save @%s[ic] @%s[ie] @%s[ib] @%s[is]", + devname, devname, devname, devname); + break; + case 'd': + devname = gettok(&devline); + newline = tprintf(".save @%s[id]", devname); + break; + case 'r': + case 'c': + case 'l': + case 'b': + case 'f': + case 'g': + case 'w': + case 's': + devname = gettok(&devline); + newline = tprintf(".save @%s[i]", devname); + break; + case 'i': + devname = gettok(&devline); + newline = tprintf(".save @%s[current]", devname); + break; + default: + continue; + } + + p = wl_cons(newline, p); + tfree(devname); } - /* if we neither have 'save' nor '.save', add '.save all' - or if we do not have wl_first, add at least a wordline '*' to allow wl_append_word() */ - if (!(*wl) || !havesave) { - *wl = TMALLOC(wordlist, 1); - (*wl)->wl_next = NULL; - (*wl)->wl_prev = NULL; - if (havesave) - (*wl)->wl_word = copy("*"); - else - (*wl)->wl_word = copy(".save all"); - } - /* Scan the deck for devices with their terminals. - We currently serve bipolars, resistors, MOS1, capacitors, inductors, - controlled current sources. Others may follow. */ - for (tmp_deck = deck->li_next; tmp_deck; tmp_deck = tmp_deck->li_next){ - beg = *(tmp_deck->li_line); - if ((beg == '*') || (beg == '.')) - continue; - switch (beg) { - case 'm': - devline = tmp_deck->li_line; - devname = gettok(&devline); - /* .save @q1[id] @q1[is] @q1[ig] @q1[ib] */ - newline = tprintf(".save @%s[id] @%s[is] @%s[ig] @%s[ib]", - devname, devname, devname, devname); - wl_append_word(NULL, wl, newline); - break; - case 'j': - devline = tmp_deck->li_line; - devname = gettok(&devline); - /* .save @q1[id] @q1[is] @q1[ig] @q1[igd] */ - newline = tprintf(".save @%s[id] @%s[is] @%s[ig] @%s[igd]", - devname, devname, devname, devname); - wl_append_word(NULL, wl, newline); - break; - case 'q': - devline = tmp_deck->li_line; - devname = gettok(&devline); - /* .save @q1[ic] @q1[ie] @q1[ib] @q1[is] */ - newline = tprintf(".save @%s[ic] @%s[ie] @%s[ib] @%s[is]", - devname, devname, devname, devname); - wl_append_word(NULL, wl, newline); - break; - case 'd': - devline = tmp_deck->li_line; - devname = gettok(&devline); - /* .save @d1[id] */ - newline = tprintf(".save @%s[id]", devname); - wl_append_word(NULL, wl, newline); - break; - case 'r': - case 'c': - case 'l': - case 'b': - case 'f': - case 'g': - case 'w': - case 's': - devline = tmp_deck->li_line; - devname = gettok(&devline); - /* .save @r1[i] */ - newline = tprintf(".save @%s[i]", devname); - wl_append_word(NULL, wl, newline); - break; - case 'i': - devline = tmp_deck->li_line; - devname = gettok(&devline); - /* .save @i1[current] */ - newline = tprintf(".save @%s[current]", devname); - wl_append_word(NULL, wl, newline); - break; - default: - ; - } - tfree(devname); - } - while((*wl)->wl_prev) - (*wl) = (*wl)->wl_prev; + return wl_append(wl, wl_reverse(p)); }