iprepare ffplot to read from stdin - 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 522bbe841ea86e232baf35ba638fe490cc763325 /scm/ploot/commit/522bbe841ea86e232baf35ba638fe490cc763325.gph bitreich.org 70 1parent df6b2deeefb42f4102a9bba819e7d06d15a3aebf /scm/ploot/commit/df6b2deeefb42f4102a9bba819e7d06d15a3aebf.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:mail@josuah.net bitreich.org 70 iDate: Tue, 1 May 2018 20:00:10 +0200 Err bitreich.org 70 i Err bitreich.org 70 iprepare ffplot to read from stdin Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 4 ++-- Err bitreich.org 70 i M ffdraw.c | 19 ++++++++++++++++++- Err bitreich.org 70 i D ffdraw.h | 39 ------------------------------- Err bitreich.org 70 i M ffplot.c | 241 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M font.h | 3 ++- Err bitreich.org 70 i M main.c | 293 ++++--------------------------- Err bitreich.org 70 i A ploot.h | 44 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i7 files changed, 342 insertions(+), 301 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/ploot/file/Makefile.gph bitreich.org 70 i@@ -1,7 +1,7 @@ Err bitreich.org 70 i CFLAGS = -Wall -Wextra -Werror -std=c89 -pedantic -D_POSIX_C_SOURCE=200809L Err bitreich.org 70 i LDFLAGS = -static Err bitreich.org 70 i Err bitreich.org 70 i-SRC = main.c ffdraw.c font_14x7.c Err bitreich.org 70 i+SRC = main.c ffplot.c ffdraw.c font_14x7.c Err bitreich.org 70 i OBJ = $(SRC:.c=.o) Err bitreich.org 70 i LIB = -lm Err bitreich.org 70 i Err bitreich.org 70 i@@ -19,4 +19,4 @@ clean:x Err bitreich.org 70 i Err bitreich.org 70 i x: Err bitreich.org 70 i Err bitreich.org 70 i-$(SRC): arg.h ffdraw.h font.h font_14x7.h Err bitreich.org 70 i+$(SRC): arg.h ploot.h font.h font_14x7.h Err bitreich.org 70 1diff --git a/ffdraw.c b/ffdraw.c /scm/ploot/file/ffdraw.c.gph bitreich.org 70 i@@ -6,11 +6,14 @@ Err bitreich.org 70 i * - (0,1) is above it. +--x Err bitreich.org 70 i */ Err bitreich.org 70 i Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i Err bitreich.org 70 i-#include "ffdraw.h" Err bitreich.org 70 i+#include "ploot.h" Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i * Convert (x,y) coordinates to (row,col) for printing into the buffer. Err bitreich.org 70 i@@ -144,3 +147,17 @@ ffdraw_fill(Canvas *can, Color *col) Err bitreich.org 70 i can->x = x; Err bitreich.org 70 i can->y = y; Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+ffdraw_print(Canvas *can) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint32_t w, h; Err bitreich.org 70 i+ Err bitreich.org 70 i+ w = htonl(can->w); Err bitreich.org 70 i+ h = htonl(can->h); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs("farbfeld", stdout); Err bitreich.org 70 i+ fwrite(&w, sizeof(w), 1, stdout); Err bitreich.org 70 i+ fwrite(&h, sizeof(h), 1, stdout); Err bitreich.org 70 i+ fwrite(can->b, can->w * can->h, sizeof(*can->b), stdout); Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/ffdraw.h b/ffdraw.h /scm/ploot/file/ffdraw.h.gph bitreich.org 70 i@@ -1,39 +0,0 @@ Err bitreich.org 70 i-#include Err bitreich.org 70 i- Err bitreich.org 70 i-#define MIN(x, y) ((x) < (y) ? (x) : (y)) Err bitreich.org 70 i-#define MAX(x, y) ((x) > (y) ? (x) : (y)) Err bitreich.org 70 i- Err bitreich.org 70 i-typedef uint16_t Color[4]; Err bitreich.org 70 i- Err bitreich.org 70 i-typedef struct { Err bitreich.org 70 i- int w; /* width */ Err bitreich.org 70 i- int h; /* height */ Err bitreich.org 70 i- Color *b; /* buffer */ Err bitreich.org 70 i- int x; /* x offset */ Err bitreich.org 70 i- int y; /* x offset */ Err bitreich.org 70 i-} Canvas; Err bitreich.org 70 i- Err bitreich.org 70 i-typedef struct { Err bitreich.org 70 i- int w; /* width */ Err bitreich.org 70 i- int h; /* height */ Err bitreich.org 70 i- char *b[128]; /* buffer */ Err bitreich.org 70 i-} Font; Err bitreich.org 70 i- Err bitreich.org 70 i-typedef struct { Err bitreich.org 70 i- Color col; /* for drawing the curve and the legend */ Err bitreich.org 70 i-/* time_t *t; / * array of timestamps */ Err bitreich.org 70 i- double *v; /* array of values */ Err bitreich.org 70 i- int n; /* number of values */ Err bitreich.org 70 i- time_t step; Err bitreich.org 70 i- char *name; /* for the legend */ Err bitreich.org 70 i-} Vlist; Err bitreich.org 70 i- Err bitreich.org 70 i-/* ffdraw.c */ Err bitreich.org 70 i-void ffdraw_pixel (Canvas *, Color *, int, int); Err bitreich.org 70 i-void ffdraw_rectangle(Canvas *, Color *, int, int, int, int); Err bitreich.org 70 i-void ffdraw_line (Canvas *, Color *, int, int, int, int); Err bitreich.org 70 i-void ffdraw_char (Canvas *, Color *, char, Font *, int, int); Err bitreich.org 70 i-void ffdraw_str_left(Canvas *, Color *, char *, Font *, int, int); Err bitreich.org 70 i-void ffdraw_str_center(Canvas *, Color *, char *, Font *, int, int); Err bitreich.org 70 i-void ffdraw_str_right(Canvas *, Color *, char *, Font *, int, int); Err bitreich.org 70 i-void ffdraw_fill (Canvas *, Color *); Err bitreich.org 70 1diff --git a/ffplot.c b/ffplot.c /scm/ploot/file/ffplot.c.gph bitreich.org 70 i@@ -0,0 +1,241 @@ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Draw a plot Err bitreich.org 70 i+ * Err bitreich.org 70 i+ * Title (units) Err bitreich.org 70 i+ * y ^ Legend Err bitreich.org 70 i+ * label |- + - + - + - + - Err bitreich.org 70 i+ * here |- + - + - + - + - Err bitreich.org 70 i+ * +--+---+---+---+--> Err bitreich.org 70 i+ * x label here Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "ploot.h" /* placed before for Font type declaration */ Err bitreich.org 70 i+#include "font_14x7.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+#define ABS(x) ((x) < 0 ? -(x) : (x)) Err bitreich.org 70 i+ Err bitreich.org 70 i+#define MARGIN 4 Err bitreich.org 70 i+ Err bitreich.org 70 i+#define FONT_H 14 Err bitreich.org 70 i+#define FONT_W 7 Err bitreich.org 70 i+ Err bitreich.org 70 i+#define TITLE_X (IMAGE_H - TITLE_H) Err bitreich.org 70 i+#define TITLE_Y (XLABEL_W) Err bitreich.org 70 i+#define TITLE_H (FONT_H * 2) Err bitreich.org 70 i+#define TITLE_W (PLOT_W) Err bitreich.org 70 i+ Err bitreich.org 70 i+#define XLABEL_X (PLOT_X) Err bitreich.org 70 i+#define XLABEL_Y (0) Err bitreich.org 70 i+#define XLABEL_H (PLOT_H) Err bitreich.org 70 i+#define XLABEL_W (FONT_W * 9 + MARGIN) Err bitreich.org 70 i+ Err bitreich.org 70 i+#define YLABEL_X (0) Err bitreich.org 70 i+#define YLABEL_Y (PLOT_Y) Err bitreich.org 70 i+#define YLABEL_H (FONT_H * 2) Err bitreich.org 70 i+#define YLABEL_W (PLOT_W) Err bitreich.org 70 i+ Err bitreich.org 70 i+#define PLOT_X (YLABEL_H) Err bitreich.org 70 i+#define PLOT_Y (XLABEL_W) Err bitreich.org 70 i+#define PLOT_W 700 Err bitreich.org 70 i+#define PLOT_H 200 Err bitreich.org 70 i+ Err bitreich.org 70 i+#define LEGEND_X (YLABEL_H) Err bitreich.org 70 i+#define LEGEND_Y (IMAGE_W - LEGEND_W) Err bitreich.org 70 i+#define LEGEND_W (FONT_W + 150 + FONT_W) Err bitreich.org 70 i+#define LEGEND_H (PLOT_H) Err bitreich.org 70 i+ Err bitreich.org 70 i+#define IMAGE_H (TITLE_H + PLOT_H + YLABEL_H) Err bitreich.org 70 i+#define IMAGE_W (XLABEL_W + PLOT_W + LEGEND_W) Err bitreich.org 70 i+ Err bitreich.org 70 i+Color buffer[IMAGE_W * IMAGE_H]; Err bitreich.org 70 i+ Err bitreich.org 70 i+Color c_axis = { 0xffff, 0xffff, 0xffff, 0xfff }; Err bitreich.org 70 i+Font *font = &font_14x7; Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+t2y(time_t t, time_t tmin, time_t tmax) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (t - tmin) * PLOT_W / (tmax - tmin); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+v2x(double v, double vmin, double vmax) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (v - vmin) * PLOT_H / (vmax - vmin); Err bitreich.org 70 i+} 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 8 (+ 1 Err bitreich.org 70 i+ * the '\0' terminator). Buffer overflow is ensured not to happen due to the Err bitreich.org 70 i+ * max size of a double. Return the exponent. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+static int Err bitreich.org 70 i+humanize(char *str, double val) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int exp, precision; Err bitreich.org 70 i+ char label[] = { '\0', 'M', 'G', 'T', 'E' }; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (exp = 0; ABS(val) > 1000; exp++) Err bitreich.org 70 i+ val /= 1000; Err bitreich.org 70 i+ Err bitreich.org 70 i+ precision = (ABS(val) < 10) ? 2 : (ABS(val) < 100) ? 1 : 0; Err bitreich.org 70 i+ precision += (exp == 0); Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(str, 9, "%+.*f %c", precision, val, label[exp]); Err bitreich.org 70 i+ str[8] = '\0'; Err bitreich.org 70 i+ if (val >= 0) Err bitreich.org 70 i+ str[0] = ' '; Err bitreich.org 70 i+ Err bitreich.org 70 i+ return exp * 3; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+xaxis(Canvas *can, Color *label, Color *grid, Err bitreich.org 70 i+ double vmin, double vmax, double vstep) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ double v; Err bitreich.org 70 i+ int x; Err bitreich.org 70 i+ char str[8 + 1]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (v = vmax - fmod(vmax, vstep); v >= vmin; v -= vstep) { Err bitreich.org 70 i+ x = v2x(v, vmin, vmax); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ffdraw_line(can, grid, Err bitreich.org 70 i+ x, XLABEL_W, Err bitreich.org 70 i+ x, XLABEL_W + PLOT_W); Err bitreich.org 70 i+ Err bitreich.org 70 i+ humanize(str, v); Err bitreich.org 70 i+ ffdraw_str_right(can, label, str, font, Err bitreich.org 70 i+ x, XLABEL_W - MARGIN); Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+yaxis(Canvas *can, Color *label, Color *grid, Err bitreich.org 70 i+ time_t tmin, time_t tmax, time_t tstep) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ time_t t; Err bitreich.org 70 i+ int y; Err bitreich.org 70 i+ char str[sizeof("YYYY/MM/DD")], *fmt; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fmt = (tstep < 3600 * 24) ? " %H:%M:%S " : " %Y/%m/%d "; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (t = tmax - tmax % tstep; t >= tmin; t -= tstep) { Err bitreich.org 70 i+ y = t2y(t, tmin, tmax); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ffdraw_line(can, grid, Err bitreich.org 70 i+ YLABEL_H, y, Err bitreich.org 70 i+ YLABEL_H + PLOT_H, y); Err bitreich.org 70 i+ Err bitreich.org 70 i+ strftime(str, sizeof(str), fmt, localtime(&t)); Err bitreich.org 70 i+ ffdraw_str_center(can, label, str, font, Err bitreich.org 70 i+ YLABEL_H / 2, y); Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+title(Canvas *can, Err bitreich.org 70 i+ Color *ct, char *title, Err bitreich.org 70 i+ Color *cu, char *unit) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ ffdraw_str_left(can, ct, title, font, Err bitreich.org 70 i+ TITLE_H / 2, 0); Err bitreich.org 70 i+ ffdraw_str_right(can, cu, unit, font, Err bitreich.org 70 i+ TITLE_H / 2, TITLE_W); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+graph(Canvas *can, Vlist *v, Err bitreich.org 70 i+ double vmin, double vmax, Err bitreich.org 70 i+ time_t tmin, time_t tmax) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ time_t *tp; Err bitreich.org 70 i+ double *vp; Err bitreich.org 70 i+ int x, y, n, xlast, ylast, first; Err bitreich.org 70 i+ Err bitreich.org 70 i+ first = 1; Err bitreich.org 70 i+ for (tp = v->t, vp = v->v, n = v->n; n-- > 0; n--, vp++, tp++) { Err bitreich.org 70 i+ x = v2x(*vp, vmin, vmax); Err bitreich.org 70 i+ y = t2y(*tp, tmin, tmax); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!first) Err bitreich.org 70 i+ ffdraw_line(can, &v->col, xlast, ylast, x, y); Err bitreich.org 70 i+ Err bitreich.org 70 i+ xlast = x; Err bitreich.org 70 i+ ylast = y; Err bitreich.org 70 i+ first = 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+plot(Canvas *can, Vlist *v, int n, Err bitreich.org 70 i+ double vmin, double vmax, Err bitreich.org 70 i+ time_t tmin, time_t tmax) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ for (; n > 0; n--, v++) Err bitreich.org 70 i+ graph(can, v, vmin, vmax, tmin, tmax); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+legend(Canvas *can, Color *label_fg, Vlist *v, int n) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int i, x, y; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; i < n; i++, v++) { Err bitreich.org 70 i+ x = LEGEND_H - n * (FONT_H + MARGIN) - FONT_H / 2; Err bitreich.org 70 i+ Err bitreich.org 70 i+ y = MARGIN + FONT_W; Err bitreich.org 70 i+ ffdraw_str_left(can, &v->col, "\1", font, x, y); Err bitreich.org 70 i+ Err bitreich.org 70 i+ y += FONT_W * 2; Err bitreich.org 70 i+ ffdraw_str_left(can, label_fg, v->name, font, x, y); Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+ffdraw(char *name, char *units, Vlist *v, int n, Err bitreich.org 70 i+ double vmin, double vmax, double vstep, Err bitreich.org 70 i+ time_t tmin, time_t tmax, time_t tstep) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Canvas can = { IMAGE_W, IMAGE_H, buffer, 0, 0 }; Err bitreich.org 70 i+ Color plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff }; Err bitreich.org 70 i+ Color grid_bg = { 0x2929, 0x2929, 0x2929, 0xffff }; Err bitreich.org 70 i+ Color grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff }; Err bitreich.org 70 i+ Color label_fg = { 0x8888, 0x8888, 0x8888, 0xffff }; Err bitreich.org 70 i+ Color title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff }; Err bitreich.org 70 i+ Err bitreich.org 70 i+ can.x = 0; Err bitreich.org 70 i+ can.y = 0; Err bitreich.org 70 i+ ffdraw_fill(&can, &plot_bg); Err bitreich.org 70 i+ Err bitreich.org 70 i+ can.x = PLOT_X; Err bitreich.org 70 i+ can.y = PLOT_Y; Err bitreich.org 70 i+ ffdraw_rectangle(&can, &grid_bg, 0, 0, PLOT_H, PLOT_W); Err bitreich.org 70 i+ Err bitreich.org 70 i+ can.x = YLABEL_X; Err bitreich.org 70 i+ can.y = YLABEL_Y; Err bitreich.org 70 i+ yaxis(&can, &label_fg, &grid_fg, tmin, tmax, tstep); Err bitreich.org 70 i+ Err bitreich.org 70 i+ can.x = XLABEL_X; Err bitreich.org 70 i+ can.y = XLABEL_Y; Err bitreich.org 70 i+ xaxis(&can, &label_fg, &grid_fg, vmin, vmax, vstep); Err bitreich.org 70 i+ Err bitreich.org 70 i+ can.x = TITLE_X; Err bitreich.org 70 i+ can.y = TITLE_Y; Err bitreich.org 70 i+ title(&can, &title_fg, name, &label_fg, units); Err bitreich.org 70 i+ Err bitreich.org 70 i+ can.x = PLOT_X; Err bitreich.org 70 i+ can.y = PLOT_Y; Err bitreich.org 70 i+ plot(&can, v, n, vmin, vmax, tmin, tmax); Err bitreich.org 70 i+ Err bitreich.org 70 i+ can.x = LEGEND_X; Err bitreich.org 70 i+ can.y = LEGEND_Y; Err bitreich.org 70 i+ legend(&can, &label_fg, v, n); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ffdraw_print(&can); Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/font.h b/font.h /scm/ploot/file/font.h.gph bitreich.org 70 i@@ -1,6 +1,7 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i-#include "ffdraw.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "ploot.h" Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i * Macros to make the fonts header file more readable. Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/ploot/file/main.c.gph bitreich.org 70 i@@ -1,289 +1,66 @@ Err bitreich.org 70 i-#include Err bitreich.org 70 i- Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i Err bitreich.org 70 i-#include Err bitreich.org 70 i- Err bitreich.org 70 i-#include "ffdraw.h" Err bitreich.org 70 i-#include "font_14x7.h" Err bitreich.org 70 i+#include "arg.h" Err bitreich.org 70 i+#include "ploot.h" Err bitreich.org 70 i Err bitreich.org 70 i-#define ABS(x) ((x) < 0 ? -(x) : (x)) Err bitreich.org 70 i #define LEN(x) (sizeof(x) / sizeof(*x)) Err bitreich.org 70 i Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Sizes and positions: Err bitreich.org 70 i- * Err bitreich.org 70 i- * Title on the first row legend Err bitreich.org 70 i- * y ^ here Err bitreich.org 70 i- * label |- + - + - + - + - with Err bitreich.org 70 i- * here |- + - + - + - + - the Err bitreich.org 70 i- * +--+---+---+---+--> full Err bitreich.org 70 i- * x label here height Err bitreich.org 70 i- */ Err bitreich.org 70 i- Err bitreich.org 70 i-#define MARGIN 4 Err bitreich.org 70 i- Err bitreich.org 70 i-#define FONT_H 14 Err bitreich.org 70 i-#define FONT_W 7 Err bitreich.org 70 i- Err bitreich.org 70 i-#define TITLE_X (IMAGE_H - TITLE_H) Err bitreich.org 70 i-#define TITLE_Y (XLABEL_W) Err bitreich.org 70 i-#define TITLE_H (FONT_H * 2) Err bitreich.org 70 i-#define TITLE_W (PLOT_W) Err bitreich.org 70 i- Err bitreich.org 70 i-#define XLABEL_X (PLOT_X) Err bitreich.org 70 i-#define XLABEL_Y (0) Err bitreich.org 70 i-#define XLABEL_H (PLOT_H) Err bitreich.org 70 i-#define XLABEL_W (FONT_W * 9 + MARGIN) Err bitreich.org 70 i+char *argv0; Err bitreich.org 70 i+char *tflag = ""; Err bitreich.org 70 i+char *uflag = ""; Err bitreich.org 70 i Err bitreich.org 70 i-#define YLABEL_X (0) Err bitreich.org 70 i-#define YLABEL_Y (PLOT_Y) Err bitreich.org 70 i-#define YLABEL_H (FONT_H * 2) Err bitreich.org 70 i-#define YLABEL_W (PLOT_W) Err bitreich.org 70 i- Err bitreich.org 70 i-#define PLOT_X (YLABEL_H) Err bitreich.org 70 i-#define PLOT_Y (XLABEL_W) Err bitreich.org 70 i-#define PLOT_W 700 Err bitreich.org 70 i-#define PLOT_H 200 Err bitreich.org 70 i- Err bitreich.org 70 i-#define LEGEND_X (YLABEL_H) Err bitreich.org 70 i-#define LEGEND_Y (IMAGE_W - LEGEND_W) Err bitreich.org 70 i-#define LEGEND_W (FONT_W + 150 + FONT_W) Err bitreich.org 70 i-#define LEGEND_H (PLOT_H) Err bitreich.org 70 i- Err bitreich.org 70 i-#define IMAGE_H (TITLE_H + PLOT_H + YLABEL_H) Err bitreich.org 70 i-#define IMAGE_W (XLABEL_W + PLOT_W + LEGEND_W) Err bitreich.org 70 i- Err bitreich.org 70 i-Color buffer[IMAGE_W * IMAGE_H]; Err bitreich.org 70 i- Err bitreich.org 70 i-Color c_axis = { 0xffff, 0xffff, 0xffff, 0xfff }; Err bitreich.org 70 i-Font *font = &font_14x7; Err bitreich.org 70 i- Err bitreich.org 70 i-int Err bitreich.org 70 i-ffplot_t2y(time_t t, time_t tmin, time_t tmax) Err bitreich.org 70 i+static void Err bitreich.org 70 i+usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- return (t - tmin) * PLOT_W / (tmax - tmin); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-int Err bitreich.org 70 i-ffplot_v2x(double v, double vmin, double vmax) Err bitreich.org 70 i-{ Err bitreich.org 70 i- return (v - vmin) * PLOT_H / (vmax - vmin); Err bitreich.org 70 i-} 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 8 (+ 1 Err bitreich.org 70 i- * the '\0' terminator). Buffer overflow is ensured not to happen due to the Err bitreich.org 70 i- * max size of a double. Return the exponent. Err bitreich.org 70 i- */ Err bitreich.org 70 i-int Err bitreich.org 70 i-humanize(char *str, double val) Err bitreich.org 70 i-{ Err bitreich.org 70 i- int exp, precision; Err bitreich.org 70 i- char label[] = { '\0', 'M', 'G', 'T', 'E' }; Err bitreich.org 70 i- Err bitreich.org 70 i- for (exp = 0; ABS(val) > 1000; exp++) Err bitreich.org 70 i- val /= 1000; Err bitreich.org 70 i- Err bitreich.org 70 i- precision = (ABS(val) < 10) ? 2 : (ABS(val) < 100) ? 1 : 0; Err bitreich.org 70 i- precision += (exp == 0); Err bitreich.org 70 i- Err bitreich.org 70 i- snprintf(str, 9, "%+.*f %c", precision, val, label[exp]); Err bitreich.org 70 i- str[8] = '\0'; Err bitreich.org 70 i- if (val >= 0) Err bitreich.org 70 i- str[0] = ' '; Err bitreich.org 70 i- Err bitreich.org 70 i- return exp * 3; Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-t title] [-u unit] label:color...\n", argv0); Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-ffplot_xaxis(Canvas *can, Color *label, Color *grid, Err bitreich.org 70 i- double vmin, double vmax, double vstep) Err bitreich.org 70 i+read_labels(Vlist *v, int n) Err bitreich.org 70 i { Err bitreich.org 70 i- double v; Err bitreich.org 70 i- int x; Err bitreich.org 70 i- char str[8 + 1]; Err bitreich.org 70 i- Err bitreich.org 70 i- for (v = vmax - fmod(vmax, vstep); v >= vmin; v -= vstep) { Err bitreich.org 70 i- x = ffplot_v2x(v, vmin, vmax); Err bitreich.org 70 i- Err bitreich.org 70 i- ffdraw_line(can, grid, Err bitreich.org 70 i- x, XLABEL_W, Err bitreich.org 70 i- x, XLABEL_W + PLOT_W); Err bitreich.org 70 i- Err bitreich.org 70 i- humanize(str, v); Err bitreich.org 70 i- ffdraw_str_right(can, label, str, font, Err bitreich.org 70 i- x, XLABEL_W - MARGIN); Err bitreich.org 70 i- } Err bitreich.org 70 i+ (void)v; Err bitreich.org 70 i+ (void)n; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-ffplot_yaxis(Canvas *can, Color *label, Color *grid, Err bitreich.org 70 i- time_t tmin, time_t tmax, time_t tstep) Err bitreich.org 70 i+read_values(Vlist *v, int n) Err bitreich.org 70 i { Err bitreich.org 70 i- time_t t; Err bitreich.org 70 i- int y; Err bitreich.org 70 i- char str[sizeof("YYYY/MM/DD")], *fmt; Err bitreich.org 70 i- Err bitreich.org 70 i- fmt = (tstep < 3600 * 24) ? " %H:%M:%S " : " %Y/%m/%d "; Err bitreich.org 70 i- Err bitreich.org 70 i- for (t = tmax - tmax % tstep; t >= tmin; t -= tstep) { Err bitreich.org 70 i- y = ffplot_t2y(t, tmin, tmax); Err bitreich.org 70 i- Err bitreich.org 70 i- ffdraw_line(can, grid, Err bitreich.org 70 i- YLABEL_H, y, Err bitreich.org 70 i- YLABEL_H + PLOT_H, y); Err bitreich.org 70 i- Err bitreich.org 70 i- strftime(str, sizeof(str), fmt, localtime(&t)); Err bitreich.org 70 i- ffdraw_str_center(can, label, str, font, Err bitreich.org 70 i- YLABEL_H / 2, y); Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-void Err bitreich.org 70 i-ffplot_title(Canvas *can, Err bitreich.org 70 i- Color *ct, char *title, Err bitreich.org 70 i- Color *cu, char *unit) Err bitreich.org 70 i-{ Err bitreich.org 70 i- ffdraw_str_left(can, ct, title, font, Err bitreich.org 70 i- TITLE_H / 2, 0); Err bitreich.org 70 i- ffdraw_str_right(can, cu, unit, font, Err bitreich.org 70 i- TITLE_H / 2, TITLE_W); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-void Err bitreich.org 70 i-ffplot_graph(Canvas *can, Vlist *v, Err bitreich.org 70 i- double vmin, double vmax, Err bitreich.org 70 i- time_t tmin, time_t tmax) Err bitreich.org 70 i-{ Err bitreich.org 70 i- time_t t; Err bitreich.org 70 i- double *vp; Err bitreich.org 70 i- int x, y, n, xlast, ylast, first; Err bitreich.org 70 i- Err bitreich.org 70 i- first = 1; Err bitreich.org 70 i- t = tmin; Err bitreich.org 70 i- for (vp = v->v, n = v->n; n-- > 0; n--, vp++) { Err bitreich.org 70 i- x = ffplot_v2x(*vp, vmin, vmax); Err bitreich.org 70 i- y = ffplot_t2y(t, tmin, tmax); Err bitreich.org 70 i- Err bitreich.org 70 i- if (!first) Err bitreich.org 70 i- ffdraw_line(can, &v->col, xlast, ylast, x, y); Err bitreich.org 70 i- Err bitreich.org 70 i- xlast = x; Err bitreich.org 70 i- ylast = y; Err bitreich.org 70 i- t += v->step; Err bitreich.org 70 i- first = 0; Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-void Err bitreich.org 70 i-ffplot_plot(Canvas *can, Vlist **v, Err bitreich.org 70 i- double vmin, double vmax, Err bitreich.org 70 i- time_t tmin, time_t tmax) Err bitreich.org 70 i-{ Err bitreich.org 70 i- for (; *v != NULL; v++) Err bitreich.org 70 i- ffplot_graph(can, *v, vmin, vmax, tmin, tmax); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-void Err bitreich.org 70 i-ffplot_legend(Canvas *can, Color *label_fg, Vlist **v) Err bitreich.org 70 i-{ Err bitreich.org 70 i- int n, x, y; Err bitreich.org 70 i- Err bitreich.org 70 i- for (n = 0; *v != NULL; v++, n++) { Err bitreich.org 70 i- x = LEGEND_H - n * (FONT_H + MARGIN) - FONT_H / 2; Err bitreich.org 70 i- Err bitreich.org 70 i- y = MARGIN + FONT_W; Err bitreich.org 70 i- ffdraw_str_left(can, &(*v)->col, "\1", font, x, y); Err bitreich.org 70 i- Err bitreich.org 70 i- y += FONT_W * 2; Err bitreich.org 70 i- ffdraw_str_left(can, label_fg, (*v)->name, font, x, y); Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-void Err bitreich.org 70 i-ffdraw(Canvas *can, char *title, char *units, Vlist **vlistv, Err bitreich.org 70 i- double vmin, double vmax, double vstep, Err bitreich.org 70 i- time_t tmin, time_t tmax, time_t tstep) Err bitreich.org 70 i-{ Err bitreich.org 70 i- Color plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff }; Err bitreich.org 70 i- Color grid_bg = { 0x2929, 0x2929, 0x2929, 0xffff }; Err bitreich.org 70 i- Color grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff }; Err bitreich.org 70 i- Color label_fg = { 0x8888, 0x8888, 0x8888, 0xffff }; Err bitreich.org 70 i- Color title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff }; Err bitreich.org 70 i- Err bitreich.org 70 i- can->x = 0; Err bitreich.org 70 i- can->y = 0; Err bitreich.org 70 i- ffdraw_fill(can, &plot_bg); Err bitreich.org 70 i- Err bitreich.org 70 i- can->x = PLOT_X; Err bitreich.org 70 i- can->y = PLOT_Y; Err bitreich.org 70 i- ffdraw_rectangle(can, &grid_bg, 0, 0, PLOT_H, PLOT_W); Err bitreich.org 70 i- Err bitreich.org 70 i- can->x = YLABEL_X; Err bitreich.org 70 i- can->y = YLABEL_Y; Err bitreich.org 70 i- ffplot_yaxis(can, &label_fg, &grid_fg, tmin, tmax, tstep); Err bitreich.org 70 i- Err bitreich.org 70 i- can->x = XLABEL_X; Err bitreich.org 70 i- can->y = XLABEL_Y; Err bitreich.org 70 i- ffplot_xaxis(can, &label_fg, &grid_fg, vmin, vmax, vstep); Err bitreich.org 70 i- Err bitreich.org 70 i- can->x = TITLE_X; Err bitreich.org 70 i- can->y = TITLE_Y; Err bitreich.org 70 i- ffplot_title(can, &title_fg, title, &label_fg, units); Err bitreich.org 70 i- Err bitreich.org 70 i- can->x = PLOT_X; Err bitreich.org 70 i- can->y = PLOT_Y; Err bitreich.org 70 i- ffplot_plot(can, vlistv, vmin, vmax, tmin, tmax); Err bitreich.org 70 i- Err bitreich.org 70 i- can->x = LEGEND_X; Err bitreich.org 70 i- can->y = LEGEND_Y; Err bitreich.org 70 i- ffplot_legend(can, &label_fg, vlistv); Err bitreich.org 70 i+ (void)v; Err bitreich.org 70 i+ (void)n; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-main(void) Err bitreich.org 70 i+main(int argc, char **argv) Err bitreich.org 70 i { Err bitreich.org 70 i- Canvas can = { IMAGE_W, IMAGE_H, buffer, 0, 0 }; Err bitreich.org 70 i- double v1[] = { 0.1, 30, -3, 42, 559, 343, 10, 345, 0 }; Err bitreich.org 70 i- double v2[] = { 30, -3, 42, 559, 343, 10, 345, 0, 0.3 }; Err bitreich.org 70 i- double v3[] = { 0, 0.3, 30, -3, 42, 5, 43, 345, 0, 10, Err bitreich.org 70 i- 0.3, 30, -3, 42, 59, 33, 35, 0, 40, 0.3, 30, Err bitreich.org 70 i- 0.3, 30, -3, 42, 55, 3, 5, 0, 100, 0.3, 30, Err bitreich.org 70 i- 95, 43, 45, 0, 40, 0.3, 30, 0.3, 30, -3, 42, Err bitreich.org 70 i- 0.3, 30, -3, 42, 5, 43, 3, 0, 100, 0.3, 30, Err bitreich.org 70 i- 0.3, 30, -3, 42, 59, 43, 45, 0, 4, 0.3, 30, Err bitreich.org 70 i- -3, 42, 559, 343, 45, 0, 10 }; Err bitreich.org 70 i- Vlist vl1 = { { 0x0000, 0xffff, 0xdddd, 0xffff }, NULL, LEN(v1), 500, "available ravens" }; Err bitreich.org 70 i- Vlist vl2 = { { 0xffff, 0x9999, 0x4444, 0xffff }, NULL, LEN(v2), 500, "used ravens" }; Err bitreich.org 70 i- Vlist vl3 = { { 0x1111, 0xffff, 0x5555, 0xffff }, NULL, LEN(v3), 57, "free ravens" }; Err bitreich.org 70 i- Vlist *vlistv[] = { NULL, NULL, NULL, NULL }; Err bitreich.org 70 i+ Vlist *v; Err bitreich.org 70 i double vmin, vmax, vstep; Err bitreich.org 70 i time_t tmin, tmax, tstep; Err bitreich.org 70 i- uint32_t w, h; Err bitreich.org 70 i Err bitreich.org 70 i- vlistv[0] = &vl1; vl1.v = v1; Err bitreich.org 70 i- vlistv[1] = &vl2; vl2.v = v2; Err bitreich.org 70 i- vlistv[2] = &vl3; vl3.v = v3; Err bitreich.org 70 i- vlistv[3] = NULL; Err bitreich.org 70 i+ ARGBEGIN { Err bitreich.org 70 i+ case 't': Err bitreich.org 70 i+ tflag = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'u': Err bitreich.org 70 i+ uflag = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } ARGEND; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ((v = calloc(argc, sizeof(*v))) == NULL) Err bitreich.org 70 i+ perror("calloc value list"), exit(1); Err bitreich.org 70 i Err bitreich.org 70 i vmin = -30; vmax = 700; vstep = 120; Err bitreich.org 70 i tmin = 0; tmax = 2000; tstep = 300; Err bitreich.org 70 i Err bitreich.org 70 i- ffdraw(&can, "Council of the ravens", "(feather per second)", vlistv, Err bitreich.org 70 i+ read_labels(v, argc); Err bitreich.org 70 i+ read_values(v, argc); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ffdraw(tflag, uflag, v, argc, Err bitreich.org 70 i vmin, vmax, vstep, Err bitreich.org 70 i tmin, tmax, tstep); Err bitreich.org 70 i Err bitreich.org 70 i- w = htonl(IMAGE_W); Err bitreich.org 70 i- h = htonl(IMAGE_H); Err bitreich.org 70 i- Err bitreich.org 70 i- fputs("farbfeld", stdout); Err bitreich.org 70 i- fwrite(&w, sizeof(w), 1, stdout); Err bitreich.org 70 i- fwrite(&h, sizeof(h), 1, stdout); Err bitreich.org 70 i- fwrite(can.b, IMAGE_W * IMAGE_H, sizeof(*can.b), stdout); Err bitreich.org 70 i- Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/ploot.h b/ploot.h /scm/ploot/file/ploot.h.gph bitreich.org 70 i@@ -0,0 +1,44 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#define MIN(x, y) ((x) < (y) ? (x) : (y)) Err bitreich.org 70 i+#define MAX(x, y) ((x) > (y) ? (x) : (y)) Err bitreich.org 70 i+ Err bitreich.org 70 i+typedef uint16_t Color[4]; Err bitreich.org 70 i+ Err bitreich.org 70 i+typedef struct { Err bitreich.org 70 i+ int w; /* width */ Err bitreich.org 70 i+ int h; /* height */ Err bitreich.org 70 i+ Color *b; /* buffer */ Err bitreich.org 70 i+ int x; /* x offset */ Err bitreich.org 70 i+ int y; /* x offset */ Err bitreich.org 70 i+} Canvas; Err bitreich.org 70 i+ Err bitreich.org 70 i+typedef struct { Err bitreich.org 70 i+ int w; /* width */ Err bitreich.org 70 i+ int h; /* height */ Err bitreich.org 70 i+ char *b[128]; /* buffer */ Err bitreich.org 70 i+} Font; Err bitreich.org 70 i+ Err bitreich.org 70 i+typedef struct { Err bitreich.org 70 i+ Color col; /* for drawing the curve and the legend */ Err bitreich.org 70 i+ time_t *t; /* array of timestamps */ Err bitreich.org 70 i+ double *v; /* array of values */ Err bitreich.org 70 i+ int n; /* number of values */ Err bitreich.org 70 i+ char *name; /* for the legend */ Err bitreich.org 70 i+} Vlist; Err bitreich.org 70 i+ Err bitreich.org 70 i+/* ffdraw.c */ Err bitreich.org 70 i+void ffdraw_pixel (Canvas *, Color *, int, int); Err bitreich.org 70 i+void ffdraw_rectangle(Canvas *, Color *, int, int, int, int); Err bitreich.org 70 i+void ffdraw_line (Canvas *, Color *, int, int, int, int); Err bitreich.org 70 i+void ffdraw_char (Canvas *, Color *, char, Font *, int, int); Err bitreich.org 70 i+void ffdraw_str_left(Canvas *, Color *, char *, Font *, int, int); Err bitreich.org 70 i+void ffdraw_str_center(Canvas *, Color *, char *, Font *, int, int); Err bitreich.org 70 i+void ffdraw_str_right(Canvas *, Color *, char *, Font *, int, int); Err bitreich.org 70 i+void ffdraw_fill (Canvas *, Color *); Err bitreich.org 70 i+void ffdraw_print (Canvas *); Err bitreich.org 70 i+ Err bitreich.org 70 i+/* ffplot.c */ Err bitreich.org 70 i+void ffdraw (char *, char *, Vlist *, int, double, double, Err bitreich.org 70 i+ double, time_t, time_t, time_t); Err bitreich.org 70 .