SMOLNET PORTAL home about changes
icsv: fix use of uninitialized memory - ploot - simple plotting tools	Err	bitreich.org	70
hgit clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot	URL:git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot	bitreich.org	70
1Log	/scm/ploot/log.gph	bitreich.org	70
1Files	/scm/ploot/files.gph	bitreich.org	70
1Refs	/scm/ploot/refs.gph	bitreich.org	70
1Tags	/scm/ploot/tag	bitreich.org	70
1README	/scm/ploot/file/README.md.gph	bitreich.org	70
1LICENSE	/scm/ploot/file/LICENSE.gph	bitreich.org	70
i---	Err	bitreich.org	70
1commit f7f88c2ee5573abff4c44c36bf7b2e705081b2ed	/scm/ploot/commit/f7f88c2ee5573abff4c44c36bf7b2e705081b2ed.gph	bitreich.org	70
1parent c3fcef87d156b02a9ad8ca7cd47fee4a826534f4	/scm/ploot/commit/c3fcef87d156b02a9ad8ca7cd47fee4a826534f4.gph	bitreich.org	70
hAuthor: Josuah Demangeon <me@josuah.net>	URL:mailto:me@josuah.net	bitreich.org	70
iDate:   Sun, 27 Jun 2021 01:04:39 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
icsv: fix use of uninitialized memory	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M Makefile                            |       6 +++---	Err	bitreich.org	70
i  M csv.c                               |      33 ++++++++++++++-----------------	Err	bitreich.org	70
i  M csv.h                               |       1 -	Err	bitreich.org	70
i  M ploot-braille.c                     |     157 ++++++++++++++++++++++---------	Err	bitreich.org	70
i  M ploot-farbfeld.c                    |      14 +++++++-------	Err	bitreich.org	70
i  D scale.c                             |      94 -------------------------------	Err	bitreich.org	70
i  D scale.h                             |      14 --------------	Err	bitreich.org	70
i	Err	bitreich.org	70
i7 files changed, 140 insertions(+), 179 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/Makefile b/Makefile	/scm/ploot/file/Makefile.gph	bitreich.org	70
i@@ -7,9 +7,9 @@ LFLAGS = -static -lm	Err	bitreich.org	70
i PREFIX = /usr/local	Err	bitreich.org	70
i MANOREFIX = $(PREFIX)/share/man	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-SRC = csv.c drawille.c font.c font13.c font8.c scale.c util.c	Err	bitreich.org	70
i-INC = csv.h drawille.h font.h scale.h util.h	Err	bitreich.org	70
i-BIN = ploot-farbfeld ploot-feed ploot-braille ploot-text	Err	bitreich.org	70
i+SRC = csv.c drawille.c font.c font13.c font8.c util.c	Err	bitreich.org	70
i+INC = csv.h drawille.h font.h util.h	Err	bitreich.org	70
i+BIN = ploot-feed ploot-braille ploot-text # ploot-farbfeld	Err	bitreich.org	70
i OBJ = ${SRC:.c=.o}	Err	bitreich.org	70
i 	Err	bitreich.org	70
i all: ${BIN}	Err	bitreich.org	70
1diff --git a/csv.c b/csv.c	/scm/ploot/file/csv.c.gph	bitreich.org	70
i@@ -13,11 +13,10 @@	Err	bitreich.org	70
i  */	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-csv_addtime(struct csv *vl, time_t epoch)	Err	bitreich.org	70
i+csv_add_time(struct csv *vl, time_t epoch)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         void *mem;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        debug("csv_addtime %p", vl->t);	Err	bitreich.org	70
i         if ((mem = realloc(vl->t, (vl->n + 1) * sizeof *vl->t)) == NULL)	Err	bitreich.org	70
i                 err(1, "realloc: %s", strerror(errno));	Err	bitreich.org	70
i         vl->t = mem;	Err	bitreich.org	70
i@@ -25,11 +24,10 @@ csv_addtime(struct csv *vl, time_t epoch)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-csv_addval(struct csv *vl, double field)	Err	bitreich.org	70
i+csv_add_val(struct csv *vl, double field)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         void *mem;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        debug("csv_addval %p", vl->t);	Err	bitreich.org	70
i         if ((mem = realloc(vl->v, (vl->n + 1) * sizeof *vl->v)) == NULL)	Err	bitreich.org	70
i                 err(1, "", strerror(errno));	Err	bitreich.org	70
i         vl->v = mem;	Err	bitreich.org	70
i@@ -40,8 +38,8 @@ csv_addval(struct csv *vl, double field)	Err	bitreich.org	70
i  * Add to each column the value on the current row.  The time_t	Err	bitreich.org	70
i  * buffer is shared among all fields.	Err	bitreich.org	70
i  */	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-csv_addrow(struct csv *vl, size_t ncol, char *line)	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+csv_add_row(struct csv *vl, size_t ncol, char *line)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         char *field;	Err	bitreich.org	70
i         time_t *tbuf;	Err	bitreich.org	70
i@@ -55,7 +53,7 @@ csv_addrow(struct csv *vl, size_t ncol, char *line)	Err	bitreich.org	70
i         if (errno)	Err	bitreich.org	70
i                 err(100, "parsing number '%s'", field);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        csv_addtime(vl, l);	Err	bitreich.org	70
i+        csv_add_time(vl, l);	Err	bitreich.org	70
i         tbuf = vl[0].t;	Err	bitreich.org	70
i         for (; (field = strsep(&line, ",")); ncol--, vl->n++, vl++) {	Err	bitreich.org	70
i                 if (ncol == 0)	Err	bitreich.org	70
i@@ -63,7 +61,7 @@ csv_addrow(struct csv *vl, size_t ncol, char *line)	Err	bitreich.org	70
i                 d = strtod(field, NULL);	Err	bitreich.org	70
i                 if (errno)	Err	bitreich.org	70
i                         err(100, "parsing double '%s'", field);	Err	bitreich.org	70
i-                csv_addval(vl, d);	Err	bitreich.org	70
i+                csv_add_val(vl, d);	Err	bitreich.org	70
i                 vl->t = tbuf;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         if (ncol > 0)	Err	bitreich.org	70
i@@ -75,10 +73,10 @@ csv_addrow(struct csv *vl, size_t ncol, char *line)	Err	bitreich.org	70
i  * label1,label2,label3	Err	bitreich.org	70
i  */	Err	bitreich.org	70
i void	Err	bitreich.org	70
i-csv_labels(FILE *fp, struct csv **vl, size_t *ncol)	Err	bitreich.org	70
i+csv_labels(FILE *fp, struct csv **vlp, size_t *ncol)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         char *field, *line, *cp;	Err	bitreich.org	70
i-        struct csv *col;	Err	bitreich.org	70
i+        struct csv *vl, *col;	Err	bitreich.org	70
i         size_t sz;	Err	bitreich.org	70
i         ssize_t r;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -94,16 +92,16 @@ csv_labels(FILE *fp, struct csv **vl, size_t *ncol)	Err	bitreich.org	70
i         if (strcmp(strsep(&cp, ","), "epoch") != 0)	Err	bitreich.org	70
i                 err(1, "first label must be 'epoch'");	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        *vl = NULL;	Err	bitreich.org	70
i-        *ncol = 0;	Err	bitreich.org	70
i+        sz = 0, vl = NULL, *ncol = 0;	Err	bitreich.org	70
i         while ((field = strsep(&cp, ","))) {	Err	bitreich.org	70
i-                if ((*vl = realloc(*vl, sz += sizeof **vl)) == NULL)	Err	bitreich.org	70
i+                if ((vl = realloc(vl, sz += sizeof *vl)) == NULL)	Err	bitreich.org	70
i                         err(1, "realloc: %s", strerror(errno));	Err	bitreich.org	70
i-                col = (*vl) + (*ncol)++;	Err	bitreich.org	70
i-                strlcpy(col->label, field, sizeof(col->label));	Err	bitreich.org	70
i+                memset(vl, 0, sizeof *vl);	Err	bitreich.org	70
i+                col = vl + (*ncol)++;	Err	bitreich.org	70
i+                strlcpy(col->label, field, sizeof col->label);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i         free(line);	Err	bitreich.org	70
i+        *vlp = vl;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /*	Err	bitreich.org	70
i@@ -122,11 +120,10 @@ csv_values(FILE *fp, struct csv *vl, size_t ncol)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         sz = 0, line = NULL;	Err	bitreich.org	70
i         while (getline(&line, &sz, fp) > -1)	Err	bitreich.org	70
i-                csv_addrow(vl, ncol, line);	Err	bitreich.org	70
i+                csv_add_row(vl, ncol, line);	Err	bitreich.org	70
i         if (vl->n == 0)	Err	bitreich.org	70
i                 err(1, "no value could be read");	Err	bitreich.org	70
i         if (vl->n == 1)	Err	bitreich.org	70
i                 err(1, "only one value could be read");	Err	bitreich.org	70
i-	Err	bitreich.org	70
i         free(line);	Err	bitreich.org	70
i }	Err	bitreich.org	70
1diff --git a/csv.h b/csv.h	/scm/ploot/file/csv.h.gph	bitreich.org	70
i@@ -15,7 +15,6 @@ struct csv {	Err	bitreich.org	70
i         char                label[64];        /* for the legend */	Err	bitreich.org	70
i };	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-void        csv_addrow(struct csv *, size_t, char *);	Err	bitreich.org	70
i void        csv_labels(FILE *, struct csv **, size_t *);	Err	bitreich.org	70
i void        csv_values(FILE *, struct csv *, size_t);	Err	bitreich.org	70
i 	Err	bitreich.org	70
1diff --git a/ploot-braille.c b/ploot-braille.c	/scm/ploot/file/ploot-braille.c.gph	bitreich.org	70
i@@ -8,13 +8,90 @@	Err	bitreich.org	70
i #include <math.h>	Err	bitreich.org	70
i #include <unistd.h>	Err	bitreich.org	70
i #include "drawille.h"	Err	bitreich.org	70
i-#include "scale.h"	Err	bitreich.org	70
i #include "util.h"	Err	bitreich.org	70
i+#include "csv.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #ifndef __OpenBSD__	Err	bitreich.org	70
i #define pledge(...) 0	Err	bitreich.org	70
i #endif	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+static int	Err	bitreich.org	70
i+get_min_max(struct csv *vl, int ncol,	Err	bitreich.org	70
i+        time_t *tmin, time_t *tmax,	Err	bitreich.org	70
i+        double *vmin, double *vmax)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        double *v;	Err	bitreich.org	70
i+        time_t *t;	Err	bitreich.org	70
i+        size_t n;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        *vmin = *vmax = 0; /* always show 0 on the scale */	Err	bitreich.org	70
i+        *tmin = *tmax = *vl->t;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (; ncol > 0; ncol--, vl++) {	Err	bitreich.org	70
i+                for (t = vl->t, v = vl->v, n = vl->n; n > 0; t++, v++, n--) {	Err	bitreich.org	70
i+                        if (*v < *vmin) *vmin = *v;	Err	bitreich.org	70
i+                        if (*v > *vmax) *vmax = *v;	Err	bitreich.org	70
i+                        if (*t < *tmin) *tmin = *t;	Err	bitreich.org	70
i+                        if (*t > *tmax) *tmax = *t;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (*tmin == *tmax)	Err	bitreich.org	70
i+                return -1;	Err	bitreich.org	70
i+        return 0;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static time_t	Err	bitreich.org	70
i+time_mark_step(time_t min, time_t max, int dots)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        time_t dt, scale[] = {	Err	bitreich.org	70
i+                1, 5, 2, 10, 20, 30, 60, 60*2, 60*5, 60*10, 60*20, 60*30, 3600, 	Err	bitreich.org	70
i+                3600*2, 3600*6, 3600*12, 3600*24, 3600*24*2, 	Err	bitreich.org	70
i+                3600*24*7, 3600*24*14, 3600*24*20, 3600*24*21, 3600*24*28, 3600*24*50,	Err	bitreich.org	70
i+                3600*24*100, 3600*24*365, 0	Err	bitreich.org	70
i+        };	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        dt = max - min;	Err	bitreich.org	70
i+        for (time_t *sc = scale; *sc > 0; sc++)	Err	bitreich.org	70
i+                if (dt < *sc * dots)	Err	bitreich.org	70
i+                        return *sc;	Err	bitreich.org	70
i+        return dt / dots;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Make the value scale aligned with round values by changing the	Err	bitreich.org	70
i+ * minimal and maximal values.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+adjust_scale(double *min, double *max, int rows)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        double dv, step, scale[] = { 1, 2, 2.5, 5, };	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        dv = *max - *min;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (dv > 1) {	Err	bitreich.org	70
i+                for (double mant = 1;; mant *= 10) {	Err	bitreich.org	70
i+                        double *sc = scale;	Err	bitreich.org	70
i+                        for (; sc < scale + LEN(scale); sc++) {	Err	bitreich.org	70
i+                                step = mant * *sc;	Err	bitreich.org	70
i+                                if (dv < (rows - 2) * step)	Err	bitreich.org	70
i+                                        goto end;	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        } else {	Err	bitreich.org	70
i+                for (double mant = 1;; mant /= 10) {	Err	bitreich.org	70
i+                        double *sc = scale + LEN(scale) - 1;	Err	bitreich.org	70
i+                        for (; sc >= scale; sc--) {	Err	bitreich.org	70
i+                                step = mant * *sc;	Err	bitreich.org	70
i+                                if (dv > (rows - 2) * step)	Err	bitreich.org	70
i+                                        goto end;	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+end:	Err	bitreich.org	70
i+        *min = (int)(*min / step) * step;	Err	bitreich.org	70
i+        *max = *min + step * rows;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i /*	Err	bitreich.org	70
i  * Plot the body as an histogram interpolating the gaps and include	Err	bitreich.org	70
i  * a vertical and horizontal axis.	Err	bitreich.org	70
i@@ -28,25 +105,31 @@ braille_histogram(struct csv *vl, struct drawille *drw,	Err	bitreich.org	70
i         time_t                *t;	Err	bitreich.org	70
i         size_t                n;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        zero = scale_ypos(0, vmin, vmax, drw->row*4);	Err	bitreich.org	70
i+#define SHIFT (4 / 2)	Err	bitreich.org	70
i+#define POSITION(val, min, max, sz) ((sz) * ((val) - (min)) / ((max) - (min)) + SHIFT)	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        zero = POSITION(0, vmin, vmax, drw->row*4);	Err	bitreich.org	70
i         v = vl->v;	Err	bitreich.org	70
i         t = vl->t;	Err	bitreich.org	70
i         n = vl->n;	Err	bitreich.org	70
i         for (; n > 0; n--, t++, v++) {	Err	bitreich.org	70
i-                if (isnan(*v))  /* XXX: better handling? */	Err	bitreich.org	70
i+                if (isnan(*v)) /* XXX: better handling? */	Err	bitreich.org	70
i                         continue;	Err	bitreich.org	70
i-                y = scale_ypos(*v, vmin, vmax, drw->row * 4);	Err	bitreich.org	70
i-                x = scale_xpos(*t, tmin, tmax, drw->col * 2);	Err	bitreich.org	70
i-                if (n < vl->n)  /* only plot when xprev, yprev are set */	Err	bitreich.org	70
i+                y = POSITION(*v, vmin, vmax, drw->row * 4);	Err	bitreich.org	70
i+                x = POSITION(*t, tmin, tmax, drw->col * 2);	Err	bitreich.org	70
i+                if (n < vl->n) /* only plot when xprev, yprev are set */	Err	bitreich.org	70
i                         drawille_histogram_line(drw, xprev, yprev, x, y, zero);	Err	bitreich.org	70
i                 xprev = x;	Err	bitreich.org	70
i                 yprev = y;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#undef POSITION	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         return 0;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t csvep, int col)	Err	bitreich.org	70
i+braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t tstep, int col)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         int x, o, prec;	Err	bitreich.org	70
i         char tmp[sizeof("MM/DD HH:MM")], *fmt;	Err	bitreich.org	70
i@@ -54,13 +137,13 @@ braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t csvep, int col)	Err	bitreich.org	70
i         time_t t;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         fmt =	Err	bitreich.org	70
i-          (csvep < 3600 * 12) ? "^%H:%M:%S" :	Err	bitreich.org	70
i-          (csvep < 3600 * 24) ? "^%m/%d %H:%M" :	Err	bitreich.org	70
i-          "^%Y/%m/%d";	Err	bitreich.org	70
i+            (tstep < 3600 * 12) ? "^%H:%M:%S" :	Err	bitreich.org	70
i+            (tstep < 3600 * 24) ? "^%m/%d %H:%M" :	Err	bitreich.org	70
i+            "^%Y/%m/%d";	Err	bitreich.org	70
i         n = x = 0;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        t = tmin + csvep - tmin % csvep;	Err	bitreich.org	70
i-        for (; t < tmax; t += csvep) {	Err	bitreich.org	70
i+        t = tmin + tstep - tmin % tstep;	Err	bitreich.org	70
i+        for (; t < tmax; t += tstep) {	Err	bitreich.org	70
i                 x = (t - tmin) * col / (tmax - tmin);	Err	bitreich.org	70
i                 strftime(tmp, sizeof tmp, fmt, localtime(&t));	Err	bitreich.org	70
i                 prec = x - n + strlen(tmp);	Err	bitreich.org	70
i@@ -76,51 +159,41 @@ braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t csvep, int col)	Err	bitreich.org	70
i  * Plot a single line out of the y axis, at row <r> out of <rows>.	Err	bitreich.org	70
i  */	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-braille_axis_y(FILE *fp, double vmin, double vmax, int r, int rows)	Err	bitreich.org	70
i+braille_axis_y(FILE *fp, double min, double max, int r, int rows)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        char tmp[10] = "", *s;	Err	bitreich.org	70
i-        double val;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        val = (rows - r) * (vmax - vmin) / rows;	Err	bitreich.org	70
i-        humanize(tmp, val);	Err	bitreich.org	70
i-        s =	Err	bitreich.org	70
i-          (r == 0) ? "┌" :	Err	bitreich.org	70
i-          (r == rows - 1) ? "└" :	Err	bitreich.org	70
i-          "├";	Err	bitreich.org	70
i-        fprintf(fp, "%s%-6s ", s, tmp);	Err	bitreich.org	70
i+        char buf[10] = "";	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        humanize(buf, (rows - 1 - r) * (max - min) / rows);	Err	bitreich.org	70
i+        fprintf(fp, "├%s ", buf);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-braille_render(struct drawille *drw, FILE *fp, double vmin, double vmax)	Err	bitreich.org	70
i+braille_render(struct drawille *drw, FILE *fp, double min, double max)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         int row;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         for (row = 0; row < drw->row; row++) {	Err	bitreich.org	70
i                 drawille_put_row(fp, drw, row);	Err	bitreich.org	70
i-                braille_axis_y(fp, vmin, vmax, row, drw->row);	Err	bitreich.org	70
i+                braille_axis_y(fp, min, max, row, drw->row);	Err	bitreich.org	70
i                 fprintf(fp, "\n");	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         return 0;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-plot(struct csv *vl, FILE *fp, size_t ncol, int rows, int cols)	Err	bitreich.org	70
i+plot(struct csv *vl, size_t ncol, int rows, int cols, FILE *fp)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        double vmin, vmax, vstep;	Err	bitreich.org	70
i-        time_t tmin, tmax, csvep;	Err	bitreich.org	70
i+        double vmin, vmax;	Err	bitreich.org	70
i+        time_t tmin, tmax, tstep;	Err	bitreich.org	70
i         struct drawille *drw;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        cols -= 9;                /* scale printed at the right */	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        scale_minmax(vl, ncol, &tmin, &tmax, &vmin, &vmax);	Err	bitreich.org	70
i-        csvep = scale_csvep(tmin, tmax, cols / 10);	Err	bitreich.org	70
i-        vstep = scale_vstep(vmin, vmax, rows / 10);	Err	bitreich.org	70
i+        rows = MAX(rows, 2);        /* readable */	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        rows -= ncol - 1;        /* room for the labels and the scale */	Err	bitreich.org	70
i-        rows /= ncol;                /* plot <ncol> times */	Err	bitreich.org	70
i-        rows = MAX(rows, 3);        /* readable */	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        debug("vstep=%lf vstep=%ld ncol=%zu rows=%zu", vstep, csvep, ncol, rows);	Err	bitreich.org	70
i+        if (get_min_max(vl, ncol, &tmin, &tmax, &vmin, &vmax) < 0)	Err	bitreich.org	70
i+                err(1, "invalid scale: tmin=%lld tmax=%lld vmin=%fd vmax=%fd",	Err	bitreich.org	70
i+                    (long long)tmin, (long long)tmax, vmin, vmax);	Err	bitreich.org	70
i+        adjust_scale(&vmin, &vmax, rows);	Err	bitreich.org	70
i+        tstep = time_mark_step(tmin, tmax, cols);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         for (; ncol > 0; vl++, ncol--) {	Err	bitreich.org	70
i                 if ((drw = drawille_new(rows, cols)) == NULL)	Err	bitreich.org	70
i@@ -132,7 +205,7 @@ plot(struct csv *vl, FILE *fp, size_t ncol, int rows, int cols)	Err	bitreich.org	70
i                         err(1, "rendering braille canvas");	Err	bitreich.org	70
i                 free(drw);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i-        if (braille_axis_x(fp, tmin, tmax, csvep, cols) == -1)	Err	bitreich.org	70
i+        if (braille_axis_x(fp, tmin, tmax, tstep * 10, cols) == -1)	Err	bitreich.org	70
i                 err(1, "printing x axis");;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -153,7 +226,7 @@ main(int argc, char **argv)	Err	bitreich.org	70
i         if (pledge("stdio", "") < 0)	Err	bitreich.org	70
i                 err(1, "pledge: %s", strerror(errno));	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        rows = 20, cols = 80;	Err	bitreich.org	70
i+        rows = 4, cols = 60;	Err	bitreich.org	70
i         arg0 = *argv;	Err	bitreich.org	70
i         while ((c = getopt(argc, argv, "r:c:")) > -1) {	Err	bitreich.org	70
i                 switch (c) {	Err	bitreich.org	70
i@@ -185,8 +258,8 @@ main(int argc, char **argv)	Err	bitreich.org	70
i         csv_labels(stdin, &vl, &ncol);	Err	bitreich.org	70
i         csv_values(stdin, vl, ncol);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        plot(vl, stdout, ncol, rows, cols);	Err	bitreich.org	70
i+        plot(vl, ncol, rows, cols, stdout);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         free(vl);	Err	bitreich.org	70
i-        return 1;	Err	bitreich.org	70
i+        return 0;	Err	bitreich.org	70
i }	Err	bitreich.org	70
1diff --git a/ploot-farbfeld.c b/ploot-farbfeld.c	/scm/ploot/file/ploot-farbfeld.c.gph	bitreich.org	70
i@@ -236,20 +236,20 @@ ffplot_v2y(double v, double vmin, double vmax)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i ffplot_xaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid,	Err	bitreich.org	70
i-        time_t tmin, time_t tmax, time_t csvep)	Err	bitreich.org	70
i+        time_t tmin, time_t tmax, time_t tstep)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         time_t t;	Err	bitreich.org	70
i         int x;	Err	bitreich.org	70
i         char str[sizeof("MM/DD HH/MM")], *fmt;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (csvep < 3600 * 12)	Err	bitreich.org	70
i+        if (tstep < 3600 * 12)	Err	bitreich.org	70
i                 fmt = "%H:%M:%S";	Err	bitreich.org	70
i-        else if (csvep < 3600 * 24)	Err	bitreich.org	70
i+        else if (tstep < 3600 * 24)	Err	bitreich.org	70
i                 fmt = "%m/%d %H:%M";	Err	bitreich.org	70
i         else	Err	bitreich.org	70
i                 fmt = "%X/%m/%d";	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        for (t = tmax - tmax % csvep; t >= tmin; t -= csvep) {	Err	bitreich.org	70
i+        for (t = tmax - tmax % tstep; t >= tmin; t -= tstep) {	Err	bitreich.org	70
i                 x = ffplot_t2x(t, tmin, tmax);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i                 ffplot_line(plot, grid,	Err	bitreich.org	70
i@@ -358,10 +358,10 @@ plot(struct csv *vl, struct ffcolor **cl, size_t ncol, char *name, char *units)	Err	bitreich.org	70
i         struct ffcolor label_fg = { 0x8888, 0x8888, 0x8888, 0xffff };	Err	bitreich.org	70
i         struct ffcolor title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff };	Err	bitreich.org	70
i         double vmin, vmax, vstep;	Err	bitreich.org	70
i-        time_t tmin, tmax, csvep;	Err	bitreich.org	70
i+        time_t tmin, tmax, tstep;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         scale_minmax(vl, ncol, &tmin, &tmax, &vmin, &vmax);	Err	bitreich.org	70
i-        csvep = scale_csvep(tmin, tmax, 7);	Err	bitreich.org	70
i+        tstep = scale_tstep(tmin, tmax, 7);	Err	bitreich.org	70
i         vstep = scale_vstep(vmin, vmax, 7);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         if ((plot.buf = calloc(IMAGE_H * IMAGE_W, sizeof *plot.buf)) == NULL)	Err	bitreich.org	70
i@@ -377,7 +377,7 @@ plot(struct csv *vl, struct ffcolor **cl, size_t ncol, char *name, char *units)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         plot.x = XLABEL_X;	Err	bitreich.org	70
i         plot.y = XLABEL_Y;	Err	bitreich.org	70
i-        ffplot_xaxis(&plot, &label_fg, &grid_fg, tmin, tmax, csvep);	Err	bitreich.org	70
i+        ffplot_xaxis(&plot, &label_fg, &grid_fg, tmin, tmax, tstep);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         plot.x = YLABEL_X;	Err	bitreich.org	70
i         plot.y = YLABEL_Y;	Err	bitreich.org	70
1diff --git a/scale.c b/scale.c	/scm/ploot/file/scale.c.gph	bitreich.org	70
i@@ -1,94 +0,0 @@	Err	bitreich.org	70
i-#include "scale.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stddef.h>	Err	bitreich.org	70
i-#include <time.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "util.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- *        - <max   ^	Err	bitreich.org	70
i- *        -        |        Translate the coordinates between double values	Err	bitreich.org	70
i- *        - <val  szy and height in the plot of <row> rows.	Err	bitreich.org	70
i- *        -        |	Err	bitreich.org	70
i- *        - <min   v	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-int	Err	bitreich.org	70
i-scale_ypos(double val, double min, double max, int szy)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        return szy * (val - min) / (max - min);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- *        <---- szx ---->                Translate the coordinates between the time	Err	bitreich.org	70
i- *                                range and position in the plot of <col> cols.	Err	bitreich.org	70
i- *        t1     t     t2	Err	bitreich.org	70
i- *         | . . | . . |	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-int	Err	bitreich.org	70
i-scale_xpos(time_t t, time_t t1, time_t t2, int szx)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        return szx * (t - t1) / (t2 - t1);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-scale_minmax(struct csv *vl, int ncol,	Err	bitreich.org	70
i-        time_t *tmin, time_t *tmax,	Err	bitreich.org	70
i-        double *vmin, double *vmax)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        double *v;	Err	bitreich.org	70
i-        time_t *t;	Err	bitreich.org	70
i-        size_t n;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        *vmin = *vmax = 0;	Err	bitreich.org	70
i-        *tmin = *tmax = *vl->t;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (; ncol > 0; ncol--, vl++) {	Err	bitreich.org	70
i-                for (t = vl->t, v = vl->v, n = vl->n; n > 0; t++, v++, n--) {	Err	bitreich.org	70
i-                        if (*v < *vmin) *vmin = *v;	Err	bitreich.org	70
i-                        if (*v > *vmax) *vmax = *v;	Err	bitreich.org	70
i-                        if (*t < *tmin) *tmin = *t;	Err	bitreich.org	70
i-                        if (*t > *tmax) *tmax = *t;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (*tmin == *tmax)	Err	bitreich.org	70
i-                err(1, "invalid time scale: min=%lld max=%lld", *tmin, *tmax);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-time_t	Err	bitreich.org	70
i-scale_csvep(time_t min, time_t max, int nval)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        time_t dt, *sc, scale[] = {	Err	bitreich.org	70
i-                1, 5, 2, 10, 20, 30, 60, 60*2, 60*5, 60*10, 60*20, 60*30, 3600, 	Err	bitreich.org	70
i-                3600*2, 3600*5, 3600*10, 3600*18, 3600*24, 3600*24*2, 	Err	bitreich.org	70
i-                3600*24*5, 3600*24*10, 3600*24*20, 3600*24*30, 3600*24*50,	Err	bitreich.org	70
i-                3600*24*100, 3600*24*365, 0	Err	bitreich.org	70
i-        };	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        dt = max - min;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (sc = scale; *sc > 0; sc++)	Err	bitreich.org	70
i-                if (dt < *sc * nval)	Err	bitreich.org	70
i-                        return *sc;	Err	bitreich.org	70
i-        return dt / nval;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-double	Err	bitreich.org	70
i-scale_vstep(double min, double max, int nval)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        double dv, d, *sc, scale[] = { 1, 2, 3, 5 };	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        dv = max - min;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (dv > 1)	Err	bitreich.org	70
i-                for (d = 1; d != 0; d *= 10)	Err	bitreich.org	70
i-                        for (sc = scale; sc < scale + LEN(scale); sc++)	Err	bitreich.org	70
i-                                if (dv < *sc * d * nval)	Err	bitreich.org	70
i-                                        return *sc * d;	Err	bitreich.org	70
i-        if (dv < 1)	Err	bitreich.org	70
i-                for (d = 1; d != 0; d *= 10)	Err	bitreich.org	70
i-                        for (sc = scale + LEN(scale) - 1; sc >= scale; sc--)	Err	bitreich.org	70
i-                                if (dv > *sc / d * nval / 2)	Err	bitreich.org	70
i-                                        return *sc / d;	Err	bitreich.org	70
i-        return 0;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
1diff --git a/scale.h b/scale.h	/scm/ploot/file/scale.h.gph	bitreich.org	70
i@@ -1,14 +0,0 @@	Err	bitreich.org	70
i-#ifndef SCALE_H	Err	bitreich.org	70
i-#define SCALE_H	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stddef.h>	Err	bitreich.org	70
i-#include <time.h>	Err	bitreich.org	70
i-#include "csv.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int        scale_ypos(double, double, double, int);	Err	bitreich.org	70
i-int        scale_xpos(time_t, time_t, time_t, int);	Err	bitreich.org	70
i-void        scale_minmax(struct csv *, int, time_t *, time_t *, double *, double *);	Err	bitreich.org	70
i-time_t        scale_csvep(time_t, time_t, int);	Err	bitreich.org	70
i-double        scale_vstep(double, double, int);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#endif	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/ploot/commit/f7f88c2ee5573abf...
Content-Typetext/plain; charset=utf-8