SMOLNET PORTAL home about changes
iinitial WIP implementation of plain text version - 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 817580dbf249b75e747cc81f56f930d80600c59e	/scm/ploot/commit/817580dbf249b75e747cc81f56f930d80600c59e.gph	bitreich.org	70
1parent 0f63680382fb6f810f4ac27df9793db7cba292cc	/scm/ploot/commit/0f63680382fb6f810f4ac27df9793db7cba292cc.gph	bitreich.org	70
hAuthor: Josuah Demangeon <mail@josuah.net>	URL:mailto:mail@josuah.net	bitreich.org	70
iDate:   Sun,  6 May 2018 23:11:07 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iinitial WIP implementation of plain text version	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                            |      29 +++++++++++++++++++----------	Err	bitreich.org	70
i  M ploot.c                             |      47 +++----------------------------	Err	bitreich.org	70
i  A plootxt.c                           |     188 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  M util.c                              |      50 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A util.h                              |       6 ++++++	Err	bitreich.org	70
i	Err	bitreich.org	70
i6 files changed, 268 insertions(+), 53 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,3 +1,4 @@	Err	bitreich.org	70
i *.o	Err	bitreich.org	70
i *.core	Err	bitreich.org	70
i ploot	Err	bitreich.org	70
i+plootxt	Err	bitreich.org	70
1diff --git a/Makefile b/Makefile	/scm/ploot/file/Makefile.gph	bitreich.org	70
i@@ -1,22 +1,31 @@	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 = ploot.c ffplot.c ffdraw.c font_14x7.c	Err	bitreich.org	70
i-OBJ = $(SRC:.c=.o)	Err	bitreich.org	70
i+PLOOT_SRC = ploot.c ffplot.c ffdraw.c font_14x7.c util.c	Err	bitreich.org	70
i+PLOOT_OBJ = $(PLOOT_SRC:.c=.o)	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+PLOOTXT_SRC = plootxt.c util.c	Err	bitreich.org	70
i+PLOOTXT_OBJ = $(PLOOTXT_SRC:.c=.o)	Err	bitreich.org	70
i+	Err	bitreich.org	70
i LIB = -lm	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-all:x ploot	Err	bitreich.org	70
i+all:V ploot plootxt	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-ploot: $(OBJ)	Err	bitreich.org	70
i-        ${CC} $(LDFLAGS) -o $@ $(OBJ) $(LIB)	Err	bitreich.org	70
i+ploot: $(PLOOT_OBJ)	Err	bitreich.org	70
i+        ${CC} $(LDFLAGS) -o $@ $(PLOOT_OBJ) $(LIB)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-install:x ploot	Err	bitreich.org	70
i+plootxt: $(PLOOTXT_OBJ)	Err	bitreich.org	70
i+        ${CC} $(LDFLAGS) -o $@ $(PLOOTXT_OBJ) $(LIB)	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+install:V ploot plootxt	Err	bitreich.org	70
i         mkdir -p ${PREFIX}/bin	Err	bitreich.org	70
i-        cp ploot ${PREFIX}/bin/ploot	Err	bitreich.org	70
i+        cp ploot plootxt ${PREFIX}/bin	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-clean:x	Err	bitreich.org	70
i+clean:V	Err	bitreich.org	70
i         rm -f *.o ploot	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-x:	Err	bitreich.org	70
i+V: # :V acts like .PHONY:	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+$(PLOOT_SRC) $(PLOOTXT_SRC): \	Err	bitreich.org	70
i+arg.h ploot.h util.h font.h font_14x7.h	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-$(SRC): arg.h ploot.h font.h font_14x7.h	Err	bitreich.org	70
1diff --git a/ploot.c b/ploot.c	/scm/ploot/file/ploot.c.gph	bitreich.org	70
i@@ -8,6 +8,7 @@	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 "util.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@@ -32,26 +33,10 @@ color(Color *col, char *name)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	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-        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+        if (esfgets(buf, LINE_MAX, stdin) == NULL)	Err	bitreich.org	70
i+                fputs("missing label line\n", stderr), exit(1);	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@@ -66,28 +51,6 @@ read_labels(Vlist *v, char **argv, char *buf)	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-static 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 != '-' && *s != '.')	Err	bitreich.org	70
i-                        fputs("invalid float format\n", 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-static 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) && *s != '-')	Err	bitreich.org	70
i-                        fputs("invalid number format\n", 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 static int	Err	bitreich.org	70
i add_val(Vlist *v, int bufsize, int nval, double field, time_t epoch)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i@@ -145,10 +108,8 @@ read_values(Vlist *v, int ncol)	Err	bitreich.org	70
i         char line[LINE_MAX];	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         bufsize = 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+        for (nval = 0; esfgets(line, sizeof(line), stdin) != NULL; nval++)	Err	bitreich.org	70
i                 bufsize = add_row(v, bufsize, 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
1diff --git a/plootxt.c b/plootxt.c	/scm/ploot/file/plootxt.c.gph	bitreich.org	70
i@@ -0,0 +1,188 @@	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 "util.h"	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+#define WIDTH_MAX 1024	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int screenwidth = 80;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char *argv0;	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+        fprintf(stderr, "usage: %s <csv\n", argv0);	Err	bitreich.org	70
i+        exit(1);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+fmt_labels(char out[LINE_MAX], int ncol, char *labels[LINE_MAX / 2])	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int i, w;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        w = screenwidth / ncol;	Err	bitreich.org	70
i+        for (i = 0; i < ncol; labels++, i++)	Err	bitreich.org	70
i+                out += snprintf(out, w - 1, " %.*s", w - 1, *labels);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Label must be able to store all pointers to token buf has to	Err	bitreich.org	70
i+ * offer: sizeof(*buf / 2).	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+static int	Err	bitreich.org	70
i+read_labels(char out[LINE_MAX])	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int ncol;	Err	bitreich.org	70
i+        char *l, line[LINE_MAX], *labels[LINE_MAX / 2], *tok;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        l = line;	Err	bitreich.org	70
i+        if (esfgets(line, LINE_MAX, stdin) == NULL)	Err	bitreich.org	70
i+                fputs("missing label line\n", stderr), exit(1);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (strcmp(strsep(&l, ","), "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 (ncol = 1; (tok = strsep(&l, ",")) != NULL; ncol++)	Err	bitreich.org	70
i+                *labels = tok;	Err	bitreich.org	70
i+        *labels = NULL;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (ncol < 2)	Err	bitreich.org	70
i+                fputs("no label found\n", stderr), exit(1);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fmt_labels(out, ncol, labels);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return ncol;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+plot_val(char *out, double val, int nrow, int width)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        (void)val;	Err	bitreich.org	70
i+        (void)out;	Err	bitreich.org	70
i+        (void)nrow;	Err	bitreich.org	70
i+        (void)width;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Change the braille characters on a whole row, this for all the	Err	bitreich.org	70
i+ * values line.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+time_t	Err	bitreich.org	70
i+plot_row(char *out, char *line, int nrow, int ncol, int width)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        time_t epoch;	Err	bitreich.org	70
i+        double val;	Err	bitreich.org	70
i+        int n;	Err	bitreich.org	70
i+        char *tok;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if ((tok = strsep(&line, ",")) == NULL)	Err	bitreich.org	70
i+                fputs("*** missing epoch value\n", stderr), exit(1);	Err	bitreich.org	70
i+        epoch = eatol(tok);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (n = 1; (tok = strsep(&line, ",")) != NULL; n++) {	Err	bitreich.org	70
i+                if (n >= ncol)	Err	bitreich.org	70
i+                        fputs("too many values\n", stderr), exit(1);	Err	bitreich.org	70
i+                val = eatof(tok);	Err	bitreich.org	70
i+                plot_val(out + n * width, nrow, val, width);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (n < ncol)	Err	bitreich.org	70
i+                fputs("not enough values\n", stderr), exit(1);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return epoch;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Read enough input in order to print one line and plot it into 'out'.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+time_t	Err	bitreich.org	70
i+plot_line(char *out, int ncol, int width)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        time_t epoch;	Err	bitreich.org	70
i+        int nrow;	Err	bitreich.org	70
i+        char line[LINE_MAX];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (nrow = 0; nrow < 4; nrow++) {	Err	bitreich.org	70
i+                if ((esfgets(line, LINE_MAX, stdin)) == NULL)	Err	bitreich.org	70
i+                        exit(0);	Err	bitreich.org	70
i+                epoch = plot_row(out, line, nrow, ncol, width);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return epoch;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+put_time(time_t epoch, time_t last, int nline)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *out, buf[sizeof("XXxXXxXX  |")];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        switch (nline % 3) {	Err	bitreich.org	70
i+        case 0:	Err	bitreich.org	70
i+                strftime(buf, sizeof(buf), "%H:%M:%S _|", localtime(&epoch));	Err	bitreich.org	70
i+                out = buf;	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case 1:	Err	bitreich.org	70
i+                strftime(buf, sizeof(buf), "%y/%m/%d  |", localtime(&last));	Err	bitreich.org	70
i+                out = buf;	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case 2:	Err	bitreich.org	70
i+                out = "          |";	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fputs(out, stdout);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+plot(char labels[LINE_MAX], int ncol)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        time_t epoch, last_epoch;	Err	bitreich.org	70
i+        int n, width;	Err	bitreich.org	70
i+        char out[WIDTH_MAX * 3 + 1];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        width = screenwidth / ncol;	Err	bitreich.org	70
i+        last_epoch = epoch = 0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (n = 0;; n++) {	Err	bitreich.org	70
i+                if (n >= 20) {	Err	bitreich.org	70
i+                        puts(labels);	Err	bitreich.org	70
i+                        n = 0;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                epoch = plot_line(out, ncol, width);	Err	bitreich.org	70
i+                put_time(epoch, last_epoch, n);	Err	bitreich.org	70
i+                last_epoch = epoch;	Err	bitreich.org	70
i+                puts(out);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                fflush(stdout);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+parse_args(int argc, char **argv)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        argv0 = *argv;	Err	bitreich.org	70
i+        if (argc != 1)	Err	bitreich.org	70
i+                usage();	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+        char labels[LINE_MAX];	Err	bitreich.org	70
i+        int ncol;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        parse_args(argc, argv);	Err	bitreich.org	70
i+        ncol = read_labels(labels);	Err	bitreich.org	70
i+        plot(labels, ncol);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return 0;	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,4 +1,9 @@	Err	bitreich.org	70
i #include <string.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 <stdlib.h>	Err	bitreich.org	70
i+#include <ctype.h>	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #include "ploot.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -19,3 +24,48 @@ strsep(char **strp, const char *sep)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         return prev;	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+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 != '-' && *s != '.')	Err	bitreich.org	70
i+                        fputs("invalid float format\n", 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) && *s != '-')	Err	bitreich.org	70
i+                        fputs("invalid number format\n", 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+char *	Err	bitreich.org	70
i+esfgets(char *buf, size_t n, FILE *file)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        if (fgets(buf, n, file) == NULL) {	Err	bitreich.org	70
i+                if (ferror(stdin))	Err	bitreich.org	70
i+                        perror("fread from stdin"), exit(1);	Err	bitreich.org	70
i+                else	Err	bitreich.org	70
i+                        return NULL;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        estriplf(buf);	Err	bitreich.org	70
i+        return buf;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/util.h b/util.h	/scm/ploot/file/util.h.gph	bitreich.org	70
i@@ -0,0 +1,6 @@	Err	bitreich.org	70
i+/* util.c */	Err	bitreich.org	70
i+char                *strsep                (char **, const char *);	Err	bitreich.org	70
i+void                 estriplf        (char *);	Err	bitreich.org	70
i+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
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/ploot/commit/817580dbf249b75e...
Content-Typetext/plain; charset=utf-8