SMOLNET PORTAL home about changes
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 <mail@josuah.net>	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 <arpa/inet.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i #include <stdint.h>	Err	bitreich.org	70
i #include <string.h>	Err	bitreich.org	70
i #include <stdlib.h>	Err	bitreich.org	70
i+#include <stdio.h>	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 <time.h>	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 <math.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <time.h>	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 <stddef.h>	Err	bitreich.org	70
i #include <stdint.h>	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 <arpa/inet.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <stdlib.h>	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i #include <time.h>	Err	bitreich.org	70
i+#include <stdlib.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <fcntl.h>	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-#include <math.h>	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 <time.h>	Err	bitreich.org	70
i+#include <stdint.h>	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
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/ploot/commit/522bbe841ea86e23...
Content-Typetext/plain; charset=utf-8