URI: 
       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)