SMOLNET PORTAL home about changes
iauto-scale - 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 c3911021718dc5e5b2dd6469495e7f3bc4befdd2	/scm/ploot/commit/c3911021718dc5e5b2dd6469495e7f3bc4befdd2.gph	bitreich.org	70
1parent d97badd46c19a6903a589c41b8b87d044f48f8dc	/scm/ploot/commit/d97badd46c19a6903a589c41b8b87d044f48f8dc.gph	bitreich.org	70
hAuthor: Josuah Demangeon <mail@josuah.net>	URL:mailto:mail@josuah.net	bitreich.org	70
iDate:   Wed,  2 May 2018 06:37:05 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iauto-scale	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M Makefile                            |       2 +-	Err	bitreich.org	70
i  M ffplot.c                            |      66 +++++++++++++++++++++++++++++--	Err	bitreich.org	70
i  D main.c                              |     191 -------------------------------	Err	bitreich.org	70
i  M ploot.c                             |     364 +++++++++++--------------------	Err	bitreich.org	70
i  M ploot.h                             |       3 +--	Err	bitreich.org	70
i	Err	bitreich.org	70
i5 files changed, 186 insertions(+), 440 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@@ -1,7 +1,7 @@	Err	bitreich.org	70
i CFLAGS        = -Wall -Wextra -Werror -std=c89 -pedantic -D_POSIX_C_SOURCE=200809L	Err	bitreich.org	70
i LDFLAGS = -static	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-SRC = main.c ffplot.c ffdraw.c font_14x7.c	Err	bitreich.org	70
i+SRC = ploot.c ffplot.c ffdraw.c font_14x7.c	Err	bitreich.org	70
i OBJ = $(SRC:.c=.o)	Err	bitreich.org	70
i LIB = -lm	Err	bitreich.org	70
i 	Err	bitreich.org	70
1diff --git a/ffplot.c b/ffplot.c	/scm/ploot/file/ffplot.c.gph	bitreich.org	70
i@@ -18,6 +18,7 @@	Err	bitreich.org	70
i #include "font_14x7.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #define ABS(x) ((x) < 0 ? -(x) : (x))	Err	bitreich.org	70
i+#define LEN(x) (sizeof(x) / sizeof(*x))	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #define MARGIN 4	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -42,7 +43,7 @@	Err	bitreich.org	70
i #define PLOT_X (YLABEL_H)	Err	bitreich.org	70
i #define PLOT_Y (XLABEL_W)	Err	bitreich.org	70
i #define PLOT_W 700	Err	bitreich.org	70
i-#define PLOT_H 200	Err	bitreich.org	70
i+#define PLOT_H 160	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #define LEGEND_X (YLABEL_H)	Err	bitreich.org	70
i #define LEGEND_Y (IMAGE_W - LEGEND_W)	Err	bitreich.org	70
i@@ -198,9 +199,60 @@ legend(Canvas *can, Color *label_fg, Vlist *v, int n)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i void	Err	bitreich.org	70
i-ffdraw(char *name, char *units, Vlist *v, int n,	Err	bitreich.org	70
i-        double vmin, double vmax, double vstep,	Err	bitreich.org	70
i-        time_t tmin, time_t tmax, time_t tstep)	Err	bitreich.org	70
i+find_scales(Vlist *v, int n,	Err	bitreich.org	70
i+        double *vmin, double *vmax, double *vstep,	Err	bitreich.org	70
i+        time_t *tmin, time_t *tmax, time_t *tstep)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        double dv, *vs, vscale[] = { 5, 2, 1 };	Err	bitreich.org	70
i+        time_t dt, *ts, tscale[] = {	Err	bitreich.org	70
i+                3600*24*30, 3600*24*5, 3600*24*2, 3600*24, 3600*18, 3600*10, 	Err	bitreich.org	70
i+                3600*5, 3600*2, 3600, 60*30, 60*20, 60*10, 60*5, 60*2, 60, 30, 	Err	bitreich.org	70
i+                20, 10, 5, 2, 1	Err	bitreich.org	70
i+        };	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        *vmin = *vmax = *tmin = *tmax = 0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (; n-- > 0; v++) {	Err	bitreich.org	70
i+                for (i = 0; i < v->n; i++) {	Err	bitreich.org	70
i+                        if (v->v[i] < *vmin)	Err	bitreich.org	70
i+                                *vmin = v->v[i];	Err	bitreich.org	70
i+                        if (v->v[i] > *vmax)	Err	bitreich.org	70
i+                                *vmax = v->v[i];	Err	bitreich.org	70
i+                        if (v->t[i] < *tmin)	Err	bitreich.org	70
i+                                *tmin = v->t[i];	Err	bitreich.org	70
i+                        if (v->t[i] > *tmax)	Err	bitreich.org	70
i+                                *tmax = v->t[i];	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        dv = *vmax - *vmin;	Err	bitreich.org	70
i+        dt = *tmax - *tmin;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (ts = tscale; ts < tscale + LEN(tscale); ts++) {	Err	bitreich.org	70
i+                if (dt > *ts * 5) {	Err	bitreich.org	70
i+                        *tstep = *ts;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (i = 1; i != 0; i *= 10) {	Err	bitreich.org	70
i+                for (vs = vscale; vs < vscale + LEN(vscale); vs++) {	Err	bitreich.org	70
i+                        if (dv > *vs * i * 1) {	Err	bitreich.org	70
i+                                *vstep = *vs * i * 10;	Err	bitreich.org	70
i+                                i = 0;	Err	bitreich.org	70
i+                                break;	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+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Plot the 'n' values list of the 'v' array with title 'name' and	Err	bitreich.org	70
i+ * 'units' label.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+ffplot(Vlist *v, int n, char *name, char *units)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         Canvas can = { IMAGE_W, IMAGE_H, buffer, 0, 0 };	Err	bitreich.org	70
i         Color plot_bg        = { 0x2222, 0x2222, 0x2222, 0xffff };	Err	bitreich.org	70
i@@ -208,6 +260,12 @@ ffdraw(char *name, char *units, Vlist *v, int n,	Err	bitreich.org	70
i         Color grid_fg        = { 0x3737, 0x3737, 0x3737, 0xffff };	Err	bitreich.org	70
i         Color label_fg        = { 0x8888, 0x8888, 0x8888, 0xffff };	Err	bitreich.org	70
i         Color title_fg        = { 0xdddd, 0xdddd, 0xdddd, 0xffff };	Err	bitreich.org	70
i+        double vmin, vmax, vstep = 30;	Err	bitreich.org	70
i+        time_t tmin, tmax, tstep = 30;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        find_scales(v, n, &vmin, &vmax, &vstep, &tmin, &tmax, &tstep);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fprintf(stderr, "%f %f  %lld %lld\n", vmin, vmax, tmin, tmax);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         can.x = 0;	Err	bitreich.org	70
i         can.y = 0;	Err	bitreich.org	70
1diff --git a/main.c b/main.c	/scm/ploot/file/main.c.gph	bitreich.org	70
i@@ -1,191 +0,0 @@	Err	bitreich.org	70
i-#include <time.h>	Err	bitreich.org	70
i-#include <stdlib.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <fcntl.h>	Err	bitreich.org	70
i-#include <limits.h>	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i-#include <ctype.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "arg.h"	Err	bitreich.org	70
i-#include "ploot.h"	Err	bitreich.org	70
i-#include "config.h"        /* after ploot.h for type definitions */	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define LEN(x) (sizeof(x) / sizeof(*x))	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-char *argv0;	Err	bitreich.org	70
i-char *tflag = "";	Err	bitreich.org	70
i-char *uflag = "";	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static int	Err	bitreich.org	70
i-color(Color *col, char *name)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        ColorList *c;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (c = colorlist; c->name != NULL; c++) {	Err	bitreich.org	70
i-                if (strcmp(name, c->name) == 0) {	Err	bitreich.org	70
i-                        memcpy(col, &c->col, sizeof(*col));	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-        return -1;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-estriplf(char *line)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *lf;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if ((lf = strchr(line, '\n')) == NULL || lf[1] != '\0')	Err	bitreich.org	70
i-                fputs("invalid input\n", stderr), exit(1);	Err	bitreich.org	70
i-        *lf = '\0';	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-read_labels(Vlist *v, char **argv, char *buf)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        if (fgets(buf, LINE_MAX, stdin) == NULL) {	Err	bitreich.org	70
i-                if (ferror(stdin))	Err	bitreich.org	70
i-                        perror("fread from stdin");	Err	bitreich.org	70
i-                else	Err	bitreich.org	70
i-                        fputs("missing label line\n", stderr);	Err	bitreich.org	70
i-                exit(1);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        estriplf(buf);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (strcmp(strsep(&buf, ","), "epoch") != 0)	Err	bitreich.org	70
i-                fputs("first label must be \"epoch\"\n", stderr), exit(1);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (; *argv != NULL; v++, argv++)	Err	bitreich.org	70
i-                if ((v->label = strsep(&buf, ",")) == NULL)	Err	bitreich.org	70
i-                        fputs("more arguments than columns\n", stderr), exit(1);	Err	bitreich.org	70
i-                else if (color(&v->col, *argv) == -1)	Err	bitreich.org	70
i-                        fprintf(stderr, "unknown color: %s\n", *argv), exit(1);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (strsep(&buf, ",") != NULL)	Err	bitreich.org	70
i-                fputs("more columns than arguments\n", stderr), exit(1);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-double	Err	bitreich.org	70
i-eatof(char *str)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *s;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (s = str; *s != '\0'; s++)	Err	bitreich.org	70
i-                if (!isdigit(*s) && *s != '.')	Err	bitreich.org	70
i-                        fputs("invalid floatrformat", stderr), exit(0);	Err	bitreich.org	70
i-        return atof(str);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-long	Err	bitreich.org	70
i-eatol(char *str)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *s;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (s = str; *s != '\0'; s++)	Err	bitreich.org	70
i-                if (!isdigit(*s))	Err	bitreich.org	70
i-                        fputs("invalid number format", stderr), exit(0);	Err	bitreich.org	70
i-        return atol(str);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-add_val(Vlist *v, int *bufsiz, int nval, double field, time_t epoch)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        if (nval >= *bufsiz) {	Err	bitreich.org	70
i-                *bufsiz = *bufsiz * 2 + 1;	Err	bitreich.org	70
i-                if ((v->v = realloc(v->v, *bufsiz * sizeof(*v->v))) == NULL)	Err	bitreich.org	70
i-                        perror("reallocating values buffer"), exit(1);	Err	bitreich.org	70
i-                if ((v->t = realloc(v->t, *bufsiz * sizeof(*v->t))) == NULL)	Err	bitreich.org	70
i-                        perror("reallocating values buffer"), exit(1);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        v->v[nval] = field;	Err	bitreich.org	70
i-        v->t[nval] = epoch;	Err	bitreich.org	70
i-        v->n = nval + 1;	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-add_row(Vlist *v, int *bufsiz, int ncol, int nval, char *line)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        time_t epoch;	Err	bitreich.org	70
i-        int n;	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-                fprintf(stderr, "%d: missing epoch\n", nval), exit(0);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        epoch = eatol(field);	Err	bitreich.org	70
i-        for (n = 0; (field = strsep(&line, ",")) != NULL; n++, v++) {	Err	bitreich.org	70
i-                if (n > ncol)	Err	bitreich.org	70
i-                        fprintf(stderr, "%d: too many fields\n", nval), exit(0);	Err	bitreich.org	70
i-                add_val(v, bufsiz, nval, eatof(field), epoch);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        if (n < ncol)	Err	bitreich.org	70
i-                fprintf(stderr, "%d: too few fields\n", nval), exit(0);	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 nval	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-read_values(Vlist *v, int ncol)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int nval, bufsiz;	Err	bitreich.org	70
i-        char line[LINE_MAX];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        bufsiz = 0;	Err	bitreich.org	70
i-        for (nval = 0; fgets(line, sizeof(line), stdin); nval++) {	Err	bitreich.org	70
i-                estriplf(line);	Err	bitreich.org	70
i-                add_row(v, &bufsiz, ncol, nval, line);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-usage(void)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        ColorList *c;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        fprintf(stderr, "usage: %s [-t title] [-u unit] color...\n"	Err	bitreich.org	70
i-                "available colors as defined by \"config.h\":\n", argv0);	Err	bitreich.org	70
i-        for (c = colorlist; c->name != NULL; c++)	Err	bitreich.org	70
i-                fprintf(stderr, "- %s\n", c->name);	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-        Vlist *v;	Err	bitreich.org	70
i-        double vmin, vmax, vstep;	Err	bitreich.org	70
i-        time_t tmin, tmax, tstep;	Err	bitreich.org	70
i-        char labels[LINE_MAX];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        ARGBEGIN {	Err	bitreich.org	70
i-        case 't':	Err	bitreich.org	70
i-                tflag = EARGF(usage());	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-        case 'u':	Err	bitreich.org	70
i-                uflag = EARGF(usage());	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-        } ARGEND;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if ((v = calloc(argc, sizeof(*v))) == NULL)	Err	bitreich.org	70
i-                perror("calloc value list"), exit(1);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        vmin = -30; vmax =  700; vstep = 120;	Err	bitreich.org	70
i-        tmin =   0; tmax = 2000; tstep = 300;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        read_labels(v, argv, labels);	Err	bitreich.org	70
i-        read_values(v, argc);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        ffdraw(tflag, uflag, v, argc,	Err	bitreich.org	70
i-                vmin, vmax, vstep,	Err	bitreich.org	70
i-                tmin, tmax, tstep);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return 0;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
1diff --git a/ploot.c b/ploot.c	/scm/ploot/file/ploot.c.gph	bitreich.org	70
i@@ -1,304 +1,184 @@	Err	bitreich.org	70
i-#include <sys/time.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i+#include <time.h>	Err	bitreich.org	70
i #include <stdlib.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <fcntl.h>	Err	bitreich.org	70
i+#include <limits.h>	Err	bitreich.org	70
i #include <string.h>	Err	bitreich.org	70
i-#include <unistd.h>	Err	bitreich.org	70
i-#include <time.h>	Err	bitreich.org	70
i+#include <ctype.h>	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #include "arg.h"	Err	bitreich.org	70
i-#include "config.h"	Err	bitreich.org	70
i+#include "ploot.h"	Err	bitreich.org	70
i+#include "config.h"        /* after ploot.h for type definitions */	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-#define ABS(x)                ((x) < 0 ? -(x) : (x))	Err	bitreich.org	70
i-#define MIN(x, y)        ((x) < (y) ? (x) : (y))	Err	bitreich.org	70
i-#define MAX(x, y)        ((x) > (y) ? (x) : (y))	Err	bitreich.org	70
i-#define LEN(buf)        (sizeof(buf) / sizeof(*(buf)))	Err	bitreich.org	70
i+#define LEN(x) (sizeof(x) / sizeof(*x))	Err	bitreich.org	70
i 	Err	bitreich.org	70
i char *argv0;	Err	bitreich.org	70
i+char *tflag = "";	Err	bitreich.org	70
i+char *uflag = "";	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i-** Add 'val' at the current position 'pos' of the 'ring' buffer and set pos to	Err	bitreich.org	70
i-** the next postion.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-#define RING_ADD(rbuf, len, pos, val)                                        \	Err	bitreich.org	70
i-do {                                                                        \	Err	bitreich.org	70
i-        rbuf[pos] = val;                                                \	Err	bitreich.org	70
i-        pos = (pos + 1 < len) ? (pos + 1) : (0);                        \	Err	bitreich.org	70
i-} while (0)	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i-** Copy the ring buffer 'rbuf' content with current position 'pos' into the	Err	bitreich.org	70
i-** buffer 'buf'.  Both buffer of length 'len'.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-#define RING_COPY(buf, rbuf, len, pos)                                        \	Err	bitreich.org	70
i-do {                                                                        \	Err	bitreich.org	70
i-        memcpy(buf, rbuf + pos, (len - pos) * sizeof(*rbuf));                \	Err	bitreich.org	70
i-        memcpy(buf + (len - pos), rbuf, pos * sizeof(*rbuf));                \	Err	bitreich.org	70
i-} while (0)	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define MAX_VAL        80	Err	bitreich.org	70
i-#define MARGIN        7	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int        hflag = 20;	Err	bitreich.org	70
i-char        *tflag = NULL;	Err	bitreich.org	70
i-time_t        oflag = 0;	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 7 (+ 1	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.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-humanize(char *str, double val)	Err	bitreich.org	70
i+static int	Err	bitreich.org	70
i+color(Color *col, char *name)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        int        exp, precision;	Err	bitreich.org	70
i-        char        *label = "\0kMGTE";	Err	bitreich.org	70
i+        ColorList *c;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        for (exp = 0; ABS(val) > 1000; exp++)	Err	bitreich.org	70
i-                val /= 1000;	Err	bitreich.org	70
i+        for (c = colorlist; c->name != NULL; c++) {	Err	bitreich.org	70
i+                if (strcmp(name, c->name) == 0) {	Err	bitreich.org	70
i+                        memcpy(col, &c->col, sizeof(*col));	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-        precision = (ABS(val) < 10) ? (3) : (ABS(val) < 100) ? (2) : (1);	Err	bitreich.org	70
i-        if (exp == 0)	Err	bitreich.org	70
i-                precision++;	Err	bitreich.org	70
i-        snprintf(str, 8, "%+.*f%c", precision, val, label[exp]);	Err	bitreich.org	70
i-        str[7] = '\0';	Err	bitreich.org	70
i-        if (val >= 0)	Err	bitreich.org	70
i-                str[0] = ' ';	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-** Returns the maximal double of values between 'beg' and 'end'.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-double	Err	bitreich.org	70
i-maxdv(double *beg, double *end)	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+estriplf(char *line)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        double        *val, max;	Err	bitreich.org	70
i+        char *lf;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        max = *beg;	Err	bitreich.org	70
i-        for (val = beg; val < end; val++) {	Err	bitreich.org	70
i-                if (*val > max)	Err	bitreich.org	70
i-                        max = *val;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        return max;	Err	bitreich.org	70
i+        if ((lf = strchr(line, '\n')) == NULL || lf[1] != '\0')	Err	bitreich.org	70
i+                fputs("invalid input\n", stderr), exit(1);	Err	bitreich.org	70
i+        *lf = '\0';	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i-** If not null, print the title 'str' centered on width.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-title(char *str, int width)	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+read_labels(Vlist *v, char **argv, char *buf)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        if (str == NULL)	Err	bitreich.org	70
i-                return;	Err	bitreich.org	70
i-        printf("%*s\n", (int)(width + strlen(str)) / 2 + MARGIN + 3, str);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i-** Print vertical axis with humanized number from time to time, with occurences	Err	bitreich.org	70
i-** determined after the position on the vertical axis from the bottom 'pos'.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-vaxis(double val, int pos)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char        label[10];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (pos % 4 == 0) {	Err	bitreich.org	70
i-                humanize(label, val);	Err	bitreich.org	70
i-                printf("%*s -", MARGIN, label);	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                printf("%*c  ", MARGIN, ' ');	Err	bitreich.org	70
i+        if (fgets(buf, LINE_MAX, stdin) == NULL) {	Err	bitreich.org	70
i+                if (ferror(stdin))	Err	bitreich.org	70
i+                        perror("fread from stdin");	Err	bitreich.org	70
i+                else	Err	bitreich.org	70
i+                        fputs("missing label line\n", stderr);	Err	bitreich.org	70
i+                exit(1);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i+        estriplf(buf);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i-** Print horizontal axis for up to 'col' values along with dates if reading time	Err	bitreich.org	70
i-** series.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-haxis(double *beg, double *end, time_t time)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        double                *tp;	Err	bitreich.org	70
i-        char                buf[9], dbeg[11], dend[11];	Err	bitreich.org	70
i+        if (strcmp(strsep(&buf, ","), "epoch") != 0)	Err	bitreich.org	70
i+                fputs("first label must be \"epoch\"\n", stderr), exit(1);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        printf("%*d -+", MARGIN, 0);	Err	bitreich.org	70
i-        for (tp = beg; tp < end; tp++)	Err	bitreich.org	70
i-                putchar((*tp < 0) ? ('x') : ('-'));	Err	bitreich.org	70
i-        putchar('\n');	Err	bitreich.org	70
i-        if (oflag > 0) {	Err	bitreich.org	70
i-                printf("%*c", MARGIN - 1, ' ');	Err	bitreich.org	70
i-                strftime(dbeg, sizeof(dbeg), "%Y/%m/%d", localtime(&time));	Err	bitreich.org	70
i-                for (tp = beg; tp < end; tp += 7) {	Err	bitreich.org	70
i-                        strftime(buf, sizeof(buf), "  %H:%M", localtime(&time));	Err	bitreich.org	70
i-                        fputs(buf, stdout);	Err	bitreich.org	70
i-                        time += oflag * 7;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                strftime(dend, sizeof(dend), "%Y/%m/%d", localtime(&time));	Err	bitreich.org	70
i-                printf("\n     %-*s %s\n", (int)(beg - end) + 4, dbeg, dend);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i+        for (; *argv != NULL; v++, argv++)	Err	bitreich.org	70
i+                if ((v->label = strsep(&buf, ",")) == NULL)	Err	bitreich.org	70
i+                        fputs("more arguments than columns\n", stderr), exit(1);	Err	bitreich.org	70
i+                else if (color(&v->col, *argv) == -1)	Err	bitreich.org	70
i+                        fprintf(stderr, "unknown color: %s\n", *argv), exit(1);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (strsep(&buf, ",") != NULL)	Err	bitreich.org	70
i+                fputs("more columns than arguments\n", stderr), exit(1);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i-** Print two rows of a plot into a single line using ' ', '.' and ':'.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-line(double *beg, double *end, double top, double bot)	Err	bitreich.org	70
i+static double	Err	bitreich.org	70
i+eatof(char *str)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        double        *val;	Err	bitreich.org	70
i+        char *s;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        putchar('|');	Err	bitreich.org	70
i-        for (val = beg; val != end; val++)	Err	bitreich.org	70
i-                putchar((*val < bot) ? ' ' : (*val < top) ? '.' : ':');	Err	bitreich.org	70
i-        putchar('\n');	Err	bitreich.org	70
i+        for (s = str; *s != '\0'; s++)	Err	bitreich.org	70
i+                if (!isdigit(*s) && *s != '-' && *s != '.')	Err	bitreich.org	70
i+                        fputs("invalid floatrformat", stderr), exit(0);	Err	bitreich.org	70
i+        return atof(str);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i-** Plot values between 'beg' and 'end' in a plot of height 'height'.	Err	bitreich.org	70
i-** If 'str' is not NULL, it is set as a title above the graph.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-plot(double *beg, double *end, int height, char *str, time_t start)	Err	bitreich.org	70
i+static long	Err	bitreich.org	70
i+eatol(char *str)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        double        top, bot, max;	Err	bitreich.org	70
i-        int        h;	Err	bitreich.org	70
i+        char *s;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        putchar('\n');	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        max = maxdv(beg, end);	Err	bitreich.org	70
i-        for (h = height + height % 2; h > 0; h -= 2) {	Err	bitreich.org	70
i-                top = h * max / height;	Err	bitreich.org	70
i-                bot = (h - 1) * max / height;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-                vaxis(top, h);	Err	bitreich.org	70
i-                line(beg, end, top, bot);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        haxis(beg, end, start);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (str != NULL)	Err	bitreich.org	70
i-                title(str, end - beg);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        putchar('\n');	Err	bitreich.org	70
i+        for (s = str; *s != '\0'; s++)	Err	bitreich.org	70
i+                if (!isdigit(*s) && *s != '-')	Err	bitreich.org	70
i+                        fputs("invalid number format", stderr), exit(0);	Err	bitreich.org	70
i+        return atol(str);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i-** Read a simple format with one double per line and save the last 'MAX_WIDTH'	Err	bitreich.org	70
i-** values into 'buf' which must be at least MAX_VAL wide and return a pointer	Err	bitreich.org	70
i-** to the last element or NULL if the input contains error.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-double *	Err	bitreich.org	70
i-read_simple(double buf[MAX_VAL])	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+add_val(Vlist *v, int *bufsiz, int nval, double field, time_t epoch)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        double        rbuf[MAX_VAL], val;	Err	bitreich.org	70
i-        size_t        p, pos, len;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        len = LEN(rbuf);	Err	bitreich.org	70
i-        for (p = pos = 0; scanf("%lf\n", &val) > 0; p++)	Err	bitreich.org	70
i-                RING_ADD(rbuf, len, pos, val);	Err	bitreich.org	70
i-        len = MIN(len, p);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        RING_COPY(buf, rbuf, len, pos);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return buf + len;	Err	bitreich.org	70
i+        if (nval >= *bufsiz) {	Err	bitreich.org	70
i+                *bufsiz = *bufsiz * 2 + 1;	Err	bitreich.org	70
i+                if ((v->v = realloc(v->v, *bufsiz * sizeof(*v->v))) == NULL)	Err	bitreich.org	70
i+                        perror("reallocating values buffer"), exit(1);	Err	bitreich.org	70
i+                if ((v->t = realloc(v->t, *bufsiz * sizeof(*v->t))) == NULL)	Err	bitreich.org	70
i+                        perror("reallocating values buffer"), exit(1);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        v->v[nval] = field;	Err	bitreich.org	70
i+        v->t[nval] = epoch;	Err	bitreich.org	70
i+        v->n = nval + 1;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /*	Err	bitreich.org	70
i-** Read a format with blank separated time_t-double pairs, one per line and save	Err	bitreich.org	70
i-** the last 'MAX_WIDTH' values into 'tbuf' and 'vbuf' which must both be at	Err	bitreich.org	70
i-** least MAX_VAL wide and return a pointer to the last element of 'vbuf' or	Err	bitreich.org	70
i-** NULL if the input contains error.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-time_t *	Err	bitreich.org	70
i-read_time_series(double *vbuf, time_t *tbuf)	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+static void	Err	bitreich.org	70
i+add_row(Vlist *v, int *bufsiz, int ncol, int nval, char *line)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        size_t        p, pos, nul, len;	Err	bitreich.org	70
i-        double        vrbuf[MAX_VAL], vval, dval;	Err	bitreich.org	70
i-        time_t        trbuf[MAX_VAL], tval;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        len = LEN(vrbuf);	Err	bitreich.org	70
i-        for (p = pos = 0; scanf("%lf %lf\n", &dval, &vval) > 0; p++) {	Err	bitreich.org	70
i-                tval = (time_t)dval;	Err	bitreich.org	70
i-                RING_ADD(trbuf, len, pos, tval);	Err	bitreich.org	70
i-                RING_ADD(vrbuf, len, nul, vval);	Err	bitreich.org	70
i+        time_t epoch;	Err	bitreich.org	70
i+        int n;	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+                fprintf(stderr, "%d: missing epoch\n", nval), exit(0);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        epoch = eatol(field);	Err	bitreich.org	70
i+        for (n = 0; (field = strsep(&line, ",")) != NULL; n++, v++) {	Err	bitreich.org	70
i+                if (n > ncol)	Err	bitreich.org	70
i+                        fprintf(stderr, "%d: too many fields\n", nval), exit(0);	Err	bitreich.org	70
i+                add_val(v, bufsiz, nval, eatof(field), epoch);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i-        len = MIN(len, p);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        RING_COPY(tbuf, trbuf, len, pos);	Err	bitreich.org	70
i-        RING_COPY(vbuf, vrbuf, len, pos);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return tbuf + len;	Err	bitreich.org	70
i+        if (n < ncol)	Err	bitreich.org	70
i+                fprintf(stderr, "%d: too few fields\n", nval), exit(0);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /*	Err	bitreich.org	70
i-** Walk from 'tbeg' and 'tend' and add offset in 'tbuf' every time there is no	Err	bitreich.org	70
i-** value in 'step' amount of time, by setting a value to -1.	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-double *	Err	bitreich.org	70
i-skip_gaps(time_t *tbeg, time_t *tend, double *vbuf, time_t step)	Err	bitreich.org	70
i+ *       < ncol >	Err	bitreich.org	70
i+ * epoch,a1,b1,c1  ^	Err	bitreich.org	70
i+ * epoch,a2,b2,c2 nval	Err	bitreich.org	70
i+ * epoch,a3,b3,c3  v	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+read_values(Vlist *v, int ncol)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        size_t        p, pos, len;	Err	bitreich.org	70
i-        time_t        *tp, toff;	Err	bitreich.org	70
i-        double        *vp, vrbuf[MAX_VAL];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        /* Compute the average alignment of the timestamps values according to	Err	bitreich.org	70
i-        ** the step size. */	Err	bitreich.org	70
i-        toff = 0;	Err	bitreich.org	70
i-        for (tp = tbeg; tp < tend; tp++)	Err	bitreich.org	70
i-                toff += *tp % step;	Err	bitreich.org	70
i-        toff = *tbeg + toff / (tend - tbeg) + step / 2;	Err	bitreich.org	70
i+        int nval, bufsiz;	Err	bitreich.org	70
i+        char line[LINE_MAX];	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        /* Fill 'vbuf' with gap added at each time gap using vrbuf as	Err	bitreich.org	70
i-        ** intermediate ring buffer. */	Err	bitreich.org	70
i-        len = LEN(vrbuf);	Err	bitreich.org	70
i-        for (p = pos = 0, tp = tbeg, vp = vbuf; tp < tend; p++, vp++, tp++) {	Err	bitreich.org	70
i-                for (; toff < *tp; toff += step)	Err	bitreich.org	70
i-                        RING_ADD(vrbuf, len, pos, -1);	Err	bitreich.org	70
i-                RING_ADD(vrbuf, len, pos, *vp);	Err	bitreich.org	70
i-                toff += step;	Err	bitreich.org	70
i+        bufsiz = 0;	Err	bitreich.org	70
i+        for (nval = 0; fgets(line, sizeof(line), stdin); nval++) {	Err	bitreich.org	70
i+                estriplf(line);	Err	bitreich.org	70
i+                add_row(v, &bufsiz, ncol, nval, line);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i-        len = MAX(MIN(p, len), pos);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        RING_COPY(vbuf, vrbuf, len, pos);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return vbuf + len;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i usage(void)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        printf("usage: ploot [-h <height>] [-o <offset>] [-t <title>]\n");	Err	bitreich.org	70
i+        ColorList *c;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fprintf(stderr, "usage: %s [-t title] [-u unit] color...\n"	Err	bitreich.org	70
i+                "available colors as defined by \"config.h\":\n", argv0);	Err	bitreich.org	70
i+        for (c = colorlist; c->name != NULL; c++)	Err	bitreich.org	70
i+                fprintf(stderr, "- %s\n", c->name);	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-        time_t        tbuf[MAX_VAL], *tend, start;	Err	bitreich.org	70
i-        double        vbuf[MAX_VAL], *vend;	Err	bitreich.org	70
i+        Vlist *v;	Err	bitreich.org	70
i+        char labels[LINE_MAX];	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        ARGBEGIN(argc, argv) {	Err	bitreich.org	70
i-        case 'h':	Err	bitreich.org	70
i-                if ((hflag = atoi(EARGF(usage()))) <= 0)	Err	bitreich.org	70
i-                        usage();	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i+        ARGBEGIN {	Err	bitreich.org	70
i         case 't':	Err	bitreich.org	70
i                 tflag = EARGF(usage());	Err	bitreich.org	70
i                 break;	Err	bitreich.org	70
i-        case 'o':	Err	bitreich.org	70
i-                oflag = atol(EARGF(usage()));	Err	bitreich.org	70
i+        case 'u':	Err	bitreich.org	70
i+                uflag = EARGF(usage());	Err	bitreich.org	70
i                 break;	Err	bitreich.org	70
i-        default:	Err	bitreich.org	70
i-                usage();	Err	bitreich.org	70
i-        } ARGEND	Err	bitreich.org	70
i+        } ARGEND;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (oflag == 0) {	Err	bitreich.org	70
i-                vend = read_simple(vbuf);	Err	bitreich.org	70
i-                start = 0;	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                tend = read_time_series(vbuf, tbuf);	Err	bitreich.org	70
i-                vend = skip_gaps(tbuf, tend, vbuf, oflag);	Err	bitreich.org	70
i-                start = *tbuf;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i+        if ((v = calloc(argc, sizeof(*v))) == NULL)	Err	bitreich.org	70
i+                perror("calloc value list"), exit(1);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        read_labels(v, argv, labels);	Err	bitreich.org	70
i+        read_values(v, argc);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        ffplot(v, argc, tflag, uflag);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        plot(vbuf, vend, hflag, tflag, start);	Err	bitreich.org	70
i         return 0;	Err	bitreich.org	70
i }	Err	bitreich.org	70
1diff --git a/ploot.h b/ploot.h	/scm/ploot/file/ploot.h.gph	bitreich.org	70
i@@ -45,8 +45,7 @@ void                 ffdraw_fill        (Canvas *, Color *);	Err	bitreich.org	70
i void                 ffdraw_print        (Canvas *);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /* ffplot.c */	Err	bitreich.org	70
i-void                 ffdraw                (char *, char *, Vlist *, int, double, double,	Err	bitreich.org	70
i-                                 double, time_t, time_t, time_t);	Err	bitreich.org	70
i+void                 ffplot                (Vlist *, int, char *, char *);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /* util.c */	Err	bitreich.org	70
i char                *strsep                (char **, const char *);	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/ploot/commit/c3911021718dc5e5...
Content-Typetext/plain; charset=utf-8