iadd an experimental ploot-braille tool - 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 1f4e757723ea483ab2c60c8fec2937569441af9e /scm/ploot/commit/1f4e757723ea483ab2c60c8fec2937569441af9e.gph bitreich.org 70 1parent ffb9fc9caeaf3a79f5ab4c7fcbbf4994c1037582 /scm/ploot/commit/ffb9fc9caeaf3a79f5ab4c7fcbbf4994c1037582.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:me@josuah.net bitreich.org 70 iDate: Sat, 15 Feb 2020 15:23:03 +0100 Err bitreich.org 70 i Err bitreich.org 70 iadd an experimental ploot-braille tool Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M .gitignore | 1 + Err bitreich.org 70 i M Makefile | 4 ++-- Err bitreich.org 70 i M arg.h | 2 -- Err bitreich.org 70 i A csv.c | 95 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i M def.h | 24 ++++++++++++++++++++++-- Err bitreich.org 70 i M drawille.c | 39 +++++++++++++++---------------- Err bitreich.org 70 i D log.h | 45 ------------------------------- Err bitreich.org 70 i M ploot-braille.c | 201 +++++++++++++------------------ Err bitreich.org 70 i M ploot-farbfeld.c | 7 +++---- Err bitreich.org 70 i M ploot-feed.c | 14 ++++++++------ Err bitreich.org 70 i A scale.c | 139 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i M util.c | 53 ++++++++++++++++++++++++++++--- Err bitreich.org 70 i Err bitreich.org 70 i12 files changed, 425 insertions(+), 199 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/.gitignore b/.gitignore /scm/ploot/file/.gitignore.gph bitreich.org 70 i@@ -1,4 +1,5 @@ Err bitreich.org 70 i *.o Err bitreich.org 70 i *.core Err bitreich.org 70 i+ploot-braille Err bitreich.org 70 i ploot-farbfeld Err bitreich.org 70 i ploot-feed Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/ploot/file/Makefile.gph bitreich.org 70 i@@ -1,5 +1,4 @@ Err bitreich.org 70 i-CFLAGS = -Wall -Wextra -std=c99 -pedantic -fPIC \ Err bitreich.org 70 i- -D_POSIX_C_SOURCE=200809L Err bitreich.org 70 i+CFLAGS = -Wall -Wextra -std=c99 -pedantic -fPIC Err bitreich.org 70 i LFLAGS = -static Err bitreich.org 70 i BIN = ploot-farbfeld ploot-feed ploot-braille Err bitreich.org 70 i LIB = -lm Err bitreich.org 70 i@@ -9,6 +8,7 @@ SRC = csv.c drawille.c font.c font7.c font8.c font13.c util.c scale.c Err bitreich.org 70 i Err bitreich.org 70 i all: $(BIN) Err bitreich.org 70 i Err bitreich.org 70 i+${SRC:.c=.o} ${BIN:=.o}: arg.h def.h Makefile Err bitreich.org 70 i ${BIN}: ${SRC:.c=.o} ${BIN:=.o} Err bitreich.org 70 i ${CC} $(LFLAGS) -o $@ $@.o ${SRC:.c=.o} $(LIB) Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/arg.h b/arg.h /scm/ploot/file/arg.h.gph bitreich.org 70 i@@ -1,8 +1,6 @@ Err bitreich.org 70 i #ifndef ARG_H Err bitreich.org 70 i #define ARG_H Err bitreich.org 70 i Err bitreich.org 70 i-extern char const *arg0; Err bitreich.org 70 i- Err bitreich.org 70 i #define ARG_SWITCH(argc, argv) \ Err bitreich.org 70 i arg0 = *argv; \ Err bitreich.org 70 i while (++argv && --argc && **argv == '-' && (*argv)[1]) \ Err bitreich.org 70 1diff --git a/csv.c b/csv.c /scm/ploot/file/csv.c.gph bitreich.org 70 i@@ -0,0 +1,95 @@ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Read CSV data onto a set of (struct vlist). Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "def.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+csv_addtime(struct vlist *vl, time_t epoch) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if ((vl->t = realloc(vl->t, (vl->n + 1) * sizeof(*vl->t))) == NULL) Err bitreich.org 70 i+ err(1, "reallocating values buffer"); Err bitreich.org 70 i+ vl->t[vl->n] = 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 vlist *vl, double field) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if ((vl->v = realloc(vl->v, (vl->n + 1) * sizeof(*vl->v))) == NULL) Err bitreich.org 70 i+ err(1, "reallocating values buffer"); Err bitreich.org 70 i+ vl->v[vl->n] = field; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Add to each column the value on the current row. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+void Err bitreich.org 70 i+csv_addrow(struct vlist *vl, size_t ncol, char *line) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *field; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ((field = strsep(&line, ",")) == NULL) Err bitreich.org 70 i+ err(1, "missing epoch at row %zu", vl->n); Err bitreich.org 70 i+ Err bitreich.org 70 i+ csv_addtime(vl, eatol(field)); Err bitreich.org 70 i+ for (; (field = strsep(&line, ",")) != NULL; ncol--, vl->n++, vl++) { Err bitreich.org 70 i+ if (ncol == 0) Err bitreich.org 70 i+ err(1, "too many fields at line %zu", vl->n); Err bitreich.org 70 i+ csv_addval(vl, eatof(field)); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (ncol > 0) Err bitreich.org 70 i+ err(1, "too few fields at line %zu", vl->n); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * < *ncol > Err bitreich.org 70 i+ * epoch,label1,label2,label3 Err bitreich.org 70 i+ */ Err bitreich.org 70 i+void Err bitreich.org 70 i+csv_labels(FILE *fp, char *buf, struct vlist **vl, size_t *ncol) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *field; Err bitreich.org 70 i+ size_t sz; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (esfgets(buf, LINE_MAX, fp) == NULL) Err bitreich.org 70 i+ err(1, "missing label line"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (strcmp(strsep(&buf, ","), "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+ for (*ncol = 0; (field = strsep(&buf, ",")) != NULL; ++*ncol) { Err bitreich.org 70 i+ sz = (*ncol + 1) * sizeof **vl; Err bitreich.org 70 i+ if ((*vl = realloc(*vl, sz)) == NULL) Err bitreich.org 70 i+ err(1, "realloc"); Err bitreich.org 70 i+ (*vl)[*ncol].label = field; 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+ * < ncol > Err bitreich.org 70 i+ * epoch,a1,b1,c1 ^ Err bitreich.org 70 i+ * epoch,a2,b2,c2 vl->n Err bitreich.org 70 i+ * epoch,a3,b3,c3 v Err bitreich.org 70 i+ */ Err bitreich.org 70 i+void Err bitreich.org 70 i+csv_values(FILE *fp, struct vlist *vl, size_t ncol) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char line[LINE_MAX]; Err bitreich.org 70 i+ time_t *tbuf; Err bitreich.org 70 i+ Err bitreich.org 70 i+ while (esfgets(line, sizeof(line), fp) != NULL) Err bitreich.org 70 i+ csv_addrow(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+ /* The same time buffer can be used for all. */ Err bitreich.org 70 i+ for (tbuf = vl->t; ncol > 0; ncol--, vl++) Err bitreich.org 70 i+ vl->t = tbuf; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/def.h b/def.h /scm/ploot/file/def.h.gph bitreich.org 70 i@@ -1,4 +1,5 @@ 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 Err bitreich.org 70 i@@ -37,8 +38,8 @@ struct vlist { Err bitreich.org 70 i /* csv.c */ Err bitreich.org 70 i Err bitreich.org 70 i void csv_addrow (struct vlist *, size_t, char *); Err bitreich.org 70 i-void csv_values (struct vlist *, size_t); Err bitreich.org 70 i-void csv_labels (struct vlist *, char **, char *); Err bitreich.org 70 i+void csv_labels (FILE *, char *, struct vlist **, size_t *); Err bitreich.org 70 i+void csv_values (FILE *, struct vlist *, size_t); Err bitreich.org 70 i Err bitreich.org 70 i /* drawille.c */ Err bitreich.org 70 i Err bitreich.org 70 i@@ -61,12 +62,28 @@ struct font font13; Err bitreich.org 70 i struct font font7; Err bitreich.org 70 i struct font font8; Err bitreich.org 70 i Err bitreich.org 70 i+/* ploot-braille.c */ Err bitreich.org 70 i+ Err bitreich.org 70 i+char const *arg0; Err bitreich.org 70 i+ Err bitreich.org 70 i+/* ploot-farbfeld.c */ Err bitreich.org 70 i+ Err bitreich.org 70 i+char const *arg0; Err bitreich.org 70 i+ Err bitreich.org 70 i+/* ploot-feed.c */ Err bitreich.org 70 i+ Err bitreich.org 70 i+char const *arg0; Err bitreich.org 70 i+ Err bitreich.org 70 i /* scale.c */ 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_vminmax (double *, double *, int); Err bitreich.org 70 i void scale (struct vlist *, int, time_t *, time_t *, time_t *, double *, double *, double *); Err bitreich.org 70 i Err bitreich.org 70 i /* util.c */ Err bitreich.org 70 i Err bitreich.org 70 i+size_t strlcpy (char *, const char *, size_t); Err bitreich.org 70 i void put3utf (long); Err bitreich.org 70 i char * strsep (char **, const char *); Err bitreich.org 70 i void estriplf (char *); Err bitreich.org 70 i@@ -74,3 +91,6 @@ double eatof (char *); Err bitreich.org 70 i long eatol (char *); Err bitreich.org 70 i char * esfgets (char *, size_t, FILE *); Err bitreich.org 70 i int humanize (char *, double); Err bitreich.org 70 i+void vlog (char const *, char const *, va_list); Err bitreich.org 70 i+void warn (char const *, ...); Err bitreich.org 70 i+void err (int, char const *, ...); Err bitreich.org 70 1diff --git a/drawille.c b/drawille.c /scm/ploot/file/drawille.c.gph bitreich.org 70 i@@ -1,3 +1,7 @@ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Terminal-based plotting using drawille character, aka drawille. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -5,14 +9,10 @@ Err bitreich.org 70 i Err bitreich.org 70 i #include "def.h" Err bitreich.org 70 i Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Terminal-based plotting using drawille character, aka drawille. Err bitreich.org 70 i- */ Err bitreich.org 70 i- Err bitreich.org 70 i /* parameters used to draw a line */ Err bitreich.org 70 i struct line { Err bitreich.org 70 i- int x0, y0, x1, y1; /* point of the line */ Err bitreich.org 70 i- int dx, dy, sx, sy, err; /* parameters for the algorythm */ Err bitreich.org 70 i+ int x0, y0, x1, y1; /* point of the line */ Err bitreich.org 70 i+ int dx, dy, sx, sy, err; /* parameters for the algorythm */ Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -36,7 +36,7 @@ drawille_cell_dot(uint8_t *cell, int row, int col) Err bitreich.org 70 i static size_t Err bitreich.org 70 i drawille_cell_utf(uint8_t cell, char *utf) Err bitreich.org 70 i { Err bitreich.org 70 i- long rune; Err bitreich.org 70 i+ long rune; Err bitreich.org 70 i Err bitreich.org 70 i rune = 10240 + cell; Err bitreich.org 70 i utf[0] = (char)(0xe0 | (0x0f & (rune >> 12))); /* 1110xxxx */ Err bitreich.org 70 i@@ -54,8 +54,8 @@ drawille_get(struct drawille *drw, int row, int col) Err bitreich.org 70 i size_t Err bitreich.org 70 i drawille_fmt_row(struct drawille *drw, char *buf, size_t sz, int row) Err bitreich.org 70 i { Err bitreich.org 70 i- char txt[] = "xxx"; Err bitreich.org 70 i- size_t n; Err bitreich.org 70 i+ char txt[] = "xxx"; Err bitreich.org 70 i+ size_t n; Err bitreich.org 70 i Err bitreich.org 70 i n = 0; Err bitreich.org 70 i for (int col = 0; col < drw->col; col++) { Err bitreich.org 70 i@@ -82,7 +82,7 @@ drawille_dot(struct drawille *drw, int x, int y) Err bitreich.org 70 i struct drawille * Err bitreich.org 70 i drawille_new(int row, int col) Err bitreich.org 70 i { Err bitreich.org 70 i- struct drawille *drw; Err bitreich.org 70 i+ struct drawille *drw; Err bitreich.org 70 i Err bitreich.org 70 i if ((drw = calloc(sizeof(struct drawille) + row * col, 1)) == NULL) Err bitreich.org 70 i return NULL; Err bitreich.org 70 i@@ -108,10 +108,10 @@ drawille_line_init(struct line *l, int x0, int y0, int x1, int y1) Err bitreich.org 70 i static int Err bitreich.org 70 i drawille_line_next(struct line *l) Err bitreich.org 70 i { Err bitreich.org 70 i- int e; Err bitreich.org 70 i+ int e; Err bitreich.org 70 i Err bitreich.org 70 i if (l->x0 == l->x1 && l->y0 == l->y1) Err bitreich.org 70 i- return 0; Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i Err bitreich.org 70 i e = l->err; Err bitreich.org 70 i if (e > -l->dx) { Err bitreich.org 70 i@@ -122,13 +122,13 @@ drawille_line_next(struct line *l) Err bitreich.org 70 i l->y0 += l->sy; Err bitreich.org 70 i l->err += l->dx; Err bitreich.org 70 i } 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 void Err bitreich.org 70 i drawille_line(struct drawille *drw, int x0, int y0, int x1, int y1) Err bitreich.org 70 i { Err bitreich.org 70 i- struct line l; Err bitreich.org 70 i+ struct line l; Err bitreich.org 70 i Err bitreich.org 70 i drawille_line_init(&l, x0, y0, x1, y1); Err bitreich.org 70 i do { Err bitreich.org 70 i@@ -139,8 +139,8 @@ drawille_line(struct drawille *drw, int x0, int y0, int x1, int y1) Err bitreich.org 70 i void Err bitreich.org 70 i drawille_line_hist(struct drawille *drw, int x0, int y0, int x1, int y1, int zero) Err bitreich.org 70 i { Err bitreich.org 70 i- struct line l; Err bitreich.org 70 i- int sign; Err bitreich.org 70 i+ struct line l; Err bitreich.org 70 i+ int sign; Err bitreich.org 70 i Err bitreich.org 70 i drawille_line_init(&l, x0, y0, x1, y1); Err bitreich.org 70 i do { Err bitreich.org 70 i@@ -153,7 +153,7 @@ drawille_line_hist(struct drawille *drw, int x0, int y0, int x1, int y1, int zer Err bitreich.org 70 i void Err bitreich.org 70 i drawille_dot_hist(struct drawille *drw, int x, int y, int zero) Err bitreich.org 70 i { Err bitreich.org 70 i- int sign; Err bitreich.org 70 i+ int sign; Err bitreich.org 70 i Err bitreich.org 70 i sign = (y > zero) ? (-1) : (+1); Err bitreich.org 70 i for (; y != zero + sign; y += sign) Err bitreich.org 70 i@@ -163,8 +163,8 @@ drawille_dot_hist(struct drawille *drw, int x, int y, int zero) Err bitreich.org 70 i static int Err bitreich.org 70 i drawille_text_glyph(struct drawille *drw, int x, int y, struct font *font, char c) Err bitreich.org 70 i { Err bitreich.org 70 i- int width; Err bitreich.org 70 i- char *glyph; Err bitreich.org 70 i+ int width; Err bitreich.org 70 i+ char *glyph; Err bitreich.org 70 i Err bitreich.org 70 i if ((unsigned)c > 127) Err bitreich.org 70 i glyph = font->glyph[0]; Err bitreich.org 70 i@@ -187,7 +187,6 @@ drawille_text(struct drawille *drw, int x, int y, struct font *font, char *s) Err bitreich.org 70 i { Err bitreich.org 70 i if (drw->row*4 < font->height) Err bitreich.org 70 i return NULL; Err bitreich.org 70 i- Err bitreich.org 70 i for (; *s != '\0' && x < drw->col/2; s++, x++) Err bitreich.org 70 i x += drawille_text_glyph(drw, x, y, font, *s); Err bitreich.org 70 i return s; Err bitreich.org 70 1diff --git a/log.h b/log.h /scm/ploot/file/log.h.gph bitreich.org 70 i@@ -1,45 +0,0 @@ Err bitreich.org 70 i-#ifndef LOG_H Err bitreich.org 70 i-#define LOG_H Err bitreich.org 70 i- 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-#include Err bitreich.org 70 i- Err bitreich.org 70 i-char const *arg0; /* Should be set by the library caller. */ Err bitreich.org 70 i- Err bitreich.org 70 i-static inline void Err bitreich.org 70 i-vlog(char const *base, char const *fmt, va_list va) Err bitreich.org 70 i-{ Err bitreich.org 70 i- fprintf(stderr, "%s: ", base); Err bitreich.org 70 i- vfprintf(stderr, fmt, va); Err bitreich.org 70 i- if (errno) Err bitreich.org 70 i- fprintf(stderr, ": %s", strerror(errno)); Err bitreich.org 70 i- fputc('\n', stderr); Err bitreich.org 70 i- fflush(stderr); Err bitreich.org 70 i- errno = 0; /* avoid repeating the error in loop */ Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static inline void Err bitreich.org 70 i-warn(char const *fmt, ...) Err bitreich.org 70 i-{ Err bitreich.org 70 i- va_list va; Err bitreich.org 70 i- Err bitreich.org 70 i- va_start(va, fmt); Err bitreich.org 70 i- vlog(arg0, fmt, va); Err bitreich.org 70 i- va_end(va); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static inline void Err bitreich.org 70 i-err(int e, char const *fmt, ...) Err bitreich.org 70 i-{ Err bitreich.org 70 i- va_list va; Err bitreich.org 70 i- Err bitreich.org 70 i- va_start(va, fmt); Err bitreich.org 70 i- vlog(arg0, fmt, va); Err bitreich.org 70 i- va_end(va); Err bitreich.org 70 i- exit(e); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-#endif 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,48 +8,15 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i #include "def.h" Err bitreich.org 70 i+#include "arg.h" Err bitreich.org 70 i Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Adjust the vertical scale so that it gets possible to Err bitreich.org 70 i- */ Err bitreich.org 70 i-static void Err bitreich.org 70 i-plot_scale(double *min, double *max, int row) Err bitreich.org 70 i-{ Err bitreich.org 70 i- double unit, range, mi; Err bitreich.org 70 i- Err bitreich.org 70 i- range = *max - *min; Err bitreich.org 70 i- unit = 1; Err bitreich.org 70 i- Err bitreich.org 70 i- /* Zoom until it fills the canvas. */ Err bitreich.org 70 i- for (; (row - 1) * unit > range; unit /= 10) Err bitreich.org 70 i- continue; Err bitreich.org 70 i- Err bitreich.org 70 i- /* Dezoom until it fits the canvas. */ Err bitreich.org 70 i- for (; (row - 1) * unit < range; unit *= 10) Err bitreich.org 70 i- continue; Err bitreich.org 70 i- Err bitreich.org 70 i- /* Fine tune. */ Err bitreich.org 70 i- if ((row - 1) * unit / 5 > range) Err bitreich.org 70 i- unit /= 5; Err bitreich.org 70 i- if ((row - 1) * unit / 4 > range) Err bitreich.org 70 i- unit /= 4; Err bitreich.org 70 i- if ((row - 1) * unit / 2 > range) Err bitreich.org 70 i- unit /= 2; Err bitreich.org 70 i- Err bitreich.org 70 i- /* Align the minimum (and the zero). */ Err bitreich.org 70 i- for (mi = 0; mi > *min - unit; mi -= unit) Err bitreich.org 70 i- continue; Err bitreich.org 70 i- Err bitreich.org 70 i- /* Update the displayed minimal and maximal. */ Err bitreich.org 70 i- *min = mi; Err bitreich.org 70 i- *max = mi + unit * row; Err bitreich.org 70 i-} Err bitreich.org 70 i+char const *arg0 = NULL; Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i * Return the step between two values. Err bitreich.org 70 i */ Err bitreich.org 70 i static int Err bitreich.org 70 i-plot_time_interval(time_t step) Err bitreich.org 70 i+braille_time_interval(time_t step) Err bitreich.org 70 i { Err bitreich.org 70 i time_t scale[] = { Err bitreich.org 70 i 1, 5, 2, 10, 20, 30, 60, 60*2, 60*5, 60*10, 60*20, 60*30, Err bitreich.org 70 i@@ -65,136 +32,142 @@ plot_time_interval(time_t step) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static size_t Err bitreich.org 70 i-plot_axis_x(char *buf, size_t sz, time_t step, time_t t2, int col) Err bitreich.org 70 i+braille_axis_x(FILE *fp, time_t step, time_t tmax, int col) Err bitreich.org 70 i { Err bitreich.org 70 i int x, prec; Err bitreich.org 70 i char tmp[sizeof("MM/DD HH:MM")], *fmt; Err bitreich.org 70 i size_t n; Err bitreich.org 70 i time_t t, interval; Err bitreich.org 70 i Err bitreich.org 70 i- interval = plot_time_interval(step); Err bitreich.org 70 i+ interval = braille_time_interval(step); Err bitreich.org 70 i fmt = (step < 3600 * 12) ? "^%H:%M:%S" : Err bitreich.org 70 i (step < 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 = t2 - col * 2 * step; Err bitreich.org 70 i+ t = tmax - col * 2 * step; Err bitreich.org 70 i t += interval - t % interval; Err bitreich.org 70 i- for (; t < t2; t += interval) { Err bitreich.org 70 i+ for (; t < tmax; t += interval) { Err bitreich.org 70 i strftime(tmp, sizeof tmp, fmt, localtime(&t)); Err bitreich.org 70 i- x = ((t - t2) / 2 + col * step) / step; Err bitreich.org 70 i+ x = ((t - tmax) / 2 + col * step) / step; Err bitreich.org 70 i prec = x - n + strlen(tmp); Err bitreich.org 70 i- assert((n += snprintf(buf+n, sz-n, "%*s", prec, tmp)) <= sz); Err bitreich.org 70 i+ fprintf(fp, "%*s", prec, tmp); Err bitreich.org 70 i } Err bitreich.org 70 i- assert((n += strlcpy(buf+n, "\n", sz-n)) < sz); Err bitreich.org 70 i- return n; Err bitreich.org 70 i+ fputc('\n', fp); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* 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 size_t Err bitreich.org 70 i-plot_axis_y(char *buf, size_t sz, double min, double max, int r, int rows) Err bitreich.org 70 i+static void 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- size_t 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 = (max - min) * (rows - r) / rows + min; Err bitreich.org 70 i- humanize(tmp, sizeof tmp, val); Err bitreich.org 70 i+ humanize(tmp, val); Err bitreich.org 70 i s = (r == 0) ? "┌" : Err bitreich.org 70 i (r == rows - 1) ? "└" : Err bitreich.org 70 i "├"; Err bitreich.org 70 i- i = snprintf(buf, sz, "%s%-6s ", s, tmp); Err bitreich.org 70 i- return (i > sz) ? (sz) : (i); Err bitreich.org 70 i+ fprintf(fp, "%s%-6s ", s, tmp); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-static char * Err bitreich.org 70 i-plot_render(struct drawille *drw, double min, double max, time_t step, time_t t2) Err bitreich.org 70 i+static int Err bitreich.org 70 i+braille_render(struct drawille *drw, FILE *fp, time_t tmin, time_t tmax) Err bitreich.org 70 i { Err bitreich.org 70 i- char *buf; Err bitreich.org 70 i- size_t sz; Err bitreich.org 70 i- size_t n; Err bitreich.org 70 i+ char buf[LINE_MAX]; Err bitreich.org 70 i Err bitreich.org 70 i /* Render the plot line by line. */ Err bitreich.org 70 i- sz = drw->row * (20 + drw->col * 3 + 1) + 1; Err bitreich.org 70 i- sz += drw->col + 1 + 100000; Err bitreich.org 70 i- if ((buf = calloc(sz, 1)) == NULL) Err bitreich.org 70 i- goto err; Err bitreich.org 70 i- n = 0; Err bitreich.org 70 i for (int row = 0; row < drw->row; row++) { Err bitreich.org 70 i- n += drawille_fmt_row(drw, buf+n, sz-n, row); Err bitreich.org 70 i- n += plot_axis_y(buf+n, sz-n, min, max, row, drw->row); Err bitreich.org 70 i- n += strlcpy(buf+n, "\n", sz-n); Err bitreich.org 70 i+ drawille_fmt_row(drw, buf, sizeof buf, row); Err bitreich.org 70 i+ braille_axis_y(fp, tmin, tmax, row, drw->row); Err bitreich.org 70 i+ fputc('\n', fp); Err bitreich.org 70 i } Err bitreich.org 70 i- plot_axis_x(buf+n, sz-n, step, t2, drw->col); Err bitreich.org 70 i- return buf; Err bitreich.org 70 i-err: Err bitreich.org 70 i- errno = ENOBUFS; Err bitreich.org 70 i- free(buf); Err bitreich.org 70 i- return NULL; Err bitreich.org 70 i+ return 0; 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 */ Err bitreich.org 70 i-static char * Err bitreich.org 70 i-plot_hist(struct vlist *vl, time_t t2, struct drawille *drw) Err bitreich.org 70 i+static int Err bitreich.org 70 i+braille_hist(struct vlist *vl, FILE *fp, time_t tmin, time_t tmax, int row, int col) Err bitreich.org 70 i { Err bitreich.org 70 i int x, y, zero, shift; Err bitreich.org 70 i- double min, max, val; Err bitreich.org 70 i- time_t t1, t; Err bitreich.org 70 i- Err bitreich.org 70 i- /* Adjust the y scale. */ Err bitreich.org 70 i- shift = min = max = 0; Err bitreich.org 70 i- timeserie_stats(vl, &min, &max); Err bitreich.org 70 i- if (drw->row > 1) { Err bitreich.org 70 i- shift = 2; /* Align values to the middle of the scale: |- */ Err bitreich.org 70 i- plot_scale(&min, &max, drw->row); Err bitreich.org 70 i- } Err bitreich.org 70 i- zero = timeserie_ypos(0, min, max, drw->row*4) - shift; Err bitreich.org 70 i- Err bitreich.org 70 i- /* Adjust the x scale. */ Err bitreich.org 70 i- t2 = t2 + vl->step - t2 % vl->step; Err bitreich.org 70 i- t1 = t2 - vl->step * vl->len; Err bitreich.org 70 i- Err bitreich.org 70 i- /* Plot the data in memory in starting from the end (t2). */ Err bitreich.org 70 i- t = t2; Err bitreich.org 70 i- for (x = drw->col * 2; x > 0; x--) { Err bitreich.org 70 i- val = timeserie_get(vl, t); Err bitreich.org 70 i- if (!isnan(val)) { Err bitreich.org 70 i- y = timeserie_ypos(val, min, max, drw->row*4) - shift; Err bitreich.org 70 i- drawille_dot_hist(drw, x, y, zero); Err bitreich.org 70 i- } Err bitreich.org 70 i- t -= vl->step; Err bitreich.org 70 i- } Err bitreich.org 70 i+ double *v, vmin, vmax; Err bitreich.org 70 i+ time_t *t; Err bitreich.org 70 i+ size_t n; Err bitreich.org 70 i+ struct drawille *drw; Err bitreich.org 70 i Err bitreich.org 70 i- return plot_render(drw, min, max, vl->step, t2); Err bitreich.org 70 i+ if ((drw = drawille_new(row, col)) == NULL) Err bitreich.org 70 i+ err(1, "allocating drawille canvas"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ shift = (drw->row > 1) ? (2) : (0); /* center values on "|-" marks */ Err bitreich.org 70 i+ vmin = vmax = 0; Err bitreich.org 70 i+ zero = scale_ypos(0, vmin, vmax, drw->row*4) - shift; 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+ continue; Err bitreich.org 70 i+ y = scale_ypos(*v, vmin, vmax, drw->row * 4) - shift; Err bitreich.org 70 i+ x = scale_xpos(*t, tmin, tmax, drw->col * 2); Err bitreich.org 70 i+ drawille_dot_hist(drw, x, y, zero); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (braille_render(drw, fp, tmin, tmax) == -1) Err bitreich.org 70 i+ err(1, "rendering braille canvas"); Err bitreich.org 70 i+ free(drw); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-static char * Err bitreich.org 70 i-plot(struct vlist *vl, time_t t2, int row, int col) Err bitreich.org 70 i+static int Err bitreich.org 70 i+plot(struct vlist *vl, FILE *fp, size_t ncol, int row, int col) Err bitreich.org 70 i { Err bitreich.org 70 i- struct drawille *drw; Err bitreich.org 70 i size_t len; Err bitreich.org 70 i- char *buf; 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 len = 500; Err bitreich.org 70 i- buf = NULL; Err bitreich.org 70 i- drw = NULL; Err bitreich.org 70 i col -= 8; Err bitreich.org 70 i Err bitreich.org 70 i- if (timeserie_read(vl) == -1) Err bitreich.org 70 i- goto err; Err bitreich.org 70 i+ scale(vl, ncol, &tmin, &tmax, &tstep, &vmin, &vmax, &vstep); Err bitreich.org 70 i Err bitreich.org 70 i- if ((drw = drawille_new(row, col)) == NULL) Err bitreich.org 70 i- goto err; Err bitreich.org 70 i+ if (braille_hist(vl, fp, tmin, tmax, row, col) == -1) Err bitreich.org 70 i+ err(1, "allocating drawille canvas"); Err bitreich.org 70 i+ braille_axis_x(fp, tstep, tmax, col); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i Err bitreich.org 70 i- buf = plot_hist(vl, t2, drw); Err bitreich.org 70 i-err: Err bitreich.org 70 i- if (buf == NULL) Err bitreich.org 70 i- timedb_close(&vl->db); Err bitreich.org 70 i- free(drw); Err bitreich.org 70 i- return buf; 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\n", arg0); Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+main(int argc, char **argv) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct vlist *vl; Err bitreich.org 70 i+ char labels[LINE_MAX]; Err bitreich.org 70 i+ size_t ncol; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ARG_SWITCH(argc, argv) { Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (argc > 0) Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ csv_labels(stdin, labels, &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, 20, 80); Err bitreich.org 70 i+ Err bitreich.org 70 i+ free(vl); Err bitreich.org 70 i+ return 1; 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@@ -13,7 +13,6 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i #include "arg.h" Err bitreich.org 70 i-#include "log.h" Err bitreich.org 70 i #include "def.h" Err bitreich.org 70 i Err bitreich.org 70 i #define MARGIN 4 Err bitreich.org 70 i@@ -66,9 +65,9 @@ struct canvas { Err bitreich.org 70 i struct color *buf; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-char const *arg0; Err bitreich.org 70 i-static char *tflag = ""; Err bitreich.org 70 i-static char *uflag = ""; Err bitreich.org 70 i+char const *arg0 = NULL; Err bitreich.org 70 i+static char *tflag = ""; Err bitreich.org 70 i+static char *uflag = ""; Err bitreich.org 70 i static struct font *font = &font13; Err bitreich.org 70 i Err bitreich.org 70 i static struct cname cname[] = { Err bitreich.org 70 1diff --git a/ploot-feed.c b/ploot-feed.c /scm/ploot/file/ploot-feed.c.gph bitreich.org 70 i@@ -13,9 +13,9 @@ Err bitreich.org 70 i #define WIDTH_MAX 1024 Err bitreich.org 70 i #define BRAILLE_START 10240 Err bitreich.org 70 i Err bitreich.org 70 i-int wflag = 80; Err bitreich.org 70 i-int width = 0; Err bitreich.org 70 i-char const *arg0 = NULL; Err bitreich.org 70 i+char const *arg0 = NULL; Err bitreich.org 70 i+static int wflag = 80; Err bitreich.org 70 i+static int width = 0; Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i * Turn the bit at position (row, col) on in the . Err bitreich.org 70 i@@ -139,8 +139,11 @@ plot(char labels[LINE_MAX], double *max, int ncol) Err bitreich.org 70 i last_epoch = epoch = 0; Err bitreich.org 70 i Err bitreich.org 70 i for (n = 0;; n = (n == 25 ? 0 : n + 1)) { Err bitreich.org 70 i- if (n == 0) Err bitreich.org 70 i- put_time(0, 0, 2), fputs(labels, stdout), puts("│"); Err bitreich.org 70 i+ if (n == 0) { Err bitreich.org 70 i+ put_time(0, 0, 2); Err bitreich.org 70 i+ fputs(labels, stdout); Err bitreich.org 70 i+ puts("│"); Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i epoch = plot_line(out, max, ncol); Err bitreich.org 70 i put_time(epoch, last_epoch, n); Err bitreich.org 70 i@@ -224,7 +227,6 @@ main(int argc, char **argv) Err bitreich.org 70 i int ncol, nmax; Err bitreich.org 70 i char *labv[LINE_MAX / 2], labels[LINE_MAX]; Err bitreich.org 70 i Err bitreich.org 70 i- setvbuf(stdin, NULL, _IOLBF, 0); Err bitreich.org 70 i nmax = parse_args(argc, argv, max); Err bitreich.org 70 i ncol = read_labels(labv); Err bitreich.org 70 i width = (wflag - sizeof("XXxXXxXX _")) / ncol - sizeof("|"); Err bitreich.org 70 1diff --git a/scale.c b/scale.c /scm/ploot/file/scale.c.gph bitreich.org 70 i@@ -0,0 +1,139 @@ Err bitreich.org 70 i+#include "def.h" Err bitreich.org 70 i+#include "err.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+#define XDENSITY 7 /* nb of values on x axis */ Err bitreich.org 70 i+#define YDENSITY 7 /* nb of values on y axis */ 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+static void Err bitreich.org 70 i+scale_minmax(struct vlist *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+static time_t Err bitreich.org 70 i+scale_tstep(time_t min, time_t max, int density) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ time_t dt, *s, 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+ for (s = scale; s < scale + LEN(scale); s++) Err bitreich.org 70 i+ if (dt < *s * density) Err bitreich.org 70 i+ return *s; Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static double Err bitreich.org 70 i+scale_vstep(double min, double max, int density) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ double dv, d, *s, 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 (s = scale; s < scale + LEN(scale); s++) Err bitreich.org 70 i+ if (dv < *s * d * density) Err bitreich.org 70 i+ return *s * 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 (s = scale + LEN(scale) - 1; s >= scale; s--) Err bitreich.org 70 i+ if (dv > *s / d * density / 2) Err bitreich.org 70 i+ return *s / d; Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Adjust the vertical scale so that everything fits, with nice Err bitreich.org 70 i+ * scale values. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+void Err bitreich.org 70 i+scale_vminmax(double *min, double *max, int row) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ double unit, range, mi; Err bitreich.org 70 i+ Err bitreich.org 70 i+ range = *max - *min; Err bitreich.org 70 i+ unit = 1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Zoom until it fills the canvas. */ Err bitreich.org 70 i+ for (; (row - 1) * unit > range; unit /= 10) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Dezoom until it fits the canvas. */ Err bitreich.org 70 i+ for (; (row - 1) * unit < range; unit *= 10) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Fine tune. */ Err bitreich.org 70 i+ if ((row - 1) * unit / 5 > range) Err bitreich.org 70 i+ unit /= 5; Err bitreich.org 70 i+ if ((row - 1) * unit / 4 > range) Err bitreich.org 70 i+ unit /= 4; Err bitreich.org 70 i+ if ((row - 1) * unit / 2 > range) Err bitreich.org 70 i+ unit /= 2; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Align the minimum (and the zero). */ Err bitreich.org 70 i+ for (mi = 0; mi > *min - unit; mi -= unit) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Update the displayed minimal and maximal. */ Err bitreich.org 70 i+ *min = mi; Err bitreich.org 70 i+ *max = mi + unit * row; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+scale(struct vlist *vl, int ncol, Err bitreich.org 70 i+ time_t *tmin, time_t *tmax, time_t *tstep, Err bitreich.org 70 i+ double *vmin, double *vmax, double *vstep) 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, XDENSITY); Err bitreich.org 70 i+ *vstep = scale_vstep(*vmin, *vmax, YDENSITY); Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/util.c b/util.c /scm/ploot/file/util.c.gph bitreich.org 70 i@@ -1,12 +1,24 @@ 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 #include 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+#include Err bitreich.org 70 i Err bitreich.org 70 i #include "def.h" Err bitreich.org 70 i Err bitreich.org 70 i+size_t Err bitreich.org 70 i+strlcpy(char *buf, const char *str, size_t sz) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t len, cpy; Err bitreich.org 70 i+ Err bitreich.org 70 i+ cpy = ((len = strlen(str)) > sz) ? (sz) : (len); Err bitreich.org 70 i+ memcpy(buf, str, cpy); Err bitreich.org 70 i+ buf[sz - 1] = '\0'; Err bitreich.org 70 i+ return len; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i void Err bitreich.org 70 i put3utf(long rune) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -79,7 +91,7 @@ esfgets(char *buf, size_t n, FILE *file) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i- * Set 'str' to a human-readable form of 'num' with always a width of 8 (+ 1 Err bitreich.org 70 i+ * Set 'str' to a human-readable form of 'num' with always a width of 8 (+1 for Err bitreich.org 70 i * the '\0' terminator). Buffer overflow is ensured not to happen due to the Err bitreich.org 70 i * max size of a double. Return the exponent. Err bitreich.org 70 i */ Err bitreich.org 70 i@@ -102,3 +114,36 @@ 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+void Err bitreich.org 70 i+vlog(char const *base, char const *fmt, va_list va) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ fprintf(stderr, "%s: ", base); Err bitreich.org 70 i+ vfprintf(stderr, fmt, va); Err bitreich.org 70 i+ if (errno) Err bitreich.org 70 i+ fprintf(stderr, ": %s", strerror(errno)); Err bitreich.org 70 i+ fputc('\n', stderr); Err bitreich.org 70 i+ fflush(stderr); Err bitreich.org 70 i+ errno = 0; /* avoid repeating the error in loop */ Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+warn(char const *fmt, ...) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ va_list va; Err bitreich.org 70 i+ Err bitreich.org 70 i+ va_start(va, fmt); Err bitreich.org 70 i+ vlog(arg0, fmt, va); Err bitreich.org 70 i+ va_end(va); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+err(int e, char const *fmt, ...) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ va_list va; Err bitreich.org 70 i+ Err bitreich.org 70 i+ va_start(va, fmt); Err bitreich.org 70 i+ vlog(arg0, fmt, va); Err bitreich.org 70 i+ va_end(va); Err bitreich.org 70 i+ exit(e); Err bitreich.org 70 i+} Err bitreich.org 70 .