inp.c, rewrite inp_savecurrents()

This commit is contained in:
rlar 2016-07-26 20:18:33 +02:00
parent 893157b11f
commit c0513ed573
1 changed files with 88 additions and 112 deletions

View File

@ -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));
}