2003-07-16 Stefan Jones <stefan.jones@multigig.com>

* src/frontend/{com_compose.c,cpitf.c,device.c,subckt.c,vectors.c}
	src/frontend/plotting/plotit.c src/include/ngspice.h
	src/spicelib/parser/{inp2dot.c,inp2r.c,inpdomod.c,inpdpar.c,inpgmod.c,inppas3.c} :
	Rest of the serious deck reader leaks, plus fixes for the last batch.
This commit is contained in:
stefanjones 2003-07-16 12:46:18 +00:00
parent a0a73abb3a
commit 88239474a8
14 changed files with 155 additions and 83 deletions

View File

@ -1,3 +1,10 @@
2003-07-16 Stefan Jones <stefan.jones@multigig.com>
* src/frontend/{com_compose.c,cpitf.c,device.c,subckt.c,vectors.c}
src/frontend/plotting/plotit.c src/include/ngspice.h
src/spicelib/parser/{inp2dot.c,inp2r.c,inpdomod.c,inpdpar.c,inpgmod.c,inppas3.c} :
Rest of the serious deck reader leaks, plus fixes for the last batch.
2003-07-15 Stefan Jones <stefan.jones@multigig.com>
* /src/frontend/{com_let.c,com_set.c,evaluate.c,parse.c,variable.c}

View File

@ -141,7 +141,6 @@ com_compose(wordlist *wl)
;
pn = pn->pn_next;
}
free_pnode(first_pn);
/* Now make sure these are all of the same dimensionality. We
* can coerce the sizes...
*/
@ -479,6 +478,7 @@ com_compose(wordlist *wl)
result->v_dims[0] = length;
vec_new(result);
cp_addkword(CT_VECTOR, result->v_name);
free_pnode(first_pn);
tfree(resname);/*DG: resname has been copied so its remains allocated: memory leak One can remove this and not copy resname*/
return;
}

View File

@ -265,23 +265,27 @@ cp_istrue(wordlist *wl)
pn = ft_getpnames(wl, TRUE);
v = ft_evaluate(pn);
free_pnode(pn);
/* It makes no sense to say while (all), but what the heck... */
while (v) {
if (isreal(v)) {
for (i = 0; i < v->v_length; i++)
if (v->v_realdata[i] != 0.0)
return (TRUE);
if (v->v_realdata[i] != 0.0) {
free_pnode(pn);
return (TRUE);
}
} else {
for (i = 0; i < v->v_length; i++)
if ((realpart(&v->v_compdata[i]) != 0.0) ||
(imagpart(&v->v_compdata[i]) != 0.0))
(imagpart(&v->v_compdata[i]) != 0.0)) {
free_pnode(pn);
return (TRUE);
}
}
v = v->v_link2;
}
return (FALSE);
free_pnode(pn);
return (FALSE);
}
/* This gets called before every command is executed... */

View File

@ -637,7 +637,6 @@ com_alter_common(wordlist *wl, int do_model)
return;
}
dv = ft_evaluate(names);
free_pnode(names);
if (!dv)
return;
if (dv->v_length < 1) {
@ -647,8 +646,8 @@ com_alter_common(wordlist *wl, int do_model)
if_setparam(ft_curckt->ci_ckt, &dev, param, dv, do_model);
/* Vector data (dv) should get garbage-collected. */
free_pnode(names);
return;
}

View File

