cleanup getlims() and plug a memory leak

This commit is contained in:
rlar 2011-07-24 20:30:44 +00:00
parent f8b4c7eb79
commit 27f1d7bb45
2 changed files with 59 additions and 40 deletions

View File

@ -1,3 +1,7 @@
2011-07-24 Robert Larice
* src/frontend/plotting/plotit.c :
cleanup getlims() and plug a memory leak
2011-07-24 Robert Larice
* src/xspice/ipc/ipcstdio.c :
(int) cast, where size can be expected to be small enough

View File

@ -30,54 +30,69 @@ static bool sameflag;
static double *
getlims(wordlist *wl, char *name, int number)
{
double *d, *td;
double *d;
wordlist *beg, *wk;
char *ss;
int n;
if(number < 1)
return NULL;
for (beg = wl; beg; beg = beg->wl_next) {
if (eq(beg->wl_word, name)) {
if (beg == wl) {
fprintf(cp_err,
"Syntax error: looking for plot parameters \"%s\".\n",
name);
return (NULL);
}
wk = beg;
d = TMALLOC(double, number);
for (n = 0; n < number; n++) {
wk = wk->wl_next;
if (!wk) {
fprintf(cp_err,
"Syntax error: not enough parameters for \"%s\".\n",
name);
return (NULL);
}
ss = wk->wl_word;
td = ft_numparse(&ss, FALSE);
if (td == NULL)
goto bad;
d[n] = *td;
}
for (beg = wl; beg; beg = beg->wl_next)
if (eq(beg->wl_word, name))
break;
if (beg->wl_prev)
beg->wl_prev->wl_next = wk->wl_next;
if (wk->wl_next) {
wk->wl_next->wl_prev = beg->wl_prev;
wk->wl_next = NULL;
}
if (beg != wl_root)
wl_free(beg);
return (d);
}
if(!beg)
return NULL;
if (beg == wl) {
fprintf(cp_err,
"Syntax error: looking for plot parameters \"%s\".\n", name);
return NULL;
}
return (NULL);
bad:
fprintf(cp_err, "Syntax error: bad parameters for \"%s\".\n", name);
return (NULL);
wk = beg;
d = TMALLOC(double, number);
for (n = 0; n < number; n++) {
char *ss;
double *td;
wk = wk->wl_next;
if (!wk) {
fprintf(cp_err,
"Syntax error: not enough parameters for \"%s\".\n", name);
txfree(d);
return NULL;
}
ss = wk->wl_word;
td = ft_numparse(&ss, FALSE);
if (!td) {
fprintf(cp_err,
"Syntax error: bad parameters for \"%s\".\n", name);
txfree(d);
return NULL;
}
d[n] = *td;
}
if (beg->wl_prev)
beg->wl_prev->wl_next = wk->wl_next;
if (wk->wl_next) {
wk->wl_next->wl_prev = beg->wl_prev;
wk->wl_next = NULL;
}
if (beg != wl_root)
wl_free(beg);
return d;
}