diff --git a/src/frontend/subckt.c b/src/frontend/subckt.c index 86143e3dc..a66060a78 100644 --- a/src/frontend/subckt.c +++ b/src/frontend/subckt.c @@ -715,6 +715,54 @@ inp_deckcopy(struct line *deck) { } +/* + * Copy a deck, without the li_actual lines, without comment lines, and + * without .control section(s). + * First line is always copied (except being .control). + */ +struct line * +inp_deckcopy_oc(struct line *deck) +{ + struct line *d = NULL, *nd = NULL; + int skip_control = 0; + + while (deck) { + /* exclude any command inside .control ... .endc */ + if (ciprefix(".control", deck->li_line)) { + skip_control++; + deck = deck->li_next; + continue; + } + else if (ciprefix(".endc", deck->li_line)) { + skip_control--; + deck = deck->li_next; + continue; + } + else if (skip_control > 0) { + deck = deck->li_next; + continue; + } + if (nd) { + d->li_next = TMALLOC(struct line, 1); + d = d->li_next; + } + else { + nd = d = TMALLOC(struct line, 1); + } + d->li_linenum = deck->li_linenum; + d->li_line = copy(deck->li_line); + if (deck->li_error) + d->li_error = copy(deck->li_error); + d->li_actual = NULL; + deck = deck->li_next; + while (deck && *(deck->li_line) == '*') + deck = deck->li_next; + } + + return (nd); +} + + /*------------------------------------------------------------------- * struct bxx_buffer, * a string assembly facility. diff --git a/src/frontend/subckt.h b/src/frontend/subckt.h index 969b7e95c..5cbb9c0f4 100644 --- a/src/frontend/subckt.h +++ b/src/frontend/subckt.h @@ -8,5 +8,6 @@ struct line * inp_subcktexpand(struct line *deck); struct line * inp_deckcopy(struct line *deck); +struct line * inp_deckcopy_oc(struct line *deck); #endif