irename ploot-ff to ploot-farbfeld, to make it obvious what -ff is - 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 ffb9fc9caeaf3a79f5ab4c7fcbbf4994c1037582 /scm/ploot/commit/ffb9fc9caeaf3a79f5ab4c7fcbbf4994c1037582.gph bitreich.org 70 1parent 1c1a69494de95f4f5a3a439a16fac98026e2aa09 /scm/ploot/commit/1c1a69494de95f4f5a3a439a16fac98026e2aa09.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:me@josuah.net bitreich.org 70 iDate: Sat, 15 Feb 2020 14:52:07 +0100 Err bitreich.org 70 i Err bitreich.org 70 irename ploot-ff to ploot-farbfeld, to make it obvious what -ff is Err bitreich.org 70 i Err bitreich.org 70 iWhile very good, not everybody knows the farbfeld file format (as Err bitreich.org 70 iopposed to png), and if ploot support multiple output format, it Err bitreich.org 70 iwill end-up hard to know what extension maps to what. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M .gitignore | 2 +- Err bitreich.org 70 i M Makefile | 4 ++-- Err bitreich.org 70 i M README | 10 +++++----- Err bitreich.org 70 i M ploot-csv.7 | 2 +- Err bitreich.org 70 i A ploot-farbfeld.1 | 103 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A ploot-farbfeld.c | 467 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M ploot-feed.1 | 2 +- Err bitreich.org 70 i D ploot-ff.1 | 103 ------------------------------- Err bitreich.org 70 i D ploot-ff.c | 463 ------------------------------- Err bitreich.org 70 i Err bitreich.org 70 i9 files changed, 580 insertions(+), 576 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/.gitignore b/.gitignore /scm/ploot/file/.gitignore.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i *.o Err bitreich.org 70 i *.core Err bitreich.org 70 i-ploot-ff Err bitreich.org 70 i+ploot-farbfeld Err bitreich.org 70 i ploot-feed 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 -std=c99 -pedantic -fPIC \ Err bitreich.org 70 i -D_POSIX_C_SOURCE=200809L Err bitreich.org 70 i LFLAGS = -static Err bitreich.org 70 i-BIN = ploot-ff ploot-feed Err bitreich.org 70 i+BIN = ploot-farbfeld ploot-feed ploot-braille Err bitreich.org 70 i LIB = -lm Err bitreich.org 70 i MANDIR = $(PREFIX)/share/man Err bitreich.org 70 i Err bitreich.org 70 i@@ -15,7 +15,7 @@ ${BIN}: ${SRC:.c=.o} ${BIN:=.o} Err bitreich.org 70 i install: $(BIN) Err bitreich.org 70 i mkdir -p ${PREFIX}/bin $(MANDIR)/man1 $(MANDIR)/man7 Err bitreich.org 70 i cp $(BIN) ${PREFIX}/bin Err bitreich.org 70 i- cp ploot-ff.1 ploot-feed.1 $(MANDIR)/man1 Err bitreich.org 70 i+ cp ploot-farbfeld.1 ploot-feed.1 $(MANDIR)/man1 Err bitreich.org 70 i cp ploot-csv.7 $(MANDIR)/man7 Err bitreich.org 70 i Err bitreich.org 70 i clean: Err bitreich.org 70 1diff --git a/README b/README /scm/ploot/file/README.gph bitreich.org 70 i@@ -1,11 +1,11 @@ Err bitreich.org 70 i ploot Err bitreich.org 70 i-================================================================================ Err bitreich.org 70 i+===== Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i-ploot-ff Err bitreich.org 70 i--------------------------------------------------------------------------------- Err bitreich.org 70 i+ploot-farbfeld Err bitreich.org 70 i+-------------- Err bitreich.org 70 i Err bitreich.org 70 i-*ploot-ff* reads collectd-style comma separated values (CSV) and produces a plot Err bitreich.org 70 i+*ploot-farbfeld* reads collectd-style comma separated values (CSV) and produces a plot Err bitreich.org 70 i in the farbfeld [1] image format (pipe it to ff2png). It is an alternative to Err bitreich.org 70 i RRDtool [2]. Err bitreich.org 70 i Err bitreich.org 70 i@@ -18,7 +18,7 @@ name of the curves. Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i ploot-feed Err bitreich.org 70 i--------------------------------------------------------------------------------- Err bitreich.org 70 i+---------- Err bitreich.org 70 i Err bitreich.org 70 i *ploot-feed* also reads collectd-style comma separated values (CSV) but produces Err bitreich.org 70 i a plain text continuous waterfall chart for live monitoring in the terminal. it Err bitreich.org 70 1diff --git a/ploot-csv.7 b/ploot-csv.7 /scm/ploot/file/ploot-csv.7.gph bitreich.org 70 i@@ -62,7 +62,7 @@ The remaining columns are values parsed as floating point numbers by Err bitreich.org 70 i .Sh SEE ALSO Err bitreich.org 70 i . Err bitreich.org 70 i .Xr ploot-feed 1 , Err bitreich.org 70 i-.Xr ploot-ff 1 Err bitreich.org 70 i+.Xr ploot-farbfeld 1 Err bitreich.org 70 i . Err bitreich.org 70 i .Sh HISTORY Err bitreich.org 70 i . Err bitreich.org 70 1diff --git a/ploot-farbfeld.1 b/ploot-farbfeld.1 /scm/ploot/file/ploot-farbfeld.1.gph bitreich.org 70 i@@ -0,0 +1,103 @@ Err bitreich.org 70 i+.Dd $Mdocdate: August 08 2018$ Err bitreich.org 70 i+.Dt PLOOT-FF 1 Err bitreich.org 70 i+.Os Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh NAME Err bitreich.org 70 i+. Err bitreich.org 70 i+.Nm ploot-farbfeld Err bitreich.org 70 i+.Nd produce a farbfeld image of csv input Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh SYNOPSIS Err bitreich.org 70 i+. Err bitreich.org 70 i+.Nm ploot-farbfeld Err bitreich.org 70 i+.Op Fl t Ar title Err bitreich.org 70 i+.Op Fl u Ar unit Err bitreich.org 70 i+.Ar colors... Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh DESCRIPTION Err bitreich.org 70 i+. Err bitreich.org 70 i+The Err bitreich.org 70 i+.Nm Err bitreich.org 70 i+utility plots an image in the farbfeld format out of csv values coming from stdin. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bl -tag -width 6n Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl t Err bitreich.org 70 i+Set the title of the plot printed at the top left corner. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl u Err bitreich.org 70 i+Set the unit description printed at the top right corner. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Ar colors Err bitreich.org 70 i+List of argument that specify the color for each column. Err bitreich.org 70 i+If the input csv have 5 columns in addition of the timestamp, there must Err bitreich.org 70 i+be 5 maxval arguments. Err bitreich.org 70 i+color_ts available are red, orange, yellow, green, cyan and blue. Err bitreich.org 70 i+. Err bitreich.org 70 i+.El Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+The input format is documented in the Err bitreich.org 70 i+.Xr ploot-csv 7 Err bitreich.org 70 i+manual page. Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh EXIT STATUS Err bitreich.org 70 i+.Ex -std Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh EXAMPLES Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bd -literal -offset indent Err bitreich.org 70 i+$ cat <sample.txt Err bitreich.org 70 i+epoch,used_memory,free_memory Err bitreich.org 70 i+1533752053,160,401 Err bitreich.org 70 i+1533752054,180,381 Err bitreich.org 70 i+1533752055,301,260 Err bitreich.org 70 i+1533752056,303,258 Err bitreich.org 70 i+EOF Err bitreich.org 70 i+$ ploot-farbfeld -t demo -u MB red yellow 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+#include 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+ Err bitreich.org 70 i+#include "arg.h" Err bitreich.org 70 i+#include "log.h" Err bitreich.org 70 i+#include "def.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+#define MARGIN 4 Err bitreich.org 70 i+ Err bitreich.org 70 i+#define IMAGE_H (TITLE_H + PLOT_H + XLABEL_H) Err bitreich.org 70 i+#define IMAGE_W (YLABEL_W + PLOT_W + LEGEND_W) Err bitreich.org 70 i+ Err bitreich.org 70 i+#define TITLE_X (YLABEL_W) Err bitreich.org 70 i+#define TITLE_Y (IMAGE_H - TITLE_H) Err bitreich.org 70 i+#define TITLE_H ((font)->height * 2) Err bitreich.org 70 i+#define TITLE_W (PLOT_W) 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 (PLOT_H) Err bitreich.org 70 i+#define YLABEL_W (40 + MARGIN) 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 ((font)->height * 2) Err bitreich.org 70 i+#define XLABEL_W (PLOT_W) Err bitreich.org 70 i+ Err bitreich.org 70 i+#define PLOT_X (YLABEL_W) Err bitreich.org 70 i+#define PLOT_Y (XLABEL_H) Err bitreich.org 70 i+#define PLOT_W (700) Err bitreich.org 70 i+#define PLOT_H (160) Err bitreich.org 70 i+ Err bitreich.org 70 i+#define LEGEND_X (IMAGE_W - LEGEND_W) Err bitreich.org 70 i+#define LEGEND_Y (TITLE_H + PLOT_H - (font)->height) Err bitreich.org 70 i+#define LEGEND_W (100) Err bitreich.org 70 i+#define LEGEND_H (PLOT_H) Err bitreich.org 70 i+ Err bitreich.org 70 i+struct color { Err bitreich.org 70 i+ uint16_t red; Err bitreich.org 70 i+ uint16_t green; Err bitreich.org 70 i+ uint16_t blue; Err bitreich.org 70 i+ uint16_t alpha; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct cname { Err bitreich.org 70 i+ char *name; Err bitreich.org 70 i+ struct color color; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct canvas { Err bitreich.org 70 i+ int w; /* width */ Err bitreich.org 70 i+ int h; /* height */ Err bitreich.org 70 i+ int x; /* x offset */ Err bitreich.org 70 i+ int y; /* y offset */ Err bitreich.org 70 i+ struct color *buf; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+char const *arg0; Err bitreich.org 70 i+static char *tflag = ""; Err bitreich.org 70 i+static char *uflag = ""; Err bitreich.org 70 i+static struct font *font = &font13; Err bitreich.org 70 i+ Err bitreich.org 70 i+static struct cname cname[] = { Err bitreich.org 70 i+ /* name red green blue alpha */ Err bitreich.org 70 i+ { "red", { 0xffff, 0x4444, 0x4444, 0xffff } }, Err bitreich.org 70 i+ { "orange", { 0xffff, 0x9999, 0x4444, 0xffff } }, Err bitreich.org 70 i+ { "yellow", { 0xffff, 0xffff, 0x4444, 0xffff } }, Err bitreich.org 70 i+ { "green", { 0x2222, 0xffff, 0x5555, 0xffff } }, Err bitreich.org 70 i+ { "cyan", { 0x0000, 0xffff, 0xdddd, 0xffff } }, Err bitreich.org 70 i+ { "blue", { 0x2222, 0x9999, 0xffff, 0xffff } }, Err bitreich.org 70 i+ { NULL, { 0, 0, 0, 0 } } Err bitreich.org 70 i+}; 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+ * The buffer only contain one number, so the coordinate is a single integer: Err bitreich.org 70 i+ * width * y + y. Err bitreich.org 70 i+ * The coordinates are shifted by offx and offy to permit relative coordinates. Err bitreich.org 70 i+ * Err bitreich.org 70 i+ * The convention used: y Err bitreich.org 70 i+ * - (0,0) is at the lower left corner of the canvas. | Err bitreich.org 70 i+ * - (0,1) is above it. +--x Err bitreich.org 70 i+ */ Err bitreich.org 70 i+static void Err bitreich.org 70 i+ff_pixel(struct canvas *can, struct color *color, Err bitreich.org 70 i+ int x, int y) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ x += can->x; Err bitreich.org 70 i+ y += can->y; Err bitreich.org 70 i+ if (x < 0 || x >= can->w || y < 0 || y >= can->h) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ memcpy(can->buf + can->w * (can->h - 1 - y) + x, color, sizeof(*can->buf)); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+ff_rectangle(struct canvas *can, struct color *color, Err bitreich.org 70 i+ int y1, int x1, Err bitreich.org 70 i+ int y2, int x2) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int x, y, ymin, xmin, ymax, xmax; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ymin = MIN(y1, y2); ymax = MAX(y1, y2); Err bitreich.org 70 i+ xmin = MIN(x1, x2); xmax = MAX(x1, x2); Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (y = ymin; y <= ymax; y++) Err bitreich.org 70 i+ for (x = xmin; x <= xmax; x++) Err bitreich.org 70 i+ ff_pixel(can, color, x, y); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * From Bresenham's line algorithm and dcat's tplot. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+static void Err bitreich.org 70 i+ff_line(struct canvas *can, struct color *color, Err bitreich.org 70 i+ int x0, int y0, Err bitreich.org 70 i+ int x1, int y1) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int dy, dx, sy, sx, err, e; Err bitreich.org 70 i+ Err bitreich.org 70 i+ sx = x0 < x1 ? 1 : -1; Err bitreich.org 70 i+ sy = y0 < y1 ? 1 : -1; Err bitreich.org 70 i+ dx = abs(x1 - x0); Err bitreich.org 70 i+ dy = abs(y1 - y0); Err bitreich.org 70 i+ err = (dy > dx ? dy : -dx) / 2; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (;;) { Err bitreich.org 70 i+ ff_pixel(can, color, x0, y0); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (y0 == y1 && x0 == x1) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ Err bitreich.org 70 i+ e = err; Err bitreich.org 70 i+ if (e > -dy) { Err bitreich.org 70 i+ y0 += sy; Err bitreich.org 70 i+ err -= dx; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (e < dx) { Err bitreich.org 70 i+ x0 += sx; Err bitreich.org 70 i+ err += dy; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Draw a coloured glyph from font f centered on y. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+static int Err bitreich.org 70 i+ff_char(struct canvas *can, struct color *color, char c, Err bitreich.org 70 i+ int x, int y) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int yf, xf, wf; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (c & 0x80) Err bitreich.org 70 i+ c = '\0'; Err bitreich.org 70 i+ y -= font->height / 2; Err bitreich.org 70 i+ wf = font_width(font, c); Err bitreich.org 70 i+ for (xf = 0; xf < wf; xf++) Err bitreich.org 70 i+ for (yf = 0; yf < font->height; yf++) Err bitreich.org 70 i+ if (font->glyph[(int)c][wf * (font->height - yf) + xf] == 3) Err bitreich.org 70 i+ ff_pixel(can, color, x + xf, y + yf); Err bitreich.org 70 i+ return wf + 1; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Draw a left aligned string without wrapping it. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+static size_t Err bitreich.org 70 i+ff_text_left(struct canvas *can, struct color *color, char *s, Err bitreich.org 70 i+ int x, int y) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ for (; *s != '\0'; s++) Err bitreich.org 70 i+ x += ff_char(can, color, *s, x, y); Err bitreich.org 70 i+ return x; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Draw a center aligned string without wrapping it. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+static size_t Err bitreich.org 70 i+ff_text_center(struct canvas *can, struct color *color, char *s, Err bitreich.org 70 i+ int x, int y) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ x -= font_strlen(font, s) / 2; Err bitreich.org 70 i+ return ff_text_left(can, color, s, x, y); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Draw a right aligned string without wrapping it. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+static size_t Err bitreich.org 70 i+ff_text_right(struct canvas *can, struct color *color, char *s, Err bitreich.org 70 i+ int x, int y) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ x -= font_strlen(font, s); Err bitreich.org 70 i+ return ff_text_left(can, color, s, x, y); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+ff_print(struct 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->buf, can->w * can->h, sizeof(*can->buf), stdout); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+ff_t2x(time_t t, time_t tmin, time_t tmax) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (tmin == tmax) Err bitreich.org 70 i+ return PLOT_W; 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+ff_v2y(double v, double vmin, double vmax) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (vmin == vmax) Err bitreich.org 70 i+ return PLOT_H; 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+static void Err bitreich.org 70 i+ff_xaxis(struct canvas *can, struct color *label, struct 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 x; Err bitreich.org 70 i+ char str[sizeof("MM/DD HH/MM")], *fmt; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (tstep < 3600 * 12) Err bitreich.org 70 i+ fmt = "%H:%M:%S"; Err bitreich.org 70 i+ else if (tstep < 3600 * 24) Err bitreich.org 70 i+ fmt = "%m/%d %H:%M"; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ fmt = "%X/%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+ x = ff_t2x(t, tmin, tmax); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ff_line(can, grid, Err bitreich.org 70 i+ x, XLABEL_H, Err bitreich.org 70 i+ x, XLABEL_H + PLOT_H); Err bitreich.org 70 i+ Err bitreich.org 70 i+ strftime(str, sizeof(str), fmt, localtime(&t)); Err bitreich.org 70 i+ ff_text_center(can, label, str, Err bitreich.org 70 i+ x, XLABEL_H / 2); 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+ff_yaxis(struct canvas *can, struct color *label, struct 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 y; 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+ y = ff_v2y(v, vmin, vmax); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ff_line(can, grid, Err bitreich.org 70 i+ YLABEL_W, y, Err bitreich.org 70 i+ YLABEL_W + PLOT_W, y); Err bitreich.org 70 i+ Err bitreich.org 70 i+ humanize(str, v); Err bitreich.org 70 i+ ff_text_right(can, label, str, Err bitreich.org 70 i+ YLABEL_W - MARGIN, 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+ff_title(struct canvas *can, Err bitreich.org 70 i+ struct color *ct, char *title, Err bitreich.org 70 i+ struct color *cu, char *unit) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ ff_text_left(can, ct, title, TITLE_H / 2, 0); Err bitreich.org 70 i+ ff_text_right(can, cu, unit, 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+ff_plot(struct canvas *can, struct vlist *vl, struct color *color, 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, ylast, xlast, first; Err bitreich.org 70 i+ Err bitreich.org 70 i+ first = 1; Err bitreich.org 70 i+ for (tp = vl->t, vp = vl->v, n = vl->n; n > 0; n--, vp++, tp++) { Err bitreich.org 70 i+ y = ff_v2y(*vp, vmin, vmax); Err bitreich.org 70 i+ x = ff_t2x(*tp, tmin, tmax); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!first) Err bitreich.org 70 i+ ff_line(can, color, xlast, ylast, x, y); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ylast = y; Err bitreich.org 70 i+ xlast = x; 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+ff_values(struct canvas *can, struct vlist *vl, struct color **cl, size_t ncol, Err bitreich.org 70 i+ time_t tmin, time_t tmax, Err bitreich.org 70 i+ double vmin, double vmax) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ for (; ncol > 0; ncol--, vl++, cl++) Err bitreich.org 70 i+ ff_plot(can, vl, *cl, 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+ff_legend(struct canvas *can, struct color *fg, struct vlist *vl, struct color **cl, size_t ncol) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t x, y; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (; ncol > 0; ncol--, vl++, cl++) { Err bitreich.org 70 i+ y = -(ncol - 1) * (font->height + MARGIN); Err bitreich.org 70 i+ x = MARGIN * 2; Err bitreich.org 70 i+ x = ff_text_left(can, *cl, "-", x, y) + MARGIN; Err bitreich.org 70 i+ x = ff_text_left(can, fg, vl->label, x, y); Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Plot the 'n' values list of the 'v' arrax with title 'name' and Err bitreich.org 70 i+ * 'units' label. Err bitreich.org 70 i+ * Err bitreich.org 70 i+ * Title (units) Err bitreich.org 70 i+ * x ^ 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+static void Err bitreich.org 70 i+ff(struct vlist *vl, struct color **cl, size_t ncol, char *name, char *units) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct canvas can = { IMAGE_W, IMAGE_H, 0, 0, NULL }; Err bitreich.org 70 i+ struct color plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff }; Err bitreich.org 70 i+ struct color grid_bg = { 0x2929, 0x2929, 0x2929, 0xffff }; Err bitreich.org 70 i+ struct color grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff }; Err bitreich.org 70 i+ struct color label_fg = { 0x8888, 0x8888, 0x8888, 0xffff }; Err bitreich.org 70 i+ struct color title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff }; Err bitreich.org 70 i+ double vmin, vmax, vstep; Err bitreich.org 70 i+ time_t tmin, tmax, tstep; Err bitreich.org 70 i+ Err bitreich.org 70 i+ scale(vl, ncol, &tmin, &tmax, &tstep, &vmin, &vmax, &vstep); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(can.buf = calloc(IMAGE_H * IMAGE_W, sizeof *can.buf)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ can.y = 0; Err bitreich.org 70 i+ can.x = 0; Err bitreich.org 70 i+ ff_rectangle(&can, &plot_bg, 0, 0, IMAGE_H - 1, IMAGE_W - 1); 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+ ff_rectangle(&can, &grid_bg, 0, 0, PLOT_H, PLOT_W); 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+ ff_xaxis(&can, &label_fg, &grid_fg, tmin, tmax, tstep); 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+ ff_yaxis(&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+ ff_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+ ff_values(&can, vl, cl, ncol, tmin, tmax, vmin, vmax); 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+ ff_legend(&can, &label_fg, vl, cl, ncol); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ff_print(&can); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static struct color * Err bitreich.org 70 i+name_to_color(char *name) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct cname *cn; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (cn = cname; cn->name != NULL; cn++) Err bitreich.org 70 i+ if (strcmp(name, cn->name) == 0) Err bitreich.org 70 i+ return &cn->color; Err bitreich.org 70 i+ return NULL; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+argv_to_color(struct color **cl, char **argv) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ for (; *argv != NULL; cl++, argv++) Err bitreich.org 70 i+ if ((*cl = name_to_color(*argv)) == NULL) Err bitreich.org 70 i+ err(1, "unknown color name: %s", *argv); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+usage(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-t title] [-u unit] {", arg0); Err bitreich.org 70 i+ fputs(cname->name, stderr); Err bitreich.org 70 i+ for (struct cname *cn = cname + 1; cn->name != NULL; cn++) Err bitreich.org 70 i+ fprintf(stderr, ",%s", cn->name); Err bitreich.org 70 i+ fputs("}...\n", stderr); Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+main(int argc, char **argv) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct vlist *vl; Err bitreich.org 70 i+ struct color **cl; Err bitreich.org 70 i+ char labels[LINE_MAX]; Err bitreich.org 70 i+ size_t ncol; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ARG_SWITCH(argc, argv) { Err bitreich.org 70 i+ case 't': Err bitreich.org 70 i+ tflag = ARG; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'u': Err bitreich.org 70 i+ uflag = ARG; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (argc == 0) Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(cl = calloc(argc, sizeof(*cl))); Err bitreich.org 70 i+ Err bitreich.org 70 i+ csv_labels(stdin, labels, &vl, &ncol); Err bitreich.org 70 i+ if (ncol > (size_t)argc) Err bitreich.org 70 i+ err(1, "too many columns or not enough arguments"); Err bitreich.org 70 i+ else if (ncol < (size_t)argc) Err bitreich.org 70 i+ err(1, "too many arguments or not enough columns"); Err bitreich.org 70 i+ csv_values(stdin, vl, ncol); Err bitreich.org 70 i+ argv_to_color(cl, argv); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ff(vl, cl, argc, tflag, uflag); Err bitreich.org 70 i+ Err bitreich.org 70 i+ free(vl); Err bitreich.org 70 i+ free(cl); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/ploot-feed.1 b/ploot-feed.1 /scm/ploot/file/ploot-feed.1.gph bitreich.org 70 i@@ -60,7 +60,7 @@ $ ploot-feed -w 80 1 1 sample.txt Err bitreich.org 70 i-epoch,used_memory,free_memory Err bitreich.org 70 i-1533752053,160,401 Err bitreich.org 70 i-1533752054,180,381 Err bitreich.org 70 i-1533752055,301,260 Err bitreich.org 70 i-1533752056,303,258 Err bitreich.org 70 i-EOF Err bitreich.org 70 i-$ ploot-ff -t demo -u MB red yellow 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-#include 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- Err bitreich.org 70 i-#include "arg.h" Err bitreich.org 70 i-#include "log.h" Err bitreich.org 70 i-#include "def.h" Err bitreich.org 70 i- Err bitreich.org 70 i-#define MARGIN 4 Err bitreich.org 70 i- Err bitreich.org 70 i-#define IMAGE_H (TITLE_H + PLOT_H + XLABEL_H) Err bitreich.org 70 i-#define IMAGE_W (YLABEL_W + PLOT_W + LEGEND_W) Err bitreich.org 70 i- Err bitreich.org 70 i-#define TITLE_X (YLABEL_W) Err bitreich.org 70 i-#define TITLE_Y (IMAGE_H - TITLE_H) Err bitreich.org 70 i-#define TITLE_H ((font)->height * 2) Err bitreich.org 70 i-#define TITLE_W (PLOT_W) 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 (PLOT_H) Err bitreich.org 70 i-#define YLABEL_W (40 + MARGIN) 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 ((font)->height * 2) Err bitreich.org 70 i-#define XLABEL_W (PLOT_W) Err bitreich.org 70 i- Err bitreich.org 70 i-#define PLOT_X (YLABEL_W) Err bitreich.org 70 i-#define PLOT_Y (XLABEL_H) Err bitreich.org 70 i-#define PLOT_W (700) Err bitreich.org 70 i-#define PLOT_H (160) Err bitreich.org 70 i- Err bitreich.org 70 i-#define LEGEND_X (IMAGE_W - LEGEND_W) Err bitreich.org 70 i-#define LEGEND_Y (TITLE_H + PLOT_H - (font)->height) Err bitreich.org 70 i-#define LEGEND_W (100) Err bitreich.org 70 i-#define LEGEND_H (PLOT_H) Err bitreich.org 70 i- Err bitreich.org 70 i-struct color { Err bitreich.org 70 i- uint16_t red; Err bitreich.org 70 i- uint16_t green; Err bitreich.org 70 i- uint16_t blue; Err bitreich.org 70 i- uint16_t alpha; Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i-struct cname { Err bitreich.org 70 i- char *name; Err bitreich.org 70 i- struct color color; Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i-struct canvas { Err bitreich.org 70 i- int w; /* width */ Err bitreich.org 70 i- int h; /* height */ Err bitreich.org 70 i- int x; /* x offset */ Err bitreich.org 70 i- int y; /* y offset */ Err bitreich.org 70 i- struct color *buf; Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i-char const *arg0; Err bitreich.org 70 i-static char *tflag = ""; Err bitreich.org 70 i-static char *uflag = ""; Err bitreich.org 70 i-static struct font *font = &font13; Err bitreich.org 70 i- Err bitreich.org 70 i-static struct cname cname[] = { Err bitreich.org 70 i- /* name red green blue alpha */ Err bitreich.org 70 i- { "red", { 0xffff, 0x4444, 0x4444, 0xffff } }, Err bitreich.org 70 i- { "orange", { 0xffff, 0x9999, 0x4444, 0xffff } }, Err bitreich.org 70 i- { "yellow", { 0xffff, 0xffff, 0x4444, 0xffff } }, Err bitreich.org 70 i- { "green", { 0x2222, 0xffff, 0x5555, 0xffff } }, Err bitreich.org 70 i- { "cyan", { 0x0000, 0xffff, 0xdddd, 0xffff } }, Err bitreich.org 70 i- { "blue", { 0x2222, 0x9999, 0xffff, 0xffff } }, Err bitreich.org 70 i- { NULL, { 0, 0, 0, 0 } } Err bitreich.org 70 i-}; 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- * The buffer only contain one number, so the coordinate is a single integer: Err bitreich.org 70 i- * width * y + y. Err bitreich.org 70 i- * The coordinates are shifted by offx and offy to permit relative coordinates. Err bitreich.org 70 i- * Err bitreich.org 70 i- * The convention used: y Err bitreich.org 70 i- * - (0,0) is at the lower left corner of the canvas. | Err bitreich.org 70 i- * - (0,1) is above it. +--x Err bitreich.org 70 i- */ Err bitreich.org 70 i-static void Err bitreich.org 70 i-ff_pixel(struct canvas *can, struct color *color, Err bitreich.org 70 i- int x, int y) Err bitreich.org 70 i-{ Err bitreich.org 70 i- x += can->x; Err bitreich.org 70 i- y += can->y; Err bitreich.org 70 i- if (x < 0 || x >= can->w || y < 0 || y >= can->h) Err bitreich.org 70 i- return; Err bitreich.org 70 i- memcpy(can->buf + can->w * (can->h - 1 - y) + x, color, sizeof(*can->buf)); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-ff_rectangle(struct canvas *can, struct color *color, Err bitreich.org 70 i- int y1, int x1, Err bitreich.org 70 i- int y2, int x2) Err bitreich.org 70 i-{ Err bitreich.org 70 i- int x, y, ymin, xmin, ymax, xmax; Err bitreich.org 70 i- Err bitreich.org 70 i- ymin = MIN(y1, y2); ymax = MAX(y1, y2); Err bitreich.org 70 i- xmin = MIN(x1, x2); xmax = MAX(x1, x2); Err bitreich.org 70 i- Err bitreich.org 70 i- for (y = ymin; y <= ymax; y++) Err bitreich.org 70 i- for (x = xmin; x <= xmax; x++) Err bitreich.org 70 i- ff_pixel(can, color, x, y); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-/* Err bitreich.org 70 i- * From Bresenham's line algorithm and dcat's tplot. Err bitreich.org 70 i- */ Err bitreich.org 70 i-static void Err bitreich.org 70 i-ff_line(struct canvas *can, struct color *color, Err bitreich.org 70 i- int x0, int y0, Err bitreich.org 70 i- int x1, int y1) Err bitreich.org 70 i-{ Err bitreich.org 70 i- int dy, dx, sy, sx, err, e; Err bitreich.org 70 i- Err bitreich.org 70 i- sx = x0 < x1 ? 1 : -1; Err bitreich.org 70 i- sy = y0 < y1 ? 1 : -1; Err bitreich.org 70 i- dx = abs(x1 - x0); Err bitreich.org 70 i- dy = abs(y1 - y0); Err bitreich.org 70 i- err = (dy > dx ? dy : -dx) / 2; Err bitreich.org 70 i- Err bitreich.org 70 i- for (;;) { Err bitreich.org 70 i- ff_pixel(can, color, x0, y0); Err bitreich.org 70 i- Err bitreich.org 70 i- if (y0 == y1 && x0 == x1) Err bitreich.org 70 i- break; Err bitreich.org 70 i- Err bitreich.org 70 i- e = err; Err bitreich.org 70 i- if (e > -dy) { Err bitreich.org 70 i- y0 += sy; Err bitreich.org 70 i- err -= dx; Err bitreich.org 70 i- } Err bitreich.org 70 i- if (e < dx) { Err bitreich.org 70 i- x0 += sx; Err bitreich.org 70 i- err += dy; Err bitreich.org 70 i- } Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Draw a coloured glyph from font f centered on y. Err bitreich.org 70 i- */ Err bitreich.org 70 i-static int Err bitreich.org 70 i-ff_char(struct canvas *can, struct color *color, char c, Err bitreich.org 70 i- int x, int y) Err bitreich.org 70 i-{ Err bitreich.org 70 i- int yf, xf, wf; Err bitreich.org 70 i- Err bitreich.org 70 i- if (c & 0x80) Err bitreich.org 70 i- c = '\0'; Err bitreich.org 70 i- y -= font->height / 2; Err bitreich.org 70 i- wf = font_width(font, c); Err bitreich.org 70 i- for (xf = 0; xf < wf; xf++) Err bitreich.org 70 i- for (yf = 0; yf < font->height; yf++) Err bitreich.org 70 i- if (font->glyph[(int)c][wf * (font->height - yf) + xf] == 3) Err bitreich.org 70 i- ff_pixel(can, color, x + xf, y + yf); Err bitreich.org 70 i- return wf + 1; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Draw a left aligned string without wrapping it. Err bitreich.org 70 i- */ Err bitreich.org 70 i-static size_t Err bitreich.org 70 i-ff_text_left(struct canvas *can, struct color *color, char *s, Err bitreich.org 70 i- int x, int y) Err bitreich.org 70 i-{ Err bitreich.org 70 i- for (; *s != '\0'; s++) Err bitreich.org 70 i- x += ff_char(can, color, *s, x, y); Err bitreich.org 70 i- return x; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Draw a center aligned string without wrapping it. Err bitreich.org 70 i- */ Err bitreich.org 70 i-static size_t Err bitreich.org 70 i-ff_text_center(struct canvas *can, struct color *color, char *s, Err bitreich.org 70 i- int x, int y) Err bitreich.org 70 i-{ Err bitreich.org 70 i- x -= font_strlen(font, s) / 2; Err bitreich.org 70 i- return ff_text_left(can, color, s, x, y); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Draw a right aligned string without wrapping it. Err bitreich.org 70 i- */ Err bitreich.org 70 i-static size_t Err bitreich.org 70 i-ff_text_right(struct canvas *can, struct color *color, char *s, Err bitreich.org 70 i- int x, int y) Err bitreich.org 70 i-{ Err bitreich.org 70 i- x -= font_strlen(font, s); Err bitreich.org 70 i- return ff_text_left(can, color, s, x, y); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-ff_print(struct 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->buf, can->w * can->h, sizeof(*can->buf), stdout); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static int Err bitreich.org 70 i-ff_t2x(time_t t, time_t tmin, time_t tmax) Err bitreich.org 70 i-{ Err bitreich.org 70 i- if (tmin == tmax) Err bitreich.org 70 i- return PLOT_W; 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-ff_v2y(double v, double vmin, double vmax) Err bitreich.org 70 i-{ Err bitreich.org 70 i- if (vmin == vmax) Err bitreich.org 70 i- return PLOT_H; 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-static void Err bitreich.org 70 i-ff_xaxis(struct canvas *can, struct color *label, struct 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 x; Err bitreich.org 70 i- char str[sizeof("MM/DD HH/MM")], *fmt; Err bitreich.org 70 i- Err bitreich.org 70 i- if (tstep < 3600 * 12) Err bitreich.org 70 i- fmt = "%H:%M:%S"; Err bitreich.org 70 i- else if (tstep < 3600 * 24) Err bitreich.org 70 i- fmt = "%m/%d %H:%M"; Err bitreich.org 70 i- else Err bitreich.org 70 i- fmt = "%X/%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- x = ff_t2x(t, tmin, tmax); Err bitreich.org 70 i- Err bitreich.org 70 i- ff_line(can, grid, Err bitreich.org 70 i- x, XLABEL_H, Err bitreich.org 70 i- x, XLABEL_H + PLOT_H); Err bitreich.org 70 i- Err bitreich.org 70 i- strftime(str, sizeof(str), fmt, localtime(&t)); Err bitreich.org 70 i- ff_text_center(can, label, str, Err bitreich.org 70 i- x, XLABEL_H / 2); 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-ff_yaxis(struct canvas *can, struct color *label, struct 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 y; 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- y = ff_v2y(v, vmin, vmax); Err bitreich.org 70 i- Err bitreich.org 70 i- ff_line(can, grid, Err bitreich.org 70 i- YLABEL_W, y, Err bitreich.org 70 i- YLABEL_W + PLOT_W, y); Err bitreich.org 70 i- Err bitreich.org 70 i- humanize(str, v); Err bitreich.org 70 i- ff_text_right(can, label, str, Err bitreich.org 70 i- YLABEL_W - MARGIN, 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-ff_title(struct canvas *can, Err bitreich.org 70 i- struct color *ct, char *title, Err bitreich.org 70 i- struct color *cu, char *unit) Err bitreich.org 70 i-{ Err bitreich.org 70 i- ff_text_left(can, ct, title, TITLE_H / 2, 0); Err bitreich.org 70 i- ff_text_right(can, cu, unit, 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-ff_plot(struct canvas *can, struct vlist *vl, struct color *color, 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, ylast, xlast, first; Err bitreich.org 70 i- Err bitreich.org 70 i- first = 1; Err bitreich.org 70 i- for (tp = vl->t, vp = vl->v, n = vl->n; n > 0; n--, vp++, tp++) { Err bitreich.org 70 i- y = ff_v2y(*vp, vmin, vmax); Err bitreich.org 70 i- x = ff_t2x(*tp, tmin, tmax); Err bitreich.org 70 i- Err bitreich.org 70 i- if (!first) Err bitreich.org 70 i- ff_line(can, color, xlast, ylast, x, y); Err bitreich.org 70 i- Err bitreich.org 70 i- ylast = y; Err bitreich.org 70 i- xlast = x; 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-ff_values(struct canvas *can, struct vlist *vl, struct color **cl, size_t ncol, Err bitreich.org 70 i- time_t tmin, time_t tmax, Err bitreich.org 70 i- double vmin, double vmax) Err bitreich.org 70 i-{ Err bitreich.org 70 i- for (; ncol > 0; ncol--, vl++, cl++) Err bitreich.org 70 i- ff_plot(can, vl, *cl, 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-ff_legend(struct canvas *can, struct color *fg, struct vlist *vl, struct color **cl, size_t ncol) Err bitreich.org 70 i-{ Err bitreich.org 70 i- size_t i, x, y; Err bitreich.org 70 i- Err bitreich.org 70 i- for (i = 0; i < ncol; i++, vl++, cl++) { Err bitreich.org 70 i- x = MARGIN * 2; Err bitreich.org 70 i- x = ff_text_left(can, *cl, "\1", x, y) + MARGIN; Err bitreich.org 70 i- x = ff_text_left(can, fg, vl->label, x, y); Err bitreich.org 70 i- y = LEGEND_H - i * (font->height + MARGIN); Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Plot the 'n' values list of the 'v' arrax with title 'name' and Err bitreich.org 70 i- * 'units' label. Err bitreich.org 70 i- * Err bitreich.org 70 i- * Title (units) Err bitreich.org 70 i- * x ^ 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-static void Err bitreich.org 70 i-ff(struct vlist *vl, struct color **cl, size_t ncol, char *name, char *units) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct canvas can = { IMAGE_W, IMAGE_H, 0, 0, NULL }; Err bitreich.org 70 i- struct color plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff }; Err bitreich.org 70 i- struct color grid_bg = { 0x2929, 0x2929, 0x2929, 0xffff }; Err bitreich.org 70 i- struct color grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff }; Err bitreich.org 70 i- struct color label_fg = { 0x8888, 0x8888, 0x8888, 0xffff }; Err bitreich.org 70 i- struct color title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff }; Err bitreich.org 70 i- double vmin, vmax, vstep; Err bitreich.org 70 i- time_t tmin, tmax, tstep; Err bitreich.org 70 i- Err bitreich.org 70 i- scale(vl, ncol, &tmin, &tmax, &tstep, &vmin, &vmax, &vstep); Err bitreich.org 70 i- Err bitreich.org 70 i- assert(can.buf = calloc(IMAGE_H * IMAGE_W, sizeof *can.buf)); Err bitreich.org 70 i- Err bitreich.org 70 i- can.y = 0; Err bitreich.org 70 i- can.x = 0; Err bitreich.org 70 i- ff_rectangle(&can, &plot_bg, 0, 0, IMAGE_H - 1, IMAGE_W - 1); 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- ff_rectangle(&can, &grid_bg, 0, 0, PLOT_H, PLOT_W); 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- ff_xaxis(&can, &label_fg, &grid_fg, tmin, tmax, tstep); 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- ff_yaxis(&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- ff_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- ff_values(&can, vl, cl, ncol, tmin, tmax, vmin, vmax); 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- ff_legend(&can, &label_fg, vl, cl, ncol); Err bitreich.org 70 i- Err bitreich.org 70 i- ff_print(&can); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static struct color * Err bitreich.org 70 i-name_to_color(char *name) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct cname *cn; Err bitreich.org 70 i- Err bitreich.org 70 i- for (cn = cname; cn->name != NULL; cn++) Err bitreich.org 70 i- if (strcmp(name, cn->name) == 0) Err bitreich.org 70 i- return &cn->color; Err bitreich.org 70 i- return NULL; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-argv_to_color(struct color **cl, char **argv) Err bitreich.org 70 i-{ Err bitreich.org 70 i- for (; *argv != NULL; cl++, argv++) Err bitreich.org 70 i- if ((*cl = name_to_color(*argv)) == NULL) Err bitreich.org 70 i- err(1, "unknown color name: %s", *argv); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-usage(void) Err bitreich.org 70 i-{ Err bitreich.org 70 i- fprintf(stderr, "usage: %s [-t title] [-u unit] {", arg0); Err bitreich.org 70 i- fputs(cname->name, stderr); Err bitreich.org 70 i- for (struct cname *cn = cname + 1; cn->name != NULL; cn++) Err bitreich.org 70 i- fprintf(stderr, ",%s", cn->name); Err bitreich.org 70 i- fputs("}...\n", stderr); Err bitreich.org 70 i- exit(1); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-int Err bitreich.org 70 i-main(int argc, char **argv) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct vlist *vl; Err bitreich.org 70 i- struct color **cl; Err bitreich.org 70 i- char labels[LINE_MAX]; Err bitreich.org 70 i- Err bitreich.org 70 i- ARG_SWITCH(argc, argv) { Err bitreich.org 70 i- case 't': Err bitreich.org 70 i- tflag = ARG; Err bitreich.org 70 i- break; Err bitreich.org 70 i- case 'u': Err bitreich.org 70 i- uflag = ARG; Err bitreich.org 70 i- break; Err bitreich.org 70 i- default: Err bitreich.org 70 i- usage(); Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- if (argc == 0) Err bitreich.org 70 i- usage(); Err bitreich.org 70 i- Err bitreich.org 70 i- assert(vl = calloc(argc, sizeof(*vl))); Err bitreich.org 70 i- assert(cl = calloc(argc, sizeof(*cl))); Err bitreich.org 70 i- Err bitreich.org 70 i- csv_labels(vl, argv, labels); Err bitreich.org 70 i- csv_values(vl, argc); Err bitreich.org 70 i- argv_to_color(cl, argv); Err bitreich.org 70 i- Err bitreich.org 70 i- ff(vl, cl, argc, tflag, uflag); Err bitreich.org 70 i- Err bitreich.org 70 i- free(vl); Err bitreich.org 70 i- free(cl); Err bitreich.org 70 i- return 0; Err bitreich.org 70 i-} Err bitreich.org 70 .