@ -254,8 +254,11 @@ plotit(wordlist *wl, char *hcopy, char *devname)
double *newdata, *newscale;
double tstep, tstart, tstop, ttime;
/* return value, error by default */
bool rtn = FALSE;
if (!wl)
return FALSE;
goto quit1;
wl_root = wl;
/* First get the command line, without the limits. */
@ -264,8 +267,10 @@ plotit(wordlist *wl, char *hcopy, char *devname)
(void) getlims(wwl, "xlimit", 2);
(void) getlims(wwl, "yl", 2);
(void) getlims(wwl, "ylimit", 2);
(void) sprintf(cline, "plot %s", wl_flatten(wwl));
pname = wl_flatten(wwl);
(void) sprintf(cline, "plot %s", pname);
tfree(pname);
wl_free(wwl);
/* Now extract all the parameters. */
@ -516,9 +521,10 @@ plotit(wordlist *wl, char *hcopy, char *devname)
nointerp = TRUE;
wl = wl->wl_next;
tfree(tw);
if (!wl) {
fprintf(cp_err, "Error: no vectors given\n");
return (FALSE);
goto quit1;
}
wl->wl_prev = NULL;
@ -534,7 +540,7 @@ plotit(wordlist *wl, char *hcopy, char *devname)
names = ft_getpnames(wl, FALSE);
if (names == NULL)
return (FALSE);
goto quit1;
/* Now evaluate the names. */
for (n = names, lv = NULL; n; n = n->pn_next) {
@ -542,16 +548,16 @@ plotit(wordlist *wl, char *hcopy, char *devname)
eq(n->pn_value->v_name, "vs")) {
if (!lv) {
fprintf(cp_err, "Error: misplaced vs arg\n");
return (FALSE);
goto quit;
} else {
if (!(n = n->pn_next)) {
fprintf(cp_err,
"Error: missing vs arg\n");
return (FALSE);
goto quit;
}
dv = ft_evaluate(n);
if (!dv)
return (FALSE);
goto quit;
if (lastvs)
lv = lastvs->v_link2;
else
@ -566,7 +572,7 @@ plotit(wordlist *wl, char *hcopy, char *devname)
}
dv = ft_evaluate(n);
if (!dv)
return (FALSE);
goto quit;
if (!d)
vecs = dv;
else
@ -575,7 +581,6 @@ plotit(wordlist *wl, char *hcopy, char *devname)
;
lv = dv;
}
free_pnode(names);
d->v_link2 = NULL;
/* Now check for 0-length vectors. */
@ -583,7 +588,7 @@ plotit(wordlist *wl, char *hcopy, char *devname)
if (!d->v_length) {
fprintf(cp_err, "Error: %s: no such vector\n",
d->v_name);
return (FALSE);
goto quit;
}
/* If there are higher dimensional vectors, transform them into a
@ -658,7 +663,7 @@ plotit(wordlist *wl, char *hcopy, char *devname)
oneval ? 1 : 0) {
fprintf(cp_err,
"Error: plot must be either all pole-zero or contain no poles or zeros\n");
return (FALSE);
goto quit;
}
if ((gtype == GRID_POLAR) || (gtype == GRID_SMITH
@ -840,13 +845,13 @@ plotit(wordlist *wl, char *hcopy, char *devname)
(gtype == GRID_LOGLOG))) {
fprintf(cp_err,
"Error: X values must be > 0 for log scale\n");
return (FALSE);
goto quit;
}
if ((ylims[0] <= 0.0) && ((gtype == GRID_YLOG) ||
(gtype == GRID_LOGLOG))) {
fprintf(cp_err,
"Error: Y values must be > 0 for log scale\n");
return (FALSE);
goto quit;
}
/* Fix the plot limits for smith and polar grids. */
@ -907,7 +912,7 @@ plotit(wordlist *wl, char *hcopy, char *devname)
newscale, newlen, 1)) {
fprintf(cp_err,
"Error: can't interpolate %s\n", v->v_name);
return(FALSE);
goto quit;
}
tfree(v->v_realdata);
@ -925,7 +930,8 @@ plotit(wordlist *wl, char *hcopy, char *devname)
((gtype == GRID_XLOG) || (gtype == GRID_LOGLOG)),
((gtype == GRID_YLOG) || (gtype == GRID_LOGLOG)),
nointerp);
return (TRUE);
rtn = TRUE;
goto quit;
}
/* See if there is one type we can give for the y scale... */
@ -942,7 +948,8 @@ plotit(wordlist *wl, char *hcopy, char *devname)
xlabel ? xlabel : ft_typabbrev(vecs->v_scale->v_type),
ylabel ? ylabel : ft_typabbrev(j),
gtype, ptype, vecs);
return (TRUE);
rtn = TRUE;
goto quit;
}
#ifdef TCL_MODULE
@ -951,7 +958,8 @@ plotit(wordlist *wl, char *hcopy, char *devname)
for (d = vecs; d; d = d->v_link2) {
blt_plot(d, oneval ? (struct dvec *) NULL : d->v_scale);
}
return (TRUE);
rtn = TRUE;
goto quit;
}
#endif
@ -968,7 +976,7 @@ plotit(wordlist *wl, char *hcopy, char *devname)
title ? title : vecs->v_plot->pl_title, hcopy, i,
xdelta ? *xdelta : 0.0, ydelta ? *ydelta : 0.0, gtype,
ptype, xlabel, ylabel, xt, j, pname, cline))
return (FALSE);
goto quit;
/* Now plot all the graphs. */
for (d = vecs; d; d = d->v_link2)
@ -976,6 +984,10 @@ plotit(wordlist *wl, char *hcopy, char *devname)
gr_clean();
return (TRUE);
rtn = TRUE;
quit:
free_pnode(names);
quit1:
return rtn;
}

