subs, pass global `subs' by reference, EXACT

global subs0
    used and modified in doit()
    passed to translate()

  translate()
    pass only to nunmodes()

  numnodes()
    doesn't modify
This commit is contained in:
rlar 2012-03-11 21:28:44 +01:00
parent 56618c91f6
commit ca4cd48786
1 changed files with 18 additions and 17 deletions

View File

@ -77,14 +77,15 @@ extern void line_free_x(struct line * deck, bool recurse);
#define line_free(line,flag) { line_free_x(line,flag); line = NULL; }
/* ----- static declarations ----- */
struct subs;
static struct line * doit(struct line *deck);
static int translate(struct line *deck, char *formal, char *actual, char *scname,
char *subname);
char *subname, struct subs * const * const subs2);
struct bxx_buffer;
static void finishLine(struct bxx_buffer *dst, char *src, char *scname);
static int settrans(char *formal, char *actual, char *subname);
static char * gettrans(const char *name, const char *name_end);
static int numnodes(char *name);
static int numnodes(char *name, struct subs * const * const subs3);
static int numdevs(char *s);
static bool modtranslate(struct line *deck, char *subname);
static void devmodtranslate(struct line *deck, char *subname);
@ -119,7 +120,7 @@ struct subs {
*/
static wordlist *modnames, *submod;
static struct subs *subs = NULL;
static struct subs *subs0 = NULL;
static bool nobjthack = FALSE;
/* flag indicating use of the experimental numparams library */
static bool use_numparams = FALSE;
@ -401,11 +402,11 @@ doit(struct line *deck) {
bool gotone;
wordlist *tmodnames = modnames;
wordlist *tsubmod = submod;
struct subs *ts = subs;
struct subs *ts = subs0;
int error;
/* Save all the old stuff... */
subs = NULL;
subs0 = NULL;
submod = NULL;
#ifdef TRACE
@ -509,8 +510,8 @@ doit(struct line *deck) {
}
}
sss->su_next = subs;
subs = sss; /* Now that sss is built, assign it to subs */
sss->su_next = subs0;
subs0 = sss; /* Now that sss is built, assign it to subs */
last = c->li_next;
@ -536,10 +537,10 @@ doit(struct line *deck) {
/* Otherwise, expand sub-subcircuits recursively. */
{
struct subs *ks;
for (ks = sss = subs; sss; sss = sss->su_next) /* iterate through the list of subcircuits */
for (ks = sss = subs0; sss; sss = sss->su_next) /* iterate through the list of subcircuits */
if ((sss->su_def = doit(sss->su_def)) == NULL)
return (NULL);
subs = ks; /* ks has held pointer to start of subcircuits list. */
subs0 = ks; /* ks has held pointer to start of subcircuits list. */
}
#ifdef TRACE
@ -590,7 +591,7 @@ doit(struct line *deck) {
s++;
/* iterate through .subckt list and look for .subckt name invoked */
for (sss = subs; sss; sss = sss->su_next)
for (sss = subs0; sss; sss = sss->su_next)
if (eq(sss->su_name, s))
break;
@ -629,7 +630,7 @@ doit(struct line *deck) {
/* now invoke translate, which handles the remainder of the
* translation.
*/
if (!translate(lcc, s, t, scname, subname))
if (!translate(lcc, s, t, scname, subname, &subs0))
error = 1;
tfree(subname);
}
@ -690,7 +691,7 @@ doit(struct line *deck) {
if (error)
return NULL; /* error message already reported; should free( ) */
subs = ts;
subs0 = ts;
modnames = tmodnames;
submod = tsubmod;
/*
@ -891,7 +892,7 @@ bxx_buffer(struct bxx_buffer *t)
* subname = copy of the subcircuit name
*-------------------------------------------------------------------------------------------*/
static int
translate(struct line *deck, char *formal, char *actual, char *scname, char *subname)
translate(struct line *deck, char *formal, char *actual, char *scname, char *subname, struct subs * const * const subs2)
{
struct line *c;
struct bxx_buffer buffer;
@ -1079,7 +1080,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
tfree(t);
/* Next iterate over all nodes (netnames) found and translate them. */
nnodes = numnodes(c->li_line);
nnodes = numnodes(c->li_line, subs2);
while (nnodes-- > 0) {
name = gettok_node(&s);
@ -1224,7 +1225,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
tfree(nametofree);
/* Next iterate over all nodes (netnames) found and translate them. */
nnodes = numnodes(c->li_line);
nnodes = numnodes(c->li_line, subs2);
while (nnodes-- > 0) {
name = gettok_node(&s);
if (name == NULL ) {
@ -1504,7 +1505,7 @@ model_bin_match( char* token, char* model_name )
/*-------------------------------------------------------------------*/
/*-------------------------------------------------------------------*/
static int
numnodes(char *name)
numnodes(char *name, struct subs * const * const subs3)
{
/* gtri - comment - wbk - 10/23/90 - Do not modify this routine for */
/* 'A' type devices since the callers will not know how to find the */
@ -1535,7 +1536,7 @@ numnodes(char *name)
while ((*s != ' ') && (*s != '\t'))
s--;
s++;
for (sss = subs; sss; sss = sss->su_next)
for (sss = *subs3; sss; sss = sss->su_next)
if (eq(sss->su_name, s))
return (sss->su_numargs);
/*