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 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 Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include 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 = 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 Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include 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 .