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.
This commit is contained in:
parent
7337701734
commit
97f3801bbd
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue