remove memory leaks

This commit is contained in:
h_vogt 2011-12-30 08:59:03 +00:00
parent 127213bff0
commit 7e96dcc639
4 changed files with 142 additions and 129 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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);
}