ireading lines into a buffe - 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 b22b1b174646f828a28144c010961a9c57f54dbd /scm/ploot/commit/b22b1b174646f828a28144c010961a9c57f54dbd.gph bitreich.org 70
1parent 522bbe841ea86e232baf35ba638fe490cc763325 /scm/ploot/commit/522bbe841ea86e232baf35ba638fe490cc763325.gph bitreich.org 70
hAuthor: Josuah Demangeon <mail@josuah.net> URL:mailto:mail@josuah.net bitreich.org 70
iDate: Wed, 2 May 2018 01:12:56 +0200 Err bitreich.org 70
i Err bitreich.org 70
ireading lines into a buffe Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i A config.h | 8 ++++++++ Err bitreich.org 70
i M ffplot.c | 2 +- Err bitreich.org 70
i M main.c | 132 ++++++++++++++++++++++++++++--- Err bitreich.org 70
i M ploot.h | 11 ++++++++++- Err bitreich.org 70
i A util.c | 21 +++++++++++++++++++++ Err bitreich.org 70
i Err bitreich.org 70
i5 files changed, 162 insertions(+), 12 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/config.h b/config.h /scm/ploot/file/config.h.gph bitreich.org 70
i@@ -0,0 +1,8 @@ Err bitreich.org 70
i+ColorList colorlist[] = { Err bitreich.org 70
i+ { "red", { 0xffff, 0x4444, 0x4444, 0xffff } }, Err bitreich.org 70
i+ { "orange", { 0xffff, 0x9999, 0x4444, 0xffff } }, Err bitreich.org 70
i+ { "yellow", { 0xffff, 0xffff, 0x4444, 0xffff } }, Err bitreich.org 70
i+ { "green", { 0x1111, 0xffff, 0x5555, 0xffff } }, Err bitreich.org 70
i+ { "cyan", { 0x0000, 0xffff, 0xdddd, 0xffff } }, Err bitreich.org 70
i+ { NULL, { 0, 0, 0, 0 } } Err bitreich.org 70
i+}; Err bitreich.org 70
1diff --git a/ffplot.c b/ffplot.c /scm/ploot/file/ffplot.c.gph bitreich.org 70
i@@ -193,7 +193,7 @@ legend(Canvas *can, Color *label_fg, Vlist *v, int n) Err bitreich.org 70
i ffdraw_str_left(can, &v->col, "\1", font, x, y); Err bitreich.org 70
i Err bitreich.org 70
i y += FONT_W * 2; Err bitreich.org 70
i- ffdraw_str_left(can, label_fg, v->name, font, x, y); Err bitreich.org 70
i+ ffdraw_str_left(can, label_fg, v->label, font, x, y); Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
1diff --git a/main.c b/main.c /scm/ploot/file/main.c.gph bitreich.org 70
i@@ -2,9 +2,13 @@ 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 "ploot.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 Err bitreich.org 70
i@@ -12,25 +16,132 @@ char *argv0; Err bitreich.org 70
i char *tflag = ""; Err bitreich.org 70
i char *uflag = ""; Err bitreich.org 70
i Err bitreich.org 70
i+static int Err bitreich.org 70
i+color(Color *col, char *name) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ ColorList *c; Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (c = colorlist; c->name != NULL; c++) { Err bitreich.org 70
i+ if (strcmp(name, c->name) == 0) { Err bitreich.org 70
i+ memcpy(col, &c->col, sizeof(*col)); Err bitreich.org 70
i+ return 0; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ return -1; 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 static void Err bitreich.org 70
i-usage(void) Err bitreich.org 70
i+read_labels(Vlist *v, char **argv, char *buf) Err bitreich.org 70
i { Err bitreich.org 70
i- fprintf(stderr, "usage: %s [-t title] [-u unit] label:color...\n", argv0); Err bitreich.org 70
i- exit(1); 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+ 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+ Err bitreich.org 70
i+ for (; *argv != NULL; v++, argv++) Err bitreich.org 70
i+ if ((v->label = strsep(&buf, ",")) == NULL) Err bitreich.org 70
i+ fputs("more arguments than columns\n", stderr), exit(1); Err bitreich.org 70
i+ else if (color(&v->col, *argv) == -1) Err bitreich.org 70
i+ fprintf(stderr, "unknown color: %s\n", *argv), exit(1); Err bitreich.org 70
i+ Err bitreich.org 70
i+ if (strsep(&buf, ",") != NULL) 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+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)) Err bitreich.org 70
i+ fputs("invalid number format", 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 void Err bitreich.org 70
i-read_labels(Vlist *v, int n) Err bitreich.org 70
i+add_value(double **v, int *bufsiz, int nval, char *field) Err bitreich.org 70
i { Err bitreich.org 70
i- (void)v; Err bitreich.org 70
i- (void)n; Err bitreich.org 70
i+ if (nval >= *bufsiz) { Err bitreich.org 70
i+ *bufsiz *= 2; Err bitreich.org 70
i+ if ((*v = realloc(*v, *bufsiz)) == NULL) Err bitreich.org 70
i+ perror("reallocating values buffer"), exit(1); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ (*v)[nval] = eatol(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. Err bitreich.org 70
i+ */ Err bitreich.org 70
i+void Err bitreich.org 70
i+add_each_value(Vlist *v, int *bufsiz, int ncol, int nval, char *line) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ time_t epoch; Err bitreich.org 70
i+ int n; Err bitreich.org 70
i+ char *field; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if ((field = strsep(&line, ",")) == NULL) Err bitreich.org 70
i+ fprintf(stderr, "%d: missing epoch\n", nval), exit(0); Err bitreich.org 70
i+ Err bitreich.org 70
i+ epoch = eatol(field); Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (n = 0; (field = strsep(&line, ",")) != NULL; n++, v++) { Err bitreich.org 70
i+ if (n > ncol) Err bitreich.org 70
i+ fprintf(stderr, "%d: too many fields\n", nval), exit(0); Err bitreich.org 70
i+ add_value(&v->v, bufsiz, nval, field); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ if (n < ncol) Err bitreich.org 70
i+ fprintf(stderr, "%d: too few fields\n", nval), exit(0); 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+ * epoch,a1,b1,c1 ^ Err bitreich.org 70
i+ * epoch,a2,b2,c2 nval Err bitreich.org 70
i+ * epoch,a3,b3,c3 v Err bitreich.org 70
i+ */ Err bitreich.org 70
i void Err bitreich.org 70
i-read_values(Vlist *v, int n) Err bitreich.org 70
i+read_values(Vlist *v, int ncol) Err bitreich.org 70
i { Err bitreich.org 70
i- (void)v; Err bitreich.org 70
i- (void)n; Err bitreich.org 70
i+ int n, nval, bufsiz; Err bitreich.org 70
i+ char line[LINE_MAX]; Err bitreich.org 70
i+ 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+ add_each_value(v, &bufsiz, ncol, nval, line); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ for (n = 0; n < ncol; n++, v++) Err bitreich.org 70
i+ v->n = nval; 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+ ColorList *c; Err bitreich.org 70
i+ Err bitreich.org 70
i+ fprintf(stderr, "usage: %s [-t title] [-u unit] color...\n" Err bitreich.org 70
i+ "available colors as defined by \"config.h\":\n", argv0); Err bitreich.org 70
i+ for (c = colorlist; c->name != NULL; c++) Err bitreich.org 70
i+ fprintf(stderr, "- %s\n", c->name); Err bitreich.org 70
i+ exit(1); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i int Err bitreich.org 70
i@@ -39,6 +150,7 @@ main(int argc, char **argv) Err bitreich.org 70
i Vlist *v; Err bitreich.org 70
i double vmin, vmax, vstep; Err bitreich.org 70
i time_t tmin, tmax, tstep; Err bitreich.org 70
i+ char labels[LINE_MAX]; Err bitreich.org 70
i Err bitreich.org 70
i ARGBEGIN { Err bitreich.org 70
i case 't': Err bitreich.org 70
i@@ -55,7 +167,7 @@ main(int argc, char **argv) Err bitreich.org 70
i vmin = -30; vmax = 700; vstep = 120; Err bitreich.org 70
i tmin = 0; tmax = 2000; tstep = 300; Err bitreich.org 70
i Err bitreich.org 70
i- read_labels(v, argc); Err bitreich.org 70
i+ read_labels(v, argv, labels); Err bitreich.org 70
i read_values(v, argc); Err bitreich.org 70
i Err bitreich.org 70
i ffdraw(tflag, uflag, v, argc, Err bitreich.org 70
1diff --git a/ploot.h b/ploot.h /scm/ploot/file/ploot.h.gph bitreich.org 70
i@@ -25,9 +25,14 @@ typedef struct { 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 int n; /* number of values */ Err bitreich.org 70
i- char *name; /* for the legend */ Err bitreich.org 70
i+ char *label; /* for the legend */ Err bitreich.org 70
i } Vlist; Err bitreich.org 70
i Err bitreich.org 70
i+typedef struct { Err bitreich.org 70
i+ char *name; Err bitreich.org 70
i+ Color col; Err bitreich.org 70
i+} ColorList; Err bitreich.org 70
i+ Err bitreich.org 70
i /* ffdraw.c */ Err bitreich.org 70
i void ffdraw_pixel (Canvas *, Color *, int, int); Err bitreich.org 70
i void ffdraw_rectangle(Canvas *, Color *, int, int, int, int); Err bitreich.org 70
i@@ -42,3 +47,7 @@ void ffdraw_print (Canvas *); Err bitreich.org 70
i /* ffplot.c */ Err bitreich.org 70
i void ffdraw (char *, char *, Vlist *, int, double, double, Err bitreich.org 70
i double, time_t, time_t, time_t); Err bitreich.org 70
i+ Err bitreich.org 70
i+/* util.c */ Err bitreich.org 70
i+char *strsep (char **, const char *); 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@@ -0,0 +1,21 @@ Err bitreich.org 70
i+#include <string.h> Err bitreich.org 70
i+ Err bitreich.org 70
i+#include "ploot.h" Err bitreich.org 70
i+ Err bitreich.org 70
i+char * Err bitreich.org 70
i+strsep(char **strp, const char *sep) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ char *s, *prev; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if (*strp == NULL) Err bitreich.org 70
i+ return NULL; Err bitreich.org 70
i+ for (s = prev = *strp; strchr(sep, *s) == NULL; s++); Err bitreich.org 70
i+ if (*s == '\0') { Err bitreich.org 70
i+ *strp = NULL; Err bitreich.org 70
i+ return prev; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ *s = '\0'; Err bitreich.org 70
i+ *strp = s + 1; Err bitreich.org 70
i+ Err bitreich.org 70
i+ return prev; Err bitreich.org 70
i+} Err bitreich.org 70
.
Response:
text/plain