src/frontend/subckt.c src/frontend/vectors.c

src/spicelib/analysis/dctran.c src/spicelib/parser/inperror.c
 	src/xspice/idn/idndig.c src/xspice/mif/mif_inp2.c ChangeLog

	Memory leak fixes
This commit is contained in:
stefanjones 2003-07-17 16:14:22 +00:00
parent 4c572183d5
commit 14483620d4
7 changed files with 76 additions and 31 deletions

View File

@ -1,5 +1,11 @@
2003-07-17 Stefan Jones <stefan.jones@multigig.com> 2003-07-17 Stefan Jones <stefan.jones@multigig.com>
* src/frontend/{subckt.c,vectors.c}
src/spicelib/analysis/dctran.c
src/spicelib/parser/inperror.c
src/xspice/idn/idndig.c src/xspice/mif/mif_inp2.c :
More memory leak fixes
* configure.in src/xspice/xspice.c : * configure.in src/xspice/xspice.c :
Fix compile problems with garbage collector Fix compile problems with garbage collector

View File

@ -332,14 +332,14 @@ doit(struct line *deck)
gotone = FALSE; gotone = FALSE;
for (c = deck, lc = NULL; c; ) { for (c = deck, lc = NULL; c; ) {
if (ciprefix(invoke, c->li_line)) { /* found reference to .subckt (i.e. component with refdes X) */ if (ciprefix(invoke, c->li_line)) { /* found reference to .subckt (i.e. component with refdes X) */
char *tofree; char *tofree, *tofree2;
gotone = TRUE; gotone = TRUE;
t = tofree = s = copy(c->li_line); /* s & t hold copy of component line */ t = tofree = s = copy(c->li_line); /* s & t hold copy of component line */
/* make scname point to first non-whitepace chars after refdes invocation /* make scname point to first non-whitepace chars after refdes invocation
* e.g. if invocation is Xreference, *scname = reference * e.g. if invocation is Xreference, *scname = reference
*/ */
scname = gettok(&s); tofree2 = scname = gettok(&s);
scname += strlen(invoke); scname += strlen(invoke);
while ((*scname == ' ') || (*scname == '\t') || while ((*scname == ' ') || (*scname == '\t') ||
(*scname == ':')) (*scname == ':'))
@ -398,6 +398,7 @@ doit(struct line *deck)
*/ */
if (!translate(lcc, s, t, scname, subname)) if (!translate(lcc, s, t, scname, subname))
error = 1; error = 1;
tfree(subname);
/* Now splice the decks together. */ /* Now splice the decks together. */
if (lc) if (lc)
@ -410,6 +411,7 @@ doit(struct line *deck)
c = lcc->li_next; c = lcc->li_next;
lc = lcc; lc = lcc;
tfree(tofree); tfree(tofree);
tfree(tofree2);
} /* if (ciprefix(invoke, c->li_line)) . . . */ } /* if (ciprefix(invoke, c->li_line)) . . . */
else { else {
lc = c; lc = c;
@ -481,19 +483,20 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
struct line *c; struct line *c;
char *buffer, *next_name, dev_type, *name, *s, *t, ch, *nametofree; char *buffer, *next_name, dev_type, *name, *s, *t, ch, *nametofree;
int nnodes, i, dim; int nnodes, i, dim;
int rtn=0;
/* settrans builds the table holding the translated netnames. */ /* settrans builds the table holding the translated netnames. */
i = settrans(formal, actual, subname); i = settrans(formal, actual, subname);
if (i < 0) { if (i < 0) {
fprintf(stderr, fprintf(stderr,
"Too few parameters for subcircuit type \"%s\" (instance: x%s)\n", "Too few parameters for subcircuit type \"%s\" (instance: x%s)\n",
subname, scname); subname, scname);
return 0; goto quit;
} else if (i > 0) { } else if (i > 0) {
fprintf(stderr, fprintf(stderr,
"Too many parameters for subcircuit type \"%s\" (instance: x%s)\n", "Too many parameters for subcircuit type \"%s\" (instance: x%s)\n",
subname, scname); subname, scname);
return 0; goto quit;
} }
/* now iterate through the .subckt deck and translate the cards. */ /* now iterate through the .subckt deck and translate the cards. */
@ -627,7 +630,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
s = c->li_line; /* s now holds the SPICE line */ s = c->li_line; /* s now holds the SPICE line */
name = gettok(&s); /* name points to the refdes */ t = name = gettok(&s); /* name points to the refdes */
if (!name) if (!name)
continue; continue;
if (!*name) { if (!*name) {
@ -650,6 +653,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
name); name);
else else
(void) sprintf(buffer, "%c:%s ", ch, scname); /* F:subcircuitname */ (void) sprintf(buffer, "%c:%s ", ch, scname); /* F:subcircuitname */
tfree(t);
/* Next iterate over all nodes (netnames) found and translate them. */ /* Next iterate over all nodes (netnames) found and translate them. */
@ -660,7 +664,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
if (name == NULL) { if (name == NULL) {
fprintf(cp_err, "Error: too few nodes: %s\n", fprintf(cp_err, "Error: too few nodes: %s\n",
c->li_line); c->li_line);
return 0; goto quit;
} }
/* call gettrans and see if netname was used in the invocation */ /* call gettrans and see if netname was used in the invocation */
@ -675,6 +679,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
(void) sprintf(buffer + strlen(buffer), (void) sprintf(buffer + strlen(buffer),
"%s:%s ", scname, name); "%s:%s ", scname, name);
} }
tfree(name);
} /* while (nnodes-- . . . . */ } /* while (nnodes-- . . . . */
@ -694,7 +699,8 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
if( get_l_paren(&s) == 1 ) { if( get_l_paren(&s) == 1 ) {
fprintf(cp_err, "Error: no left paren after POLY %s\n", fprintf(cp_err, "Error: no left paren after POLY %s\n",
c->li_line); c->li_line);
return 0; tfree(next_name);
goto quit;
} }
nametofree = gettok_noparens(&s); nametofree = gettok_noparens(&s);
@ -705,7 +711,8 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
if( get_r_paren(&s) == 1 ) { if( get_r_paren(&s) == 1 ) {
fprintf(cp_err, "Error: no right paren after POLY %s\n", fprintf(cp_err, "Error: no right paren after POLY %s\n",
c->li_line); c->li_line);
return 0; tfree(next_name);
goto quit;
} }
/* Write POLY(dim) into buffer */ /* Write POLY(dim) into buffer */
@ -716,15 +723,16 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
} /* if ( (strcmp(next_name, "POLY") == 0) . . . */ } /* if ( (strcmp(next_name, "POLY") == 0) . . . */
else else
dim = 1; /* only one controlling source . . . */ dim = 1; /* only one controlling source . . . */
tfree(next_name);
/* Now translate the controlling source/nodes */ /* Now translate the controlling source/nodes */
nnodes = dim * numdevs(c->li_line); nnodes = dim * numdevs(c->li_line);
while (nnodes-- > 0) { while (nnodes-- > 0) {
name = gettok(&s); /* name points to the returned token */ nametofree = name = gettok(&s); /* name points to the returned token */
if (name == NULL) { if (name == NULL) {
fprintf(cp_err, "Error: too few devs: %s\n", fprintf(cp_err, "Error: too few devs: %s\n",
c->li_line); c->li_line);
return 0; goto quit;
} }
if ( (dev_type == 'f') || if ( (dev_type == 'f') ||
@ -732,13 +740,6 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
(dev_type == 'h') || (dev_type == 'h') ||
(dev_type == 'H') ) { (dev_type == 'H') ) {
/*
if ( (strcmp(&dev_type, "f") == 0) ||
(strcmp(&dev_type, "F") == 0) ||
(strcmp(&dev_type, "h") == 0) ||
(strcmp(&dev_type, "H") == 0) ) {
*/
/* Handle voltage source name */ /* Handle voltage source name */
#ifdef TRACE #ifdef TRACE
@ -775,6 +776,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
/* From netname and Urefdes creates Urefdes:netname */ /* From netname and Urefdes creates Urefdes:netname */
} }
} }
tfree(nametofree);
} /* while (nnodes--. . . . */ } /* while (nnodes--. . . . */
/* Now write out remainder of line (polynomial coeffs) */ /* Now write out remainder of line (polynomial coeffs) */
@ -819,7 +821,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
if (name == NULL) { if (name == NULL) {
fprintf(cp_err, "Error: too few nodes: %s\n", fprintf(cp_err, "Error: too few nodes: %s\n",
c->li_line); c->li_line);
return 0; goto quit;
} }
/* call gettrans and see if netname was used in the invocation */ /* call gettrans and see if netname was used in the invocation */
@ -847,7 +849,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
if (name == NULL) { if (name == NULL) {
fprintf(cp_err, "Error: too few devs: %s\n", fprintf(cp_err, "Error: too few devs: %s\n",
c->li_line); c->li_line);
return 0; goto quit;
} }
ch = *name; ch = *name;
name++; name++;
@ -885,7 +887,15 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
tfree(buffer); tfree(buffer);
} /* for (c = deck . . . . */ } /* for (c = deck . . . . */
return 1; rtn = 1;
quit:
for (i = 0; ; i++) {
if(!table[i].t_old && !table[i].t_new)
break;
FREE(table[i].t_old);
FREE(table[i].t_new);
}
return rtn;
} }
@ -1007,6 +1017,8 @@ settrans(char *formal, char *actual, char *subname)
{ {
int i; int i;
bzero(table,sizeof(*table));
for (i = 0; ; i++) { for (i = 0; ; i++) {
table[i].t_old = gettok(&formal); table[i].t_old = gettok(&formal);
table[i].t_new = gettok(&actual); table[i].t_new = gettok(&actual);
@ -1217,6 +1229,7 @@ modtranslate(struct line *deck, char *subname)
buffer = tmalloc(strlen(name) + strlen(t) + buffer = tmalloc(strlen(name) + strlen(t) +
strlen(subname) + 4); strlen(subname) + 4);
(void) sprintf(buffer, "%s ",name); /* at this point, buffer = ".model " */ (void) sprintf(buffer, "%s ",name); /* at this point, buffer = ".model " */
tfree(name);
name = gettok(&t); /* name now holds model name */ name = gettok(&t); /* name now holds model name */
wlsub = alloc(struct wordlist); wlsub = alloc(struct wordlist);
wlsub->wl_next = submod; wlsub->wl_next = submod;
@ -1269,10 +1282,13 @@ devmodtranslate(struct line *deck, char *subname)
case 'c': case 'c':
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer,"%s ",name); (void) sprintf(buffer,"%s ",name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
if (*t) { if (*t) {
name = gettok(&t); name = gettok(&t);
@ -1287,6 +1303,7 @@ devmodtranslate(struct line *deck, char *subname)
} }
if (!found) if (!found)
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
} }
found = FALSE; found = FALSE;
@ -1303,6 +1320,7 @@ devmodtranslate(struct line *deck, char *subname)
} }
if (!found) if (!found)
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
} }
(void) strcat(buffer, t); (void) strcat(buffer, t);
@ -1313,10 +1331,13 @@ devmodtranslate(struct line *deck, char *subname)
case 'd': case 'd':
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer,"%s ",name); (void) sprintf(buffer,"%s ",name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t); name = gettok(&t);
/* Now, is this a subcircuit model? */ /* Now, is this a subcircuit model? */
@ -1331,6 +1352,7 @@ devmodtranslate(struct line *deck, char *subname)
if (!found) if (!found)
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
(void) strcat(buffer, t); (void) strcat(buffer, t);
tfree(s->li_line); tfree(s->li_line);
s->li_line = buffer; s->li_line = buffer;
@ -1372,14 +1394,19 @@ devmodtranslate(struct line *deck, char *subname)
case 'm': case 'm':
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer,"%s ",name); (void) sprintf(buffer,"%s ",name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t); name = gettok(&t);
/* Now, is this a subcircuit model? */ /* Now, is this a subcircuit model? */
@ -1397,17 +1424,22 @@ devmodtranslate(struct line *deck, char *subname)
(void) strcat(buffer, t); (void) strcat(buffer, t);
tfree(s->li_line); tfree(s->li_line);
s->li_line = buffer; s->li_line = buffer;
tfree(name);
break; break;
case 'q': case 'q':
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer,"%s ",name); (void) sprintf(buffer,"%s ",name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t); name = gettok(&t);
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
name = gettok(&t); name = gettok(&t);
/* Now, is this a subcircuit model? */ /* Now, is this a subcircuit model? */
@ -1421,6 +1453,7 @@ devmodtranslate(struct line *deck, char *subname)
} }
if (!found) if (!found)
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
found = FALSE; found = FALSE;
if (*t) { if (*t) {
@ -1436,6 +1469,7 @@ devmodtranslate(struct line *deck, char *subname)
} }
if (!found) if (!found)
(void) sprintf(buffer + strlen(buffer), "%s ", name); (void) sprintf(buffer + strlen(buffer), "%s ", name);
tfree(name);
} }
(void) strcat(buffer, t); (void) strcat(buffer, t);

