New parameter char *linesource for fcn insert_new_line

Make Fcn inp_read in inpcom.c static
This commit is contained in:
Holger Vogt 2024-04-26 15:53:28 +02:00
parent cca34330f8
commit 55aee45955
4 changed files with 68 additions and 92 deletions

View File

@ -198,7 +198,7 @@ struct inp_read_t {
int line_number;
};
struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
static struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
const char* file_name, bool comfile, bool intfile);
@ -432,7 +432,7 @@ static int is_xspice_model(char* buf)
*/
struct card *insert_new_line(
struct card *card, char *line, int linenum, int linenum_orig)
struct card *card, char *line, int linenum, int linenum_orig, char *lineinfo)
{
struct card *x = TMALLOC(struct card, 1);
@ -443,6 +443,7 @@ struct card *insert_new_line(
x->linenum = linenum;
x->linenum_orig = linenum_orig;
x->level = card ? card->level : NULL;
x->linesource = lineinfo;
if (card)
card->nextcard = x;
@ -828,7 +829,7 @@ static void inp_cider_models(struct card* working)
}
else {
prev->actualLine =
insert_new_line(NULL, s, prev->linenum, prev->linenum_orig);
insert_new_line(NULL, s, prev->linenum, prev->linenum_orig, prev->linesource);
prev->actualLine->level = prev->level;
prev->actualLine->nextcard = working;
}
@ -1242,7 +1243,7 @@ struct card *inp_readall(FILE *fp, const char *dir_name, const char* file_name,
}
struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
static struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
const char* file_name, bool comfile, bool intfile)
/* fp: in, pointer to file to be read,
call_depth: in, nested call to fcn
@ -1465,7 +1466,7 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
/* append `buffer' to the (cc, end) chain of decks */
{
end = insert_new_line(
end, copy(buffer), line_number, line_number);
end, copy(buffer), line_number, line_number, NULL);
if (!cc)
cc = end;
@ -1700,8 +1701,7 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
{
end = insert_new_line(
end, copy(buffer), line_number++, line_number_orig++);
end->linesource = sourcelineinfo;
end, copy(buffer), line_number++, line_number_orig++, sourcelineinfo);
if (!cc)
cc = end;
}
@ -1722,10 +1722,10 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
if (call_depth == 0 && !comfile) {
if (!cp_getvar("no_auto_gnd", CP_BOOL, NULL, 0))
insert_new_line(cc, copy(".global gnd"), 1, 0);
insert_new_line(cc, copy(".global gnd"), 1, 0, "internal");
else
insert_new_line(
cc, copy("* gnd is not set to 0 automatically "), 1, 0);
cc, copy("* gnd is not set to 0 automatically "), 1, 0, "internal");
if (!newcompat.lt && !newcompat.ps && !newcompat.s3) {
/* process all library section references */
@ -1740,7 +1740,7 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
if (call_depth == 0 && !comfile)
if (found_end == TRUE)
end = insert_new_line(
end, copy(".end"), line_number++, line_number_orig++);
end, copy(".end"), line_number++, line_number_orig++, end->linesource);
/* Replace first line with the new title, if available */
if (call_depth == 0 && !comfile && new_title) {
@ -2220,8 +2220,8 @@ static int inp_chk_for_multi_in_vcvs(struct card *c, int *line_number)
tfree(xy_values2[1]);
*c->line = '*';
c = insert_new_line(c, m_instance, (*line_number)++, c->linenum_orig);
c = insert_new_line(c, m_model, (*line_number)++, c->linenum_orig);
c = insert_new_line(c, m_instance, (*line_number)++, c->linenum_orig, c->linesource);
c = insert_new_line(c, m_model, (*line_number)++, c->linenum_orig, c->linesource);
#endif
return 1;
} else {
@ -2401,7 +2401,7 @@ static void replace_freq(struct card *c, int *line_number)
line = tprintf("b_gen_%.*s gen_node_%.*s 0 v=%.*s",
BSTR(e), BSTR(e), BSTR(expr));
c = insert_new_line(c, line, (*line_number)++, c->linenum_orig);
c = insert_new_line(c, line, (*line_number)++, c->linenum_orig, c->linesource);
if (n2) {
line = tprintf("a_gen_%.*s gen_node_%.*s %%%cd(%.*s %.*s) "
"gen_model_%.*s",
@ -2412,13 +2412,13 @@ static void replace_freq(struct card *c, int *line_number)
BSTR(e), BSTR(e), pt, BSTR(n1), BSTR(e));
}
}
c = insert_new_line(c, line, (*line_number)++, c->linenum_orig);
c = insert_new_line(c, line, (*line_number)++, c->linenum_orig, c->linesource);
line = tprintf(".model gen_model_%.*s xfer %s table = [%.*s]",
BSTR(e),
ri ? "r_i=true" : rad ? "rad=true" : !db ? "db=false" : "",
BSTR(list));
c = insert_new_line(c, line, (*line_number)++, c->linenum_orig);
c = insert_new_line(c, line, (*line_number)++, c->linenum_orig, c->linesource);
#endif
}
@ -2489,12 +2489,12 @@ static void inp_add_control_section(struct card *deck, int *line_number)
if (last_end)
prev_card = last_end;
for (lp = cards; *lp; ++lp)
prev_card = insert_new_line(prev_card, copy(*lp), (*line_number)++, 0);
prev_card = insert_new_line(prev_card, copy(*lp), (*line_number)++, 0, "internal");
if (cp_getvar("rawfile", CP_STRING, rawfile, sizeof(rawfile))) {
line = tprintf("write %s", rawfile);
prev_card = insert_new_line(prev_card, line, (*line_number)++, 0);
prev_card = insert_new_line(prev_card, line, (*line_number)++, 0, "internal");
}
insert_new_line(prev_card, copy(".endc"), (*line_number)++, 0);
insert_new_line(prev_card, copy(".endc"), (*line_number)++, 0, "internal");
}
@ -3410,7 +3410,7 @@ static char *inp_fix_subckt(struct names *subckt_w_params, char *s)
beg = skip_back_non_ws(beg, s);
beg[-1] = '\0'; /* fixme can be < s */
head = insert_new_line(NULL, NULL, 0, 0);
head = insert_new_line(NULL, NULL, 0, 0, "internal");
/* create list of parameters that need to get sorted */
first_param_card = c = NULL;
while ((ptr1 = strchr(beg, '=')) != NULL) {
@ -3431,7 +3431,7 @@ static char *inp_fix_subckt(struct names *subckt_w_params, char *s)
beg = ptr2;
c = insert_new_line(c, copy_substring(ptr1, ptr2), 0, 0);
c = insert_new_line(c, copy_substring(ptr1, ptr2), 0, 0, "internal");
if (!first_param_card)
first_param_card = c;
@ -3665,7 +3665,7 @@ static struct card *expand_section_ref(struct card *c, const char *dir_name)
struct card *t = section_def;
for (; t; t = t->nextcard) {
c = insert_new_line(
c, copy(t->line), t->linenum, t->linenum_orig);
c, copy(t->line), t->linenum, t->linenum_orig, t->linesource);
if (t == section_def) {
c->line[0] = '*';
c->line[1] = '<';
@ -5450,7 +5450,7 @@ static int inp_split_multi_param_lines(struct card *card, int line_num)
*(card->line) = '*';
// insert new param lines immediately after current line
for (i = 0; i < counter; i++)
card = insert_new_line(card, array[i], line_num++, card->linenum_orig);
card = insert_new_line(card, array[i], line_num++, card->linenum_orig, card->linesource);
tfree(array);
}
@ -5938,10 +5938,8 @@ static void inp_compat(struct card *card)
// comment out current variable e line
*(card->line) = '*';
// insert new lines immediately after current line
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource);
}
}
else {
@ -5952,10 +5950,8 @@ static void inp_compat(struct card *card)
// comment out current variable e line
*(card->line) = '*';
// insert new lines immediately after current line
char* tmpsource = card->linesource;
for (i = 0; i < 4; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource);
}
}
tfree(expression);
@ -6000,10 +5996,8 @@ static void inp_compat(struct card *card)
// comment out current variable e line
*(card->line) = '*';
// insert new B source line immediately after current line
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource);
}
tfree(title_tok);
tfree(node1);
@ -6159,10 +6153,8 @@ static void inp_compat(struct card *card)
// comment out current variable e line
*(card->line) = '*';
// insert new lines immediately after current line
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource);
}
}
else {
@ -6171,10 +6163,8 @@ static void inp_compat(struct card *card)
// comment out current variable g line
*(card->line) = '*';
// insert new lines immediately after current line
char* tmpsource = card->linesource;
for (i = 0; i < 4; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource);
}
}
@ -6231,10 +6221,8 @@ static void inp_compat(struct card *card)
// comment out current variable g line
*(card->line) = '*';
// insert new B source line immediately after current line
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource);
}
tfree(title_tok);
@ -6280,10 +6268,8 @@ static void inp_compat(struct card *card)
// comment out current variable f line
*(card->line) = '*';
// insert new three lines immediately after current line
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource);
}
tfree(title_tok);
@ -6329,10 +6315,8 @@ static void inp_compat(struct card *card)
// comment out current variable h line
*(card->line) = '*';
// insert new three lines immediately after current line
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource);
}
tfree(title_tok);
@ -6404,16 +6388,11 @@ static void inp_compat(struct card *card)
// comment out current old R line
*(card->line) = '*';
// insert new B source line immediately after current line
char* tmpsource = card->linesource;
card = insert_new_line(card, xline, 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, xline, 1, currlinenumber, card->linesource);
if (rnoise) {
card = insert_new_line(card, x2line, 2, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, x3line, 3, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, x4line, 4, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, x2line, 2, currlinenumber, card->linesource);
card = insert_new_line(card, x3line, 3, currlinenumber, card->linesource);
card = insert_new_line(card, x4line, 4, currlinenumber, card->linesource);
}
tfree(title_tok);
@ -6488,10 +6467,8 @@ static void inp_compat(struct card *card)
// comment out current variable capacitor line
*(card->line) = '*';
// insert new B source line immediately after current line
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource);
}
tfree(title_tok);
@ -6550,10 +6527,8 @@ static void inp_compat(struct card *card)
// comment out current variable inductor line
*(card->line) = '*';
// insert new B source line immediately after current line
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource);
}
tfree(title_tok);
@ -6712,7 +6687,7 @@ static void inp_compat(struct card *card)
card->line = inp_remove_ws(curr_line);
// insert new B source line immediately after current line
for (ii = paui; ii < pai; ii++)
card = insert_new_line(card, ckt_array[ii], (int)ii + 1, currlinenumber);
card = insert_new_line(card, ckt_array[ii], (int)ii + 1, currlinenumber, card->linesource);
paui = pai;
}
@ -6809,7 +6784,7 @@ static void inp_compat(struct card *card)
// *(ckt_array[0]) = '*';
// insert new B source line immediately after current line
for (ii = paui; ii < pai; ii++)
card = insert_new_line(card, ckt_array[ii], (int)ii + 1, currlinenumber);
card = insert_new_line(card, ckt_array[ii], (int)ii + 1, currlinenumber, card->linesource);
paui = pai;
// continue;
@ -6910,7 +6885,7 @@ static void inp_bsource_compat(struct card *card)
// insert new B source line immediately after current line
/* Copy old line numbers into new B source line */
card = insert_new_line(
card, final_str, card->linenum, card->linenum_orig);
card, final_str, card->linenum, card->linenum_orig, card->linesource);
tfree(new_str);
} /* end of if 'b' */
@ -7271,8 +7246,8 @@ static void inp_add_series_resistor(struct card *deck)
*(card->line) = '*';
// insert new new L and R lines immediately after current line
card = insert_new_line(card, newL, 1, currlinenumber);
card = insert_new_line(card, newR, 2, currlinenumber);
card = insert_new_line(card, newL, 1, currlinenumber, card->linesource);
card = insert_new_line(card, newR, 2, currlinenumber, card->linesource);
tfree(title_tok);
tfree(node1);
@ -7308,7 +7283,7 @@ static void subckt_params_to_param(struct card *card)
/* card->line ends with subcircuit name */
cut_line[-1] = '\0';
/* insert new_line after card->line */
insert_new_line(card, new_line, card->linenum + 1, card->linenum_orig);
insert_new_line(card, new_line, card->linenum + 1, card->linenum_orig, card->linesource);
}
}
}
@ -7668,7 +7643,7 @@ static void inp_fix_temper_in_param(struct card *deck)
}
else {
/* Or just enter new line into deck */
insert_new_line(card, new_str, 0, card->linenum);
insert_new_line(card, new_str, 0, card->linenum_orig, card->linesource);
*card->line = '*';
}
}
@ -7877,7 +7852,7 @@ static void inp_fix_agauss_in_param(struct card *deck, char *fcn)
*card->line = '*';
/* Enter new line into deck */
insert_new_line(card, new_str, 0, card->linenum);
insert_new_line(card, new_str, 0, card->linenum_orig, card->linesource);
}
}
/* final memory clearance */
@ -7946,7 +7921,7 @@ static struct func_temper *inp_new_func(char *funcname, char *funcbody,
new_str = tprintf(".func %s() %s", funcname, funcbody);
*card->line = '*';
insert_new_line(card, new_str, 0, card->linenum);
insert_new_line(card, new_str, 0, card->linenum_orig, card->linesource);
return f;
}
@ -8449,7 +8424,7 @@ static void inp_meas_current(struct card *deck)
new_line = tprintf("%s %s %s_vmeas_%d 0",
new_tok, node1, node1, sn);
/* insert new_line after card->line */
insert_new_line(card, new_line, card->linenum + 1, card->linenum_orig);
insert_new_line(card, new_line, card->linenum + 1, card->linenum_orig, card->linesource);
}
sn++;
tfree(new_tok);

