SMOLNET PORTAL home about changes
imove from CSV to TSV - 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 98d0cb5aa9d2adb27b2a992e90debce8b3843c5b	/scm/ploot/commit/98d0cb5aa9d2adb27b2a992e90debce8b3843c5b.gph	bitreich.org	70
1parent 8836c19534760f2ce037c39bde9dc5591011ed07	/scm/ploot/commit/8836c19534760f2ce037c39bde9dc5591011ed07.gph	bitreich.org	70
hAuthor: Josuah Demangeon <me@josuah.net>	URL:mailto:me@josuah.net	bitreich.org	70
iDate:   Sun, 27 Jun 2021 04:57:00 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
imove from CSV to TSV	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M Makefile                            |       6 +++---	Err	bitreich.org	70
i  M README.md                           |       6 +++---	Err	bitreich.org	70
i  D csv.c                               |     154 -------------------------------	Err	bitreich.org	70
i  D csv.h                               |      22 ----------------------	Err	bitreich.org	70
i  D example.csv                         |     114 -------------------------------	Err	bitreich.org	70
i  M example.png                         |       0 	Err	bitreich.org	70
i  A example.tsv                         |     114 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  M ploot-braille.c                     |      14 +++++++-------	Err	bitreich.org	70
i  D ploot-csv.5                         |      77 -------------------------------	Err	bitreich.org	70
i  M ploot-farbfeld.1                    |      10 +++++-----	Err	bitreich.org	70
i  M ploot-farbfeld.c                    |      18 +++++++++---------	Err	bitreich.org	70
i  M ploot-feed.1                        |       6 +++---	Err	bitreich.org	70
i  M ploot-feed.c                        |      10 +++++-----	Err	bitreich.org	70
i  A ploot-tsv.5                         |      77 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A tsv.c                               |     154 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A tsv.h                               |      22 ++++++++++++++++++++++	Err	bitreich.org	70
i	Err	bitreich.org	70
i16 files changed, 402 insertions(+), 402 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@@ -7,9 +7,9 @@ LFLAGS = -static -lm	Err	bitreich.org	70
i PREFIX = /usr/local	Err	bitreich.org	70
i MANOREFIX = $(PREFIX)/share/man	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-SRC = csv.c drawille.c font.c font13.c font8.c util.c	Err	bitreich.org	70
i-INC = csv.h drawille.h font.h util.h	Err	bitreich.org	70
i-BIN = ploot-feed ploot-braille ploot-text  ploot-farbfeld	Err	bitreich.org	70
i+SRC = tsv.c drawille.c font.c font13.c font8.c util.c	Err	bitreich.org	70
i+INC = tsv.h drawille.h font.h util.h	Err	bitreich.org	70
i+BIN = ploot-farbfeld ploot-feed ploot-braille ploot-text	Err	bitreich.org	70
i OBJ = ${SRC:.c=.o}	Err	bitreich.org	70
i 	Err	bitreich.org	70
i all: ${BIN}	Err	bitreich.org	70
1diff --git a/README.md b/README.md	/scm/ploot/file/README.md.gph	bitreich.org	70
i@@ -3,7 +3,7 @@ ploot	Err	bitreich.org	70
i 	Err	bitreich.org	70
i ploot-ffplot	Err	bitreich.org	70
i --------------	Err	bitreich.org	70
i-*ploot-ffplot* reads collectd-style comma separated values (CSV) and produces a plot	Err	bitreich.org	70
i+*ploot-ffplot* reads collectd-style comma separated values (TSV) and produces a plot	Err	bitreich.org	70
i in the ffplot [1] image format (pipe it to ff2png). It is an alternative to	Err	bitreich.org	70
i RRDtool [2].	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -16,12 +16,12 @@ name of the curves.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i ploot-feed	Err	bitreich.org	70
i ----------	Err	bitreich.org	70
i-*ploot-feed* also reads collectd-style comma separated values (CSV) but produces	Err	bitreich.org	70
i+*ploot-feed* also reads collectd-style comma separated values (TSV) but produces	Err	bitreich.org	70
i a plain text continuous waterfall chart for live monitoring in the terminal. it	Err	bitreich.org	70
i is an alternative to grafana [1].	Err	bitreich.org	70
i 	Err	bitreich.org	70
i ```	Err	bitreich.org	70
i-% plootxt 1 1 1 <load-average.csv	Err	bitreich.org	70
i+% plootxt 1 1 1 <load-average.tsv	Err	bitreich.org	70
i           │shortterm           │midterm             │longterm            │	Err	bitreich.org	70
i 17:34:00 _│⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣯⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
i 18/05/01  │⣟⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│	Err	bitreich.org	70
1diff --git a/csv.c b/csv.c	/scm/ploot/file/csv.c.gph	bitreich.org	70
i@@ -1,154 +0,0 @@	Err	bitreich.org	70
i-#include "csv.h"	Err	bitreich.org	70
i-#include <errno.h>	Err	bitreich.org	70
i-#include <assert.h>	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-#include <limits.h>	Err	bitreich.org	70
i-#include <time.h>	Err	bitreich.org	70
i-#include "util.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Read CSV data onto a set of (struct csv) and some utilities to work on these data.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int	Err	bitreich.org	70
i-csv_min_max(struct csv *vl, int ncol,	Err	bitreich.org	70
i-        time_t *tmin, time_t *tmax,	Err	bitreich.org	70
i-        double *vmin, double *vmax)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        double *v;	Err	bitreich.org	70
i-        time_t *t;	Err	bitreich.org	70
i-        size_t n;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        *vmin = *vmax = 0; /* always show 0 on the scale */	Err	bitreich.org	70
i-        *tmin = *tmax = *vl->t;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (; ncol > 0; ncol--, vl++) {	Err	bitreich.org	70
i-                for (t = vl->t, v = vl->v, n = vl->n; n > 0; t++, v++, n--) {	Err	bitreich.org	70
i-                        if (*v < *vmin) *vmin = *v;	Err	bitreich.org	70
i-                        if (*v > *vmax) *vmax = *v;	Err	bitreich.org	70
i-                        if (*t < *tmin) *tmin = *t;	Err	bitreich.org	70
i-                        if (*t > *tmax) *tmax = *t;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        if (*tmin == *tmax)	Err	bitreich.org	70
i-                return -1;	Err	bitreich.org	70
i-        return 0;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-csv_add_time(struct csv *vl, time_t epoch)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        void *mem;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if ((mem = realloc(vl->t, (vl->n + 1) * sizeof *vl->t)) == NULL)	Err	bitreich.org	70
i-                err(1, "realloc: %s", strerror(errno));	Err	bitreich.org	70
i-        vl->t = mem;	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_add_val(struct csv *vl, double field)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        void *mem;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if ((mem = realloc(vl->v, (vl->n + 1) * sizeof *vl->v)) == NULL)	Err	bitreich.org	70
i-                err(1, "", strerror(errno));	Err	bitreich.org	70
i-        vl->v = mem;	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.  The time_t	Err	bitreich.org	70
i- * buffer is shared among all fields.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-csv_add_row(struct csv *vl, size_t ncol, char *line)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *field;	Err	bitreich.org	70
i-        time_t *tbuf;	Err	bitreich.org	70
i-        long l;	Err	bitreich.org	70
i-        double d;	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-        l = strtol(field, NULL, 10);	Err	bitreich.org	70
i-        if (errno)	Err	bitreich.org	70
i-                err(100, "parsing number '%s'", field);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        csv_add_time(vl, l);	Err	bitreich.org	70
i-        tbuf = vl[0].t;	Err	bitreich.org	70
i-        for (; (field = strsep(&line, ",")); 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-                d = strtod(field, NULL);	Err	bitreich.org	70
i-                if (errno)	Err	bitreich.org	70
i-                        err(100, "parsing double '%s'", field);	Err	bitreich.org	70
i-                csv_add_val(vl, d);	Err	bitreich.org	70
i-                vl->t = tbuf;	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- * label1,label2,label3	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-csv_labels(FILE *fp, struct csv **vlp, size_t *ncol)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *field, *line, *cp;	Err	bitreich.org	70
i-        struct csv *vl, *col;	Err	bitreich.org	70
i-        size_t sz;	Err	bitreich.org	70
i-        ssize_t r;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        sz = 0, line = NULL;	Err	bitreich.org	70
i-        r = getline(&line, &sz, fp);	Err	bitreich.org	70
i-        if (ferror(fp))	Err	bitreich.org	70
i-                err(111, "error while reading from file");	Err	bitreich.org	70
i-        if (feof(fp))	Err	bitreich.org	70
i-                err(100, "missing label line");	Err	bitreich.org	70
i-        strchomp(line);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        cp = line;	Err	bitreich.org	70
i-        if (strcmp(strsep(&cp, ","), "epoch") != 0)	Err	bitreich.org	70
i-                err(1, "first label must be 'epoch'");	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        sz = 0, vl = NULL, *ncol = 0;	Err	bitreich.org	70
i-        while ((field = strsep(&cp, ","))) {	Err	bitreich.org	70
i-                if ((vl = realloc(vl, sz += sizeof *vl)) == NULL)	Err	bitreich.org	70
i-                        err(1, "realloc: %s", strerror(errno));	Err	bitreich.org	70
i-                col = vl + (*ncol)++;	Err	bitreich.org	70
i-                memset(col, 0, sizeof *vl);	Err	bitreich.org	70
i-                strlcpy(col->label, field, sizeof col->label);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        free(line);	Err	bitreich.org	70
i-        *vlp = vl;	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- * val1a,val1b,val1c    ^	Err	bitreich.org	70
i- * val2a,val2b,val2c    |	Err	bitreich.org	70
i- * val3a,val3b,val3c (vl->n)	Err	bitreich.org	70
i- * val4a,val4b,val4c    |	Err	bitreich.org	70
i- * val5a,val5b,val5c    v	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-csv_values(FILE *fp, struct csv *vl, size_t ncol)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *line;	Err	bitreich.org	70
i-        size_t sz;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        sz = 0, line = NULL;	Err	bitreich.org	70
i-        while (getline(&line, &sz, fp) > -1)	Err	bitreich.org	70
i-                csv_add_row(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-        free(line);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
1diff --git a/csv.h b/csv.h	/scm/ploot/file/csv.h.gph	bitreich.org	70
i@@ -1,22 +0,0 @@	Err	bitreich.org	70
i-#ifndef CSV_H	Err	bitreich.org	70
i-#define CSV_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-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * List of values and timestamps.  Both have their dedicated buffer	Err	bitreich.org	70
i- * so that the timestamp buffer can be shared across csv objects.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-struct csv {	Err	bitreich.org	70
i-        time_t                *t;                /* array of timestamps */	Err	bitreich.org	70
i-        double                *v;                /* array of values */	Err	bitreich.org	70
i-        size_t                n;                /* number of values */	Err	bitreich.org	70
i-        char                label[64];        /* for the legend */	Err	bitreich.org	70
i-};	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void        csv_labels(FILE *, struct csv **, size_t *);	Err	bitreich.org	70
i-void        csv_values(FILE *, struct csv *, size_t);	Err	bitreich.org	70
i-int        csv_min_max(struct csv *, int, time_t *, time_t *, double *, double *);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#endif	Err	bitreich.org	70
1diff --git a/example.csv b/example.csv	/scm/ploot/file/example.csv.gph	bitreich.org	70
i@@ -1,114 +0,0 @@	Err	bitreich.org	70
i-epoch,shortterm,midterm,longterm	Err	bitreich.org	70
i-1525186140,0.023804,0.056885,0.049561	Err	bitreich.org	70
i-1525187040,0.035767,0.047485,0.043701	Err	bitreich.org	70
i-1525187940,0.057861,0.050293,0.042480	Err	bitreich.org	70
i-1525188840,0.098267,0.099609,0.072266	Err	bitreich.org	70
i-1525189740,0.083618,0.091187,0.079468	Err	bitreich.org	70
i-1525190640,0.055298,0.063843,0.063354	Err	bitreich.org	70
i-1525191540,0.046875,0.056152,0.058960	Err	bitreich.org	70
i-1525192440,0.091187,0.062622,0.058716	Err	bitreich.org	70
i-1525193340,0.067871,0.060303,0.059937	Err	bitreich.org	70
i-1525194240,0.085571,0.056763,0.052612	Err	bitreich.org	70
i-1525195140,0.020874,0.054810,0.055176	Err	bitreich.org	70
i-1525196040,0.125122,0.062500,0.048096	Err	bitreich.org	70
i-1525196940,0.040649,0.041870,0.040649	Err	bitreich.org	70
i-1525197840,0.032471,0.049194,0.042114	Err	bitreich.org	70
i-1525198740,0.073853,0.088501,0.071045	Err	bitreich.org	70
i-1525199640,0.119995,0.072998,0.064697	Err	bitreich.org	70
i-1525200540,0.030518,0.043335,0.046265	Err	bitreich.org	70
i-1525201440,0.037842,0.042969,0.040894	Err	bitreich.org	70
i-1525202340,0.054810,0.049927,0.042358	Err	bitreich.org	70
i-1525203240,0.120728,0.077271,0.053589	Err	bitreich.org	70
i-1525204140,0.068970,0.086670,0.074585	Err	bitreich.org	70
i-1525205040,0.071289,0.083496,0.079834	Err	bitreich.org	70
i-1525205940,0.046265,0.059326,0.068848	Err	bitreich.org	70
i-1525206840,0.064209,0.083374,0.069214	Err	bitreich.org	70
i-1525207740,0.055054,0.046753,0.051758	Err	bitreich.org	70
i-1525208640,0.170410,0.088867,0.064575	Err	bitreich.org	70
i-1525209540,0.067627,0.092407,0.092163	Err	bitreich.org	70
i-1525210440,0.078003,0.087646,0.083130	Err	bitreich.org	70
i-1525211340,0.032959,0.043457,0.059204	Err	bitreich.org	70
i-1525212240,0.036377,0.054810,0.057861	Err	bitreich.org	70
i-1525213140,0.054565,0.078369,0.071655	Err	bitreich.org	70
i-1525214040,0.026611,0.041138,0.051514	Err	bitreich.org	70
i-1525214940,0.065186,0.067505,0.061768	Err	bitreich.org	70
i-1525215840,0.071411,0.055298,0.055176	Err	bitreich.org	70
i-1525229081,0.041260,0.045044,0.045654	Err	bitreich.org	70
i-1525229081,0.041260,0.045044,0.045654	Err	bitreich.org	70
i-1525229981,0.059692,0.102051,0.105835	Err	bitreich.org	70
i-1525230881,0.077148,0.067017,0.073730	Err	bitreich.org	70
i-1525231781,0.080200,0.074341,0.064575	Err	bitreich.org	70
i-1525232681,0.122437,0.099487,0.075806	Err	bitreich.org	70
i-1525233581,0.085815,0.076050,0.073486	Err	bitreich.org	70
i-1525234481,0.074585,0.064087,0.062012	Err	bitreich.org	70
i-1525235381,0.024902,0.047241,0.053345	Err	bitreich.org	70
i-1525236281,0.107910,0.081543,0.065918	Err	bitreich.org	70
i-1525237181,0.038696,0.075684,0.080688	Err	bitreich.org	70
i-1525238081,0.204834,0.181152,0.130737	Err	bitreich.org	70
i-1525238981,0.231445,0.158325,0.137695	Err	bitreich.org	70
i-1525239881,0.067505,0.089355,0.109497	Err	bitreich.org	70
i-1525240781,0.047852,0.088745,0.107910	Err	bitreich.org	70
i-1525241681,0.094360,0.085693,0.083618	Err	bitreich.org	70
i-1525242581,0.047363,0.043335,0.052856	Err	bitreich.org	70
i-1525243481,0.047363,0.031982,0.036621	Err	bitreich.org	70
i-1525244381,0.055054,0.042236,0.040039	Err	bitreich.org	70
i-1525245281,0.034668,0.041626,0.040039	Err	bitreich.org	70
i-1525246181,0.088867,0.065918,0.048706	Err	bitreich.org	70
i-1525247081,0.049072,0.051880,0.042236	Err	bitreich.org	70
i-1525247981,0.045166,0.048828,0.041382	Err	bitreich.org	70
i-1525248881,0.067261,0.061768,0.047852	Err	bitreich.org	70
i-1525249781,0.039917,0.056519,0.045654	Err	bitreich.org	70
i-1525250681,0.017822,0.030273,0.033081	Err	bitreich.org	70
i-1525251581,0.034668,0.033691,0.034546	Err	bitreich.org	70
i-1525252481,0.053223,0.051880,0.045166	Err	bitreich.org	70
i-1525253381,0.028687,0.050049,0.050659	Err	bitreich.org	70
i-1525254281,0.021118,0.042358,0.040649	Err	bitreich.org	70
i-1525255181,0.059204,0.047974,0.041870	Err	bitreich.org	70
i-1525256081,0.206421,0.141968,0.086670	Err	bitreich.org	70
i-1525256981,0.105713,0.087158,0.073486	Err	bitreich.org	70
i-1525257881,0.048950,0.060913,0.068359	Err	bitreich.org	70
i-1525258781,0.024414,0.036621,0.046753	Err	bitreich.org	70
i-1525259681,0.245239,0.109619,0.071045	Err	bitreich.org	70
i-1525260581,0.042236,0.063965,0.069092	Err	bitreich.org	70
i-1525261481,0.016724,0.054077,0.059692	Err	bitreich.org	70
i-1525262381,0.018433,0.078003,0.076660	Err	bitreich.org	70
i-1525263281,0.042480,0.057617,0.061890	Err	bitreich.org	70
i-1525264181,0.040161,0.041138,0.044189	Err	bitreich.org	70
i-1525265081,0.059082,0.090698,0.064575	Err	bitreich.org	70
i-1525265981,0.129272,0.080811,0.073486	Err	bitreich.org	70
i-1525266881,0.228516,0.164551,0.112915	Err	bitreich.org	70
i-1525267781,0.083130,0.058594,0.067627	Err	bitreich.org	70
i-1525268681,0.062378,0.063965,0.061523	Err	bitreich.org	70
i-1525269581,0.066895,0.069702,0.062500	Err	bitreich.org	70
i-1525270481,0.061768,0.080322,0.065674	Err	bitreich.org	70
i-1525271381,0.123657,0.089478,0.072021	Err	bitreich.org	70
i-1525272281,0.056885,0.045532,0.051514	Err	bitreich.org	70
i-1525273181,0.108887,0.056519,0.046387	Err	bitreich.org	70
i-1525274081,0.072266,0.119629,0.080078	Err	bitreich.org	70
i-1525274981,0.033447,0.058350,0.070190	Err	bitreich.org	70
i-1525275881,0.028198,0.050781,0.058105	Err	bitreich.org	70
i-1525276781,0.067261,0.059937,0.057495	Err	bitreich.org	70
i-1525277681,0.024780,0.028809,0.038452	Err	bitreich.org	70
i-1525278581,0.053955,0.049561,0.041748	Err	bitreich.org	70
i-1525279481,0.086304,0.065308,0.048096	Err	bitreich.org	70
i-1525281698,0.019165,0.047485,0.041870	Err	bitreich.org	70
i-1525281698,0.019165,0.047485,0.041870	Err	bitreich.org	70
i-1525282598,0.039551,0.034302,0.038086	Err	bitreich.org	70
i-1525283498,0.017700,0.022827,0.026367	Err	bitreich.org	70
i-1525284398,0.023560,0.034790,0.024292	Err	bitreich.org	70
i-1525285298,0.093506,0.078857,0.053101	Err	bitreich.org	70
i-1525286198,0.051025,0.066162,0.069458	Err	bitreich.org	70
i-1525287098,0.054077,0.057861,0.059082	Err	bitreich.org	70
i-1525287998,0.080200,0.071655,0.062744	Err	bitreich.org	70
i-1525288898,0.478638,0.375122,0.247192	Err	bitreich.org	70
i-1525289798,0.393066,0.390991,0.347046	Err	bitreich.org	70
i-1525290698,0.368164,0.383545,0.365723	Err	bitreich.org	70
i-1525291598,0.459229,0.463867,0.432129	Err	bitreich.org	70
i-1525292498,0.286865,0.354980,0.381958	Err	bitreich.org	70
i-1525293398,0.180786,0.178833,0.232910	Err	bitreich.org	70
i-1525294298,0.278198,0.260864,0.242920	Err	bitreich.org	70
i-1525295198,0.192505,0.183716,0.200806	Err	bitreich.org	70
i-1525296098,0.109375,0.185669,0.207153	Err	bitreich.org	70
i-1525296098,0.109375,0.185669,0.207153	Err	bitreich.org	70
i-1525296998,0.137085,0.126221,0.138184	Err	bitreich.org	70
i-1525297898,0.077881,0.092529,0.109619	Err	bitreich.org	70
1diff --git a/example.png b/example.png	/scm/ploot/file/example.png.gph	bitreich.org	70
iBinary files differ.	Err	bitreich.org	70
1diff --git a/example.tsv b/example.tsv	/scm/ploot/file/example.tsv.gph	bitreich.org	70
i@@ -0,0 +1,114 @@	Err	bitreich.org	70
i+epoch        shortterm        midterm        longterm	Err	bitreich.org	70
i+1525186140        0.023804        0.056885        0.049561	Err	bitreich.org	70
i+1525187040        0.035767        0.047485        0.043701	Err	bitreich.org	70
i+1525187940        0.057861        0.050293        0.042480	Err	bitreich.org	70
i+1525188840        0.098267        0.099609        0.072266	Err	bitreich.org	70
i+1525189740        0.083618        0.091187        0.079468	Err	bitreich.org	70
i+1525190640        0.055298        0.063843        0.063354	Err	bitreich.org	70
i+1525191540        0.046875        0.056152        0.058960	Err	bitreich.org	70
i+1525192440        0.091187        0.062622        0.058716	Err	bitreich.org	70
i+1525193340        0.067871        0.060303        0.059937	Err	bitreich.org	70
i+1525194240        0.085571        0.056763        0.052612	Err	bitreich.org	70
i+1525195140        0.020874        0.054810        0.055176	Err	bitreich.org	70
i+1525196040        0.125122        0.062500        0.048096	Err	bitreich.org	70
i+1525196940        0.040649        0.041870        0.040649	Err	bitreich.org	70
i+1525197840        0.032471        0.049194        0.042114	Err	bitreich.org	70
i+1525198740        0.073853        0.088501        0.071045	Err	bitreich.org	70
i+1525199640        0.119995        0.072998        0.064697	Err	bitreich.org	70
i+1525200540        0.030518        0.043335        0.046265	Err	bitreich.org	70
i+1525201440        0.037842        0.042969        0.040894	Err	bitreich.org	70
i+1525202340        0.054810        0.049927        0.042358	Err	bitreich.org	70
i+1525203240        0.120728        0.077271        0.053589	Err	bitreich.org	70
i+1525204140        0.068970        0.086670        0.074585	Err	bitreich.org	70
i+1525205040        0.071289        0.083496        0.079834	Err	bitreich.org	70
i+1525205940        0.046265        0.059326        0.068848	Err	bitreich.org	70
i+1525206840        0.064209        0.083374        0.069214	Err	bitreich.org	70
i+1525207740        0.055054        0.046753        0.051758	Err	bitreich.org	70
i+1525208640        0.170410        0.088867        0.064575	Err	bitreich.org	70
i+1525209540        0.067627        0.092407        0.092163	Err	bitreich.org	70
i+1525210440        0.078003        0.087646        0.083130	Err	bitreich.org	70
i+1525211340        0.032959        0.043457        0.059204	Err	bitreich.org	70
i+1525212240        0.036377        0.054810        0.057861	Err	bitreich.org	70
i+1525213140        0.054565        0.078369        0.071655	Err	bitreich.org	70
i+1525214040        0.026611        0.041138        0.051514	Err	bitreich.org	70
i+1525214940        0.065186        0.067505        0.061768	Err	bitreich.org	70
i+1525215840        0.071411        0.055298        0.055176	Err	bitreich.org	70
i+1525229081        0.041260        0.045044        0.045654	Err	bitreich.org	70
i+1525229081        0.041260        0.045044        0.045654	Err	bitreich.org	70
i+1525229981        0.059692        0.102051        0.105835	Err	bitreich.org	70
i+1525230881        0.077148        0.067017        0.073730	Err	bitreich.org	70
i+1525231781        0.080200        0.074341        0.064575	Err	bitreich.org	70
i+1525232681        0.122437        0.099487        0.075806	Err	bitreich.org	70
i+1525233581        0.085815        0.076050        0.073486	Err	bitreich.org	70
i+1525234481        0.074585        0.064087        0.062012	Err	bitreich.org	70
i+1525235381        0.024902        0.047241        0.053345	Err	bitreich.org	70
i+1525236281        0.107910        0.081543        0.065918	Err	bitreich.org	70
i+1525237181        0.038696        0.075684        0.080688	Err	bitreich.org	70
i+1525238081        0.204834        0.181152        0.130737	Err	bitreich.org	70
i+1525238981        0.231445        0.158325        0.137695	Err	bitreich.org	70
i+1525239881        0.067505        0.089355        0.109497	Err	bitreich.org	70
i+1525240781        0.047852        0.088745        0.107910	Err	bitreich.org	70
i+1525241681        0.094360        0.085693        0.083618	Err	bitreich.org	70
i+1525242581        0.047363        0.043335        0.052856	Err	bitreich.org	70
i+1525243481        0.047363        0.031982        0.036621	Err	bitreich.org	70
i+1525244381        0.055054        0.042236        0.040039	Err	bitreich.org	70
i+1525245281        0.034668        0.041626        0.040039	Err	bitreich.org	70
i+1525246181        0.088867        0.065918        0.048706	Err	bitreich.org	70
i+1525247081        0.049072        0.051880        0.042236	Err	bitreich.org	70
i+1525247981        0.045166        0.048828        0.041382	Err	bitreich.org	70
i+1525248881        0.067261        0.061768        0.047852	Err	bitreich.org	70
i+1525249781        0.039917        0.056519        0.045654	Err	bitreich.org	70
i+1525250681        0.017822        0.030273        0.033081	Err	bitreich.org	70
i+1525251581        0.034668        0.033691        0.034546	Err	bitreich.org	70
i+1525252481        0.053223        0.051880        0.045166	Err	bitreich.org	70
i+1525253381        0.028687        0.050049        0.050659	Err	bitreich.org	70
i+1525254281        0.021118        0.042358        0.040649	Err	bitreich.org	70
i+1525255181        0.059204        0.047974        0.041870	Err	bitreich.org	70
i+1525256081        0.206421        0.141968        0.086670	Err	bitreich.org	70
i+1525256981        0.105713        0.087158        0.073486	Err	bitreich.org	70
i+1525257881        0.048950        0.060913        0.068359	Err	bitreich.org	70
i+1525258781        0.024414        0.036621        0.046753	Err	bitreich.org	70
i+1525259681        0.245239        0.109619        0.071045	Err	bitreich.org	70
i+1525260581        0.042236        0.063965        0.069092	Err	bitreich.org	70
i+1525261481        0.016724        0.054077        0.059692	Err	bitreich.org	70
i+1525262381        0.018433        0.078003        0.076660	Err	bitreich.org	70
i+1525263281        0.042480        0.057617        0.061890	Err	bitreich.org	70
i+1525264181        0.040161        0.041138        0.044189	Err	bitreich.org	70
i+1525265081        0.059082        0.090698        0.064575	Err	bitreich.org	70
i+1525265981        0.129272        0.080811        0.073486	Err	bitreich.org	70
i+1525266881        0.228516        0.164551        0.112915	Err	bitreich.org	70
i+1525267781        0.083130        0.058594        0.067627	Err	bitreich.org	70
i+1525268681        0.062378        0.063965        0.061523	Err	bitreich.org	70
i+1525269581        0.066895        0.069702        0.062500	Err	bitreich.org	70
i+1525270481        0.061768        0.080322        0.065674	Err	bitreich.org	70
i+1525271381        0.123657        0.089478        0.072021	Err	bitreich.org	70
i+1525272281        0.056885        0.045532        0.051514	Err	bitreich.org	70
i+1525273181        0.108887        0.056519        0.046387	Err	bitreich.org	70
i+1525274081        0.072266        0.119629        0.080078	Err	bitreich.org	70
i+1525274981        0.033447        0.058350        0.070190	Err	bitreich.org	70
i+1525275881        0.028198        0.050781        0.058105	Err	bitreich.org	70
i+1525276781        0.067261        0.059937        0.057495	Err	bitreich.org	70
i+1525277681        0.024780        0.028809        0.038452	Err	bitreich.org	70
i+1525278581        0.053955        0.049561        0.041748	Err	bitreich.org	70
i+1525279481        0.086304        0.065308        0.048096	Err	bitreich.org	70
i+1525281698        0.019165        0.047485        0.041870	Err	bitreich.org	70
i+1525281698        0.019165        0.047485        0.041870	Err	bitreich.org	70
i+1525282598        0.039551        0.034302        0.038086	Err	bitreich.org	70
i+1525283498        0.017700        0.022827        0.026367	Err	bitreich.org	70
i+1525284398        0.023560        0.034790        0.024292	Err	bitreich.org	70
i+1525285298        0.093506        0.078857        0.053101	Err	bitreich.org	70
i+1525286198        0.051025        0.066162        0.069458	Err	bitreich.org	70
i+1525287098        0.054077        0.057861        0.059082	Err	bitreich.org	70
i+1525287998        0.080200        0.071655        0.062744	Err	bitreich.org	70
i+1525288898        0.478638        0.375122        0.247192	Err	bitreich.org	70
i+1525289798        0.393066        0.390991        0.347046	Err	bitreich.org	70
i+1525290698        0.368164        0.383545        0.365723	Err	bitreich.org	70
i+1525291598        0.459229        0.463867        0.432129	Err	bitreich.org	70
i+1525292498        0.286865        0.354980        0.381958	Err	bitreich.org	70
i+1525293398        0.180786        0.178833        0.232910	Err	bitreich.org	70
i+1525294298        0.278198        0.260864        0.242920	Err	bitreich.org	70
i+1525295198        0.192505        0.183716        0.200806	Err	bitreich.org	70
i+1525296098        0.109375        0.185669        0.207153	Err	bitreich.org	70
i+1525296098        0.109375        0.185669        0.207153	Err	bitreich.org	70
i+1525296998        0.137085        0.126221        0.138184	Err	bitreich.org	70
i+1525297898        0.077881        0.092529        0.109619	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@@ -9,7 +9,7 @@	Err	bitreich.org	70
i #include <unistd.h>	Err	bitreich.org	70
i #include "drawille.h"	Err	bitreich.org	70
i #include "util.h"	Err	bitreich.org	70
i-#include "csv.h"	Err	bitreich.org	70
i+#include "tsv.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #ifndef __OpenBSD__	Err	bitreich.org	70
i #define pledge(...) 0	Err	bitreich.org	70
i@@ -20,7 +20,7 @@	Err	bitreich.org	70
i  * a vertical and horizontal axis.	Err	bitreich.org	70
i  */	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-braille_histogram(struct csv *vl, struct drawille *drw,	Err	bitreich.org	70
i+braille_histogram(struct tsv *vl, struct drawille *drw,	Err	bitreich.org	70
i         time_t tmin, time_t tmax, double vmin, double vmax)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         int                x, xprev, y, yprev, zero;	Err	bitreich.org	70
i@@ -104,7 +104,7 @@ braille_render(struct drawille *drw, FILE *fp, double min, double max)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-plot(struct csv *vl, size_t ncol, int rows, int cols, FILE *fp)	Err	bitreich.org	70
i+plot(struct tsv *vl, size_t ncol, int rows, int cols, FILE *fp)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         double vmin, vmax, vstep;	Err	bitreich.org	70
i         time_t tmin, tmax, tstep;	Err	bitreich.org	70
i@@ -112,7 +112,7 @@ plot(struct csv *vl, size_t ncol, int rows, int cols, FILE *fp)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         rows = MAX(rows, 2);        /* readable */	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (csv_min_max(vl, ncol, &tmin, &tmax, &vmin, &vmax) < 0)	Err	bitreich.org	70
i+        if (tsv_min_max(vl, ncol, &tmin, &tmax, &vmin, &vmax) < 0)	Err	bitreich.org	70
i                 err(1, "invalid scale: tmin=%lld tmax=%lld vmin=%fd vmax=%fd",	Err	bitreich.org	70
i                     (long long)tmin, (long long)tmax, vmin, vmax);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -145,7 +145,7 @@ usage(void)	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 csv *vl;	Err	bitreich.org	70
i+        struct tsv *vl;	Err	bitreich.org	70
i         size_t ncol;	Err	bitreich.org	70
i         int c, rows, cols;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -181,8 +181,8 @@ main(int argc, char **argv)	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, &vl, &ncol);	Err	bitreich.org	70
i-        csv_values(stdin, vl, ncol);	Err	bitreich.org	70
i+        tsv_labels(stdin, &vl, &ncol);	Err	bitreich.org	70
i+        tsv_values(stdin, vl, ncol);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         plot(vl, ncol, rows, cols, stdout);	Err	bitreich.org	70
i 	Err	bitreich.org	70
1diff --git a/ploot-csv.5 b/ploot-csv.5	/scm/ploot/file/ploot-csv.5.gph	bitreich.org	70
i@@ -1,77 +0,0 @@	Err	bitreich.org	70
i-.Dd $Mdocdate: February 01 2020$	Err	bitreich.org	70
i-.Dt PLOOT-CSV 5	Err	bitreich.org	70
i-.Os	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Sh NAME	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Nm ploot-csv	Err	bitreich.org	70
i-.Nd input format used by the ploot set of programs	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Sh SYNOPSIS	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Bd -literal	Err	bitreich.org	70
i-epoch,column-name-1,column-name-2	Err	bitreich.org	70
i-timestamp,value1,value2	Err	bitreich.org	70
i-timestamp,value1,value2	Err	bitreich.org	70
i-\&...	Err	bitreich.org	70
i-.Ed	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Sh DESCRIPTION	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-This is the simple coma-separated format used by the ploot-* programs.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Sh INPUT FORMAT	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Nm	Err	bitreich.org	70
i-has a first header line, then zero or more data lines, both	Err	bitreich.org	70
i-coma-separated list of values.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Ss Header line	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-The input must contain a first header line with the label of each column in order.	Err	bitreich.org	70
i-The first column is always	Err	bitreich.org	70
i-.Dq epoch .	Err	bitreich.org	70
i-Then there are the actual column names.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Bd -literal -offset indent	Err	bitreich.org	70
i-epoch,free_memory,process_count	Err	bitreich.org	70
i-.Ed	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Ss Data lines	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-The following lines are the data.	Err	bitreich.org	70
i-The first column is always an unix timestamp as in	Err	bitreich.org	70
i-.Vt time_t .	Err	bitreich.org	70
i-The remaining columns are values parsed as floating point numbers by	Err	bitreich.org	70
i-.Xr strtod 3 :	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Bd -literal -offset indent	Err	bitreich.org	70
i-1533752053,16.3,45	Err	bitreich.org	70
i-1533752054,18.7,42	Err	bitreich.org	70
i-1533752055,40.1,39	Err	bitreich.org	70
i-1533752056,40.1,39	Err	bitreich.org	70
i-.Ed	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Sh SEE ALSO	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Xr ploot-feed 1 ,	Err	bitreich.org	70
i-.Xr ploot-farbfeld 1	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Sh HISTORY	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Nm	Err	bitreich.org	70
i-was defined at	Err	bitreich.org	70
i-.Lk gopher://bitreich.org/1/scm/ploot/ "Bitreich"	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.Sh AUTHORS	Err	bitreich.org	70
i-.	Err	bitreich.org	70
i-.An Josuah Demangeon	Err	bitreich.org	70
i-.Aq Mt me@josuah.net	Err	bitreich.org	70
1diff --git a/ploot-farbfeld.1 b/ploot-farbfeld.1	/scm/ploot/file/ploot-farbfeld.1.gph	bitreich.org	70
i@@ -6,7 +6,7 @@	Err	bitreich.org	70
i .Sh NAME	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Nm ploot-ffplot	Err	bitreich.org	70
i-.Nd produce a ffplot image of csv input	Err	bitreich.org	70
i+.Nd produce a ffplot image of tsv input	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Sh SYNOPSIS	Err	bitreich.org	70
i@@ -20,7 +20,7 @@	Err	bitreich.org	70
i .	Err	bitreich.org	70
i The	Err	bitreich.org	70
i .Nm	Err	bitreich.org	70
i-utility plots an image in the ffplot format out of csv values coming from stdin.	Err	bitreich.org	70
i+utility plots an image in the ffplot format out of tsv values coming from stdin.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Bl -tag -width 6n	Err	bitreich.org	70
i .	Err	bitreich.org	70
i@@ -29,7 +29,7 @@ Set the title of the plot printed at the top left corner.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .It Ar colors	Err	bitreich.org	70
i List of argument that specify the color for each column.	Err	bitreich.org	70
i-If the input csv have 5 columns in addition of the timestamp, there must	Err	bitreich.org	70
i+If the input tsv have 5 columns in addition of the timestamp, there must	Err	bitreich.org	70
i be 5 maxval arguments.	Err	bitreich.org	70
i color_ts available are red, orange, yellow, green, cyan and blue.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i@@ -37,7 +37,7 @@ color_ts available are red, orange, yellow, green, cyan and blue.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Pp	Err	bitreich.org	70
i The input format is documented in the	Err	bitreich.org	70
i-.Xr ploot-csv 7	Err	bitreich.org	70
i+.Xr ploot-tsv 7	Err	bitreich.org	70
i manual page.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .	Err	bitreich.org	70
i@@ -62,7 +62,7 @@ $ ploot-ffplot -t demo -u MB red yellow <sample.txt	Err	bitreich.org	70
i .Sh SEE ALSO	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Xr ploot-ffplot 1 ,	Err	bitreich.org	70
i-.Xr ploot-csv 7	Err	bitreich.org	70
i+.Xr ploot-tsv 7	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Pp	Err	bitreich.org	70
i The	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@@ -11,7 +11,7 @@	Err	bitreich.org	70
i #include <string.h>	Err	bitreich.org	70
i #include <time.h>	Err	bitreich.org	70
i #include <unistd.h>	Err	bitreich.org	70
i-#include "csv.h"	Err	bitreich.org	70
i+#include "tsv.h"	Err	bitreich.org	70
i #include "font.h"	Err	bitreich.org	70
i #include "util.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -287,7 +287,7 @@ ffplot_title(struct ffplot *plot, struct ffcolor *ct, char *title)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-ffplot_plot(struct ffplot *plot, struct csv *vl, struct ffcolor *color,	Err	bitreich.org	70
i+ffplot_plot(struct ffplot *plot, struct tsv *vl, struct ffcolor *color,	Err	bitreich.org	70
i         double vmin, double vmax,	Err	bitreich.org	70
i         time_t tmin, time_t tmax)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i@@ -310,7 +310,7 @@ ffplot_plot(struct ffplot *plot, struct csv *vl, struct ffcolor *color,	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-ffplot_values(struct ffplot *plot, struct csv *vl, struct ffcolor **cl, size_t ncol,	Err	bitreich.org	70
i+ffplot_values(struct ffplot *plot, struct tsv *vl, struct ffcolor **cl, size_t 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@@ -319,7 +319,7 @@ ffplot_values(struct ffplot *plot, struct csv *vl, struct ffcolor **cl, size_t n	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-ffplot_legend(struct ffplot *plot, struct ffcolor *fg, struct csv *vl, struct ffcolor **cl, size_t ncol)	Err	bitreich.org	70
i+ffplot_legend(struct ffplot *plot, struct ffcolor *fg, struct tsv *vl, struct ffcolor **cl, size_t ncol)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         size_t x, y;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -342,7 +342,7 @@ ffplot_legend(struct ffplot *plot, struct ffcolor *fg, struct csv *vl, struct ff	Err	bitreich.org	70
i  *                x label here        	Err	bitreich.org	70
i  */	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-plot(struct csv *vl, struct ffcolor **cl, size_t ncol, char *name)	Err	bitreich.org	70
i+plot(struct tsv *vl, struct ffcolor **cl, size_t ncol, char *name)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         struct ffplot plot = { IMAGE_W, IMAGE_H, 0, 0, NULL };	Err	bitreich.org	70
i         struct ffcolor plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff };	Err	bitreich.org	70
i@@ -353,7 +353,7 @@ plot(struct csv *vl, struct ffcolor **cl, size_t ncol, char *name)	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-        csv_min_max(vl, ncol, &tmin, &tmax, &vmin, &vmax);	Err	bitreich.org	70
i+        tsv_min_max(vl, ncol, &tmin, &tmax, &vmin, &vmax);	Err	bitreich.org	70
i         tstep = scale_time_t(tmin, tmax, 7);	Err	bitreich.org	70
i         vstep = scale_double(vmin, vmax, 7);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -424,7 +424,7 @@ usage(void)	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 csv *vl;	Err	bitreich.org	70
i+        struct tsv *vl;	Err	bitreich.org	70
i         struct ffcolor **cl;	Err	bitreich.org	70
i         size_t ncol;	Err	bitreich.org	70
i         int c;	Err	bitreich.org	70
i@@ -451,12 +451,12 @@ main(int argc, char **argv)	Err	bitreich.org	70
i         if ((cl = calloc(argc, sizeof *cl)) == NULL)	Err	bitreich.org	70
i                 err(1, "calloc: %s", strerror(errno));	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        csv_labels(stdin, &vl, &ncol);	Err	bitreich.org	70
i+        tsv_labels(stdin, &vl, &ncol);	Err	bitreich.org	70
i         if (ncol > (size_t)argc)	Err	bitreich.org	70
i                 err(1, "too many columns or not enough arguments");	Err	bitreich.org	70
i         else if (ncol < (size_t)argc)	Err	bitreich.org	70
i                 err(1, "too many arguments or not enough columns");	Err	bitreich.org	70
i-        csv_values(stdin, vl, ncol);	Err	bitreich.org	70
i+        tsv_values(stdin, vl, ncol);	Err	bitreich.org	70
i         argv_to_color(cl, argv);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         plot(vl, cl, argc, flag_title);	Err	bitreich.org	70
1diff --git a/ploot-feed.1 b/ploot-feed.1	/scm/ploot/file/ploot-feed.1.gph	bitreich.org	70
i@@ -20,7 +20,7 @@	Err	bitreich.org	70
i .	Err	bitreich.org	70
i The	Err	bitreich.org	70
i .Nm	Err	bitreich.org	70
i-utility plots a text chart of csv values coming from stdin in real time.	Err	bitreich.org	70
i+utility plots a text chart of tsv values coming from stdin in real time.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Bl -tag -width 6n	Err	bitreich.org	70
i .	Err	bitreich.org	70
i@@ -29,14 +29,14 @@ is the width of the plot in characters.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .It Ar maxval	Err	bitreich.org	70
i is a list of argument that specify the maximum value for each column.	Err	bitreich.org	70
i-If the input csv have 5 columns in addition of the timestamp, there must	Err	bitreich.org	70
i+If the input tsv have 5 columns in addition of the timestamp, there must	Err	bitreich.org	70
i be 5 maxval arguments.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .El	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .Pp	Err	bitreich.org	70
i The input format is documented in the	Err	bitreich.org	70
i-.Xr ploot-csv 7	Err	bitreich.org	70
i+.Xr ploot-tsv 7	Err	bitreich.org	70
i manual page.	Err	bitreich.org	70
i .	Err	bitreich.org	70
i .	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@@ -59,14 +59,14 @@ plot_row(long *out, char *line, double *max, int nrow, int ncol)	Err	bitreich.org	70
i         int n;	Err	bitreich.org	70
i         char *tok;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        tok = strsep(&line, ",");	Err	bitreich.org	70
i+        tok = strsep(&line, "\t");	Err	bitreich.org	70
i         if (!tok)	Err	bitreich.org	70
i                 err(100, "*** missing epoch value");	Err	bitreich.org	70
i         epoch = strtol(tok, NULL, 10);	Err	bitreich.org	70
i         if (errno)	Err	bitreich.org	70
i                 warn("*** parsing epoch '%s'", tok);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        for (n = 0; (tok = strsep(&line, ",")) != NULL; n++) {	Err	bitreich.org	70
i+        for (n = 0; (tok = strsep(&line, "\t")) != NULL; n++) {	Err	bitreich.org	70
i                 if (n >= ncol)	Err	bitreich.org	70
i                         err(100, "too many values");	Err	bitreich.org	70
i                 val = atof(tok);	Err	bitreich.org	70
i@@ -186,10 +186,10 @@ read_labels(char **labv)	Err	bitreich.org	70
i         strchomp(line);	Err	bitreich.org	70
i         cp = line;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (strcmp(strsep(&cp, ","), "epoch") != 0)	Err	bitreich.org	70
i+        if (strcmp(strsep(&cp, "\t"), "epoch") != 0)	Err	bitreich.org	70
i                 err(100, "first label must be 'epoch'");	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        for (ncol = 0; (tok = strsep(&cp, ",")) != NULL; ncol++, labv++)	Err	bitreich.org	70
i+        for (ncol = 0; (tok = strsep(&cp, "\t")) != NULL; ncol++, labv++)	Err	bitreich.org	70
i                 *labv = tok;	Err	bitreich.org	70
i         *labv = NULL;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -212,7 +212,7 @@ fmt_labels(char out[4069], int ncol, char *labels[4069 / 2])	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 [-w width] maxval... <csv\n", arg0);	Err	bitreich.org	70
i+        fprintf(stderr, "usage: %s [-w width] maxval... <tsv\n", arg0);	Err	bitreich.org	70
i         exit(1);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
1diff --git a/ploot-tsv.5 b/ploot-tsv.5	/scm/ploot/file/ploot-tsv.5.gph	bitreich.org	70
i@@ -0,0 +1,77 @@	Err	bitreich.org	70
i+.Dd $Mdocdate: February 01 2020$	Err	bitreich.org	70
i+.Dt PLOOT-TSV 5	Err	bitreich.org	70
i+.Os	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh NAME	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Nm ploot-tsv	Err	bitreich.org	70
i+.Nd input format used by the ploot set of programs	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh SYNOPSIS	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Bd -literal	Err	bitreich.org	70
i+epoch,column-name-1,column-name-2	Err	bitreich.org	70
i+timestamp,value1,value2	Err	bitreich.org	70
i+timestamp,value1,value2	Err	bitreich.org	70
i+\&...	Err	bitreich.org	70
i+.Ed	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh DESCRIPTION	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+This is the simple coma-separated format used by the ploot-* programs.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh INPUT FORMAT	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Nm	Err	bitreich.org	70
i+has a first header line, then zero or more data lines, both	Err	bitreich.org	70
i+coma-separated list of values.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Ss Header line	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+The input must contain a first header line with the label of each column in order.	Err	bitreich.org	70
i+The first column is always	Err	bitreich.org	70
i+.Dq epoch .	Err	bitreich.org	70
i+Then there are the actual column names.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Bd -literal -offset indent	Err	bitreich.org	70
i+epoch,free_memory,process_count	Err	bitreich.org	70
i+.Ed	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Ss Data lines	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+The following lines are the data.	Err	bitreich.org	70
i+The first column is always an unix timestamp as in	Err	bitreich.org	70
i+.Vt time_t .	Err	bitreich.org	70
i+The remaining columns are values parsed as floating point numbers by	Err	bitreich.org	70
i+.Xr strtod 3 :	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Bd -literal -offset indent	Err	bitreich.org	70
i+1533752053,16.3,45	Err	bitreich.org	70
i+1533752054,18.7,42	Err	bitreich.org	70
i+1533752055,40.1,39	Err	bitreich.org	70
i+1533752056,40.1,39	Err	bitreich.org	70
i+.Ed	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh SEE ALSO	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Xr ploot-feed 1 ,	Err	bitreich.org	70
i+.Xr ploot-farbfeld 1	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh HISTORY	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Nm	Err	bitreich.org	70
i+was defined at	Err	bitreich.org	70
i+.Lk gopher://bitreich.org/1/scm/ploot/ "Bitreich"	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh AUTHORS	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.An Josuah Demangeon	Err	bitreich.org	70
i+.Aq Mt me@josuah.net	Err	bitreich.org	70
1diff --git a/tsv.c b/tsv.c	/scm/ploot/file/tsv.c.gph	bitreich.org	70
i@@ -0,0 +1,154 @@	Err	bitreich.org	70
i+#include "tsv.h"	Err	bitreich.org	70
i+#include <errno.h>	Err	bitreich.org	70
i+#include <assert.h>	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+#include <limits.h>	Err	bitreich.org	70
i+#include <time.h>	Err	bitreich.org	70
i+#include "util.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Read TSV data onto a set of (struct tsv) and some utilities to work on these data.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int	Err	bitreich.org	70
i+tsv_min_max(struct tsv *vl, int ncol,	Err	bitreich.org	70
i+        time_t *tmin, time_t *tmax,	Err	bitreich.org	70
i+        double *vmin, double *vmax)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        double *v;	Err	bitreich.org	70
i+        time_t *t;	Err	bitreich.org	70
i+        size_t n;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        *vmin = *vmax = 0; /* always show 0 on the scale */	Err	bitreich.org	70
i+        *tmin = *tmax = *vl->t;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (; ncol > 0; ncol--, vl++) {	Err	bitreich.org	70
i+                for (t = vl->t, v = vl->v, n = vl->n; n > 0; t++, v++, n--) {	Err	bitreich.org	70
i+                        if (*v < *vmin) *vmin = *v;	Err	bitreich.org	70
i+                        if (*v > *vmax) *vmax = *v;	Err	bitreich.org	70
i+                        if (*t < *tmin) *tmin = *t;	Err	bitreich.org	70
i+                        if (*t > *tmax) *tmax = *t;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (*tmin == *tmax)	Err	bitreich.org	70
i+                return -1;	Err	bitreich.org	70
i+        return 0;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+tsv_add_time(struct tsv *vl, time_t epoch)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        void *mem;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if ((mem = realloc(vl->t, (vl->n + 1) * sizeof *vl->t)) == NULL)	Err	bitreich.org	70
i+                err(1, "realloc: %s", strerror(errno));	Err	bitreich.org	70
i+        vl->t = mem;	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+tsv_add_val(struct tsv *vl, double field)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        void *mem;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if ((mem = realloc(vl->v, (vl->n + 1) * sizeof *vl->v)) == NULL)	Err	bitreich.org	70
i+                err(1, "", strerror(errno));	Err	bitreich.org	70
i+        vl->v = mem;	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.  The time_t	Err	bitreich.org	70
i+ * buffer is shared among all fields.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+tsv_add_row(struct tsv *vl, size_t ncol, char *line)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *field;	Err	bitreich.org	70
i+        time_t *tbuf;	Err	bitreich.org	70
i+        long l;	Err	bitreich.org	70
i+        double d;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if ((field = strsep(&line, "\t")) == 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+        l = strtol(field, NULL, 10);	Err	bitreich.org	70
i+        if (errno)	Err	bitreich.org	70
i+                err(100, "parsing number '%s'", field);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        tsv_add_time(vl, l);	Err	bitreich.org	70
i+        tbuf = vl[0].t;	Err	bitreich.org	70
i+        for (; (field = strsep(&line, "\t")); 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+                d = strtod(field, NULL);	Err	bitreich.org	70
i+                if (errno)	Err	bitreich.org	70
i+                        err(100, "parsing double '%s'", field);	Err	bitreich.org	70
i+                tsv_add_val(vl, d);	Err	bitreich.org	70
i+                vl->t = tbuf;	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+ * label1,label2,label3	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+tsv_labels(FILE *fp, struct tsv **vlp, size_t *ncol)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *field, *line, *cp;	Err	bitreich.org	70
i+        struct tsv *vl, *col;	Err	bitreich.org	70
i+        size_t sz;	Err	bitreich.org	70
i+        ssize_t r;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        sz = 0, line = NULL;	Err	bitreich.org	70
i+        r = getline(&line, &sz, fp);	Err	bitreich.org	70
i+        if (ferror(fp))	Err	bitreich.org	70
i+                err(111, "error while reading from file");	Err	bitreich.org	70
i+        if (feof(fp))	Err	bitreich.org	70
i+                err(100, "missing label line");	Err	bitreich.org	70
i+        strchomp(line);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        cp = line;	Err	bitreich.org	70
i+        if (strcmp(strsep(&cp, "\t"), "epoch") != 0)	Err	bitreich.org	70
i+                err(1, "first label must be 'epoch'");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        sz = 0, vl = NULL, *ncol = 0;	Err	bitreich.org	70
i+        while ((field = strsep(&cp, "\t"))) {	Err	bitreich.org	70
i+                if ((vl = realloc(vl, sz += sizeof *vl)) == NULL)	Err	bitreich.org	70
i+                        err(1, "realloc: %s", strerror(errno));	Err	bitreich.org	70
i+                col = vl + (*ncol)++;	Err	bitreich.org	70
i+                memset(col, 0, sizeof *vl);	Err	bitreich.org	70
i+                strlcpy(col->label, field, sizeof col->label);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        free(line);	Err	bitreich.org	70
i+        *vlp = vl;	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+ * val1a,val1b,val1c    ^	Err	bitreich.org	70
i+ * val2a,val2b,val2c    |	Err	bitreich.org	70
i+ * val3a,val3b,val3c (vl->n)	Err	bitreich.org	70
i+ * val4a,val4b,val4c    |	Err	bitreich.org	70
i+ * val5a,val5b,val5c    v	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+tsv_values(FILE *fp, struct tsv *vl, size_t ncol)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *line;	Err	bitreich.org	70
i+        size_t sz;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        sz = 0, line = NULL;	Err	bitreich.org	70
i+        while (getline(&line, &sz, fp) > -1)	Err	bitreich.org	70
i+                tsv_add_row(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+        free(line);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/tsv.h b/tsv.h	/scm/ploot/file/tsv.h.gph	bitreich.org	70
i@@ -0,0 +1,22 @@	Err	bitreich.org	70
i+#ifndef TSV_H	Err	bitreich.org	70
i+#define TSV_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+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * List of values and timestamps.  Both have their dedicated buffer	Err	bitreich.org	70
i+ * so that the timestamp buffer can be shared across tsv objects.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+struct tsv {	Err	bitreich.org	70
i+        time_t                *t;                /* array of timestamps */	Err	bitreich.org	70
i+        double                *v;                /* array of values */	Err	bitreich.org	70
i+        size_t                n;                /* number of values */	Err	bitreich.org	70
i+        char                label[64];        /* for the legend */	Err	bitreich.org	70
i+};	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void        tsv_labels(FILE *, struct tsv **, size_t *);	Err	bitreich.org	70
i+void        tsv_values(FILE *, struct tsv *, size_t);	Err	bitreich.org	70
i+int        tsv_min_max(struct tsv *, int, time_t *, time_t *, double *, double *);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/ploot/commit/98d0cb5aa9d2adb2...
Content-Typetext/plain; charset=utf-8