diff --git a/ChangeLog b/ChangeLog index e683410b5..a57035ae7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2011-12-29 Holger Vogt + * inppas3.c, cktdest.c: reduce memory leaks + * inpsymt.c: beautify + 2011-12-29 Holger Vogt * b4v6dest.c : improved removal of circuit installation, bug no. 3229770. Memory leaks are quasi gone for diff --git a/src/spicelib/analysis/cktdest.c b/src/spicelib/analysis/cktdest.c index b356c6d89..ebf014a98 100644 --- a/src/spicelib/analysis/cktdest.c +++ b/src/spicelib/analysis/cktdest.c @@ -53,6 +53,8 @@ CKTdestroy(CKTcircuit *ckt) FREE(node); node = nnode; } + ckt->CKTnodes = NULL; + ckt->CKTlastNode = NULL; FREE(ckt->CKTrhs); FREE(ckt->CKTrhsOld); @@ -63,9 +65,13 @@ CKTdestroy(CKTcircuit *ckt) FREE(ckt->CKTstat->STATdevNum); FREE(ckt->CKTstat); + FREE(ckt->CKThead); + +#ifdef XSPICE + FREE(ckt->enh); + FREE(ckt->evt); +#endif - ckt->CKTnodes = NULL; - ckt->CKTlastNode = NULL; FREE(ckt); return(OK); } diff --git a/src/spicelib/parser/inppas3.c b/src/spicelib/parser/inppas3.c index 12fa3749c..c882db187 100644 --- a/src/spicelib/parser/inppas3.c +++ b/src/spicelib/parser/inppas3.c @@ -1,7 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles -Modified: AlansFixes +Modified: AlansFixes **********/ #include "ngspice/config.h" @@ -22,7 +22,7 @@ extern IFsimulator *ft_sim; void INPpas3(CKTcircuit *ckt, card *data, INPtables *tab, TSKtask *task, - IFparm *nodeParms, int numNodeParms) + IFparm *nodeParms, int numNodeParms) { card *current; @@ -46,81 +46,84 @@ INPpas3(CKTcircuit *ckt, card *data, INPtables *tab, TSKtask *task, #endif for(current = data; current != NULL; current = current->nextcard) { - line = current->line; - FREE(token) - INPgetTok(&line,&token,1); + line = current->line; + FREE(token) + INPgetTok(&line,&token,1); - if (strcmp(token,".nodeset")==0) { - which = -1; + if (strcmp(token,".nodeset")==0) { + which = -1; - for(prm = nodeParms; prm < nodeParms + numNodeParms; prm++) { - if(strcmp(prm->keyword,"nodeset")==0) { - which = prm->id; - break; - } - } + for(prm = nodeParms; prm < nodeParms + numNodeParms; prm++) { + if(strcmp(prm->keyword,"nodeset")==0) { + which = prm->id; + break; + } + } - if(which == -1) { - LITERR("nodeset unknown to simulator. \n") - goto quit; - } + if(which == -1) { + LITERR("nodeset unknown to simulator. \n") + goto quit; + } - for(;;) { - /* loop until we run out of data */ - INPgetTok(&line,&name,1); + for(;;) { + /* loop until we run out of data */ + INPgetTok(&line,&name,1); - /* check to see if in the form V(xxx) and grab the xxx */ - if( *name == 0) break; /* end of line */ - if( (*name == 'V' || *name == 'v') && !name[1] ) { - /* looks like V - must be V(xx) - get xx now*/ - INPgetTok(&line,&name,1); - if (INPtermInsert(ckt,&name,tab,&node1)!=E_EXISTS) - fprintf(stderr, - "Warning : Nodeset on non-existant node - %s\n", name); - ptemp.rValue = INPevaluate(&line,&error,1); - IFC(setNodeParm, (ckt, node1, which, &ptemp, NULL)); - continue; - } - LITERR(" Error: .nodeset syntax error.\n") - break; - } - } else if ((strcmp(token,".ic") == 0)) { - /* .ic */ - which = -1; - for(prm = nodeParms; prm < nodeParms + numNodeParms; prm++) { - if(strcmp(prm->keyword,"ic")==0) { - which = prm->id; - break; - } - } + /* check to see if in the form V(xxx) and grab the xxx */ + if( *name == 0) break; /* end of line */ + if( (*name == 'V' || *name == 'v') && !name[1] ) { + /* looks like V - must be V(xx) - get xx now*/ + INPgetTok(&line,&name,1); + if (INPtermInsert(ckt,&name,tab,&node1)!=E_EXISTS) + fprintf(stderr, + "Warning : Nodeset on non-existant node - %s\n", name); + ptemp.rValue = INPevaluate(&line,&error,1); + IFC(setNodeParm, (ckt, node1, which, &ptemp, NULL)); + continue; + } + LITERR(" Error: .nodeset syntax error.\n") + break; + } + } else if ((strcmp(token,".ic") == 0)) { + /* .ic */ + which = -1; + for(prm = nodeParms; prm < nodeParms + numNodeParms; prm++) { + if(strcmp(prm->keyword,"ic")==0) { + which = prm->id; + break; + } + } - if(which==-1) { - LITERR("ic unknown to simulator. \n") - goto quit; - } + if(which==-1) { + LITERR("ic unknown to simulator. \n") + goto quit; + } - for(;;) { - /* loop until we run out of data */ - INPgetTok(&line,&name,1); - /* check to see if in the form V(xxx) and grab the xxx */ - if( *name == 0) break; /* end of line */ - if( (*name == 'V' || *name == 'v') && !name[1] ) { - /* looks like V - must be V(xx) - get xx now*/ - INPgetTok(&line,&name,1); - if (INPtermInsert(ckt,&name,tab,&node1)!=E_EXISTS) - fprintf(stderr, - "Warning : IC on non-existant node - %s\n", name); - ptemp.rValue = INPevaluate(&line,&error,1); - IFC(setNodeParm, (ckt, node1, which, &ptemp, NULL)) - continue; - } - LITERR(" Error: .ic syntax error.\n") - break; - } - } + for(;;) { + /* loop until we run out of data */ + INPgetTok(&line,&name,1); + /* check to see if in the form V(xxx) and grab the xxx */ + if( *name == 0) { + FREE(name); + break; /* end of line */ + } + if( (*name == 'V' || *name == 'v') && !name[1] ) { + /* looks like V - must be V(xx) - get xx now*/ + INPgetTok(&line,&name,1); + if (INPtermInsert(ckt,&name,tab,&node1)!=E_EXISTS) + fprintf(stderr, + "Warning : IC on non-existant node - %s\n", name); + ptemp.rValue = INPevaluate(&line,&error,1); + IFC(setNodeParm, (ckt, node1, which, &ptemp, NULL)) + continue; + } + LITERR(" Error: .ic syntax error.\n") + break; + } + } } quit: FREE(token); - return; + return; } diff --git a/src/spicelib/parser/inpsymt.c b/src/spicelib/parser/inpsymt.c index 9a16f9da5..11bc452df 100644 --- a/src/spicelib/parser/inpsymt.c +++ b/src/spicelib/parser/inpsymt.c @@ -48,23 +48,23 @@ int INPtermInsert(CKTcircuit *ckt, char **token, INPtables * tab, CKTnode **node key = hash(*token, tab->INPtermsize); for (t = tab->INPtermsymtab[key]; t; t = t->t_next) { - if (!strcmp(*token, t->t_ent)) { - FREE(*token); - *token = t->t_ent; - if (node) - *node = t->t_node; - return (E_EXISTS); - } + if (!strcmp(*token, t->t_ent)) { + FREE(*token); + *token = t->t_ent; + if (node) + *node = t->t_node; + return (E_EXISTS); + } } t = TMALLOC(struct INPnTab, 1); if (t == NULL) - return (E_NOMEM); + return (E_NOMEM); ZERO(t, struct INPnTab); error = ft_sim->newNode (ckt, &(t->t_node), *token); if (error) - return (error); + return (error); if (node) - *node = t->t_node; + *node = t->t_node; t->t_ent = *token; t->t_next = tab->INPtermsymtab[key]; tab->INPtermsymtab[key] = t; @@ -85,17 +85,17 @@ int INPmkTerm(CKTcircuit *ckt, char **token, INPtables * tab, CKTnode **node) key = hash(*token, tab->INPtermsize); for (t = tab->INPtermsymtab[key]; t; t = t->t_next) { - if (!strcmp(*token, t->t_ent)) { - FREE(*token); - *token = t->t_ent; - if (node) - *node = t->t_node; - return (E_EXISTS); - } + if (!strcmp(*token, t->t_ent)) { + FREE(*token); + *token = t->t_ent; + if (node) + *node = t->t_node; + return (E_EXISTS); + } } t = TMALLOC(struct INPnTab, 1); if (t == NULL) - return (E_NOMEM); + return (E_NOMEM); ZERO(t, struct INPnTab); t->t_node = *node; t->t_ent = *token; @@ -114,23 +114,23 @@ int INPgndInsert(CKTcircuit *ckt, char **token, INPtables * tab, CKTnode **node) key = hash(*token, tab->INPtermsize); for (t = tab->INPtermsymtab[key]; t; t = t->t_next) { - if (!strcmp(*token, t->t_ent)) { - FREE(*token); - *token = t->t_ent; - if (node) - *node = t->t_node; - return (E_EXISTS); - } + if (!strcmp(*token, t->t_ent)) { + FREE(*token); + *token = t->t_ent; + if (node) + *node = t->t_node; + return (E_EXISTS); + } } t = TMALLOC(struct INPnTab, 1); if (t == NULL) - return (E_NOMEM); + return (E_NOMEM); ZERO(t, struct INPnTab); error = ft_sim->groundNode (ckt, &(t->t_node), *token); if (error) - return (error); + return (error); if (node) - *node = t->t_node; + *node = t->t_node; t->t_ent = *token; t->t_next = tab->INPtermsymtab[key]; tab->INPtermsymtab[key] = t; @@ -146,10 +146,10 @@ int INPretrieve(char **token, INPtables * tab) key = hash(*token, tab->INPsize); for (t = tab->INPsymtab[key]; t; t = t->t_next) - if (!strcmp(*token, t->t_ent)) { - *token = t->t_ent; - return (OK); - } + if (!strcmp(*token, t->t_ent)) { + *token = t->t_ent; + return (OK); + } return (E_BADPARM); } @@ -163,14 +163,14 @@ int INPinsert(char **token, INPtables * tab) key = hash(*token, tab->INPsize); for (t = tab->INPsymtab[key]; t; t = t->t_next) - if (!strcmp(*token, t->t_ent)) { - FREE(*token); - *token = t->t_ent; - return (E_EXISTS); - } + if (!strcmp(*token, t->t_ent)) { + FREE(*token); + *token = t->t_ent; + return (E_EXISTS); + } t = TMALLOC(struct INPtab, 1); if (t == NULL) - return (E_NOMEM); + return (E_NOMEM); ZERO(t, struct INPtab); t->t_ent = *token; t->t_next = tab->INPsymtab[key]; @@ -189,15 +189,15 @@ int INPinsertNofree(char **token, INPtables * tab) key = hash(*token, tab->INPsize); for (t = tab->INPsymtab[key]; t; t = t->t_next) - if (!strcmp(*token, t->t_ent)) { + if (!strcmp(*token, t->t_ent)) { - /* MW. We can't touch memory pointed by token now */ - *token = t->t_ent; - return (E_EXISTS); - } + /* MW. We can't touch memory pointed by token now */ + *token = t->t_ent; + return (E_EXISTS); + } t = TMALLOC(struct INPtab, 1); if (t == NULL) - return (E_NOMEM); + return (E_NOMEM); ZERO(t, struct INPtab); t->t_ent = *token; t->t_next = tab->INPsymtab[key]; @@ -214,9 +214,9 @@ int INPremove(char *token, INPtables * tab) key = hash(token, tab->INPsize); prevp = &tab->INPsymtab[key]; for (t = *prevp; t && token != t->t_ent; t = t->t_next) - prevp = &t->t_next; + prevp = &t->t_next; if (!t) - return OK; + return OK; *prevp = t->t_next; tfree(t->t_ent); @@ -234,9 +234,9 @@ int INPremTerm(char *token, INPtables * tab) key = hash(token, tab->INPtermsize); prevp = &tab->INPtermsymtab[key]; for (t = *prevp; t && token != t->t_ent; t = t->t_next) - prevp = &t->t_next; + prevp = &t->t_next; if (!t) - return OK; + return OK; *prevp = t->t_next; tfree(t->t_ent); @@ -254,18 +254,18 @@ void INPtabEnd(INPtables * tab) int i; for (i = 0; i < tab->INPsize; i++) - for (t = tab->INPsymtab[i]; t; t = lt) { - lt = t->t_next; - FREE(t->t_ent); - FREE(t); - } + for (t = tab->INPsymtab[i]; t; t = lt) { + lt = t->t_next; + FREE(t->t_ent); + FREE(t); + } FREE(tab->INPsymtab); for (i = 0; i < tab->INPtermsize; i++) - for (n = tab->INPtermsymtab[i]; n; n = ln) { - ln = n->t_next; - FREE(n->t_ent); - FREE(n); /* But not t_node ! */ - } + for (n = tab->INPtermsymtab[i]; n; n = ln) { + ln = n->t_next; + FREE(n->t_ent); + FREE(n); /* But not t_node ! */ + } FREE(tab->INPtermsymtab); FREE(tab); return; @@ -277,6 +277,6 @@ static int hash(char *name, int tsize) register int i = 0; for (s = name; *s; s++) - i += *s; + i += *s; return (i % tsize); }