View File

@ -267,7 +267,7 @@ doit(struct line *deck)
/* Now put the .subckt definition found into sss */
sss->su_def = last->li_next;
s = last->li_line;
(void) gettok(&s);
txfree(gettok(&s));
sss->su_name = gettok(&s);
sss->su_args = copy(s);
/* count the number of args in the .subckt line */
@ -317,7 +317,7 @@ doit(struct line *deck)
for (c = deck; c; c = c->li_next)
if (prefix(model, c->li_line)) {
s = c->li_line;
(void) gettok(&s);
txfree(gettok(&s));
wl = alloc(struct wordlist);
wl->wl_next = modnames;
if (modnames)
@ -332,8 +332,9 @@ doit(struct line *deck)
gotone = FALSE;
for (c = deck, lc = NULL; c; ) {
if (ciprefix(invoke, c->li_line)) { /* found reference to .subckt (i.e. component with refdes X) */
gotone = TRUE;
t = s = copy(c->li_line); /* s & t hold copy of component line */
char *tofree;
gotone = TRUE;
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
* e.g. if invocation is Xreference, *scname = reference
@ -390,7 +391,7 @@ doit(struct line *deck)
devmodtranslate(lcc, scname);
s = sss->su_args;
(void) gettok(&t); /* Throw out the subcircuit refdes */
txfree(gettok(&t)); /* Throw out the subcircuit refdes */
/* now invoke translate, which handles the remainder of the
* translation.
@ -408,6 +409,7 @@ doit(struct line *deck)
lcc->li_next = c->li_next;
c = lcc->li_next;
lc = lcc;
tfree(tofree);
} /* if (ciprefix(invoke, c->li_line)) . . . */
else {
lc = c;
@ -477,7 +479,7 @@ static int
translate(struct line *deck, char *formal, char *actual, char *scname, char *subname)
{
struct line *c;
char *buffer, *next_name, dev_type, *name, *s, *t, ch;
char *buffer, *next_name, dev_type, *name, *s, *t, ch, *nametofree;
int nnodes, i, dim;
/* settrans builds the table holding the translated netnames. */
@ -695,8 +697,10 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
return 0;
}
dim = (int *) atoi( (char *)gettok_noparens(&s) ); /* convert returned string to int */
nametofree = gettok_noparens(&s);
dim = atoi(nametofree); /* convert returned string to int */
tfree(nametofree);
/* move pointer ahead of ) */
if( get_r_paren(&s) == 1 ) {
fprintf(cp_err, "Error: no right paren after POLY %s\n",
@ -782,7 +786,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
/*================= Default case ===================*/
default: /* this section handles ordinary components */
s = c->li_line;
name = gettok(&s);
nametofree = name = gettok(&s);
if (!name)
continue;
if (!*name) {
@ -804,7 +808,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
name);
else
(void) sprintf(buffer, "%c:%s ", ch, scname);
tfree(nametofree);
/* Next iterate over all nodes (netnames) found and translate them. */
@ -830,6 +834,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
(void) sprintf(buffer + strlen(buffer),
"%s:%s ", scname, name);
}
free(name);
} /* while (nnodes-- . . . . */
/* Now translate any devices (i.e. controlling sources).
@ -838,7 +843,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
*/
nnodes = numdevs(c->li_line);
while (nnodes-- > 0) {
name = gettok(&s);
t = name = gettok(&s);
if (name == NULL) {
fprintf(cp_err, "Error: too few devs: %s\n",
c->li_line);
@ -855,7 +860,7 @@ translate(struct line *deck, char *formal, char *actual, char *scname, char *sub
else
(void) sprintf(buffer + strlen(buffer),
"%c:%s ", ch, scname);
tfree(t);
} /* while (nnodes--. . . . */
@ -1100,13 +1105,14 @@ numnodes(char *name)
i = 0;
s = buf;
gotit = 0;
t = gettok(&s); /* Skip component name */
txfree(gettok(&s)); /* Skip component name */
while ((i < n) && (*s) && !gotit) {
t = gettok(&s);
for (wl = modnames; wl; wl = wl->wl_next)
if (eq(t, wl->wl_word))
gotit = 1;
i++;
tfree(t);
} /* while . . . . */
/* Note: node checks must be done on #_of_node-1 because the */
@ -1125,7 +1131,7 @@ numnodes(char *name)
return (n);
for (s = buf, i = 0; *s && (i < 4); i++)
(void) gettok(&s);
txfree(gettok(&s));
if (i == 3)
return (3);
@ -1138,8 +1144,11 @@ numnodes(char *name)
/* Now, is this a model? */
t = gettok(&s);
for (wl = modnames; wl; wl = wl->wl_next)
if (eq(t, wl->wl_word))
if (eq(t, wl->wl_word)) {
tfree(t);
return (3);
}
tfree(t);
return (4);
}
@ -1221,7 +1230,7 @@ modtranslate(struct line *deck, char *subname)
tfree(c->li_line);
c->li_line = buffer;
t = c->li_line;
(void) gettok(&t);
txfree(gettok(&t));
wl = alloc(struct wordlist);
wl->wl_next = modnames;
if (modnames)

View File

@ -600,8 +600,7 @@ vec_free(struct dvec *v)
pl = v->v_plot;
/* Now we have to take this dvec out of the plot list. */
if (pl == NULL)
fprintf(cp_err, "vec_free: Internal Error: plot ptr is 0\n");
if (pl != NULL) {
if (pl->pl_dvecs == v)
pl->pl_dvecs = v->v_next;
else {
@ -620,12 +619,15 @@ vec_free(struct dvec *v)
else
pl->pl_scale = NULL;
}
}
tfree(v->v_name);
if(v->v_length) {
if (isreal(v)) {
tfree(v->v_realdata);
} else {
tfree(v->v_compdata);
}
}
tfree(v);
return;
}

View File

@ -116,6 +116,9 @@ struct timeb timebegin;
#endif
extern char *gettok(char **s);
extern char *gettok_noparens(char **s);
extern int get_l_paren(char **s);
extern int get_r_paren(char **s);
extern void appendc(char *s, char c);
extern int scannum(char *str);
extern int ciprefix(register char *p, register char *s);

View File

@ -640,74 +640,89 @@ INP2dot(void *ckt, INPtables *tab, card *current, void *task, void *gnode)
void *foo = NULL; /* pointer to analysis */
/* the part of the current line left to parse */
char *line = current->line;
int rtn = 0;
INPgetTok(&line, &token, 1);
if (strcmp(token, ".model") == 0) {
/* don't have to do anything, since models were all done in
* pass 1 */
return (0);
goto quit;
} else if ((strcmp(token, ".width") == 0) ||
strcmp(token, ".print") == 0 || strcmp(token, ".plot") == 0) {
/* obsolete - ignore */
LITERR(" Warning: obsolete control card - ignored \n");
return (0);
goto quit;
} else if ((strcmp(token, ".temp") == 0)) {
/* .temp temp1 temp2 temp3 temp4 ..... */
/* not yet implemented - warn & ignore */
LITERR(" Warning: .TEMP card obsolete - use .options TEMP and TNOM\n");
return (0);
goto quit;
} else if ((strcmp(token, ".op") == 0)) {
return dot_op(line, ckt, tab, current, task, gnode, foo);
rtn = dot_op(line, ckt, tab, current, task, gnode, foo);
goto quit;
} else if ((strcmp(token, ".nodeset") == 0)) {
return(0);
goto quit;
} else if ((strcmp(token, ".disto") == 0)) {
return dot_disto(line, ckt, tab, current, task, gnode, foo);
rtn = dot_disto(line, ckt, tab, current, task, gnode, foo);
goto quit;
} else if ((strcmp(token, ".noise") == 0)) {
return dot_noise(line, ckt, tab, current, task, gnode, foo);
rtn = dot_noise(line, ckt, tab, current, task, gnode, foo);
goto quit;
} else if ((strcmp(token, ".four") == 0)
|| (strcmp(token, ".fourier") == 0)) {
/* .four */
/* not implemented - warn & ignore */
LITERR("Use fourier command to obtain fourier analysis\n");
return (0);
goto quit;
} else if ((strcmp(token, ".ic") == 0)) {
return (0);
goto quit;
} else if ((strcmp(token, ".ac") == 0)) {
return dot_ac(line, ckt, tab, current, task, gnode, foo);
rtn = dot_ac(line, ckt, tab, current, task, gnode, foo);
goto quit;
} else if ((strcmp(token, ".pz") == 0)) {
return dot_pz(line, ckt, tab, current, task, gnode, foo);
rtn = dot_pz(line, ckt, tab, current, task, gnode, foo);
goto quit;
} else if ((strcmp(token, ".dc") == 0)) {
return dot_dc(line, ckt, tab, current, task, gnode, foo);
rtn = dot_dc(line, ckt, tab, current, task, gnode, foo);
goto quit;
} else if ((strcmp(token, ".tf") == 0)) {
return dot_tf(line, ckt, tab, current, task, gnode, foo);
rtn = dot_tf(line, ckt, tab, current, task, gnode, foo);
goto quit;
} else if ((strcmp(token, ".tran") == 0)) {
return dot_tran(line, ckt, tab, current, task, gnode, foo);
rtn = dot_tran(line, ckt, tab, current, task, gnode, foo);
goto quit;
} else if ((strcmp(token, ".subckt") == 0) ||
(strcmp(token, ".ends") == 0)) {
/* not yet implemented - warn & ignore */
LITERR(" Warning: Subcircuits not yet implemented - ignored \n");
return (0);
goto quit;
} else if ((strcmp(token, ".end") == 0)) {
/* .end - end of input */
/* not allowed to pay attention to additional input - return */
return (1);
rtn = 1;
goto quit;
} else if (strcmp(token, ".sens") == 0) {
return dot_sens(line, ckt, tab, current, task, gnode, foo);
rtn = dot_sens(line, ckt, tab, current, task, gnode, foo);
goto quit;
}
#ifdef WANT_SENSE2
else if ((strcmp(token, ".sens2") == 0)) {
return dot_sens2(line, ckt, tab, current, task, gnode, foo);
rtn = dot_sens2(line, ckt, tab, current, task, gnode, foo);
goto quit;
}
#endif
else if ((strcmp(token, ".probe") == 0)) {
/* Maybe generate a "probe" format file in the future. */
return 0;
goto quit;
}
else if ((strcmp(token, ".options") == 0)||
(strcmp(token,".option")==0) ||
(strcmp(token,".opt")==0)) {
return dot_options(line, ckt, tab, current, task, gnode, foo);
rtn = dot_options(line, ckt, tab, current, task, gnode, foo);
goto quit;
}
LITERR(" unimplemented control card - error \n");
return (0);
quit:
tfree(token);
return rtn;
}

View File

@ -79,6 +79,7 @@ void INP2R(void *ckt, INPtables * tab, card * current)
type = thismodel->INPmodType;
}
} else {
tfree(model);
/* It is not a model */
line = saveline; /* go back */
type = mytype;
@ -91,6 +92,7 @@ void INP2R(void *ckt, INPtables * tab, card * current)
}
IFC(newInstance, (ckt, mdfast, &fast, name));
} else {
tfree(model);
/* The token is null and a default model will be created */
type = mytype;
if (!tab->defRmod) {

View File

@ -34,6 +34,7 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
#endif
INPgetTok(&line, &modname, 1); /* throw away '.model' */
tfree(modname);
INPgetTok(&line, &modname, 1); /* get model name */
INPinsert(&modname, tab); /* stick model name into table */
INPgetTok(&line, &typename, 1); /* get model type */
@ -530,5 +531,6 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
#endif
}
tfree(typename);
return (err);
}

