Introduction
Introduction Statistics Contact Development Disclaimer Help
[add] time at the bottom axis - ploot - simple plotting tools
git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65…
Log
Files
Refs
Tags
README
LICENSE
---
commit 8f05e8625d7d5a684fba3ab97c911d3b98e1ecdd
parent ae31e2f1bccbf48ba05d29941119f73b34e1a66b
Author: Josuah Demangeon <[email protected]>
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(-)
---
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 ti…
+** 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 sa…
- * 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 sa…
+** 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_…
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
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.