View File

@ -640,7 +640,8 @@ bool
vec_eq(struct dvec *v1, struct dvec *v2) vec_eq(struct dvec *v1, struct dvec *v2)
{ {
char *s1, *s2; char *s1, *s2;
bool rtn;
if (v1->v_plot != v2->v_plot) if (v1->v_plot != v2->v_plot)
return (FALSE); return (FALSE);
@ -648,9 +649,13 @@ vec_eq(struct dvec *v1, struct dvec *v2)
s2 = vec_basename(v2); s2 = vec_basename(v2);
if (cieq(s1, s2)) if (cieq(s1, s2))
return (TRUE); rtn = TRUE;
else else
return (FALSE); rtn = FALSE;
tfree(s1);
tfree(s2);
return rtn;
} }
/* Return the name of the vector with the plot prefix stripped off. This /* Return the name of the vector with the plot prefix stripped off. This

View File

@ -126,6 +126,7 @@ DCtran(CKTcircuit *ckt,
(void*)ckt->CKTcurJob, (void*)ckt->CKTcurJob,
ckt->CKTcurJob->JOBname,timeUid,IF_REAL,numNames,nameList, ckt->CKTcurJob->JOBname,timeUid,IF_REAL,numNames,nameList,
IF_REAL,&(((TRANan*)ckt->CKTcurJob)->TRANplot)); IF_REAL,&(((TRANan*)ckt->CKTcurJob)->TRANplot));
tfree(nameList);
if(error) return(error); if(error) return(error);
ckt->CKTtime = 0; ckt->CKTtime = 0;

View File

@ -24,8 +24,8 @@ char *INPerror(int type)
char *ebuf; char *ebuf;
/*CDHW Lots of things set errMsg but it is never used so let's hack it in CDHW*/ /*CDHW Lots of things set errMsg but it is never used so let's hack it in CDHW*/
if ( errMsg ) { if ( errMsg )
val = errMsg; errMsg=NULL; } val = errMsg;
else else
/*CDHW end of hack CDHW*/ /*CDHW end of hack CDHW*/
val = SPerror(type); val = SPerror(type);
@ -55,5 +55,6 @@ char *INPerror(int type)
sprintf(ebuf, "%s\n", val); sprintf(ebuf, "%s\n", val);
} }
#endif /* HAVE_ASPRINTF */ #endif /* HAVE_ASPRINTF */
FREE(errMsg);
return ebuf; return ebuf;
} }

