reding from stdin with scanf, may still need to debug ring buffers - 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 3b39b0db61c4795ea3c0af49b0c2151585e502b6
(DIR) parent c529b0f871ecc44395506be3e5eb928caa4b63e0
(HTM) Author: Josuah Demangeon <mail@josuah.net>
Date: Sat, 3 Feb 2018 03:13:14 +0100
reding from stdin with scanf, may still need to debug ring buffers
Diffstat:
M Makefile | 6 +++++-
M ploot.c | 53 ++++++++++++++++++++++---------
A ploot.core | 0
3 files changed, 43 insertions(+), 16 deletions(-)
---
(DIR) diff --git a/Makefile b/Makefile
@@ -1,7 +1,11 @@
CFLAGS = -Wall -Wextra -Werror -std=c89 -pedantic
-all: ploot.o config.h
+all:ploot
+
+ploot: ploot.o config.h
${CC} -static -o ploot ploot.o
clean:
rm -f *.o ploot
+
+.PHONY: all clean
(DIR) diff --git a/ploot.c b/ploot.c
@@ -10,8 +10,9 @@
#define MAX_VAL 80
#define MARGIN 7
-#define ABS(x) ((x) < 0 ? -(x) : (x))
-#define LEN(x) (sizeof(x) / sizeof(*x))
+#define ABS(x) ((x) < 0 ? -(x) : (x))
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+#define LEN(x) (sizeof(x) / sizeof(*x))
char *argv0;
int flag_h = 20;
@@ -132,6 +133,29 @@ plot(int height, double *beg, double *end, char *str)
}
/*
+ * Add `val' at the current position `pos' of the `ring' buffer and return the
+ * next postion.
+ */
+size_t
+ring_add(double *ring, size_t len, size_t pos, double val)
+{
+ *ring = val;
+
+ return (pos >= len) ? pos + 1 : 0;
+}
+
+/*
+ * Copy the ring buffer `rbuf' content with current position `pos' into the
+ * buffer `buf'. Both buffer of length `len'.
+ */
+void
+ring_copy(double *buf, double *rbuf, size_t len, size_t pos)
+{
+ memcpy(buf, rbuf + pos, (len - pos) * sizeof(*rbuf));
+ memcpy(buf + (len - pos), rbuf, pos * sizeof(*rbuf));
+}
+
+/*
* 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.
@@ -139,12 +163,16 @@ plot(int height, double *beg, double *end, char *str)
double *
read_simple(double buf[MAX_VAL])
{
- /* ring buffer to read input continuously */
- double val_rbuf[MAX_VAL];
+ /* ring buffer to keep the last `MAX_VAL' values */
+ double rbuf[MAX_VAL], val;
+ size_t p, pos, len;
- (void)val_rbuf;
+ len = LEN(rbuf);
+ for (p = pos = 0; scanf("%lf\n", &val) > 0; p++)
+ pos = ring_add(rbuf, val, len, pos);
+ ring_copy(buf, rbuf, len, pos);
- return buf;
+ return buf + MIN(p, len);
}
/*
@@ -156,7 +184,7 @@ read_simple(double buf[MAX_VAL])
double *
read_time_series(double *valv, time_t *timev)
{
- /* ring buffers to read input continuously */
+ /* ring buffer to keep the last `MAX_VAL' values */
time_t time_rbuf[MAX_VAL];
double val_rbuf[MAX_VAL];
@@ -177,13 +205,7 @@ usage(void)
int
main(int argc, char **argv)
{
- double val[] = { 55, 55, 1, 72, 53, 73, 6, 45, 7, 71, 18, 100, 78, 56,
- 53, 24, 99, 99, 37, 91, 67, 68, 9, 16, 83, 30, 68, 51, 38, 47, 91,
- 35, 73, 36, 52, 99, 19, 91, 89, 7, 40, 88, 75, 50, 92, 91, 23, 54,
- 90, 98, 91, 94, 10, 39, 55, 71, 44, 77, 48, 74, 66, 53, 81, 85, 44,
- 71, 84, 93, 8, 50, 77, 16, 57, 68, 52, 82, 36, 7, 13, 10, 7, 95, 64,
- 71, 61, 12, 29, 63, 85, 72, 98, 59, 96, 91, 67, 24, 48, 4, 90, 1,
- 15, 57, 11, 93, 18, 18, 78, 85, 36, 35, 15, 7, 85, 31, 73, 57, 70 };
+ double val[MAX_VAL], *end;
ARGBEGIN(argc, argv) {
case 'h':
@@ -193,6 +215,7 @@ main(int argc, char **argv)
break;
} ARGEND;
- plot(flag_h, val, val + LEN(val), "Sample data generated with jot");
+ end = read_simple(val);
+ plot(flag_h, val, end, "Sample data generated with jot");
return 0;
}
(DIR) diff --git a/ploot.core b/ploot.core
Binary files differ.