ploot

plot images or real-time plain text from a .csv file
Log | Files | Refs | README

commit 8f05e8625d7d5a684fba3ab97c911d3b98e1ecdd
parent ae31e2f1bccbf48ba05d29941119f73b34e1a66b
Author: Josuah Demangeon <mail@josuah.net>
Date:   Wed, 14 Feb 2018 20:13:55 +0100

[add] time at the bottom axis

Diffstat:
Mploot.c | 109+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Aploot.core | 0
Atxt | 0
3 files changed, 62 insertions(+), 47 deletions(-)

diff --git a/ploot.c b/ploot.c @@ -7,18 +7,15 @@ #include "config.h" -#define MAX_VAL 80 -#define MARGIN 7 - #define ABS(x) ((x) < 0 ? -(x) : (x)) #define MIN(x, y) ((x) < (y) ? (x) : (y)) #define MAX(x, y) ((x) > (y) ? (x) : (y)) #define LEN(buf) (sizeof(buf) / sizeof(*(buf))) /* - * Add `val' at the current position `pos' of the `ring' buffer and set pos to - * the next postion. - */ +** Add `val' at the current position `pos' of the `ring' buffer and set pos to +** the next postion. +*/ #define RING_ADD(rbuf, len, pos, val) \ do { \ rbuf[pos] = val; \ @@ -26,24 +23,27 @@ do { \ } while (0) /* - * Copy the ring buffer `rbuf' content with current position `pos' into the - * buffer `buf'. Both buffer of length `len'. - */ +** Copy the ring buffer `rbuf' content with current position `pos' into the +** buffer `buf'. Both buffer of length `len'. +*/ #define RING_COPY(buf, rbuf, len, pos) \ do { \ memcpy(buf, rbuf + pos, (len - pos) * sizeof(*rbuf)); \ memcpy(buf + (len - pos), rbuf, pos * sizeof(*rbuf)); \ } while (0) +#define MAX_VAL 80 +#define MARGIN 7 + int flag_h = 20; char *flag_t = NULL; time_t flag_o = 0; /* - * Set `str' to a human-readable form of `num' with always a width of 7 (+ 1 - * the '\0' terminator). Buffer overflow is ensured not to happen due to the - * max size of a double. - */ +** Set `str' to a human-readable form of `num' with always a width of 7 (+ 1 +** the '\0' terminator). Buffer overflow is ensured not to happen due to the +** max size of a double. +*/ void humanize(char *str, double val) { @@ -63,8 +63,8 @@ humanize(char *str, double val) } /* - * Returns the maximal double of values between `beg' and `end'. - */ +** Returns the maximal double of values between `beg' and `end'. +*/ double maxdv(double *beg, double *end) { @@ -79,8 +79,8 @@ maxdv(double *beg, double *end) } /* - * If not null, print the title `str' centered on width. - */ +** If not null, print the title `str' centered on width. +*/ void title(char *str, int width) { @@ -90,9 +90,9 @@ title(char *str, int width) } /* - * Print vertical axis with humanized number from time to time, with occurences - * determined after the position on the vertical axis from the bottom `pos'. - */ +** Print vertical axis with humanized number from time to time, with occurences +** determined after the position on the vertical axis from the bottom `pos'. +*/ void vaxis(double val, int pos) { @@ -107,22 +107,35 @@ vaxis(double val, int pos) } /* - * Print horizontal axis for up to `col' values. - */ +** Print horizontal axis for up to `col' values along with dates if reading time +** series. +*/ void -haxis(double *beg, double *end) +haxis(double *beg, double *end, time_t time) { - double *tp; + double *tp; + char buf[9], dbeg[11], dend[11]; printf("%*d -+", MARGIN, 0); for (tp = beg; tp < end; tp++) putchar((*tp < 0) ? ('x') : ('-')); putchar('\n'); + if (flag_o > 0) { + printf("%*c", MARGIN - 1, ' '); + strftime(dbeg, sizeof(dbeg), "%Y/%m/%d", localtime(&time)); + for (tp = beg; tp < end; tp += 7) { + strftime(buf, sizeof(buf), " %H:%M", localtime(&time)); + fputs(buf, stdout); + time += flag_o * 7; + } + strftime(dend, sizeof(dend), "%Y/%m/%d", localtime(&time)); + printf("\n %-*s %s\n", (int)(beg - end) + 4, dbeg, dend); + } } /* - * Print two rows of a plot into a single line using ' ', '.' and ':'. - */ +** Print two rows of a plot into a single line using ' ', '.' and ':'. +*/ void line(double *beg, double *end, double top, double bot) { @@ -135,11 +148,11 @@ line(double *beg, double *end, double top, double bot) } /* - * Plot values between `beg' and `end' in a plot of height `height'. - * If `str' is not NULL, it is set as a title above the graph. - */ +** Plot values between `beg' and `end' in a plot of height `height'. +** If `str' is not NULL, it is set as a title above the graph. +*/ void -plot(double *beg, double *end, int height, char *str) +plot(double *beg, double *end, int height, char *str, time_t start) { double top, bot, max; int h; @@ -156,16 +169,16 @@ plot(double *beg, double *end, int height, char *str) vaxis(top, h); line(beg, end, top, bot); } - haxis(beg, end); + haxis(beg, end, start); putchar('\n'); } /* - * Read a simple format with one double per line and save the last `MAX_WIDTH' - * values into `buf' which must be at least MAX_VAL wide and return a pointer - * to the last element or NULL if the input contains error. - */ +** Read a simple format with one double per line and save the last `MAX_WIDTH' +** values into `buf' which must be at least MAX_VAL wide and return a pointer +** to the last element or NULL if the input contains error. +*/ double * read_simple(double buf[MAX_VAL]) { @@ -183,11 +196,11 @@ read_simple(double buf[MAX_VAL]) } /* - * Read a format with blank separated time_t-double pairs, one per line and save - * the last `MAX_WIDTH' values into `tbuf' and `vbuf' which must both be at - * least MAX_VAL wide and return a pointer to the last element of `vbuf' or - * NULL if the input contains error. - */ +** Read a format with blank separated time_t-double pairs, one per line and save +** the last `MAX_WIDTH' values into `tbuf' and `vbuf' which must both be at +** least MAX_VAL wide and return a pointer to the last element of `vbuf' or +** NULL if the input contains error. +*/ time_t * read_time_series(double *vbuf, time_t *tbuf) { @@ -210,9 +223,9 @@ read_time_series(double *vbuf, time_t *tbuf) } /* - * Walk from `tbeg' and `tend' and add offset in `tbuf' every time there is no - * value in `step' amount of time, by setting a value to -1. - */ +** Walk from `tbeg' and `tend' and add offset in `tbuf' every time there is no +** value in `step' amount of time, by setting a value to -1. +*/ double * skip_gaps(time_t *tbeg, time_t *tend, double *vbuf, time_t step) { @@ -221,14 +234,14 @@ skip_gaps(time_t *tbeg, time_t *tend, double *vbuf, time_t step) double *vp, vrbuf[MAX_VAL]; /* Compute the average alignment of the timestamps values according to - * the step size. */ + ** the step size. */ toff = 0; for (tp = tbeg; tp < tend; tp++) toff += *tp % step; toff = *tbeg + toff / (tend - tbeg) + step / 2; /* Fill `vbuf' with gap added at each time gap using vrbuf as - * intermediate ring buffer. */ + ** intermediate ring buffer. */ len = LEN(vrbuf); for (p = pos = 0, tp = tbeg, vp = vbuf; tp < tend; p++, vp++, tp++) { for (; toff < *tp; toff += step) @@ -253,7 +266,7 @@ usage(void) int main(int argc, char **argv) { - time_t tbuf[MAX_VAL], *tend; + time_t tbuf[MAX_VAL], *tend, start; double vbuf[MAX_VAL], *vend; int c; @@ -278,11 +291,13 @@ main(int argc, char **argv) if (flag_o == 0) { vend = read_simple(vbuf); + start = 0; } else { tend = read_time_series(vbuf, tbuf); vend = skip_gaps(tbuf, tend, vbuf, flag_o); + start = *tbuf; } - plot(vbuf, vend, flag_h, flag_t); + plot(vbuf, vend, flag_h, flag_t, start); return 0; } diff --git a/ploot.core b/ploot.core Binary files differ. diff --git a/txt b/txt