imake plootxt draw an empty grid - 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 97913fd518557ed58a07f52204fef1271af2bb32 /scm/ploot/commit/97913fd518557ed58a07f52204fef1271af2bb32.gph bitreich.org 70 1parent 817580dbf249b75e747cc81f56f930d80600c59e /scm/ploot/commit/817580dbf249b75e747cc81f56f930d80600c59e.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:mail@josuah.net bitreich.org 70 iDate: Mon, 7 May 2018 01:10:39 +0200 Err bitreich.org 70 i Err bitreich.org 70 imake plootxt draw an empty grid Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M ploot.c | 2 ++ Err bitreich.org 70 i M plootxt.c | 199 +++++++++++++++++++------------ Err bitreich.org 70 i A test.csv | 30 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 157 insertions(+), 74 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/ploot.c b/ploot.c /scm/ploot/file/ploot.c.gph bitreich.org 70 i@@ -110,6 +110,8 @@ read_values(Vlist *v, int ncol) Err bitreich.org 70 i bufsize = 0; 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+ if (nval == 0) Err bitreich.org 70 i+ fputs("no value could be read\n", stderr), exit(1); 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@@ -12,72 +12,46 @@ 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+#define BRAILLE_START 10240 Err bitreich.org 70 i Err bitreich.org 70 i-int screenwidth = 80; Err bitreich.org 70 i+int wflag = 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 0; out++, col--) Err bitreich.org 70 i+ plot_dot(out + col / 2, row, col % 2); 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+static time_t Err bitreich.org 70 i+plot_row(long *out, char *line, double *max, 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@@ -88,11 +62,11 @@ plot_row(char *out, char *line, int nrow, int ncol, int width) 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+ for (n = 0; (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+ plot_val(out + n * width, max[n - 1], 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@@ -103,23 +77,27 @@ plot_row(char *out, char *line, int nrow, int ncol, int width) 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+static time_t Err bitreich.org 70 i+plot_line(long *out, double *max, 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+ int n, nrow; Err bitreich.org 70 i+ long *o, rune; Err bitreich.org 70 i char line[LINE_MAX]; Err bitreich.org 70 i Err bitreich.org 70 i+ for (rune = BRAILLE_START, o = out, n = ncol * width; n > 0; o++, n--) Err bitreich.org 70 i+ memcpy(o, &rune, sizeof(rune)); Err bitreich.org 70 i+ *o = '\0'; 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+ epoch = plot_row(out, line, max, 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+static 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@@ -141,48 +119,121 @@ put_time(time_t epoch, time_t last, int nline) 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+static void Err bitreich.org 70 i+print_utf8_3bytes(long rune) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ putchar((char)(0xe0 | (0x0f & (rune >> 12)))); /* 1110xxxx */ Err bitreich.org 70 i+ putchar((char)(0x80 | (0x3f & (rune >> 6)))); /* 10xxxxxx */ Err bitreich.org 70 i+ putchar((char)(0x80 | (0x3f & (rune)))); /* 10xxxxxx */ Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+put_line(long *out) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ for (; *out != '\0'; out++) Err bitreich.org 70 i+ print_utf8_3bytes(*out); Err bitreich.org 70 i+ putchar('|'); Err bitreich.org 70 i+ putchar('\n'); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+plot(char labels[LINE_MAX], double *max, int ncol) Err bitreich.org 70 i { Err bitreich.org 70 i time_t epoch, last_epoch; Err bitreich.org 70 i+ long out[WIDTH_MAX + 1]; 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+ width = (wflag - sizeof("XXxXXxXX _|")) / ncol - sizeof("|"); 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+ for (n = 0;; n = n == 20 ? 0 : n + 1) { Err bitreich.org 70 i+ if (n == 0) Err bitreich.org 70 i+ put_time(0, 0, 2), puts(labels); Err bitreich.org 70 i Err bitreich.org 70 i- epoch = plot_line(out, ncol, width); Err bitreich.org 70 i+ epoch = plot_line(out, max, 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+ put_line(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+static 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 = wflag / 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], **lab, *labels[LINE_MAX / 2], *tok; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ((l = 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+ lab = labels; Err bitreich.org 70 i+ for (ncol = 0; (tok = strsep(&l, ",")) != NULL; ncol++, lab++) Err bitreich.org 70 i+ *lab = tok; Err bitreich.org 70 i+ *lab = NULL; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ncol < 1) 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+static void Err bitreich.org 70 i+usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i+ fprintf(stderr, "usage: %s maxval... 0; n--, argv++, max++) Err bitreich.org 70 i+ *max = eatof(*argv); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return argc; 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+ double max[LINE_MAX / 2]; Err bitreich.org 70 i+ int ncol, nmax; 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+ nmax = parse_args(argc, argv, max); Err bitreich.org 70 i ncol = read_labels(labels); Err bitreich.org 70 i- plot(labels, ncol); Err bitreich.org 70 i+ if (ncol != nmax) Err bitreich.org 70 i+ fputs("not as many labels and arguments\n", stderr), exit(0); Err bitreich.org 70 i+ plot(labels, max, 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/test.csv b/test.csv /scm/ploot/file/test.csv.gph bitreich.org 70 i@@ -0,0 +1,30 @@ Err bitreich.org 70 i+epoch,value Err bitreich.org 70 i+1525186140,34.691934 Err bitreich.org 70 i+1525187040,34.405857 Err bitreich.org 70 i+1525187940,32.498299 Err bitreich.org 70 i+1525188840,27.619718 Err bitreich.org 70 i+1525189740,30.942743 Err bitreich.org 70 i+1525190640,32.813887 Err bitreich.org 70 i+1525191540,32.230595 Err bitreich.org 70 i+1525192440,30.917799 Err bitreich.org 70 i+1525193340,31.829373 Err bitreich.org 70 i+1525194240,30.912565 Err bitreich.org 70 i+1525195140,32.899966 Err bitreich.org 70 i+1525196040,31.234834 Err bitreich.org 70 i+1525196940,31.196973 Err bitreich.org 70 i+1525197840,30.626265 Err bitreich.org 70 i+1525198740,30.734170 Err bitreich.org 70 i+1525199640,29.900881 Err bitreich.org 70 i+1525200540,28.375837 Err bitreich.org 70 i+1525201440,28.976500 Err bitreich.org 70 i+1525202340,27.949893 Err bitreich.org 70 i+1525203240,26.158816 Err bitreich.org 70 i+1525204140,23.383114 Err bitreich.org 70 i+1525205040,26.615605 Err bitreich.org 70 i+1525205940,30.636621 Err bitreich.org 70 i+1525206840,28.831401 Err bitreich.org 70 i+1525207740,29.878943 Err bitreich.org 70 i+1525208640,22.641583 Err bitreich.org 70 i+1525209540,30.158785 Err bitreich.org 70 i+1525210440,30.718469 Err bitreich.org 70 i+1525211340,30.369028 Err bitreich.org 70 .