make plotting work with arbitrary scale - ploot - simple plotting tools HTML git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit d97badd46c19a6903a589c41b8b87d044f48f8dc DIR parent c9c242228362e465b83fc106675981fd45419228 HTML Author: Josuah Demangeon <mail@josuah.net> Date: Wed, 2 May 2018 05:46:29 +0200 make plotting work with arbitrary scale Diffstat: M ffplot.c | 2 +- M main.c | 30 +++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) --- DIR diff --git a/ffplot.c b/ffplot.c @@ -159,7 +159,7 @@ graph(Canvas *can, Vlist *v, int x, y, n, xlast, ylast, first; first = 1; - for (tp = v->t, vp = v->v, n = v->n; n-- > 0; n--, vp++, tp++) { + for (tp = v->t, vp = v->v, n = v->n; n > 0; n--, vp++, tp++) { x = v2x(*vp, vmin, vmax); y = t2y(*tp, tmin, tmax); DIR diff --git a/main.c b/main.c @@ -66,6 +66,17 @@ read_labels(Vlist *v, char **argv, char *buf) fputs("more columns than arguments\n", stderr), exit(1); } +double +eatof(char *str) +{ + char *s; + + for (s = str; *s != '\0'; s++) + if (!isdigit(*s) && *s != '.') + fputs("invalid floatrformat", stderr), exit(0); + return atof(str); +} + long eatol(char *str) { @@ -78,22 +89,25 @@ eatol(char *str) } void -add_value(Vlist *v, int *bufsiz, int nval, char *field) +add_val(Vlist *v, int *bufsiz, int nval, double field, time_t epoch) { if (nval >= *bufsiz) { *bufsiz = *bufsiz * 2 + 1; - if ((v->v = realloc(v->v, *bufsiz)) == NULL) + if ((v->v = realloc(v->v, *bufsiz * sizeof(*v->v))) == NULL) + perror("reallocating values buffer"), exit(1); + if ((v->t = realloc(v->t, *bufsiz * sizeof(*v->t))) == NULL) perror("reallocating values buffer"), exit(1); } - v->v[nval] = eatol(field); - v->n = nval; + v->v[nval] = field; + v->t[nval] = epoch; + v->n = nval + 1; } /* * Add to each column the value on the current row. */ void -add_each_value(Vlist *v, int *bufsiz, int ncol, int nval, char *line) +add_row(Vlist *v, int *bufsiz, int ncol, int nval, char *line) { time_t epoch; int n; @@ -103,11 +117,10 @@ add_each_value(Vlist *v, int *bufsiz, int ncol, int nval, char *line) fprintf(stderr, "%d: missing epoch\n", nval), exit(0); epoch = eatol(field); - for (n = 0; (field = strsep(&line, ",")) != NULL; n++, v++) { if (n > ncol) fprintf(stderr, "%d: too many fields\n", nval), exit(0); - add_value(v, bufsiz, nval, field); + add_val(v, bufsiz, nval, eatof(field), epoch); } if (n < ncol) fprintf(stderr, "%d: too few fields\n", nval), exit(0); @@ -128,9 +141,8 @@ read_values(Vlist *v, int ncol) bufsiz = 0; for (nval = 0; fgets(line, sizeof(line), stdin); nval++) { estriplf(line); - add_each_value(v, &bufsiz, ncol, nval, line); + add_row(v, &bufsiz, ncol, nval, line); } - fprintf(stderr, "nval: %d, bufsiz: %d\n", nval, bufsiz), fflush(stderr); } static void