iploot-farbfeld: comeback - 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 8836c19534760f2ce037c39bde9dc5591011ed07 /scm/ploot/commit/8836c19534760f2ce037c39bde9dc5591011ed07.gph bitreich.org 70 1parent eb816ab512727f55665f05809c78563ff93a94cc /scm/ploot/commit/eb816ab512727f55665f05809c78563ff93a94cc.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:me@josuah.net bitreich.org 70 iDate: Sun, 27 Jun 2021 04:51:38 +0200 Err bitreich.org 70 i Err bitreich.org 70 iploot-farbfeld: comeback Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 2 +- Err bitreich.org 70 i M csv.c | 27 ++++++++++++++++++++++++++- Err bitreich.org 70 i M csv.h | 1 + Err bitreich.org 70 i A example.png | 0 Err bitreich.org 70 i M ploot-braille.c | 90 +++---------------------------- Err bitreich.org 70 i M ploot-farbfeld.1 | 4 ---- Err bitreich.org 70 i M ploot-farbfeld.c | 64 +++++++++++++------------------ Err bitreich.org 70 i M util.c | 53 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i M util.h | 3 +++ Err bitreich.org 70 i Err bitreich.org 70 i9 files changed, 118 insertions(+), 126 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@@ -9,7 +9,7 @@ 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 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+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@@ -9,9 +9,34 @@ Err bitreich.org 70 i #include "util.h" Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i- * Read CSV data onto a set of (struct csv). Err bitreich.org 70 i+ * Read CSV data onto a set of (struct csv) and some utilities to work on these data. Err bitreich.org 70 i */ Err bitreich.org 70 i Err bitreich.org 70 i+int Err bitreich.org 70 i+csv_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 void Err bitreich.org 70 i csv_add_time(struct csv *vl, time_t epoch) 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@@ -17,5 +17,6 @@ struct csv { Err bitreich.org 70 i 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+int csv_min_max(struct csv *, int, time_t *, time_t *, double *, double *); Err bitreich.org 70 i Err bitreich.org 70 i #endif Err bitreich.org 70 1diff --git a/example.png b/example.png /scm/ploot/file/example.png.gph bitreich.org 70 iBinary files differ. 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@@ -15,85 +15,6 @@ 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- step = 1; 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 * 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- double tmp = mant * *sc; Err bitreich.org 70 i- if (dv > rows * tmp) Err bitreich.org 70 i- goto end; Err bitreich.org 70 i- step = tmp; 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@@ -185,17 +106,20 @@ braille_render(struct drawille *drw, FILE *fp, double min, double max) Err bitreich.org 70 i static void 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; Err bitreich.org 70 i+ double vmin, vmax, vstep; 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 rows = MAX(rows, 2); /* readable */ Err bitreich.org 70 i Err bitreich.org 70 i- if (get_min_max(vl, ncol, &tmin, &tmax, &vmin, &vmax) < 0) Err bitreich.org 70 i+ if (csv_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+ tstep = scale_time_t(tmin, tmax, cols); Err bitreich.org 70 i+ vstep = scale_double(vmin, vmax, rows); Err bitreich.org 70 i+ vmin = (int)(vmin / vstep) * vstep; Err bitreich.org 70 i+ vmax = vmin + vstep * rows; 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 1diff --git a/ploot-farbfeld.1 b/ploot-farbfeld.1 /scm/ploot/file/ploot-farbfeld.1.gph bitreich.org 70 i@@ -13,7 +13,6 @@ Err bitreich.org 70 i . Err bitreich.org 70 i .Nm ploot-ffplot Err bitreich.org 70 i .Op Fl t Ar title Err bitreich.org 70 i-.Op Fl u Ar unit Err bitreich.org 70 i .Ar colors... Err bitreich.org 70 i . Err bitreich.org 70 i . Err bitreich.org 70 i@@ -28,9 +27,6 @@ utility plots an image in the ffplot format out of csv values coming from stdin. Err bitreich.org 70 i .It Fl t Err bitreich.org 70 i Set the title of the plot printed at the top left corner. Err bitreich.org 70 i . Err bitreich.org 70 i-.It Fl u Err bitreich.org 70 i-Set the unit description printed at the top right corner. Err bitreich.org 70 i-. Err bitreich.org 70 i .It Ar colors Err bitreich.org 70 i List of argument that specify the color for each column. Err bitreich.org 70 i If the input csv have 5 columns in addition of the timestamp, there must 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@@ -13,24 +13,23 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include "csv.h" Err bitreich.org 70 i #include "font.h" Err bitreich.org 70 i-#include "scale.h" Err bitreich.org 70 i #include "util.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-#define MARGIN 4 Err bitreich.org 70 i+#define MARGIN 8 Err bitreich.org 70 i Err bitreich.org 70 i #define IMAGE_H (TITLE_H + PLOT_H + XLABEL_H) Err bitreich.org 70 i-#define IMAGE_W (YLABEL_W + PLOT_W + LEGEND_W) Err bitreich.org 70 i+#define IMAGE_W (MARGIN + YLABEL_W + PLOT_W + MARGIN) Err bitreich.org 70 i Err bitreich.org 70 i-#define TITLE_X (YLABEL_W) Err bitreich.org 70 i-#define TITLE_Y (IMAGE_H - TITLE_H) Err bitreich.org 70 i+#define TITLE_X (MARGIN) Err bitreich.org 70 i+#define TITLE_Y (IMAGE_H - TITLE_H / 2) Err bitreich.org 70 i #define TITLE_H ((font)->height * 2) Err bitreich.org 70 i #define TITLE_W (PLOT_W) Err bitreich.org 70 i Err bitreich.org 70 i-#define YLABEL_X (0) Err bitreich.org 70 i+#define YLABEL_X (MARGIN) Err bitreich.org 70 i #define YLABEL_Y (PLOT_Y) Err bitreich.org 70 i #define YLABEL_H (PLOT_H) Err bitreich.org 70 i #define YLABEL_W (40 + MARGIN) Err bitreich.org 70 i@@ -40,14 +39,13 @@ Err bitreich.org 70 i #define XLABEL_H ((font)->height * 2) Err bitreich.org 70 i #define XLABEL_W (PLOT_W) Err bitreich.org 70 i Err bitreich.org 70 i-#define PLOT_X (YLABEL_W) Err bitreich.org 70 i+#define PLOT_X (YLABEL_X + YLABEL_W) Err bitreich.org 70 i #define PLOT_Y (XLABEL_H) Err bitreich.org 70 i #define PLOT_W (700) Err bitreich.org 70 i #define PLOT_H (160) Err bitreich.org 70 i Err bitreich.org 70 i-#define LEGEND_X (IMAGE_W - LEGEND_W) Err bitreich.org 70 i-#define LEGEND_Y (TITLE_H + PLOT_H - (font)->height) Err bitreich.org 70 i-#define LEGEND_W (100) Err bitreich.org 70 i+#define LEGEND_X (IMAGE_W / 2) Err bitreich.org 70 i+#define LEGEND_Y (TITLE_Y) Err bitreich.org 70 i #define LEGEND_H (PLOT_H) Err bitreich.org 70 i Err bitreich.org 70 i struct ffcolor { Err bitreich.org 70 i@@ -76,8 +74,7 @@ static struct colorname { Err bitreich.org 70 i { NULL, { 0, 0, 0, 0 } } Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-static char *tflag = ""; Err bitreich.org 70 i-static char *uflag = ""; Err bitreich.org 70 i+static char *flag_title = ""; Err bitreich.org 70 i static struct font *font = &font13; Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -212,7 +209,7 @@ ffplot_print(FILE *fp, struct ffplot *plot) Err bitreich.org 70 i w = htonl(plot->w); Err bitreich.org 70 i h = htonl(plot->h); Err bitreich.org 70 i Err bitreich.org 70 i- fprintf(stdout, "ffplot"); Err bitreich.org 70 i+ fprintf(stdout, "farbfeld"); Err bitreich.org 70 i fwrite(&w, sizeof(w), 1, fp); Err bitreich.org 70 i fwrite(&h, sizeof(h), 1, fp); Err bitreich.org 70 i fwrite(plot->buf, plot->w * plot->h, sizeof(*plot->buf), fp); Err bitreich.org 70 i@@ -284,12 +281,9 @@ ffplot_yaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid, Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i-ffplot_title(struct ffplot *plot, Err bitreich.org 70 i- struct ffcolor *ct, char *title, Err bitreich.org 70 i- struct ffcolor *cu, char *unit) Err bitreich.org 70 i+ffplot_title(struct ffplot *plot, struct ffcolor *ct, char *title) Err bitreich.org 70 i { Err bitreich.org 70 i ffplot_text_left(plot, ct, font, title, TITLE_H / 2, 0); Err bitreich.org 70 i- ffplot_text_right(plot, cu, font, unit, TITLE_H / 2, TITLE_W); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i@@ -329,27 +323,26 @@ ffplot_legend(struct ffplot *plot, struct ffcolor *fg, struct csv *vl, struct ff Err bitreich.org 70 i { Err bitreich.org 70 i size_t x, y; Err bitreich.org 70 i Err bitreich.org 70 i+ x = y = 0; Err bitreich.org 70 i for (; ncol > 0; ncol--, vl++, cl++) { Err bitreich.org 70 i- y = -(ncol - 1) * (font->height + MARGIN); Err bitreich.org 70 i- x = MARGIN * 2; Err bitreich.org 70 i x = ffplot_text_left(plot, *cl, font, "-", x, y) + MARGIN; Err bitreich.org 70 i x = ffplot_text_left(plot, fg, font, vl->label, x, y); Err bitreich.org 70 i+ x = ffplot_text_left(plot, fg, font, " ", x, y); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i- * Plot the 'n' values list of the 'v' arrax with title 'name' and Err bitreich.org 70 i- * 'units' label. Err bitreich.org 70 i+ * Plot the 'n' values list of the 'v' arrax with title 'name' label. Err bitreich.org 70 i * Err bitreich.org 70 i- * Title (units) Err bitreich.org 70 i- * x ^ Legend Err bitreich.org 70 i- * label | - + - + - + - + - .... Err bitreich.org 70 i- * here | - + - + - + - + - .... Err bitreich.org 70 i+ * Title Legend Err bitreich.org 70 i+ * x ^ Err bitreich.org 70 i+ * label | - + - + - + - + - Err bitreich.org 70 i+ * here | - + - + - + - + - Err bitreich.org 70 i * +---+---+---+---+--> Err bitreich.org 70 i * x label here Err bitreich.org 70 i */ Err bitreich.org 70 i static void Err bitreich.org 70 i-plot(struct csv *vl, struct ffcolor **cl, size_t ncol, char *name, char *units) Err bitreich.org 70 i+plot(struct csv *vl, struct ffcolor **cl, size_t ncol, char *name) Err bitreich.org 70 i { Err bitreich.org 70 i struct ffplot plot = { IMAGE_W, IMAGE_H, 0, 0, NULL }; Err bitreich.org 70 i struct ffcolor plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff }; Err bitreich.org 70 i@@ -360,9 +353,9 @@ plot(struct csv *vl, struct ffcolor **cl, size_t ncol, char *name, char *units) Err bitreich.org 70 i double vmin, vmax, vstep; 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- tstep = scale_tstep(tmin, tmax, 7); Err bitreich.org 70 i- vstep = scale_vstep(vmin, vmax, 7); Err bitreich.org 70 i+ csv_min_max(vl, ncol, &tmin, &tmax, &vmin, &vmax); Err bitreich.org 70 i+ tstep = scale_time_t(tmin, tmax, 7); Err bitreich.org 70 i+ vstep = scale_double(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 err(1, "calloc: %s", strerror(errno)); Err bitreich.org 70 i@@ -385,7 +378,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 = TITLE_X; Err bitreich.org 70 i plot.y = TITLE_Y; Err bitreich.org 70 i- ffplot_title(&plot, &title_fg, name, &label_fg, units); Err bitreich.org 70 i+ ffplot_title(&plot, &title_fg, name); Err bitreich.org 70 i Err bitreich.org 70 i plot.x = PLOT_X; Err bitreich.org 70 i plot.y = PLOT_Y; Err bitreich.org 70 i@@ -420,7 +413,7 @@ argv_to_color(struct ffcolor **cl, char **argv) Err bitreich.org 70 i static void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "usage: %s [-t title] [-u unit] {", arg0); Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-t title] {", arg0); Err bitreich.org 70 i fputs(colorname->name, stderr); Err bitreich.org 70 i for (struct colorname *cn = colorname + 1; cn->name != NULL; cn++) Err bitreich.org 70 i fprintf(stderr, ",%s", cn->name); Err bitreich.org 70 i@@ -440,13 +433,10 @@ main(int argc, char **argv) Err bitreich.org 70 i err(1, "pledge: %s", strerror(errno)); Err bitreich.org 70 i Err bitreich.org 70 i arg0 = *argv; Err bitreich.org 70 i- while ((c = getopt(argc, argv, "t:u:")) > -1) { Err bitreich.org 70 i+ while ((c = getopt(argc, argv, "t:")) > -1) { Err bitreich.org 70 i switch (c) { Err bitreich.org 70 i case 't': Err bitreich.org 70 i- tflag = optarg; Err bitreich.org 70 i- break; Err bitreich.org 70 i- case 'u': Err bitreich.org 70 i- uflag = optarg; Err bitreich.org 70 i+ flag_title = optarg; Err bitreich.org 70 i break; Err bitreich.org 70 i default: Err bitreich.org 70 i usage(); Err bitreich.org 70 i@@ -469,7 +459,7 @@ main(int argc, char **argv) Err bitreich.org 70 i csv_values(stdin, vl, ncol); Err bitreich.org 70 i argv_to_color(cl, argv); Err bitreich.org 70 i Err bitreich.org 70 i- plot(vl, cl, argc, tflag, uflag); Err bitreich.org 70 i+ plot(vl, cl, argc, flag_title); Err bitreich.org 70 i Err bitreich.org 70 i free(vl); Err bitreich.org 70 i free(cl); Err bitreich.org 70 1diff --git a/util.c b/util.c /scm/ploot/file/util.c.gph bitreich.org 70 i@@ -1,4 +1,5 @@ Err bitreich.org 70 i #include "util.h" Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -122,3 +123,55 @@ humanize(char *str, double val) Err bitreich.org 70 i Err bitreich.org 70 i return exp * 3; Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 i+time_t Err bitreich.org 70 i+scale_time_t(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+double Err bitreich.org 70 i+scale_double(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+ step = 1; 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 * step) Err bitreich.org 70 i+ return step; 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+ double tmp = mant * *sc; Err bitreich.org 70 i+ if (dv > rows * tmp) Err bitreich.org 70 i+ return step; Err bitreich.org 70 i+ step = tmp; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ assert(!"not reached"); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/util.h b/util.h /scm/ploot/file/util.h.gph bitreich.org 70 i@@ -2,6 +2,7 @@ Err bitreich.org 70 i #define TOOL_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 #define LEN(x) (sizeof(x) / sizeof(*x)) Err bitreich.org 70 i #define MAX(x, y) ((x) > (y) ? (x) : (y)) Err bitreich.org 70 i@@ -18,5 +19,7 @@ void put3utf(long); Err bitreich.org 70 i char *strsep(char **, const char *); Err bitreich.org 70 i void strchomp(char *); Err bitreich.org 70 i int humanize(char *, double); Err bitreich.org 70 i+time_t scale_time_t(time_t, time_t, int); Err bitreich.org 70 i+double scale_double(double, double, int); Err bitreich.org 70 i Err bitreich.org 70 i #endif Err bitreich.org 70 .