View File

@ -7,7 +7,7 @@
#define ngspice_INPCOM_H
struct card *insert_new_line(struct card *card, char *line,
int linenum, int linenum_orig);
int linenum, int linenum_orig, char *linesource);
char *inp_pathresolve(const char *name);
extern char* inp_remove_ws(char* s);

View File

@ -180,8 +180,7 @@ static void replace_table(struct card *startcard)
tfree(begline);
tfree(card->line);
card->line = cut_line = neweline;
insert_new_line(card, newbline, 0, card->linenum_orig);
card->nextcard->linesource = card->linesource;
insert_new_line(card, newbline, 0, card->linenum_orig, card->linesource);
/* read next TABLE function in cut_line */
ftablebeg = strstr(cut_line, "table(");
}
@ -672,26 +671,26 @@ struct card *pspice_compat(struct card *oldcard)
/* add predefined params TEMP, VT, GMIN to beginning of deck */
char *new_str = copy(".param temp = 'temper'");
newcard = insert_new_line(NULL, new_str, 1, 0);
newcard = insert_new_line(NULL, new_str, 1, 0, "internal");
new_str = copy(".param vt = '(temper + 273.15) * 8.6173303e-5'");
nextcard = insert_new_line(newcard, new_str, 2, 0);
nextcard = insert_new_line(newcard, new_str, 2, 0, "internal");
new_str = copy(".param gmin = 1e-12");
nextcard = insert_new_line(nextcard, new_str, 3, 0);
nextcard = insert_new_line(nextcard, new_str, 3, 0, "internal");
/* add funcs limit, pwr, pwrs, stp, if, int */
/* LIMIT( Output Expression, Limit1, Limit2)
Output will stay between the two limits given. */
new_str = copy(".func limit(x, a, b) { ternary_fcn(a > b, max(min(x, a), b), max(min(x, b), a)) }");
nextcard = insert_new_line(nextcard, new_str, 4, 0);
nextcard = insert_new_line(nextcard, new_str, 4, 0, "internal");
new_str = copy(".func pwr(x, a) { pow(x, a) }");
nextcard = insert_new_line(nextcard, new_str, 5, 0);
nextcard = insert_new_line(nextcard, new_str, 5, 0, "internal");
new_str = copy(".func pwrs(x, a) { sgn(x) * pow(x, a) }");
nextcard = insert_new_line(nextcard, new_str, 6, 0);
nextcard = insert_new_line(nextcard, new_str, 6, 0, "internal");
new_str = copy(".func stp(x) { u(x) }");
nextcard = insert_new_line(nextcard, new_str, 7, 0);
nextcard = insert_new_line(nextcard, new_str, 7, 0, "internal");
new_str = copy(".func if(a, b, c) {ternary_fcn( a , b , c )}");
nextcard = insert_new_line(nextcard, new_str, 8, 0);
nextcard = insert_new_line(nextcard, new_str, 8, 0, "internal");
new_str = copy(".func int(x) { sign(x)*floor(abs(x)) }");
nextcard = insert_new_line(nextcard, new_str, 9, 0);
nextcard = insert_new_line(nextcard, new_str, 9, 0, "internal");
nextcard->nextcard = oldcard;
#ifdef INTEGRATE_UDEVICES
@ -715,9 +714,9 @@ struct card *pspice_compat(struct card *oldcard)
char *cut_line = card->line;
if (ciprefix(".subckt", cut_line)) {
new_str = copy(".param temp = 'temper'");
nextcard = insert_new_line(card, new_str, 0, 0);
nextcard = insert_new_line(card, new_str, 0, card->linenum_orig, card->linesource);
new_str = copy(".param vt = '(temper + 273.15) * 8.6173303e-5'");
nextcard = insert_new_line(nextcard, new_str, 1, 0);
nextcard = insert_new_line(nextcard, new_str, 1, card->linenum_orig, card->linesource);
/* params: replace comma separator by space.
Do nothing if you are inside of { }. */
char* parastr = strstr(cut_line, "params:");
@ -1727,16 +1726,16 @@ struct card *ltspice_compat(struct card *oldcard)
char *new_str =
copy(".func uplim(x, pos, z) { min(x, pos - z) + (1 - "
"(min(max(0, x - pos + z), 2 * z) / 2 / z - 1)**2)*z }");
newcard = insert_new_line(NULL, new_str, 1, 0);
newcard = insert_new_line(NULL, new_str, 1, 0, "internal");
new_str = copy(".func dnlim(x, neg, z) { max(x, neg + z) - (1 - "
"(min(max(0, -x + neg + z), 2 * z) / 2 / z - 1)**2)*z }");
nextcard = insert_new_line(newcard, new_str, 2, 0);
nextcard = insert_new_line(newcard, new_str, 2, 0, "internal");
new_str = copy(".func uplim_tanh(x, pos, z) { min(x, pos - z) + "
"tanh(max(0, x - pos + z) / z)*z }");
nextcard = insert_new_line(nextcard, new_str, 3, 0);
nextcard = insert_new_line(nextcard, new_str, 3, 0, "internal");
new_str = copy(".func dnlim_tanh(x, neg, z) { max(x, neg + z) - "
"tanh(max(0, neg + z - x) / z)*z }");
nextcard = insert_new_line(nextcard, new_str, 4, 0);
nextcard = insert_new_line(nextcard, new_str, 4, 0, "internal");
nextcard->nextcard = oldcard;
/* remove .backanno, replace 'noiseless' by 'moisy=0' */

View File

@ -255,7 +255,7 @@ static struct card *flush_card(struct bridge *bridge, int ln,
ln, bridge->held, bridge->held, bridge->vcc);
bridge->count = 0;
bridge->end_index = 0;
return insert_new_line(last, copy(buff), BIG + ln, 0);
return insert_new_line(last, copy(buff), BIG + ln, last->linenum_orig, last->linesource);
}
@ -738,7 +738,8 @@ bool Evtcheck_nodes(
head = insert_new_line(lastcard,
copy("* Auto-bridge sub-deck."),
BIG + ln++, 0);
BIG + ln++, (lastcard ? lastcard->linenum_orig : 0),
(lastcard ? lastcard->linesource : NULL));
lastcard = head;
}
@ -748,7 +749,8 @@ bool Evtcheck_nodes(
*/
lastcard = insert_new_line(lastcard, bridge->setup,
BIG + ln++, 0);
BIG + ln++, (lastcard ? lastcard->linenum_orig : 0),
(lastcard ? lastcard->linesource : NULL));
bridge->setup = NULL; // Output just once.
}