View File

@ -30,10 +30,11 @@ char *INPdevParse(char **line, void *ckt, int dev, void *fast,
/* flag - 1 if leading double given, 0 otherwise */
{
int error; /* int to store evaluate error return codes in */
char *parm;
char *parm=NULL;
char *errbuf;
int i;
IFvalue *val;
char *rtn=NULL;
/* check for leading value */
*waslead = 0;
@ -44,10 +45,14 @@ char *INPdevParse(char **line, void *ckt, int dev, void *fast,
*leading = 0.0;
while (**line != (char) 0) {
error = INPgetTok(line, &parm, 1);
if (!*parm)
if (!*parm) {
FREE(parm);
continue;
if (error)
return (INPerror(error));
}
if (error) {
rtn = (INPerror(error));
goto quit;
}
for (i = 0; i < (*(*(ft_sim->devices)[dev]).numInstanceParms); i++) {
if (strcmp(parm,
((*(ft_sim->devices)[dev]).instanceParms[i].
@ -56,25 +61,32 @@ char *INPdevParse(char **line, void *ckt, int dev, void *fast,
INPgetValue(ckt, line,
((*(ft_sim->devices)[dev]).
instanceParms[i].dataType), tab);
if (!val)
return (INPerror(E_PARMVAL));
if (!val) {
rtn = (INPerror(E_PARMVAL));
goto quit;
}
error = (*(ft_sim->setInstanceParm)) (ckt, fast,
(*(ft_sim->devices)
[dev]).
instanceParms[i].id,
val,
(IFvalue *) NULL);
if (error)
return (INPerror(error));
if (error) {
rtn = (INPerror(error));
goto quit;
}
break;
}
}
if (i == (*(*(ft_sim->devices)[dev]).numInstanceParms)) {
errbuf = MALLOC(strlen(parm) + 25);
(void) sprintf(errbuf, " unknown parameter (%s) \n", parm);
return (errbuf);
rtn = (errbuf);
goto quit;
}
FREE(parm);
}
return ((char *) NULL);
quit:
FREE(parm);
return rtn;
}

View File

@ -74,7 +74,9 @@ char *INPgetMod(void *ckt, char *name, INPmodel ** model, INPtables * tab)
INPgetTok(&line, &parm, 1); /* throw away '.model' */
tfree(parm);
INPgetTok(&line, &parm, 1); /* throw away 'modname' */
tfree(parm);
while (*line != 0) {
INPgetTok(&line, &parm, 1);
if (!*parm)

View File

@ -30,7 +30,7 @@ INPpas3(void *ckt, card *data, INPtables *tab, void *task,
char *line; /* the part of the current line left
to parse */
char *name; /* the node's name */
char *token; /* a token from the line */
char *token=NULL; /* a token from the line */
IFparm *prm; /* pointer to parameter to search
through array */
IFvalue ptemp; /* a value structure to package
@ -46,6 +46,7 @@ INPpas3(void *ckt, card *data, INPtables *tab, void *task,
for(current = data; current != NULL; current = current->nextcard) {
line = current->line;
FREE(token)
INPgetTok(&line,&token,1);
if (strcmp(token,".nodeset")==0) {
@ -60,7 +61,7 @@ INPpas3(void *ckt, card *data, INPtables *tab, void *task,
if(which == -1) {
LITERR("nodeset unknown to simulator. \n")
return;
goto quit;
}
for(;;) {
@ -95,7 +96,7 @@ INPpas3(void *ckt, card *data, INPtables *tab, void *task,
if(which==-1) {
LITERR("ic unknown to simulator. \n")
return;
goto quit;
}
for(;;) {
@ -119,6 +120,8 @@ INPpas3(void *ckt, card *data, INPtables *tab, void *task,
}
}
}
return;
quit:
FREE(token);
return;
}