From 88e6ec2f709e476cb26ddbfdf73ea280f565864f Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Sat, 7 Mar 2020 19:49:36 +0100 Subject: [PATCH] Add afuction to transform i(vxx) to vxx#branch in .control sections. This is to avoid memory leaks (see bug 478). A better fix may be probably available by adapting parse-bison.y. --- src/frontend/inpcom.c | 58 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 31b5a4f6e..4b2a992d9 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -180,6 +180,7 @@ static struct card *pspice_compat(struct card *newcard); static void pspice_compat_a(struct card *oldcard); static struct card *ltspice_compat(struct card *oldcard); static void ltspice_compat_a(struct card *oldcard); +static void inp_rep_ixx(struct card *deck); #if defined(__MINGW32__) || defined(_MSC_VER) #ifndef EXT_ASC @@ -705,6 +706,8 @@ struct card *inp_readall(FILE *fp, const char *dir_name, inp_bsource_compat(working); inp_dot_if(working); expr_w_temper = inp_temper_compat(working); + /* i(vxx) to vxx#branch within .control section */ + inp_rep_ixx(working); } if (expr_w_temper_p) *expr_w_temper_p = expr_w_temper; @@ -1735,6 +1738,61 @@ static void inp_chk_for_multi_in_vcvs(struct card *c, int *line_number) } } +/* replace i(vxx) by vxx#branch */ +static void inp_rep_ixx(struct card* deck) { + struct card* c; + int only_control = 0; + + for (c = deck; c; c = c->nextcard) { + + char* line, * beg; + line = beg = c->line; + + /* there is no e source inside .control ... .endc */ + if (ciprefix(".control", line)) { + only_control++; + continue; + } + else if (ciprefix(".endc", line)) { + only_control--; + continue; + } + else if (only_control <= 0) { + continue; + } + + char* new_str = NULL; + while (line) { + char* s = strstr(line, " i(v"); + if (s) { + char* beg_str, *end_str, *t; + /* replace i(vxx) by vxx#branch */ + if (get_r_paren(&line) == 1) { + fprintf(stderr, "Error: missing ')' in line\n %s\n", c->line); + break; + } + /* token containing name of voltage source to be measured */ + t = copy_substring(s + 3, line - 1); + /* change line, convert i(XXX) to XXX#branch */ + beg_str = copy_substring(beg, s); + end_str = copy(line); + tfree(new_str); + new_str = tprintf("%s %s%s %s", beg_str, t, "#branch", end_str); + beg = line = new_str; + tfree(beg_str); + tfree(end_str); + tfree(t); + } + else { + break; + } + } + if (new_str) { + tfree(c->line); + c->line = new_str; + } + } +} /* If ngspice is started with option -a, then variable 'autorun' * will be set and the following function scans the deck.