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