choose whether we scale up or scale down - 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 9bd929c04277a0f9d0056e5b50f1233054a4b17f DIR parent ab839e91e0a3687937992cb48558a15e1547d8ea HTML Author: Josuah Demangeon <mail@josuah.net> Date: Wed, 2 May 2018 12:17:32 +0200 choose whether we scale up or scale down Diffstat: M ffplot.c | 22 ++++++++++------------ M ploot.c | 47 ++++++++++++++++++------------- 2 files changed, 37 insertions(+), 32 deletions(-) --- DIR diff --git a/ffplot.c b/ffplot.c @@ -196,7 +196,7 @@ legend(Canvas *can, Color *label_fg, Vlist *v, int n) int i, x, y; for (i = 0; i < n; i++, v++) { - x = LEGEND_H - n * (FONT_H + MARGIN) - FONT_H / 2; + x = LEGEND_H - i * (FONT_H + MARGIN) - FONT_H / 2; y = MARGIN + FONT_W; ffdraw_str_left(can, &v->col, "\1", font, x, y); @@ -246,22 +246,20 @@ find_scales(Vlist *v, int n, } } - for (i = 1; i != 0; i *= 10) { - for (vs = vscale + LEN(vscale) - 1; vs >= vscale; vs--) { - if (dv > *vs / i * XDENSITY / 2) { - *vstep = *vs / i; - i = 0; - break; + if (dv > 1) for (i = 1; i != 0; i *= 10) { + for (vs = vscale; vs < vscale + LEN(vscale); vs++) { + if (dv < *vs * i * XDENSITY) { + *vstep = *vs * i; + return; } } } for (i = 1; i != 0; i *= 10) { - for (vs = vscale; vs < vscale + LEN(vscale); vs++) { - if (dv < *vs * i * XDENSITY) { - *vstep = *vs * i; - i = 0; - break; + for (vs = vscale + LEN(vscale) - 1; vs >= vscale; vs--) { + if (dv > *vs / i * XDENSITY / 2) { + *vstep = *vs / i; + return; } } } DIR diff --git a/ploot.c b/ploot.c @@ -88,29 +88,31 @@ eatol(char *str) return atol(str); } -static void -add_val(Vlist *v, int *bufsiz, int nval, double field, time_t epoch) +static int +add_val(Vlist *v, int bufsize, int nval, double field, time_t epoch) { - if (nval >= *bufsiz) { - *bufsiz = *bufsiz * 2 + 1; - if ((v->v = realloc(v->v, *bufsiz * sizeof(*v->v))) == NULL) + if (nval >= bufsize) { + bufsize = bufsize * 2 + 1; + if ((v->v = realloc(v->v, bufsize * sizeof(*v->v))) == NULL) perror("reallocating values buffer"), exit(1); - if ((v->t = realloc(v->t, *bufsiz * sizeof(*v->t))) == NULL) + if ((v->t = realloc(v->t, bufsize * sizeof(*v->t))) == NULL) perror("reallocating values buffer"), exit(1); } v->v[nval] = field; v->t[nval] = epoch; v->n = nval + 1; + + return bufsize; } /* * Add to each column the value on the current row. */ -static void -add_row(Vlist *v, int *bufsiz, int ncol, int nval, char *line) +static int +add_row(Vlist *v, int bufsize, int ncol, int nval, char *line) { time_t epoch; - int n; + int bs; char *field, *dot; if ((field = strsep(&line, ",")) == NULL) @@ -119,13 +121,15 @@ add_row(Vlist *v, int *bufsiz, int ncol, int nval, char *line) if ((dot = strchr(field, '.')) != NULL) *dot = '\0'; epoch = eatol(field); - for (n = 0; (field = strsep(&line, ",")) != NULL; n++, v++) { - if (n > ncol) + for (; (field = strsep(&line, ",")) != NULL; ncol--, v++) { + if (ncol <= 0) fprintf(stderr, "%d: too many fields\n", nval), exit(0); - add_val(v, bufsiz, nval, eatof(field), epoch); + bs = add_val(v, bufsize, nval, eatof(field), epoch); } - if (n < ncol) + if (ncol > 0) fprintf(stderr, "%d: too few fields\n", nval), exit(0); + + return bs; } /* @@ -137,13 +141,13 @@ add_row(Vlist *v, int *bufsiz, int ncol, int nval, char *line) static void read_values(Vlist *v, int ncol) { - int nval, bufsiz; + int nval, bufsize; char line[LINE_MAX]; - bufsiz = 0; + bufsize = 0; for (nval = 0; fgets(line, sizeof(line), stdin); nval++) { estriplf(line); - add_row(v, &bufsiz, ncol, nval, line); + bufsize = add_row(v, bufsize, ncol, nval, line); } } @@ -152,10 +156,11 @@ usage(void) { ColorList *c; - fprintf(stderr, "usage: %s [-t title] [-u unit] color...\n" - "available colors as defined by \"config.h\":\n", argv0); - for (c = colorlist; c->name != NULL; c++) - fprintf(stderr, "- %s\n", c->name); + fprintf(stderr, "usage: %s [-t title] [-u unit] {", argv0); + fputs(colorlist->name, stderr); + for (c = colorlist + 1; c->name != NULL; c++) + fprintf(stderr, ",%s", c->name); + fputs("}...\n", stderr); exit(1); } @@ -172,6 +177,8 @@ main(int argc, char **argv) case 'u': uflag = EARGF(usage()); break; + default: + usage(); } ARGEND; if ((v = calloc(argc, sizeof(*v))) == NULL)