iauto-scale - 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 c3911021718dc5e5b2dd6469495e7f3bc4befdd2 /scm/ploot/commit/c3911021718dc5e5b2dd6469495e7f3bc4befdd2.gph bitreich.org 70
1parent d97badd46c19a6903a589c41b8b87d044f48f8dc /scm/ploot/commit/d97badd46c19a6903a589c41b8b87d044f48f8dc.gph bitreich.org 70
hAuthor: Josuah Demangeon <mail@josuah.net> URL:mailto:mail@josuah.net bitreich.org 70
iDate: Wed, 2 May 2018 06:37:05 +0200 Err bitreich.org 70
i Err bitreich.org 70
iauto-scale Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M Makefile | 2 +- Err bitreich.org 70
i M ffplot.c | 66 +++++++++++++++++++++++++++++-- Err bitreich.org 70
i D main.c | 191 ------------------------------- Err bitreich.org 70
i M ploot.c | 364 +++++++++++-------------------- Err bitreich.org 70
i M ploot.h | 3 +-- Err bitreich.org 70
i Err bitreich.org 70
i5 files changed, 186 insertions(+), 440 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@@ -1,7 +1,7 @@ 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 = main.c ffplot.c ffdraw.c font_14x7.c 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 LIB = -lm 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@@ -18,6 +18,7 @@ Err bitreich.org 70
i #include "font_14x7.h" Err bitreich.org 70
i Err bitreich.org 70
i #define ABS(x) ((x) < 0 ? -(x) : (x)) Err bitreich.org 70
i+#define LEN(x) (sizeof(x) / sizeof(*x)) Err bitreich.org 70
i Err bitreich.org 70
i #define MARGIN 4 Err bitreich.org 70
i Err bitreich.org 70
i@@ -42,7 +43,7 @@ Err bitreich.org 70
i #define PLOT_X (YLABEL_H) Err bitreich.org 70
i #define PLOT_Y (XLABEL_W) Err bitreich.org 70
i #define PLOT_W 700 Err bitreich.org 70
i-#define PLOT_H 200 Err bitreich.org 70
i+#define PLOT_H 160 Err bitreich.org 70
i Err bitreich.org 70
i #define LEGEND_X (YLABEL_H) Err bitreich.org 70
i #define LEGEND_Y (IMAGE_W - LEGEND_W) Err bitreich.org 70
i@@ -198,9 +199,60 @@ legend(Canvas *can, Color *label_fg, Vlist *v, int n) Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i-ffdraw(char *name, char *units, Vlist *v, int n, Err bitreich.org 70
i- double vmin, double vmax, double vstep, Err bitreich.org 70
i- time_t tmin, time_t tmax, time_t tstep) Err bitreich.org 70
i+find_scales(Vlist *v, int n, Err bitreich.org 70
i+ double *vmin, double *vmax, double *vstep, Err bitreich.org 70
i+ time_t *tmin, time_t *tmax, time_t *tstep) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ double dv, *vs, vscale[] = { 5, 2, 1 }; Err bitreich.org 70
i+ time_t dt, *ts, tscale[] = { Err bitreich.org 70
i+ 3600*24*30, 3600*24*5, 3600*24*2, 3600*24, 3600*18, 3600*10, Err bitreich.org 70
i+ 3600*5, 3600*2, 3600, 60*30, 60*20, 60*10, 60*5, 60*2, 60, 30, Err bitreich.org 70
i+ 20, 10, 5, 2, 1 Err bitreich.org 70
i+ }; Err bitreich.org 70
i+ int i; Err bitreich.org 70
i+ Err bitreich.org 70
i+ *vmin = *vmax = *tmin = *tmax = 0; Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (; n-- > 0; v++) { Err bitreich.org 70
i+ for (i = 0; i < v->n; i++) { Err bitreich.org 70
i+ if (v->v[i] < *vmin) Err bitreich.org 70
i+ *vmin = v->v[i]; Err bitreich.org 70
i+ if (v->v[i] > *vmax) Err bitreich.org 70
i+ *vmax = v->v[i]; Err bitreich.org 70
i+ if (v->t[i] < *tmin) Err bitreich.org 70
i+ *tmin = v->t[i]; Err bitreich.org 70
i+ if (v->t[i] > *tmax) Err bitreich.org 70
i+ *tmax = v->t[i]; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ dv = *vmax - *vmin; Err bitreich.org 70
i+ dt = *tmax - *tmin; Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (ts = tscale; ts < tscale + LEN(tscale); ts++) { Err bitreich.org 70
i+ if (dt > *ts * 5) { Err bitreich.org 70
i+ *tstep = *ts; Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (i = 1; i != 0; i *= 10) { Err bitreich.org 70
i+ for (vs = vscale; vs < vscale + LEN(vscale); vs++) { Err bitreich.org 70
i+ if (dv > *vs * i * 1) { Err bitreich.org 70
i+ *vstep = *vs * i * 10; Err bitreich.org 70
i+ i = 0; Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+/* Err bitreich.org 70
i+ * Plot the 'n' values list of the 'v' array with title 'name' and Err bitreich.org 70
i+ * 'units' label. Err bitreich.org 70
i+ */ Err bitreich.org 70
i+void Err bitreich.org 70
i+ffplot(Vlist *v, int n, char *name, char *units) Err bitreich.org 70
i { Err bitreich.org 70
i Canvas can = { IMAGE_W, IMAGE_H, buffer, 0, 0 }; Err bitreich.org 70
i Color plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff }; Err bitreich.org 70
i@@ -208,6 +260,12 @@ ffdraw(char *name, char *units, Vlist *v, int n, Err bitreich.org 70
i Color grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff }; Err bitreich.org 70
i Color label_fg = { 0x8888, 0x8888, 0x8888, 0xffff }; Err bitreich.org 70
i Color title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff }; Err bitreich.org 70
i+ double vmin, vmax, vstep = 30; Err bitreich.org 70
i+ time_t tmin, tmax, tstep = 30; Err bitreich.org 70
i+ Err bitreich.org 70
i+ find_scales(v, n, &vmin, &vmax, &vstep, &tmin, &tmax, &tstep); Err bitreich.org 70
i+ Err bitreich.org 70
i+ fprintf(stderr, "%f %f %lld %lld\n", vmin, vmax, tmin, tmax); Err bitreich.org 70
i Err bitreich.org 70
i can.x = 0; Err bitreich.org 70
i can.y = 0; Err bitreich.org 70
1diff --git a/main.c b/main.c /scm/ploot/file/main.c.gph bitreich.org 70
i@@ -1,191 +0,0 @@ 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 "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-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-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- 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-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 != '.') Err bitreich.org 70
i- fputs("invalid floatrformat", 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)) 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-add_val(Vlist *v, int *bufsiz, int nval, double field, time_t epoch) Err bitreich.org 70
i-{ Err bitreich.org 70
i- if (nval >= *bufsiz) { Err bitreich.org 70
i- *bufsiz = *bufsiz * 2 + 1; Err bitreich.org 70
i- if ((v->v = realloc(v->v, *bufsiz * sizeof(*v->v))) == NULL) Err bitreich.org 70
i- perror("reallocating values buffer"), exit(1); Err bitreich.org 70
i- if ((v->t = realloc(v->t, *bufsiz * sizeof(*v->t))) == NULL) Err bitreich.org 70
i- perror("reallocating values buffer"), exit(1); Err bitreich.org 70
i- } Err bitreich.org 70
i- v->v[nval] = field; Err bitreich.org 70
i- v->t[nval] = epoch; Err bitreich.org 70
i- v->n = nval + 1; 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_row(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- 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_val(v, bufsiz, nval, eatof(field), epoch); 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 ncol) Err bitreich.org 70
i-{ Err bitreich.org 70
i- int nval, bufsiz; Err bitreich.org 70
i- char line[LINE_MAX]; Err bitreich.org 70
i- Err bitreich.org 70
i- bufsiz = 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- add_row(v, &bufsiz, 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
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-main(int argc, char **argv) Err bitreich.org 70
i-{ 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- tflag = EARGF(usage()); Err bitreich.org 70
i- break; Err bitreich.org 70
i- case 'u': Err bitreich.org 70
i- uflag = EARGF(usage()); Err bitreich.org 70
i- break; Err bitreich.org 70
i- } ARGEND; Err bitreich.org 70
i- Err bitreich.org 70
i- if ((v = calloc(argc, sizeof(*v))) == NULL) Err bitreich.org 70
i- perror("calloc value list"), exit(1); Err bitreich.org 70
i- 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, 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
i- vmin, vmax, vstep, Err bitreich.org 70
i- tmin, tmax, tstep); Err bitreich.org 70
i- Err bitreich.org 70
i- return 0; 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@@ -1,304 +1,184 @@ Err bitreich.org 70
i-#include <sys/time.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 #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 <unistd.h> Err bitreich.org 70
i-#include <time.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 "config.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 ABS(x) ((x) < 0 ? -(x) : (x)) Err bitreich.org 70
i-#define MIN(x, y) ((x) < (y) ? (x) : (y)) Err bitreich.org 70
i-#define MAX(x, y) ((x) > (y) ? (x) : (y)) Err bitreich.org 70
i-#define LEN(buf) (sizeof(buf) / sizeof(*(buf))) Err bitreich.org 70
i+#define LEN(x) (sizeof(x) / sizeof(*x)) Err bitreich.org 70
i Err bitreich.org 70
i 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-/* Err bitreich.org 70
i-** Add 'val' at the current position 'pos' of the 'ring' buffer and set pos to Err bitreich.org 70
i-** the next postion. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-#define RING_ADD(rbuf, len, pos, val) \ Err bitreich.org 70
i-do { \ Err bitreich.org 70
i- rbuf[pos] = val; \ Err bitreich.org 70
i- pos = (pos + 1 < len) ? (pos + 1) : (0); \ Err bitreich.org 70
i-} while (0) Err bitreich.org 70
i- Err bitreich.org 70
i-/* Err bitreich.org 70
i-** Copy the ring buffer 'rbuf' content with current position 'pos' into the Err bitreich.org 70
i-** buffer 'buf'. Both buffer of length 'len'. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-#define RING_COPY(buf, rbuf, len, pos) \ Err bitreich.org 70
i-do { \ Err bitreich.org 70
i- memcpy(buf, rbuf + pos, (len - pos) * sizeof(*rbuf)); \ Err bitreich.org 70
i- memcpy(buf + (len - pos), rbuf, pos * sizeof(*rbuf)); \ Err bitreich.org 70
i-} while (0) Err bitreich.org 70
i- Err bitreich.org 70
i-#define MAX_VAL 80 Err bitreich.org 70
i-#define MARGIN 7 Err bitreich.org 70
i- Err bitreich.org 70
i-int hflag = 20; Err bitreich.org 70
i-char *tflag = NULL; Err bitreich.org 70
i-time_t oflag = 0; Err bitreich.org 70
i- Err bitreich.org 70
i-/* Err bitreich.org 70
i-** Set 'str' to a human-readable form of 'num' with always a width of 7 (+ 1 Err bitreich.org 70
i-** the '\0' terminator). Buffer overflow is ensured not to happen due to the Err bitreich.org 70
i-** max size of a double. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-void Err bitreich.org 70
i-humanize(char *str, double val) 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- int exp, precision; Err bitreich.org 70
i- char *label = "\0kMGTE"; Err bitreich.org 70
i+ ColorList *c; Err bitreich.org 70
i Err bitreich.org 70
i- for (exp = 0; ABS(val) > 1000; exp++) Err bitreich.org 70
i- val /= 1000; 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- precision = (ABS(val) < 10) ? (3) : (ABS(val) < 100) ? (2) : (1); Err bitreich.org 70
i- if (exp == 0) Err bitreich.org 70
i- precision++; Err bitreich.org 70
i- snprintf(str, 8, "%+.*f%c", precision, val, label[exp]); Err bitreich.org 70
i- str[7] = '\0'; Err bitreich.org 70
i- if (val >= 0) Err bitreich.org 70
i- str[0] = ' '; Err bitreich.org 70
i+ return -1; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-/* Err bitreich.org 70
i-** Returns the maximal double of values between 'beg' and 'end'. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-double Err bitreich.org 70
i-maxdv(double *beg, double *end) 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- double *val, max; Err bitreich.org 70
i+ char *lf; Err bitreich.org 70
i Err bitreich.org 70
i- max = *beg; Err bitreich.org 70
i- for (val = beg; val < end; val++) { Err bitreich.org 70
i- if (*val > max) Err bitreich.org 70
i- max = *val; Err bitreich.org 70
i- } Err bitreich.org 70
i- return max; 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-/* Err bitreich.org 70
i-** If not null, print the title 'str' centered on width. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-void Err bitreich.org 70
i-title(char *str, int width) 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 (str == NULL) Err bitreich.org 70
i- return; Err bitreich.org 70
i- printf("%*s\n", (int)(width + strlen(str)) / 2 + MARGIN + 3, str); Err bitreich.org 70
i-} Err bitreich.org 70
i- Err bitreich.org 70
i-/* Err bitreich.org 70
i-** Print vertical axis with humanized number from time to time, with occurences Err bitreich.org 70
i-** determined after the position on the vertical axis from the bottom 'pos'. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-void Err bitreich.org 70
i-vaxis(double val, int pos) Err bitreich.org 70
i-{ Err bitreich.org 70
i- char label[10]; Err bitreich.org 70
i- Err bitreich.org 70
i- if (pos % 4 == 0) { Err bitreich.org 70
i- humanize(label, val); Err bitreich.org 70
i- printf("%*s -", MARGIN, label); Err bitreich.org 70
i- } else { Err bitreich.org 70
i- printf("%*c ", MARGIN, ' '); 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-} Err bitreich.org 70
i+ estriplf(buf); Err bitreich.org 70
i Err bitreich.org 70
i-/* Err bitreich.org 70
i-** Print horizontal axis for up to 'col' values along with dates if reading time Err bitreich.org 70
i-** series. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-void Err bitreich.org 70
i-haxis(double *beg, double *end, time_t time) Err bitreich.org 70
i-{ Err bitreich.org 70
i- double *tp; Err bitreich.org 70
i- char buf[9], dbeg[11], dend[11]; 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- printf("%*d -+", MARGIN, 0); Err bitreich.org 70
i- for (tp = beg; tp < end; tp++) Err bitreich.org 70
i- putchar((*tp < 0) ? ('x') : ('-')); Err bitreich.org 70
i- putchar('\n'); Err bitreich.org 70
i- if (oflag > 0) { Err bitreich.org 70
i- printf("%*c", MARGIN - 1, ' '); Err bitreich.org 70
i- strftime(dbeg, sizeof(dbeg), "%Y/%m/%d", localtime(&time)); Err bitreich.org 70
i- for (tp = beg; tp < end; tp += 7) { Err bitreich.org 70
i- strftime(buf, sizeof(buf), " %H:%M", localtime(&time)); Err bitreich.org 70
i- fputs(buf, stdout); Err bitreich.org 70
i- time += oflag * 7; Err bitreich.org 70
i- } Err bitreich.org 70
i- strftime(dend, sizeof(dend), "%Y/%m/%d", localtime(&time)); Err bitreich.org 70
i- printf("\n %-*s %s\n", (int)(beg - end) + 4, dbeg, dend); 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-/* Err bitreich.org 70
i-** Print two rows of a plot into a single line using ' ', '.' and ':'. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-void Err bitreich.org 70
i-line(double *beg, double *end, double top, double bot) 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- double *val; Err bitreich.org 70
i+ char *s; Err bitreich.org 70
i Err bitreich.org 70
i- putchar('|'); Err bitreich.org 70
i- for (val = beg; val != end; val++) Err bitreich.org 70
i- putchar((*val < bot) ? ' ' : (*val < top) ? '.' : ':'); Err bitreich.org 70
i- putchar('\n'); 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 floatrformat", 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-/* Err bitreich.org 70
i-** Plot values between 'beg' and 'end' in a plot of height 'height'. Err bitreich.org 70
i-** If 'str' is not NULL, it is set as a title above the graph. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-void Err bitreich.org 70
i-plot(double *beg, double *end, int height, char *str, time_t start) 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- double top, bot, max; Err bitreich.org 70
i- int h; Err bitreich.org 70
i+ char *s; Err bitreich.org 70
i Err bitreich.org 70
i- putchar('\n'); Err bitreich.org 70
i- Err bitreich.org 70
i- max = maxdv(beg, end); Err bitreich.org 70
i- for (h = height + height % 2; h > 0; h -= 2) { Err bitreich.org 70
i- top = h * max / height; Err bitreich.org 70
i- bot = (h - 1) * max / height; Err bitreich.org 70
i- Err bitreich.org 70
i- vaxis(top, h); Err bitreich.org 70
i- line(beg, end, top, bot); Err bitreich.org 70
i- } Err bitreich.org 70
i- Err bitreich.org 70
i- haxis(beg, end, start); Err bitreich.org 70
i- Err bitreich.org 70
i- if (str != NULL) Err bitreich.org 70
i- title(str, end - beg); Err bitreich.org 70
i- Err bitreich.org 70
i- putchar('\n'); 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", 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-/* Err bitreich.org 70
i-** Read a simple format with one double per line and save the last 'MAX_WIDTH' Err bitreich.org 70
i-** values into 'buf' which must be at least MAX_VAL wide and return a pointer Err bitreich.org 70
i-** to the last element or NULL if the input contains error. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-double * Err bitreich.org 70
i-read_simple(double buf[MAX_VAL]) Err bitreich.org 70
i+static void Err bitreich.org 70
i+add_val(Vlist *v, int *bufsiz, int nval, double field, time_t epoch) Err bitreich.org 70
i { Err bitreich.org 70
i- double rbuf[MAX_VAL], val; Err bitreich.org 70
i- size_t p, pos, len; Err bitreich.org 70
i- Err bitreich.org 70
i- len = LEN(rbuf); Err bitreich.org 70
i- for (p = pos = 0; scanf("%lf\n", &val) > 0; p++) Err bitreich.org 70
i- RING_ADD(rbuf, len, pos, val); Err bitreich.org 70
i- len = MIN(len, p); Err bitreich.org 70
i- Err bitreich.org 70
i- RING_COPY(buf, rbuf, len, pos); Err bitreich.org 70
i- Err bitreich.org 70
i- return buf + len; Err bitreich.org 70
i+ if (nval >= *bufsiz) { Err bitreich.org 70
i+ *bufsiz = *bufsiz * 2 + 1; Err bitreich.org 70
i+ if ((v->v = realloc(v->v, *bufsiz * sizeof(*v->v))) == NULL) Err bitreich.org 70
i+ perror("reallocating values buffer"), exit(1); Err bitreich.org 70
i+ if ((v->t = realloc(v->t, *bufsiz * sizeof(*v->t))) == NULL) Err bitreich.org 70
i+ perror("reallocating values buffer"), exit(1); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ v->v[nval] = field; Err bitreich.org 70
i+ v->t[nval] = epoch; Err bitreich.org 70
i+ v->n = nval + 1; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i /* Err bitreich.org 70
i-** Read a format with blank separated time_t-double pairs, one per line and save Err bitreich.org 70
i-** the last 'MAX_WIDTH' values into 'tbuf' and 'vbuf' which must both be at Err bitreich.org 70
i-** least MAX_VAL wide and return a pointer to the last element of 'vbuf' or Err bitreich.org 70
i-** NULL if the input contains error. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-time_t * Err bitreich.org 70
i-read_time_series(double *vbuf, time_t *tbuf) 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+static void Err bitreich.org 70
i+add_row(Vlist *v, int *bufsiz, int ncol, int nval, char *line) Err bitreich.org 70
i { Err bitreich.org 70
i- size_t p, pos, nul, len; Err bitreich.org 70
i- double vrbuf[MAX_VAL], vval, dval; Err bitreich.org 70
i- time_t trbuf[MAX_VAL], tval; Err bitreich.org 70
i- Err bitreich.org 70
i- len = LEN(vrbuf); Err bitreich.org 70
i- for (p = pos = 0; scanf("%lf %lf\n", &dval, &vval) > 0; p++) { Err bitreich.org 70
i- tval = (time_t)dval; Err bitreich.org 70
i- RING_ADD(trbuf, len, pos, tval); Err bitreich.org 70
i- RING_ADD(vrbuf, len, nul, vval); 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+ 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_val(v, bufsiz, nval, eatof(field), epoch); Err bitreich.org 70
i } Err bitreich.org 70
i- len = MIN(len, p); Err bitreich.org 70
i- Err bitreich.org 70
i- RING_COPY(tbuf, trbuf, len, pos); Err bitreich.org 70
i- RING_COPY(vbuf, vrbuf, len, pos); Err bitreich.org 70
i- Err bitreich.org 70
i- return tbuf + len; 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-** Walk from 'tbeg' and 'tend' and add offset in 'tbuf' every time there is no Err bitreich.org 70
i-** value in 'step' amount of time, by setting a value to -1. Err bitreich.org 70
i-*/ Err bitreich.org 70
i-double * Err bitreich.org 70
i-skip_gaps(time_t *tbeg, time_t *tend, double *vbuf, time_t step) 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+static void Err bitreich.org 70
i+read_values(Vlist *v, int ncol) Err bitreich.org 70
i { Err bitreich.org 70
i- size_t p, pos, len; Err bitreich.org 70
i- time_t *tp, toff; Err bitreich.org 70
i- double *vp, vrbuf[MAX_VAL]; Err bitreich.org 70
i- Err bitreich.org 70
i- /* Compute the average alignment of the timestamps values according to Err bitreich.org 70
i- ** the step size. */ Err bitreich.org 70
i- toff = 0; Err bitreich.org 70
i- for (tp = tbeg; tp < tend; tp++) Err bitreich.org 70
i- toff += *tp % step; Err bitreich.org 70
i- toff = *tbeg + toff / (tend - tbeg) + step / 2; Err bitreich.org 70
i+ int nval, bufsiz; Err bitreich.org 70
i+ char line[LINE_MAX]; Err bitreich.org 70
i Err bitreich.org 70
i- /* Fill 'vbuf' with gap added at each time gap using vrbuf as Err bitreich.org 70
i- ** intermediate ring buffer. */ Err bitreich.org 70
i- len = LEN(vrbuf); Err bitreich.org 70
i- for (p = pos = 0, tp = tbeg, vp = vbuf; tp < tend; p++, vp++, tp++) { Err bitreich.org 70
i- for (; toff < *tp; toff += step) Err bitreich.org 70
i- RING_ADD(vrbuf, len, pos, -1); Err bitreich.org 70
i- RING_ADD(vrbuf, len, pos, *vp); Err bitreich.org 70
i- toff += step; Err bitreich.org 70
i+ bufsiz = 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+ add_row(v, &bufsiz, ncol, nval, line); Err bitreich.org 70
i } Err bitreich.org 70
i- len = MAX(MIN(p, len), pos); Err bitreich.org 70
i- Err bitreich.org 70
i- RING_COPY(vbuf, vrbuf, len, pos); Err bitreich.org 70
i- Err bitreich.org 70
i- return vbuf + len; 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 usage(void) Err bitreich.org 70
i { Err bitreich.org 70
i- printf("usage: ploot [-h <height>] [-o <offset>] [-t <title>]\n"); 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 main(int argc, char **argv) Err bitreich.org 70
i { Err bitreich.org 70
i- time_t tbuf[MAX_VAL], *tend, start; Err bitreich.org 70
i- double vbuf[MAX_VAL], *vend; Err bitreich.org 70
i+ Vlist *v; Err bitreich.org 70
i+ char labels[LINE_MAX]; Err bitreich.org 70
i Err bitreich.org 70
i- ARGBEGIN(argc, argv) { Err bitreich.org 70
i- case 'h': Err bitreich.org 70
i- if ((hflag = atoi(EARGF(usage()))) <= 0) Err bitreich.org 70
i- usage(); Err bitreich.org 70
i- break; Err bitreich.org 70
i+ ARGBEGIN { Err bitreich.org 70
i case 't': Err bitreich.org 70
i tflag = EARGF(usage()); Err bitreich.org 70
i break; Err bitreich.org 70
i- case 'o': Err bitreich.org 70
i- oflag = atol(EARGF(usage())); Err bitreich.org 70
i+ case 'u': Err bitreich.org 70
i+ uflag = EARGF(usage()); Err bitreich.org 70
i break; Err bitreich.org 70
i- default: Err bitreich.org 70
i- usage(); Err bitreich.org 70
i- } ARGEND Err bitreich.org 70
i+ } ARGEND; Err bitreich.org 70
i Err bitreich.org 70
i- if (oflag == 0) { Err bitreich.org 70
i- vend = read_simple(vbuf); Err bitreich.org 70
i- start = 0; Err bitreich.org 70
i- } else { Err bitreich.org 70
i- tend = read_time_series(vbuf, tbuf); Err bitreich.org 70
i- vend = skip_gaps(tbuf, tend, vbuf, oflag); Err bitreich.org 70
i- start = *tbuf; Err bitreich.org 70
i- } Err bitreich.org 70
i+ if ((v = calloc(argc, sizeof(*v))) == NULL) Err bitreich.org 70
i+ perror("calloc value list"), exit(1); Err bitreich.org 70
i+ 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+ ffplot(v, argc, tflag, uflag); Err bitreich.org 70
i Err bitreich.org 70
i- plot(vbuf, vend, hflag, tflag, start); Err bitreich.org 70
i return 0; Err bitreich.org 70
i } Err bitreich.org 70
1diff --git a/ploot.h b/ploot.h /scm/ploot/file/ploot.h.gph bitreich.org 70
i@@ -45,8 +45,7 @@ void ffdraw_fill (Canvas *, Color *); Err bitreich.org 70
i void ffdraw_print (Canvas *); Err bitreich.org 70
i 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+void ffplot (Vlist *, int, char *, char *); 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
.
Response:
text/plain