[add] time at the bottom axis - ploot - simple plotting tools
(HTM) git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
(DIR) LICENSE
---
(DIR) commit 8f05e8625d7d5a684fba3ab97c911d3b98e1ecdd
(DIR) parent ae31e2f1bccbf48ba05d29941119f73b34e1a66b
(HTM) Author: Josuah Demangeon <mail@josuah.net>
Date: Wed, 14 Feb 2018 20:13:55 +0100
[add] time at the bottom axis
Diffstat:
M ploot.c | 109 ++++++++++++++++++-------------
A ploot.core | 0
A txt | 0
3 files changed, 62 insertions(+), 47 deletions(-)
---
(DIR) 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;
}
(DIR) diff --git a/ploot.core b/ploot.core
Binary files differ.
(DIR) diff --git a/txt b/txt