diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 0444db175..2611ac2fb 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2459,17 +2459,26 @@ expand_section_references(struct line *c, int call_depth, char *dir_name) /* insert the library section definition into `c' */ { - struct line *corig = c; - struct line *cend = c; +// struct line *corig = c; + struct line *cend = NULL, *newl; struct line *rest = c->li_next; struct line *t = section_def; - cend = c->li_next = xx_new_line(NULL, copy(t->li_line), t->li_linenum, t->li_linenum_orig); - cend->li_line[0] = '*'; - cend->li_line[1] = '<'; - t = t->li_next; +// cend = c->li_next = xx_new_line(NULL, copy(t->li_line), t->li_linenum, t->li_linenum_orig); +// cend->li_line[0] = '*'; +// cend->li_line[1] = '<'; +// t = t->li_next; for (; t; t=t->li_next) { - cend->li_next = xx_new_line(NULL, copy(t->li_line), t->li_linenum, t->li_linenum_orig); - cend = cend->li_next; +// cend->li_next = xx_new_line(NULL, copy(t->li_line), t->li_linenum, t->li_linenum_orig); + newl = xx_new_line(NULL, copy(t->li_line), t->li_linenum, t->li_linenum_orig); + if (cend) + cend->li_next = newl; + else { + c->li_next = newl; + newl->li_line[0] = '*'; + newl->li_line[1] = '<'; + } + cend = newl; +// cend = cend->li_next; if(ciprefix(".endl", t->li_line)) break; } @@ -2479,7 +2488,7 @@ expand_section_references(struct line *c, int call_depth, char *dir_name) } cend->li_line[0] = '*'; cend->li_line[1] = '>'; - c = corig; +// c = corig; cend->li_next = rest; } @@ -5562,13 +5571,16 @@ static void inp_temper_compat(struct line *card) { int skip_control = 0; - char *beg_str, *end_str, *new_str = NULL, *beg_tstr, *end_tstr, *exp_str; + char *beg_str, *end_str, *beg_tstr, *end_tstr, *exp_str; char actchar; for (; card; card = card->li_next) { + char *new_str = NULL; char *curr_line = card->li_line; + if (curr_line == NULL) + continue; /* exclude any command inside .control ... .endc */ if (ciprefix(".control", curr_line)) { skip_control ++; @@ -5598,12 +5610,12 @@ inp_temper_compat(struct line *card) beg_str = beg_tstr = curr_line; while ((beg_tstr = strstr(beg_tstr, "temper")) != NULL) { actchar = *(beg_tstr - 1); - if (!isspace(actchar) && !is_arith_char(actchar)) { + if (!isspace(actchar) && !is_arith_char(actchar) && !(actchar == ',')) { beg_tstr++; continue; } actchar = *(beg_tstr + 6); - if (!isspace(actchar) && !is_arith_char(actchar)) + if (!isspace(actchar) && !is_arith_char(actchar) && !(actchar == ',')) continue; /* we have found a true 'temper' */ /* set the global variable */ @@ -5627,8 +5639,7 @@ inp_temper_compat(struct line *card) if (*beg_str) new_str = INPstrCat(new_str, copy(beg_str), " "); tfree(card->li_line); - new_str = inp_remove_ws(new_str); - card->li_line = new_str; + card->li_line = inp_remove_ws(new_str); } } @@ -6045,11 +6056,16 @@ inp_poly_err(struct line *card) void tprint(struct line *t) { + struct line *tmp; + /*debug: print into file*/ FILE *fd = fopen("tprint-out.txt", "w"); - - for (; t; t = t->li_next) - fprintf(fd, "%d %d %s\n", t->li_linenum_orig, t->li_linenum, t->li_line); + for (tmp = t; tmp; tmp = tmp->li_next) + if (*(tmp->li_line) != '*') + fprintf(fd, "%6d %6d %s\n", tmp->li_linenum_orig, tmp->li_linenum, tmp->li_line); + fprintf(fd, "\n*********************************************************************************\n\n"); + for (tmp = t; tmp; tmp = tmp->li_next) + fprintf(fd, "%6d %6d %s\n", tmp->li_linenum_orig, tmp->li_linenum, tmp->li_line); fclose(fd); } @@ -6146,13 +6162,21 @@ inp_fix_temper_in_param(struct line *deck) beg_tstr = curr_line; while ((end_tstr = beg_tstr = strstr(beg_tstr, "temper")) != NULL) { actchar = *(beg_tstr - 1); - if (!(actchar == '{') && !isspace(actchar) && !is_arith_char(actchar)) { + if (!(actchar == '{') && !isspace(actchar) && !is_arith_char(actchar) && !(actchar == ',')) { beg_tstr++; continue; } actchar = *(beg_tstr + 6); - if (!(actchar == '}') && !isspace(actchar) && !is_arith_char(actchar)) - continue; + if (actchar == '=') { + fprintf(stderr, "Error: you cannot assign a value to TEMPER\n"); + fprintf(stderr, " Line no. %d, %s\n", card->li_linenum, curr_line); + controlled_exit(EXIT_BAD); + } + + if (!(actchar == '}') && !isspace(actchar) && !is_arith_char(actchar) && !(actchar == ',')) { + beg_tstr++; + continue; + } /* we have found a true 'temper', so start conversion */ /* find function name and function body: We may have multiple params in a linie! @@ -6209,8 +6233,9 @@ inp_fix_temper_in_param(struct line *deck) char *new_str = NULL; /* string we assemble here */ char *curr_str;/* where we are in curr_line */ char *add_str;/* what we add */ + char *curr_line = card->li_line; - char * new_tmp_str, *tmp_str; + char * new_tmp_str, *tmp_str, *beg_str; if (*curr_line == '*') continue; @@ -6242,31 +6267,32 @@ inp_fix_temper_in_param(struct line *deck) continue; if (sub_count[subckt_depth] != new_func->subckt_count) continue; - - curr_str = curr_line; + // if (*curr_line != 'b') + // continue; + beg_str = curr_str = curr_line; while ((beg_tstr = strstr(curr_str, new_func->funcname)) != NULL) { /* start of token */ actchar = *(beg_tstr - 1); - if (!(actchar == '{') && !isspace(actchar) && !is_arith_char(actchar)) { - curr_str++; - continue; - } /* end of token */ end_tstr = beg_tstr + strlen(new_func->funcname); + if (!(actchar == '{') && !(actchar == ',') && !isspace(actchar) && !is_arith_char(actchar)) { + curr_str = end_tstr; + continue; + } actchar = *(end_tstr); - if (!(actchar == '}') && !isspace(actchar) && !is_arith_char(actchar)) { - curr_str++; + if (!(actchar == '}') && !(actchar == ',') && !isspace(actchar) && !is_arith_char(actchar)) { + curr_str = end_tstr; continue; } if (actchar == '(') { - curr_str++; + curr_str = end_tstr; continue; /* not the .func xxx() itself */ } /* we have found a true token equaling funcname, so start insertion */ - add_str = copy_substring(curr_str, end_tstr); + add_str = copy_substring(beg_str, end_tstr); new_str = INPstrCat(new_str, add_str, ""); new_str = INPstrCat(new_str, copy("()"), ""); - curr_str = end_tstr; + beg_str = curr_str = end_tstr; } if (new_str) /* add final part of line */ new_str = INPstrCat(new_str, copy(curr_str), "");