diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 6411c053f..ff13a2225 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -122,6 +122,22 @@ static void inp_poly_err(struct line *deck); #endif +static struct line * +xx_new_line(struct line *next, char *line, int linenum, int linenum_orig) +{ + struct line *x = TMALLOC(struct line, 1); + + x->li_next = next; + x->li_error = NULL; + x->li_actual = NULL; + x->li_line = line; + x->li_linenum = linenum; + x->li_linenum_orig = linenum_orig; + + return x; +} + + static struct library * new_lib(void) { @@ -495,22 +511,20 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile /* Make the .include a comment */ *buffer = '*'; - /* now check if this is the first pass (i.e. end points to null) */ - if (end) { /* end already exists */ - end->li_next = alloc(struct line); /* create next card */ - end = end->li_next; /* make end point to next card */ - } else { - end = cc = alloc(struct line); /* create the deck & end. cc will - point to beginning of deck, end to - the end */ + /* append `buffer' to the (cc, end) chain of decks */ + { + struct line *x = xx_new_line(NULL, copy(buffer), line_number, line_number); + + if (end) + end->li_next = x; + else + cc = x; + + end = x; + + line_number++; } - /* now fill out rest of struct end. */ - end->li_next = NULL; - end->li_error = NULL; - end->li_actual = NULL; - end->li_line = copy(buffer); - end->li_linenum = end->li_linenum_orig = line_number++; if (newcard) { int line_number_inc = 1; end->li_next = newcard; @@ -574,22 +588,17 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile shell_eol_continuation = chk_for_line_continuation(buffer); - /* now check if this is the first pass (i.e. end points to null) */ - if (end) { /* end already exists */ - end->li_next = alloc(struct line); /* create next card */ - end = end->li_next; /* point to next card */ - } else { /* End doesn't exist. Create it. */ - end = cc = alloc(struct line); /* note that cc points to beginning - of deck, end to the end */ + { + struct line *x = xx_new_line(NULL, copy(buffer), line_number++, line_number_orig++); + + if (end) + end->li_next = x; + else + cc = x; + + end = x; } - /* now put buffer into li */ - end->li_next = NULL; - end->li_error = NULL; - end->li_actual = NULL; - end->li_line = copy(buffer); - end->li_linenum = line_number++; - end->li_linenum_orig = line_number_orig++; tfree(buffer); } /* end while ((buffer = readline(fp)) != NULL) */ @@ -597,14 +606,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile return NULL; if (call_depth == 0 && found_end == TRUE) { - struct line *global_card = alloc(struct line); - global_card->li_error = NULL; - global_card->li_actual = NULL; - global_card->li_line = copy(".global gnd"); - global_card->li_linenum = 1; - - global_card->li_next = cc->li_next; - cc->li_next = global_card; + cc->li_next = xx_new_line(cc->li_next, copy(".global gnd"), 1, 0); if (inp_compat_mode == COMPATMODE_ALL || inp_compat_mode == COMPATMODE_HS || @@ -621,16 +623,9 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile if (call_depth == 0) { if (found_end == TRUE) { - end->li_next = alloc(struct line); /* create next card */ - end = end->li_next; /* point to next card */ - - /* now put buffer into li */ - end->li_next = NULL; - end->li_error = NULL; - end->li_actual = NULL; - end->li_line = copy(".end"); - end->li_linenum = end->li_linenum_orig = line_number++; - end->li_linenum_orig = line_number_orig++; + struct line *x = xx_new_line(NULL, copy(".end"), line_number++, line_number_orig++); + end->li_next = x; + end = x; } } @@ -694,13 +689,7 @@ inp_readall(FILE *fp, int call_depth, char *dir_name, bool comfile, bool intfile end->li_next = working; tfree(s); } else { - newcard = alloc(struct line); - newcard->li_linenum = prev->li_linenum; - newcard->li_line = s; - newcard->li_next = working; - newcard->li_error = NULL; - newcard->li_actual = NULL; - prev->li_actual = newcard; + prev->li_actual = xx_new_line(working, s, prev->li_linenum, 0); } working = prev->li_next; break; @@ -960,21 +949,6 @@ inp_fix_gnd_name(struct line *c) } } -static struct line* -create_new_card(char *card_str, int *line_number) -{ - struct line *newcard = alloc(struct line); - - newcard->li_line = strdup(card_str); - newcard->li_linenum = *line_number; - newcard->li_error = NULL; - newcard->li_actual = NULL; - - *line_number += 1; - - return newcard; -} - static void inp_chk_for_multi_in_vcvs(struct line *c, int *line_number) @@ -1065,13 +1039,13 @@ inp_chk_for_multi_in_vcvs(struct line *c, int *line_number) sprintf(big_buf, "%s %%vd[ %s ] %%vd( %s ) %s", model_name, ctrl_node_str, node_str, model_name); - a_card = create_new_card(big_buf, line_number); + a_card = xx_new_line(NULL, copy(big_buf), *(line_number)++, 0); *a_card->li_line = 'a'; sprintf(big_buf, ".model %s multi_input_pwl ( x = [%s %s] y = [%s %s] model = \"%s\" )", model_name, xy_values1[0], xy_values2[0], xy_values1[1], xy_values2[1], fcn_name); - model_card = create_new_card(big_buf, line_number); + model_card = xx_new_line(NULL, copy(big_buf), (*line_number)++, 0); tfree(model_name); tfree(node_str); @@ -1096,7 +1070,7 @@ inp_chk_for_multi_in_vcvs(struct line *c, int *line_number) static void inp_add_control_section(struct line *deck, int *line_number) { - struct line *c, *newcard, *prev_card = NULL; + struct line *c, *prev_card = NULL; bool found_control = FALSE, found_run = FALSE; bool found_end = FALSE; char *op_line = NULL, rawfile[1000], *line; @@ -1119,56 +1093,37 @@ inp_add_control_section(struct line *deck, int *line_number) found_control = FALSE; if (!found_run) { - newcard = create_new_card("run", line_number); - prev_card->li_next = newcard; - newcard->li_next = c; - prev_card = newcard; - found_run = TRUE; + prev_card->li_next = xx_new_line(c, copy("run"), (*line_number)++, 0); + prev_card = prev_card->li_next; + found_run = TRUE; } if (cp_getvar("rawfile", CP_STRING, rawfile)) { line = TMALLOC(char, strlen("write") + strlen(rawfile) + 2); sprintf(line, "write %s", rawfile); - newcard = create_new_card(line, line_number); - prev_card->li_next = newcard; - newcard->li_next = c; - prev_card = newcard; - tfree(line); + prev_card->li_next = xx_new_line(c, line, (*line_number)++, 0); + prev_card = prev_card->li_next; } } prev_card = c; } + // check if need to add control section if (!found_run && found_end) { - prev_card = deck->li_next; - newcard = create_new_card(".endc", line_number); - deck->li_next = newcard; - newcard->li_next = prev_card; + + deck->li_next = xx_new_line(deck->li_next, copy(".endc"), (*line_number)++, 0); if (cp_getvar("rawfile", CP_STRING, rawfile)) { line = TMALLOC(char, strlen("write") + strlen(rawfile) + 2); sprintf(line, "write %s", rawfile); - prev_card = deck->li_next; - newcard = create_new_card(line, line_number); - deck->li_next = newcard; - newcard->li_next = prev_card; - tfree(line); - } - if (op_line != NULL) { - prev_card = deck->li_next; - newcard = create_new_card(op_line, line_number); - deck->li_next = newcard; - newcard->li_next = prev_card; + deck->li_next = xx_new_line(deck->li_next, line, (*line_number)++, 0); } - prev_card = deck->li_next; - newcard = create_new_card("run", line_number); - deck->li_next = newcard; - newcard->li_next = prev_card; + if (op_line) + deck->li_next = xx_new_line(deck->li_next, copy(op_line), (*line_number)++, 0); - prev_card = deck->li_next; - newcard = create_new_card(".control", line_number); - deck->li_next = newcard; - newcard->li_next = prev_card; + deck->li_next = xx_new_line(deck->li_next, copy("run"), (*line_number)++, 0); + + deck->li_next = xx_new_line(deck->li_next, copy(".control"), (*line_number)++, 0); } } @@ -2041,7 +1996,7 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) beg = skip_back_non_ws(beg); beg[-1] = '\0'; - head = alloc(struct line); + head = xx_new_line(NULL, NULL, 0, 0); /* create list of parameters that need to get sorted */ while (*beg && (ptr1 = strchr(beg, '=')) != NULL) { #ifndef NOBRACE @@ -2082,10 +2037,7 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) beg = ptr2 + 1; } - newcard = alloc(struct line); - - newcard->li_line = strdup(ptr1); - newcard->li_next = NULL; + newcard = xx_new_line(NULL, strdup(ptr1), 0, 0); if (start_card == NULL) head->li_next = start_card = newcard; @@ -2119,10 +2071,7 @@ inp_fix_subckt(struct names *subckt_w_params, char *s) buf[buf_idx++] = '\0'; beg = p1; - newcard = alloc(struct line); - - newcard->li_line = buf; - newcard->li_next = NULL; + newcard = xx_new_line(NULL, buf, 0, 0); if (start_card == NULL) head->li_next = start_card = newcard; @@ -4043,17 +3992,14 @@ inp_split_multi_param_lines(struct line *deck, int line_num) } tmp_ptr = card->li_next; for (i = 0; i < counter; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = array[i]; - param_end->li_linenum = line_num++; + struct line *x = xx_new_line(NULL, array[i], line_num++, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current multi-param line *(card->li_line) = '*'; @@ -4269,17 +4215,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable e line *(card->li_line) = '*'; @@ -4331,17 +4274,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable e line *(card->li_line) = '*'; @@ -4461,17 +4401,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable e line *(card->li_line) = '*'; @@ -4534,17 +4471,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable g line *(card->li_line) = '*'; @@ -4649,18 +4583,12 @@ inp_compat(struct line *card) } tc1_ptr = NULL; tc2_ptr = NULL; - new_line = alloc(struct line); - new_line->li_next = NULL; - new_line->li_error = NULL; - new_line->li_actual = NULL; - new_line->li_line = xline; - new_line->li_linenum = 0; + new_line = xx_new_line(card->li_next, xline, 0, 0); + // comment out current old R line *(card->li_line) = '*'; // insert new B source line immediately after current line - tmp_ptr = card->li_next; card->li_next = new_line; - new_line->li_next = tmp_ptr; // point 'card' pointer to the new line card = new_line; tfree(title_tok); @@ -4755,17 +4683,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 3; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable capacitor line *(card->li_line) = '*'; @@ -4870,17 +4795,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (i = 0; i < 3; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable inductor line *(card->li_line) = '*'; @@ -5044,17 +4966,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (ii = paui; ii < pai; ii++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[ii]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[ii], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // insert new param lines immediately after current line @@ -5165,17 +5084,14 @@ inp_compat(struct line *card) // insert new B source line immediately after current line tmp_ptr = card->li_next; for (ii = paui; ii < pai; ii++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[ii]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[ii], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current variable capacitor line // *(ckt_array[0]) = '*'; @@ -5243,7 +5159,7 @@ inp_bsource_compat(struct line *card) { char *equal_ptr, *str_ptr, *tmp_char, *new_str, *final_str; char actchar; - struct line *new_line, *tmp_ptr; + struct line *new_line; wordlist *wl = NULL, *wlist = NULL; char buf[512]; size_t i, xlen, ustate = 0; @@ -5495,20 +5411,13 @@ inp_bsource_compat(struct line *card) final_str = TMALLOC(char, xlen); sprintf(final_str, "%s %s", tmp_char, new_str); - new_line = alloc(struct line); - new_line->li_next = NULL; - new_line->li_error = NULL; - new_line->li_actual = NULL; - new_line->li_line = final_str; /* Copy old line numbers into new B source line */ - new_line->li_linenum = card->li_linenum; - new_line->li_linenum_orig = card->li_linenum_orig; + new_line = xx_new_line(card->li_next, final_str, card->li_linenum, card->li_linenum_orig); + // comment out current line (old B source line) *(card->li_line) = '*'; // insert new B source line immediately after current line - tmp_ptr = card->li_next; card->li_next = new_line; - new_line->li_next = tmp_ptr; // point 'card' pointer to the new line card = new_line; @@ -5643,17 +5552,14 @@ inp_add_series_resistor(struct line *deck) /* assemble new L and R lines */ tmp_ptr = card->li_next; for (i = 0; i < 2; i++) { - if (param_end) { - param_end->li_next = alloc(struct line); - param_end = param_end->li_next; - } else { - param_end = param_beg = alloc(struct line); - } - param_end->li_next = NULL; - param_end->li_error = NULL; - param_end->li_actual = NULL; - param_end->li_line = ckt_array[i]; - param_end->li_linenum = 0; + struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0); + + if (param_end) + param_end->li_next = x; + else + param_beg = x; + + param_end = x; } // comment out current L line *(card->li_line) = '*';