From 27f1d7bb45e949eee64476f7039ce6efa17ce508 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 24 Jul 2011 20:30:44 +0000 Subject: [PATCH] cleanup getlims() and plug a memory leak --- ChangeLog | 4 ++ src/frontend/plotting/plotit.c | 93 ++++++++++++++++++++-------------- 2 files changed, 58 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index 59e6285ff..f7257c2ab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/src/frontend/plotting/plotit.c b/src/frontend/plotting/plotit.c index d426bbd3b..708f0b10a 100644 --- a/src/frontend/plotting/plotit.c +++ b/src/frontend/plotting/plotit.c @@ -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; + } + + 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; } - return (NULL); -bad: - fprintf(cp_err, "Syntax error: bad parameters for \"%s\".\n", name); - return (NULL); + + 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; }