inp.c: pre_<command> to allow command execution from the .control section before parsing the circuit

This commit is contained in:
h_vogt 2012-11-17 16:30:17 +01:00
parent 843126d9a6
commit a419712eca
1 changed files with 28 additions and 25 deletions

View File

@ -292,7 +292,7 @@ inp_spsource(FILE *fp, bool comfile, char *filename)
double testemp = 0.0;
bool commands = FALSE;
wordlist *wl = NULL, *end = NULL, *wl_first = NULL;
wordlist *controls = NULL;
wordlist *controls = NULL, *pre_controls = NULL;
FILE *lastin, *lastout, *lasterr;
double temperature_value;
@ -420,35 +420,28 @@ inp_spsource(FILE *fp, bool comfile, char *filename)
else
fprintf(cp_err, "Warning: misplaced .endc card\n");
} else if (commands || prefix("*#", dd->li_line)) {
/* more control lines */
if (prefix("*#", dd->li_line)) {
s = copy(dd->li_line + 2);
} else {
s = dd->li_line;
dd->li_line = 0; /* SJB - prevent line_free() freeing the string (now pointed at by wl->wl_word) */
/* assemble all commands starting with pre_ after stripping pre_,
to be executed before circuit parsing */
if (ciprefix("pre_", dd->li_line)) {
s = copy(dd->li_line + 4);
pre_controls = wl_cons(s, pre_controls);
}
controls = wl_cons(s, controls);
wl = controls;
/* Look for set or unset numparams.
If either are found then we evaluate these lines immediately
so they take effect before netlist parsing */
while (isspace(*s)) /* step past any white space */
s++;
if (ciprefix("set", s))
s += 3;
else if (ciprefix("unset", s))
s += 5;
if (s != dd->li_line) { /* one of the above must have matched */
while (isspace(*s)) /* step past white space */
s++;
if (ciprefix("numparams", s))
cp_evloop(wl->wl_word);
/* assemble all other commands to be executed after circuit parsing */
else {
/* special control lines outside of .control section*/
if (prefix("*#", dd->li_line)) {
s = copy(dd->li_line + 2);
/* all commands from within .control section */
} else {
s = dd->li_line;
dd->li_line = 0; /* SJB - prevent line_free() freeing the string (now pointed at by wl->wl_word) */
}
controls = wl_cons(s, controls);
}
ld->li_next = dd->li_next;
line_free(dd, FALSE);
} else if (!*dd->li_line) {
/* So blank lines in com files don't get considered as
* circuits. */
/* So blank lines in com files don't get considered as circuits. */
ld->li_next = dd->li_next;
line_free(dd, FALSE);
} else {
@ -479,6 +472,15 @@ inp_spsource(FILE *fp, bool comfile, char *filename)
}
} /* end for (dd = deck->li_next . . . . */
/* Now that the deck is loaded, do the pre commands, if there are any,
before the circuit structure is set up */
if (pre_controls) {
pre_controls = wl_reverse(pre_controls);
for (wl = pre_controls; wl; wl = wl->wl_next)
cp_evloop(wl->wl_word);
wl_free(pre_controls);
}
/* set temperature if defined to a preliminary variable which may be used
in numparam evaluation */
if (temperature) {
@ -662,6 +664,7 @@ inp_spsource(FILE *fp, bool comfile, char *filename)
Do this here before controls are run: .save is thus recognized even if
.control is used */
ft_dotsaves();
/* run all 'save' commands upfront, allow same syntax as in .save,
then remove them from controls, store data in dbs */
consaves(controls);