iplotting time series - 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 51d676a1197f90fba3e657a875ad3905b95646a2 /scm/ploot/commit/51d676a1197f90fba3e657a875ad3905b95646a2.gph bitreich.org 70 1parent 413abf823787458e35396a700f9acf1af53ef239 /scm/ploot/commit/413abf823787458e35396a700f9acf1af53ef239.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:mail@josuah.net bitreich.org 70 iDate: Tue, 6 Feb 2018 23:03:45 +0100 Err bitreich.org 70 i Err bitreich.org 70 iplotting time series Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M ploot.c | 77 +++++++++++++++++++++++-------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 59 insertions(+), 18 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@@ -12,8 +12,8 @@ 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 LEN(x) (sizeof(x) / sizeof(*x)) Err bitreich.org 70 i- 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 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@@ -37,6 +37,7 @@ do { \ Err bitreich.org 70 i Err bitreich.org 70 i int flag_h = 20; Err bitreich.org 70 i char *flag_t = NULL; Err bitreich.org 70 i+time_t flag_o = 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@@ -108,11 +109,13 @@ vaxis(double val, int pos) Err bitreich.org 70 i * Print horizontal axis for up to `col' values. Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i-haxis(int col) Err bitreich.org 70 i+haxis(double *beg, double *end) Err bitreich.org 70 i { Err bitreich.org 70 i+ double *tp; Err bitreich.org 70 i+ Err bitreich.org 70 i printf("%*d -+", MARGIN, 0); Err bitreich.org 70 i- while (col-- > 0) Err bitreich.org 70 i- putchar('-'); 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 } Err bitreich.org 70 i Err bitreich.org 70 i@@ -151,7 +154,7 @@ plot(int height, double *beg, double *end, char *str) 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- haxis(end - beg); Err bitreich.org 70 i+ haxis(beg, end); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -169,7 +172,6 @@ read_simple(double buf[MAX_VAL]) 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- pos = MIN(pos, 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@@ -182,43 +184,75 @@ read_simple(double buf[MAX_VAL]) Err bitreich.org 70 i * least MAX_VAL wide and return a pointer to the last element of `vbuf' or NULL if the Err bitreich.org 70 i * input contains error. Err bitreich.org 70 i */ Err bitreich.org 70 i-double * 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 { Err bitreich.org 70 i- size_t p, pos, len; Err bitreich.org 70 i+ size_t p, pos, nul, len; Err bitreich.org 70 i double vrbuf[MAX_VAL], vval; 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("%zd %lf\n", &tval, &vval) > 0; p++) Err bitreich.org 70 i+ for (p = pos = 0; scanf("%zd %lf\n", &tval, &vval) > 0; p++) { Err bitreich.org 70 i RING_ADD(trbuf, len, pos, tval); Err bitreich.org 70 i- RING_ADD(vrbuf, len, pos, vval); Err bitreich.org 70 i+ RING_ADD(vrbuf, len, nul, vval); Err bitreich.org 70 i+ } Err bitreich.org 70 i len = MIN(len, p); Err bitreich.org 70 i- pos = MIN(pos, 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+} 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+fill_gaps(time_t *tbeg, time_t *tend, double *vbuf, time_t step) 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+ 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+ } 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 usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- printf("usage: ploot [-h ] [-t ]\n"); Err bitreich.org 70 i+ printf("usage: ploot [-h <height>] [-t <title>] -o <offset>\n"); 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-/* Err bitreich.org 70 i- time_t tbuf[MAX_VAL]; Err bitreich.org 70 i-*/ Err bitreich.org 70 i+ time_t tbuf[MAX_VAL], *tend; Err bitreich.org 70 i double vbuf[MAX_VAL], *vend; Err bitreich.org 70 i char c; Err bitreich.org 70 i Err bitreich.org 70 i- while ((c = getopt(argc, argv, "h:t:")) != -1) { Err bitreich.org 70 i+ while ((c = getopt(argc, argv, "h:t:o:")) != -1) { Err bitreich.org 70 i switch (c) { Err bitreich.org 70 i case -1: Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -229,12 +263,19 @@ main(int argc, char **argv) Err bitreich.org 70 i case 't': Err bitreich.org 70 i flag_t = optarg; Err bitreich.org 70 i break; Err bitreich.org 70 i+ case 'o': Err bitreich.org 70 i+ flag_o = atol(optarg); Err bitreich.org 70 i+ break; Err bitreich.org 70 i default: Err bitreich.org 70 i usage(); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i+ if (flag_o == 0) Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ tend = read_time_series(vbuf, tbuf); Err bitreich.org 70 i+ vend = fill_gaps(tbuf, tend, vbuf, flag_o); Err bitreich.org 70 i Err bitreich.org 70 i- vend = read_simple(vbuf); Err bitreich.org 70 i plot(flag_h, vbuf, vend, flag_t); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 .