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 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 Err bitreich.org 70 i #include 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 out of . 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 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 Err bitreich.org 70 i-#include 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- * - rows. Err bitreich.org 70 i- * - | Err bitreich.org 70 i- * - Translate the coordinates between the time Err bitreich.org 70 i- * range and position in the plot of 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 Err bitreich.org 70 i-#include 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 .