View File

@ -39,14 +39,11 @@ NON-STANDARD FEATURES
============================================================================*/ ============================================================================*/
#include <stdio.h> #include "ngspice.h"
#include "cm.h" #include "cm.h"
#include "evtudn.h" #include "evtudn.h"
void *tmalloc(size_t);
/* ************************************************************************ */ /* ************************************************************************ */
@ -146,7 +143,7 @@ void idn_digital_resolve(int num_struct,
/* Cast the input void pointers to pointers of the digital type */ /* Cast the input void pointers to pointers of the digital type */
dig_struct = evt_struct; dig_struct = evt_struct;
dig_struct_array = evt_struct_array; dig_struct_array = (Digital_t **)evt_struct_array;
/* Copy the first member of the array directly to the output */ /* Copy the first member of the array directly to the output */
dig_struct->state = dig_struct_array[0]->state; dig_struct->state = dig_struct_array[0]->state;

View File

@ -188,6 +188,7 @@ card *current; /* the card we are to parse */
/* and return a pointer to its structure in 'thismodel' */ /* and return a pointer to its structure in 'thismodel' */
current->error = MIFgetMod(ckt, model, &thismodel, tab); current->error = MIFgetMod(ckt, model, &thismodel, tab);
tfree(name);
if(current->error) { if(current->error) {
return; return;