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