diff --git a/src/frontend/plotting/plotit.c b/src/frontend/plotting/plotit.c index 6fe0efc49..e45dee0c7 100644 --- a/src/frontend/plotting/plotit.c +++ b/src/frontend/plotting/plotit.c @@ -16,7 +16,6 @@ #include "gnuplot.h" #include "graf.h" -static wordlist *wl_root; static bool sameflag; #ifdef TCL_MODULE @@ -38,17 +37,11 @@ getlims(wordlist *wl, char *name, int number) if(number < 1) return NULL; - beg = wl_find(name, wl); + beg = wl_find(name, wl->wl_next); 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); @@ -88,8 +81,7 @@ getlims(wordlist *wl, char *name, int number) wk->wl_next = NULL; } - if (beg != wl_root) - wl_free(beg); + wl_free(beg); return d; } @@ -195,7 +187,7 @@ compress(struct dvec *d, double *xcomp, double *xind) static bool getflag(wordlist *wl, char *name) { - wl = wl_find(name, wl); + wl = wl_find(name, wl->wl_next); if (!wl) return FALSE; @@ -217,12 +209,12 @@ getword(wordlist *wl, char *name) wordlist *beg; char *s; - beg = wl_find(name, wl); + beg = wl_find(name, wl->wl_next); if (!beg) return NULL; - if ((beg == wl) || !beg->wl_next) { + if (!beg->wl_next) { fprintf(cp_err, "Syntax error: looking for plot keyword at \"%s\".\n", name); return NULL; @@ -262,7 +254,7 @@ plotit(wordlist *wl, char *hcopy, char *devname) char *xn; int i, j, xt; double tt, mx, my, rad; - wordlist *wwl, *tw; + wordlist *wwl; char cline[BSIZE_SP], buf[BSIZE_SP], *pname; char *nxlabel = NULL, *nylabel = NULL, *ntitle = NULL; @@ -275,8 +267,14 @@ plotit(wordlist *wl, char *hcopy, char *devname) bool rtn = FALSE; if (!wl) - goto quit1; - wl_root = wl; + return rtn; + + /* + * we need a preceding element here, + * and we will destructively modify the wordlist in stupid ways, + * thus lets make our own copy which fits our purpose + */ + wl = wl_cons(NULL, wl_copy(wl)); /* First get the command line, without the limits. Wii be used for zoomed windows */ @@ -293,7 +291,7 @@ plotit(wordlist *wl, char *hcopy, char *devname) nxlabel = getword(wwl, "xlabel"); nylabel = getword(wwl, "ylabel"); ntitle = getword(wwl, "title"); - pname = wl_flatten(wwl); + pname = wl_flatten(wwl->wl_next); (void) sprintf(cline, "plot %s", pname); tfree(pname); wl_free(wwl); @@ -314,18 +312,6 @@ plotit(wordlist *wl, char *hcopy, char *devname) /* Now extract all the parameters. */ - /* In case the parameter is the first on the line, we need a - * "buffer" word. Use previous word up the chain if available, - * Otherwise create one. - */ - if(wl->wl_prev) { - wl = wl->wl_prev; - tw = NULL; /* Not used, so must be NULL */ - } else { - wl = wl_cons("", wl); - tw = wl; - } - sameflag = getflag(wl, "samep"); if (!sameflag || !xlim) { @@ -565,15 +551,11 @@ plotit(wordlist *wl, char *hcopy, char *devname) else if (getflag(wl, "nointerp")) nointerp = TRUE; - wl = wl->wl_next; - if(tw) tfree(tw); - if (!wl) { + if (!wl->wl_next) { fprintf(cp_err, "Error: no vectors given\n"); goto quit1; } - wl->wl_prev = NULL; - /* Now parse the vectors. We have a list of the form * "a b vs c d e vs f g h". Since it's a bit of a hassle for * us to parse the vector boundaries here, we do this -- call @@ -583,7 +565,7 @@ plotit(wordlist *wl, char *hcopy, char *devname) * evaulating the pnodes... */ - names = ft_getpnames(wl, FALSE); + names = ft_getpnames(wl->wl_next, FALSE); if (names == NULL) goto quit1; @@ -1087,5 +1069,6 @@ plotit(wordlist *wl, char *hcopy, char *devname) quit: free_pnode(names); quit1: + wl_free(wl); return rtn; }