SMOLNET PORTAL home about changes
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 <me@josuah.net>	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 <string.h>	Err	bitreich.org	70
i+#include <time.h>	Err	bitreich.org	70
i+#include <stdlib.h>	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 <limits.h>	Err	bitreich.org	70
i+#include <stdarg.h>	Err	bitreich.org	70
i #include <stdint.h>	Err	bitreich.org	70
i #include <stdio.h>	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 <stdint.h>	Err	bitreich.org	70
i #include <stdio.h>	Err	bitreich.org	70
i #include <stdlib.h>	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 <errno.h>	Err	bitreich.org	70
i-#include <stdarg.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <stdlib.h>	Err	bitreich.org	70
i-#include <string.h>	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 <math.h>	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 <r> out of <rows>.	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 <drw> 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 <math.h>	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+ *        - <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+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 <string.h>	Err	bitreich.org	70
i+#include <ctype.h>	Err	bitreich.org	70
i #include <errno.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i #include <limits.h>	Err	bitreich.org	70
i+#include <stdarg.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i #include <stdlib.h>	Err	bitreich.org	70
i-#include <ctype.h>	Err	bitreich.org	70
i+#include <string.h>	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
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/ploot/commit/1f4e757723ea483a...
Content-Typetext/plain; charset=utf-8