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
|
||||
* b4v6dest.c : improved removal of circuit installation,
|
||||
bug no. 3229770. Memory leaks are quasi gone for
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue