From 97f3801bbd2091ce322bdd7664fb21380b6de826 Mon Sep 17 00:00:00 2001 From: rlar Date: Tue, 25 Oct 2016 21:51:38 +0200 Subject: [PATCH] inpcom.c, abstraction, introduce bogus_find_subckt() extracted from inp_fix_inst_calls_for_numparam(). This code is and was evil, as it does not respect scoping rules. --- src/frontend/inpcom.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 11c4f8532..d65991093 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -2655,6 +2655,24 @@ inp_fix_subckt_multiplier(struct names *subckt_w_params, struct line *subckt_car } +/* a bogus search for a .subckt with given name, + * which does not honour scoping rules + */ + +static struct line * +bogus_find_subckt(struct line *d, const char *subckt_name) +{ + const size_t len = strlen(subckt_name); + for (; d; d = d->li_next) + if (ciprefix(".subckt", d->li_line)) { + const char *n = skip_ws(skip_non_ws(d->li_line)); + if ((strncmp(n, subckt_name, len) == 0) && (!n[len] || isspace_c(n[len]))) + break; + } + return d; +} + + static void inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck) { @@ -2663,7 +2681,6 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck char *subckt_param_values[1000]; char *inst_param_names[1000]; char *inst_param_values[1000]; - char name_w_space[1000]; int i; // first iterate through instances and find occurences where 'm' multiplier needs to be @@ -2682,17 +2699,8 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck struct line *d, *p = NULL; // iterate through the deck to find the subckt (last one defined wins) - for (d = deck; d; d = d->li_next) { - char *subckt_line = d->li_line; - if (ciprefix(".subckt", subckt_line)) { - subckt_line = skip_non_ws(subckt_line); - subckt_line = skip_ws(subckt_line); - - sprintf(name_w_space, "%s ", subckt_name); - if (strncmp(subckt_line, name_w_space, strlen(name_w_space)) == 0) - p = d; - } - } + for (d = deck; (d = bogus_find_subckt(d, subckt_name)) != NULL; d = d->li_next) + p = d; if (p) { int num_subckt_params = inp_get_params(p->li_line, subckt_param_names, subckt_param_values); @@ -2728,17 +2736,11 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck if (find_name(subckt_w_params, subckt_name)) { struct line *d; - /* find .subckt line */ - - sprintf(name_w_space, "%s ", subckt_name); - - for (d = deck; d; d = d->li_next) { + for (d = deck; (d = bogus_find_subckt(d, subckt_name)) != NULL; d = d->li_next) { char *subckt_line = d->li_line; - if (ciprefix(".subckt", subckt_line)) { subckt_line = skip_non_ws(subckt_line); subckt_line = skip_ws(subckt_line); - if (strncmp(subckt_line, name_w_space, strlen(name_w_space)) == 0) { int num_subckt_params = inp_get_params(subckt_line, subckt_param_names, subckt_param_values); int num_inst_params = inp_get_params(inst_line, inst_param_names, inst_param_values); @@ -2780,8 +2782,6 @@ inp_fix_inst_calls_for_numparam(struct names *subckt_w_params, struct line *deck } break; - } - } } }