Introduction
Introduction Statistics Contact Development Disclaimer Help
refactor: unify into one file per program - ploot - simple plotting tools
git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65…
Log
Files
Refs
Tags
README
LICENSE
---
commit ecbd21a496446ea895412dc2c98c803173828520
parent c385adf172be43bfa1d8e0d2e5fcd6bc8ea2477d
Author: Josuah Demangeon <[email protected]>
Date: Tue, 12 Jun 2018 02:24:39 +0200
refactor: unify into one file per program
rename programs ploot* into ploot-* to build a toolset reading the
same format with eventually a REPL driver called "ploot".
Diffstat:
M .gitignore | 4 ++--
M Makefile | 41 ++++++++++++++++-------------…
M README | 120 ++++++++++++++++-------------…
D config.h | 8 --------
D ffdraw.c | 164 -----------------------------…
D ffplot.c | 316 -----------------------------…
M font.h | 1723 +++++++++++++++++++++++++++++…
D font_14x7.c | 1639 ------------------------------
D font_14x7.h | 1 -
A ploot-feed.c | 236 +++++++++++++++++++++++++++++…
A ploot-ff.c | 640 +++++++++++++++++++++++++++++…
D ploot.1 | 94 -----------------------------…
D ploot.c | 154 -----------------------------…
D ploot.h | 49 -----------------------------…
D plootxt.c | 247 -----------------------------…
M util.c | 35 +++++++++++++++++++++++++++++…
M util.h | 10 ++++++----
17 files changed, 2676 insertions(+), 2805 deletions(-)
---
diff --git a/.gitignore b/.gitignore
@@ -1,4 +1,4 @@
*.o
*.core
-ploot
-plootxt
+ploot-ff
+ploot-feed
diff --git a/Makefile b/Makefile
@@ -1,32 +1,33 @@
-CFLAGS = -Wall -Wextra -Werror -std=c89 -pedantic -fPIC \
- -D_POSIX_C_SOURCE=200809L
-LDFLAGS = -static
+CFLAGS = -Wall -Wextra -Werror -std=c89 -pedantic -fPIC \
+ -D_POSIX_C_SOURCE=200809L
+LDFLAGS = -static
+BIN = ploot-ff ploot-feed
+LIB = -lm
-PLOOT_SRC = ploot.c ffplot.c ffdraw.c font_14x7.c util.c
-PLOOT_OBJ = $(PLOOT_SRC:.c=.o)
+SRC_PLOOT_FF = util.c ploot-ff.c
+HDR_PLOOT_FF = arg.h util.h font.h
+OBJ_PLOOT_FF = $(SRC_PLOOT_FF:.c=.o)
-PLOOTXT_SRC = plootxt.c util.c
-PLOOTXT_OBJ = $(PLOOTXT_SRC:.c=.o)
+SRC_PLOOT_FEED = util.c ploot-feed.c
+HDR_PLOOT_FEED = arg.h util.h
+OBJ_PLOOT_FEED = $(SRC_PLOOT_FEED:.c=.o)
+all: $(BIN)
-LIB = -lm
+ploot-ff: $(OBJ_PLOOT_FF)
+ ${CC} $(LDFLAGS) -o $@ $(OBJ_PLOOT_FF) $(LIB)
-all:V ploot plootxt
+ploot-feed: $(OBJ_PLOOT_FEED)
+ ${CC} $(LDFLAGS) -o $@ $(OBJ_PLOOT_FEED) $(LIB)
-ploot: $(PLOOT_OBJ)
- ${CC} $(LDFLAGS) -o $@ $(PLOOT_OBJ) $(LIB)
-
-plootxt: $(PLOOTXT_OBJ)
- ${CC} $(LDFLAGS) -o $@ $(PLOOTXT_OBJ) $(LIB)
-
-install:V ploot plootxt
+install: $(BIN)
mkdir -p ${PREFIX}/bin
cp ploot plootxt ${PREFIX}/bin
-clean:V
+clean:
rm -f *.o
-V: # :V acts like .PHONY:
+.PHONY: all install clean
-$(PLOOT_SRC) $(PLOOTXT_SRC): \
-arg.h ploot.h util.h font.h font_14x7.h
+$(SRC_PLOOT_FF): $(HDR_PLOOT_FF)
+$(SRC_PLOOT_FEED): $(HDR_PLOOT_FEED)
diff --git a/README b/README
@@ -1,60 +1,60 @@
-PLOOT(1) General Commands Manual PLOOT(1)
-
-NAME
- ploot – plain text plotting tool
-
-SYNOPSIS
- ploot [-h height] [-o offset] [-t title]
-
-DESCRIPTION
- The ploot utility reads decimal values from stdin and print a plain text
- graph of the values to stdout. The values are separated by blanks or
- newlines, and can be either a plain list or a time serie (if the -o flag
- is set)
-
- -h height
- Sets the height of the plot in characters.
-
- -o offset
- Read data as time series: the input alternates UNIX epoch and
- value to be plotted. The time stamps are assumed to be at an
- interval of offset.
-
- -t title
- Print title centered at the bottom of the graph.
-
-EXIT STATUS
- The ploot utility exits 0 on success, and >0 if an error occurs.
-
-EXAMPLES
- % awk 'BEGIN { for (i=0; i<60; i++) print sin(i/3)+1 }' | ploot -h 10 -t …
-
- | .... .... ....
- 1.5963 -| ::::::. ::::::. .:::::: .:
- |.::::::::. .::::::::. .::::::::. .::
- 0.7982 -|::::::::::: .::::::::::. .::::::::::. ::::
- |::::::::::::. ::::::::::::::. .:::::::::::::: .:::::
- 0 -+------------------------------------------------------------
- List
-
- % ploot -h 8 -o 200 -t 'Time series'
- 1518780448 12 1518780643 13 1518780848 31 1518781028 19 1518781291 23
- 1518781423 20 1518781687 10 1518781819 13 1518782215 22 1518782412 11
- 1518782632 18 1518782822 11 1518783039 16 1518783235 21 1518783499 21
- 1518786629 30 1518786812 28 1518787012 11 1518787202 11 1518787433 11
- 1518787629 10 1518788042 16 1518788333 29 1518788494 26 1518788633 12
- 1518788821 28 1518789072 11 1518789201 11 1518789421 11 1518789630 11
-
- 31.000 -| : .. . .
- | : .. . .. :: :: :
- 15.500 -|..:::: . : : ::: :: :::.:
- |:::::::: ::::::: :::::: :::::::::
- 0 -+--------x-------xxxxxxxxxxxxxxx------x---------
- 12:27 12:50 13:14 13:37 14:00 14:24 14:47
- 2018/02/16 2018/02/16
- Time series
-
- The ‘x’ symbols on the horizontal axis represent a lack of data for t…
- interval.
-
-Void Linux February 15, 2018 Void Linux
+ploot
+==============================================================================…
+
+
+ploot-ff
+------------------------------------------------------------------------------…
+
+*ploot-ff* reads collectd-style comma separated values (CSV) and produces a pl…
+in the farbfeld [1] image format (pipe it to ff2png). It is an alternative to
+RRDtool [2].
+
+It is targetting at generating monitoring graph, and it always read unix
+timestamp as first column on standard input. The first line determines the
+name of the curves.
+
+[1]: https://tools.suckless.org/farbfeld/
+[2]: https://oss.oetiker.ch/rrdtool/
+
+
+ploot-feed
+------------------------------------------------------------------------------…
+
+*ploot-feed* also reads collectd-style comma separated values (CSV) but produc…
+a plain text continuous waterfall chart for live monitoring in the terminal. it
+is an alternative to grafana [1].
+
+ % plootxt 1 1 1 <load-average.csv
+
+ │shortterm │midterm │longterm …
+ 17:34:00 _│⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 18/05/01 │⣟⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ │⣛⣂⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 20:34:00 _│⣧⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 18/05/01 │⣧⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ │⣟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 23:34:00 _│⣿⡒⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 18/05/01 │⡧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ │⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 05:44:41 _│⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 18/05/02 │⣛⣁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ │⣷⠶⠶⠶⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 08:44:41 _│⡗⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 18/05/02 │⡯⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ │⠗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 11:44:41 _│⠗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 18/05/02 │⡿⠶⠒⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ │⠖⠒⠒⠒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 14:44:41 _│⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 18/05/02 │⣿⠟⠓⠒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ │⣿⠤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 17:44:41 _│⡟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 18/05/02 │⣭⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ │⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 20:51:38 _│⣶⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 18/05/02 │⣿⣷⣶⣶⣶⣶⣶⠖⠒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ │shortterm │midterm │longterm …
+ 22:51:38 _│⣿⣿⣿⣟⣛⡋⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+ 18/05/02 │⣿⡿⠍⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀…
+
+[1]: https://grafana.com/
diff --git a/config.h b/config.h
@@ -1,8 +0,0 @@
-ColorList colorlist[] = {
- { "red", { 0xffff, 0x4444, 0x4444, 0xffff } },
- { "orange", { 0xffff, 0x9999, 0x4444, 0xffff } },
- { "yellow", { 0xffff, 0xffff, 0x4444, 0xffff } },
- { "green", { 0x1111, 0xffff, 0x5555, 0xffff } },
- { "cyan", { 0x0000, 0xffff, 0xdddd, 0xffff } },
- { NULL, { 0, 0, 0, 0 } }
-};
diff --git a/ffdraw.c b/ffdraw.c
@@ -1,164 +0,0 @@
-/*
- * Render bitmapped font as a farbfeld image
- *
- * The convention used: y
- * - (0,0) is at the lower left corner of the canvas. |
- * - (0,1) is above it. +--x
- */
-
-#include <arpa/inet.h>
-
-#include <stdint.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "util.h"
-#include "ploot.h"
-
-/*
- * Convert (x,y) coordinates to (row,col) for printing into the buffer.
- * The buffer only contain one number, so the coordinate is a single integer:
- * width * x + y.
- * The coordinates are shifted by offx and offy to permit relative coordinates.
- */
-void
-ffdraw_pixel(Canvas *can, Color *col,
- int x, int y)
-{
- x += can->x;
- y += can->y;
- if (x < 0 || x >= can->h || y < 0 || y >= can->w)
- return;
- memcpy(can->b + can->w * (can->h - 1 - x) + y, col, sizeof(*can->b));
-}
-
-void
-ffdraw_rectangle(Canvas *can, Color *col,
- int x1, int y1,
- int x2, int y2)
-{
- int x, y, xmin, ymin, xmax, ymax;
-
- xmin = MIN(x1, x2); xmax = MAX(x1, x2);
- ymin = MIN(y1, y2); ymax = MAX(y1, y2);
-
- for (x = xmin; x <= xmax; x++)
- for (y = ymin; y <= ymax; y++)
- ffdraw_pixel(can, col, x, y);
-}
-
-/*
- * From Bresenham's line algorithm and dcat's tplot.
- */
-void
-ffdraw_line(Canvas *can, Color *col,
- int x0, int y0,
- int x1, int y1)
-{
- int dx, dy, sx, sy, err, e;
-
- sx = x0 < x1 ? 1 : -1;
- sy = y0 < y1 ? 1 : -1;
- dx = abs(x1 - x0);
- dy = abs(y1 - y0);
- err = (dx > dy ? dx : -dy) / 2;
-
- for (;;) {
- ffdraw_pixel(can, col, x0, y0);
-
- if (x0 == x1 && y0 == y1)
- break;
-
- e = err;
- if (e > -dx) {
- x0 += sx;
- err -= dy;
- }
- if (e < dy) {
- y0 += sy;
- err += dx;
- }
- }
-}
-
-/*
- * Draw a coloured glyph from font f centered on x.
- */
-void
-ffdraw_char(Canvas *can, Color *col, char c, Font *f,
- int x, int y)
-{
- int xf, yf;
-
- if (c & 0x80)
- c = '\0';
-
- x -= f->h / 2;
-
- for (xf = 0; xf < f->h; xf++)
- for (yf = 0; yf < f->w; yf++)
- if (f->b[(int)c][f->w * (f->h - xf - 1) + yf] > 0)
- ffdraw_pixel(can, col, x + xf, y + yf);
-}
-
-/*
- * Draw a left aligned string without wrapping it.
- */
-void
-ffdraw_str_left(Canvas *can, Color *col, char *s, Font *f,
- int x, int y)
-{
- for (; *s != '\0'; y += f->w, s++)
- ffdraw_char(can, col, *s, f, x, y);
-}
-
-/*
- * Draw a center aligned string without wrapping it.
- */
-void
-ffdraw_str_center(Canvas *can, Color *col, char *s, Font *f,
- int x, int y)
-{
- y -= f->w * strlen(s) / 2;
- ffdraw_str_left(can, col, s, f, x, y);
-}
-
-/*
- * Draw a right aligned string without wrapping it.
- */
-void
-ffdraw_str_right(Canvas *can, Color *col, char *s, Font *f,
- int x, int y)
-{
- y -= f->w * strlen(s);
- ffdraw_str_left(can, col, s, f, x, y);
-}
-
-void
-ffdraw_fill(Canvas *can, Color *col)
-{
- int x, y;
-
- x = can->x; can->x = 0;
- y = can->y; can->y = 0;
-
- ffdraw_rectangle(can, col, 0, 0, can->h - 1, can->w - 1);
-
- can->x = x;
- can->y = y;
-}
-
-void
-ffdraw_print(Canvas *can)
-{
- uint32_t w, h;
-
- w = htonl(can->w);
- h = htonl(can->h);
-
- fputs("farbfeld", stdout);
- fwrite(&w, sizeof(w), 1, stdout);
- fwrite(&h, sizeof(h), 1, stdout);
- fwrite(can->b, can->w * can->h, sizeof(*can->b), stdout);
-}
diff --git a/ffplot.c b/ffplot.c
@@ -1,316 +0,0 @@
-/*
- * Draw a plot
- *
- * Title (units)
- * y ^ Legend
- * label |- + - + - + - + -
- * here |- + - + - + - + -
- * +--+---+---+---+-->
- * x label here
- */
-
-#include <math.h>
-#include <string.h>
-#include <stdio.h>
-#include <time.h>
-
-#include "ploot.h" /* placed before for Font type declaration */
-#include "font_14x7.h"
-
-#define ABS(x) ((x) < 0 ? -(x) : (x))
-#define LEN(x) (sizeof(x) / sizeof(*x))
-
-#define MARGIN 4
-
-#define XDENSITY 7 /* how many values to be displayed on x axis */
-#define YDENSITY 7 /* how many values to be displayed on y axis */
-
-#define FONT_H 14
-#define FONT_W 7
-
-#define TITLE_X (IMAGE_H - TITLE_H)
-#define TITLE_Y (XLABEL_W)
-#define TITLE_H (FONT_H * 2)
-#define TITLE_W (PLOT_W)
-
-#define XLABEL_X (PLOT_X)
-#define XLABEL_Y (0)
-#define XLABEL_H (PLOT_H)
-#define XLABEL_W (FONT_W * 9 + MARGIN)
-
-#define YLABEL_X (0)
-#define YLABEL_Y (PLOT_Y)
-#define YLABEL_H (FONT_H * 2)
-#define YLABEL_W (PLOT_W)
-
-#define PLOT_X (YLABEL_H)
-#define PLOT_Y (XLABEL_W)
-#define PLOT_W 700
-#define PLOT_H 160
-
-#define LEGEND_X (YLABEL_H)
-#define LEGEND_Y (IMAGE_W - LEGEND_W)
-#define LEGEND_W (FONT_W + 150 + FONT_W)
-#define LEGEND_H (PLOT_H)
-
-#define IMAGE_H (TITLE_H + PLOT_H + YLABEL_H)
-#define IMAGE_W (XLABEL_W + PLOT_W + LEGEND_W)
-
-Color buffer[IMAGE_W * IMAGE_H];
-
-Color c_axis = { 0xffff, 0xffff, 0xffff, 0xfff };
-Font *font = &font_14x7;
-
-static int
-t2y(time_t t, time_t tmin, time_t tmax)
-{
- return (t - tmin) * PLOT_W / (tmax - tmin);
-}
-
-static int
-v2x(double v, double vmin, double vmax)
-{
- return (v - vmin) * PLOT_H / (vmax - vmin);
-}
-
-/*
- * Set 'str' to a human-readable form of 'num' with always a width of 8 (+ 1
- * the '\0' terminator). Buffer overflow is ensured not to happen due to the
- * max size of a double. Return the exponent.
- */
-static int
-humanize(char *str, double val)
-{
- int exp, precision;
- char label[] = { '\0', 'M', 'G', 'T', 'E' };
-
- for (exp = 0; ABS(val) > 1000; exp++)
- val /= 1000;
-
- precision = (ABS(val) < 10) ? 2 : (ABS(val) < 100) ? 1 : 0;
- precision += (exp == 0);
-
- snprintf(str, 9, "%+.*f %c", precision, val, label[exp]);
- str[8] = '\0';
- if (val >= 0)
- str[0] = ' ';
-
- return exp * 3;
-}
-
-static void
-xaxis(Canvas *can, Color *label, Color *grid,
- double vmin, double vmax, double vstep)
-{
- double v;
- int x;
- char str[8 + 1];
-
- for (v = vmax - fmod(vmax, vstep); v >= vmin; v -= vstep) {
- x = v2x(v, vmin, vmax);
-
- ffdraw_line(can, grid,
- x, XLABEL_W,
- x, XLABEL_W + PLOT_W);
-
- humanize(str, v);
- ffdraw_str_right(can, label, str, font,
- x, XLABEL_W - MARGIN);
- }
-}
-
-static void
-yaxis(Canvas *can, Color *label, Color *grid,
- time_t tmin, time_t tmax, time_t tstep)
-{
- time_t t;
- int y;
- char str[sizeof("MM/DD HH/MM")], *fmt;
-
- if (tstep < 3600 * 12)
- fmt = "%H:%M:%S";
- else if (tstep < 3600 * 24)
- fmt = "%m/%d %H:%M";
- else
- fmt = "%Y/%m/%d";
-
- for (t = tmax - tmax % tstep; t >= tmin; t -= tstep) {
- y = t2y(t, tmin, tmax);
-
- ffdraw_line(can, grid,
- YLABEL_H, y,
- YLABEL_H + PLOT_H, y);
-
- strftime(str, sizeof(str), fmt, localtime(&t));
- ffdraw_str_center(can, label, str, font,
- YLABEL_H / 2, y);
- }
-}
-
-static void
-title(Canvas *can,
- Color *ct, char *title,
- Color *cu, char *unit)
-{
- ffdraw_str_left(can, ct, title, font,
- TITLE_H / 2, 0);
- ffdraw_str_right(can, cu, unit, font,
- TITLE_H / 2, TITLE_W);
-}
-
-static void
-graph(Canvas *can, Vlist *v,
- double vmin, double vmax,
- time_t tmin, time_t tmax)
-{
- time_t *tp;
- double *vp;
- int x, y, n, xlast, ylast, first;
-
- first = 1;
- for (tp = v->t, vp = v->v, n = v->n; n > 0; n--, vp++, tp++) {
- x = v2x(*vp, vmin, vmax);
- y = t2y(*tp, tmin, tmax);
-
- if (!first)
- ffdraw_line(can, &v->col, xlast, ylast, x, y);
-
- xlast = x;
- ylast = y;
- first = 0;
- }
-}
-
-static void
-plot(Canvas *can, Vlist *v, int n,
- double vmin, double vmax,
- time_t tmin, time_t tmax)
-{
- for (; n > 0; n--, v++)
- graph(can, v, vmin, vmax, tmin, tmax);
-}
-
-static void
-legend(Canvas *can, Color *label_fg, Vlist *v, int n)
-{
- int i, x, y;
-
- for (i = 0; i < n; i++, v++) {
- x = LEGEND_H - i * (FONT_H + MARGIN) - FONT_H / 2;
-
- y = MARGIN + FONT_W;
- ffdraw_str_left(can, &v->col, "\1", font, x, y);
-
- y += FONT_W * 2;
- ffdraw_str_left(can, label_fg, v->label, font, x, y);
- }
-}
-
-void
-find_scales(Vlist *v, int n,
- double *vmin, double *vmax, double *vstep,
- time_t *tmin, time_t *tmax, time_t *tstep)
-{
- double dv, *vs, vscale[] = { 1, 2, 3, 5 };
- time_t dt, *ts, tscale[] = {
- 1, 5, 2, 10, 20, 30, 60, 60*2, 60*5, 60*10, 60*20, 60*30, 3600…
- 3600*2, 3600*5, 3600*10, 3600*18, 3600*24, 3600*24*2,
- 3600*24*5, 3600*24*10, 3600*24*20, 3600*24*30, 3600*24*50,
- 3600*24*100, 3600*24*365
- };
- int i;
-
- *vmin = *vmax = 0;
- *tmin = *tmax = *v->t;
-
- for (; n-- > 0; v++) {
- for (i = 0; i < v->n; i++) {
- if (v->v[i] < *vmin)
- *vmin = v->v[i];
- if (v->v[i] > *vmax)
- *vmax = v->v[i];
- if (v->t[i] < *tmin)
- *tmin = v->t[i];
- if (v->t[i] > *tmax)
- *tmax = v->t[i];
- }
- }
-
- dv = *vmax - *vmin;
- dt = *tmax - *tmin;
-
- for (ts = tscale; ts < tscale + LEN(tscale); ts++)
- if (dt < *ts * YDENSITY) {
- *tstep = *ts;
- break;
- }
-
- if (dv > 1) {
- for (i = 1; i != 0; i *= 10) {
- for (vs = vscale; vs < vscale + LEN(vscale); vs++) {
- if (dv < *vs * i * XDENSITY) {
- *vstep = *vs * i;
- return;
- }
- }
- }
- } else {
- for (i = 1; i != 0; i *= 10) {
- for (vs = vscale + LEN(vscale) - 1; vs >= vscale; vs--…
- if (dv > *vs / i * XDENSITY / 2) {
- *vstep = *vs / i;
- return;
- }
- }
- }
- }
-}
-
-/*
- * Plot the 'n' values list of the 'v' array with title 'name' and
- * 'units' label.
- */
-void
-ffplot(Vlist *v, int n, char *name, char *units)
-{
- Canvas can = { IMAGE_W, IMAGE_H, buffer, 0, 0 };
- Color plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff };
- Color grid_bg = { 0x2929, 0x2929, 0x2929, 0xffff };
- Color grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff };
- Color label_fg = { 0x8888, 0x8888, 0x8888, 0xffff };
- Color title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff };
- double vmin, vmax, vstep = 30;
- time_t tmin, tmax, tstep = 30;
-
- find_scales(v, n, &vmin, &vmax, &vstep, &tmin, &tmax, &tstep);
-
- can.x = 0;
- can.y = 0;
- ffdraw_fill(&can, &plot_bg);
-
- can.x = PLOT_X;
- can.y = PLOT_Y;
- ffdraw_rectangle(&can, &grid_bg, 0, 0, PLOT_H, PLOT_W);
-
- can.x = YLABEL_X;
- can.y = YLABEL_Y;
- yaxis(&can, &label_fg, &grid_fg, tmin, tmax, tstep);
-
- can.x = XLABEL_X;
- can.y = XLABEL_Y;
- xaxis(&can, &label_fg, &grid_fg, vmin, vmax, vstep);
-
- can.x = TITLE_X;
- can.y = TITLE_Y;
- title(&can, &title_fg, name, &label_fg, units);
-
- can.x = PLOT_X;
- can.y = PLOT_Y;
- plot(&can, v, n, vmin, vmax, tmin, tmax);
-
- can.x = LEGEND_X;
- can.y = LEGEND_Y;
- legend(&can, &label_fg, v, n);
-
- ffdraw_print(&can);
-}
diff --git a/font.h b/font.h
@@ -1,46 +1,1677 @@
-#include <stddef.h>
-#include <stdint.h>
-
-#include "ploot.h"
-
-/*
- * Macros to make the fonts header file more readable.
- */
-#define _ 0
-#define X 1
-#define C(x) static char glyph_ ## x[FONT_WIDTH * FONT_HEIGHT]
-
-#define FONT(x) Font x = { FONT_WIDTH, FONT_HEIGHT, { \
- glyph_error, glyph_error, glyph_error, glyph_error, \
- glyph_error, glyph_error, glyph_error, glyph_error, \
- glyph_error, glyph_error, glyph_error, glyph_error, \
- glyph_error, glyph_error, glyph_error, glyph_error, \
- glyph_error, glyph_error, glyph_error, glyph_error, \
- glyph_error, glyph_error, glyph_error, glyph_error, \
- glyph_error, glyph_error, glyph_error, glyph_error, \
- glyph_error, glyph_error, glyph_error, glyph_error, \
- glyph_space, glyph_bang, glyph_double, glyph_hash, \
- glyph_dollar, glyph_percent, glyph_ampersand, glyph_single, \
- glyph_l_round, glyph_r_round, glyph_asterisk, glyph_plus, \
- glyph_coma, glyph_minus, glyph_dot, glyph_slash, \
- glyph_0, glyph_1, glyph_2, glyph_3, \
- glyph_4, glyph_5, glyph_6, glyph_7, \
- glyph_8, glyph_9, glyph_column, glyph_semicolumn, \
- glyph_l_angle, glyph_equal, glyph_r_angle, glyph_question, \
- glyph_at, glyph_A, glyph_B, glyph_C, \
- glyph_D, glyph_E, glyph_F, glyph_G, \
- glyph_H, glyph_I, glyph_J, glyph_K, \
- glyph_L, glyph_M, glyph_N, glyph_O, \
- glyph_P, glyph_Q, glyph_R, glyph_S, \
- glyph_T, glyph_U, glyph_V, glyph_W, \
- glyph_X, glyph_Y, glyph_Z, glyph_l_square, \
- glyph_backslash, glyph_r_square, glyph_hat, glyph_underscore, \
- glyph_backtilt, glyph_a, glyph_b, glyph_c, \
- glyph_d, glyph_e, glyph_f, glyph_g, \
- glyph_h, glyph_i, glyph_j, glyph_k, \
- glyph_l, glyph_m, glyph_n, glyph_o, \
- glyph_p, glyph_q, glyph_r, glyph_s, \
- glyph_t, glyph_u, glyph_v, glyph_w, \
- glyph_x, glyph_y, glyph_z, glyph_l_curly, \
- glyph_pipe, glyph_r_curly, glyph_tilde, glyph_error \
-} }
+#define FONT_W 7
+#define FONT_H 14
+
+#define C(x) static char glyph_ ## x[FONT_W * FONT_H]
+#define _ 0
+#define X 1
+
+C(error) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,X,X,X,_,_,
+ _,_,X,X,X,_,_,
+ _,_,X,X,X,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(space) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(bang) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(double) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(hash) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,X,X,X,X,X,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,X,X,X,X,X,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(dollar) = {
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,_,_,
+ _,X,_,X,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,X,_,X,_,
+ _,_,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(percent) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,_,_,X,_,
+ _,X,X,_,_,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,X,_,_,X,X,_,
+ _,X,_,_,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(ampersand) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,X,_,X,_,
+ _,X,_,_,X,_,_,
+ _,X,_,_,X,_,_,
+ _,X,_,_,X,_,_,
+ _,_,X,X,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(single) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(l_round) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(r_round) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(asterisk) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,X,_,X,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,X,_,X,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(plus) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(coma) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(minus) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(dot) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(slash) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(0) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(1) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(2) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(3) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(4) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,X,X,_,
+ _,_,_,X,_,X,_,
+ _,_,X,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(5) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(6) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(7) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(8) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(9) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(column) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(semicolumn) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(l_angle) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(equal) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(r_angle) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(question) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(at) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,X,X,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,X,X,_,
+ _,X,_,_,_,_,_,
+ _,_,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(A) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(B) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(C) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(D) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(E) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(F) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(G) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,X,X,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(H) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(I) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(J) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,X,_,_,X,_,_,
+ _,_,X,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(K) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,X,_,_,
+ _,X,_,X,_,_,_,
+ _,X,X,_,_,_,_,
+ _,X,_,X,_,_,_,
+ _,X,_,_,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(L) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(M) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,X,_,X,X,_,
+ _,X,X,_,X,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(N) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,X,_,_,X,_,
+ _,X,X,_,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,_,X,X,_,
+ _,X,_,_,X,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(O) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(P) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(Q) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,X,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(R) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,_,_,
+ _,X,_,X,_,_,_,
+ _,X,_,_,X,_,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(S) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(T) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(U) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(V) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(W) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,X,_,X,X,_,
+ _,X,X,_,X,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(X) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(Y) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(Z) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(l_square) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(backslash) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(r_square) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(hat) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,X,_,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(underscore) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+X ,X,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(backtilt) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(a) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,X,X,X,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(b) = {
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(c) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(d) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,X,X,X,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(e) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,X,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(f) = {
+ _,_,_,_,_,_,_,
+ _,_,_,X,X,X,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(g) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,X,_,
+ _,_,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_
+};
+
+C(h) = {
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(i) = {
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(j) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,X,_,_,X,_,_,
+ _,_,X,X,_,_,_
+};
+
+C(k) = {
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,X,_,_,
+ _,X,_,X,_,_,_,
+ _,X,X,_,_,_,_,
+ _,X,_,X,_,_,_,
+ _,X,_,_,X,_,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(l) = {
+ _,_,_,_,_,_,_,
+ _,_,X,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(m) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(n) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(o) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(p) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,X,X,X,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_
+};
+
+C(q) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X
+};
+
+C(r) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,X,X,X,X,
+ _,X,X,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(s) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,X,X,_,
+ _,X,_,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,X,X,X,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,_,X,_,
+ _,X,X,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(t) = {
+ _,_,_,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,X,X,X,X,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(u) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(v) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,X,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(w) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,X,_,X,_,
+ _,_,X,_,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(x) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,X,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(y) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,X,_,
+ _,_,_,_,_,X,_,
+ _,X,_,_,_,X,_,
+ _,_,X,X,X,_,_
+};
+
+C(z) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,X,_,_,_,
+ _,_,X,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,X,X,X,X,X,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(l_curly) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,X,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,X,_,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,X,_,_,_,_,
+ _,_,_,X,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(pipe) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(r_curly) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,X,_,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,_,X,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,_,_,X,_,_,
+ _,_,X,X,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+C(tilde) = {
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,X,_,_,X,_,
+ _,X,_,X,_,X,_,
+ _,X,_,_,X,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_,
+ _,_,_,_,_,_,_
+};
+
+#undef C
+#undef _
+#undef X
+
+char *glyph[128] = {
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_space, glyph_bang, glyph_double, glyph_hash,
+ glyph_dollar, glyph_percent, glyph_ampersand, glyph_single,
+ glyph_l_round, glyph_r_round, glyph_asterisk, glyph_plus,
+ glyph_coma, glyph_minus, glyph_dot, glyph_slash,
+ glyph_0, glyph_1, glyph_2, glyph_3,
+ glyph_4, glyph_5, glyph_6, glyph_7,
+ glyph_8, glyph_9, glyph_column, glyph_semicolumn,
+ glyph_l_angle, glyph_equal, glyph_r_angle, glyph_question,
+ glyph_at, glyph_A, glyph_B, glyph_C,
+ glyph_D, glyph_E, glyph_F, glyph_G,
+ glyph_H, glyph_I, glyph_J, glyph_K,
+ glyph_L, glyph_M, glyph_N, glyph_O,
+ glyph_P, glyph_Q, glyph_R, glyph_S,
+ glyph_T, glyph_U, glyph_V, glyph_W,
+ glyph_X, glyph_Y, glyph_Z, glyph_l_square,
+ glyph_backslash, glyph_r_square, glyph_hat, glyph_underscore,
+ glyph_backtilt, glyph_a, glyph_b, glyph_c,
+ glyph_d, glyph_e, glyph_f, glyph_g,
+ glyph_h, glyph_i, glyph_j, glyph_k,
+ glyph_l, glyph_m, glyph_n, glyph_o,
+ glyph_p, glyph_q, glyph_r, glyph_s,
+ glyph_t, glyph_u, glyph_v, glyph_w,
+ glyph_x, glyph_y, glyph_z, glyph_l_curly,
+ glyph_pipe, glyph_r_curly, glyph_tilde, glyph_error
+};
diff --git a/font_14x7.c b/font_14x7.c
@@ -1,1639 +0,0 @@
-#include "font.h"
-#include "font_14x7.h"
-
-#define FONT_HEIGHT 14
-#define FONT_WIDTH 7
-
-C(error) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,X,X,X,_,_,
- _,_,X,X,X,_,_,
- _,_,X,X,X,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(space) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(bang) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(double) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(hash) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,X,X,X,X,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,X,X,X,X,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(dollar) = {
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,_,_,
- _,X,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,X,_,X,_,
- _,_,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(percent) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,_,_,X,_,
- _,X,X,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,X,X,_,
- _,X,_,_,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(ampersand) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,_,X,_,
- _,X,_,_,X,_,_,
- _,X,_,_,X,_,_,
- _,X,_,_,X,_,_,
- _,_,X,X,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(single) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(l_round) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(r_round) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(asterisk) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,X,_,X,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,X,_,X,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(plus) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(coma) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(minus) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(dot) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(slash) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(0) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(1) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(2) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(3) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(4) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,X,_,
- _,_,_,X,_,X,_,
- _,_,X,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(5) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(6) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(7) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(8) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(9) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(column) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(semicolumn) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(l_angle) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(equal) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(r_angle) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(question) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(at) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,X,X,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,X,X,_,
- _,X,_,_,_,_,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(A) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(B) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(C) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(D) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(E) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(F) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(G) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(H) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(I) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(J) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,X,_,_,X,_,_,
- _,_,X,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(K) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,X,_,_,
- _,X,_,X,_,_,_,
- _,X,X,_,_,_,_,
- _,X,_,X,_,_,_,
- _,X,_,_,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(L) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(M) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,X,_,X,X,_,
- _,X,X,_,X,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(N) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,X,_,_,X,_,
- _,X,X,_,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,_,X,X,_,
- _,X,_,_,X,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(O) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(P) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(Q) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,X,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(R) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,X,_,X,_,_,_,
- _,X,_,_,X,_,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(S) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(T) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(U) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(V) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(W) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,X,_,X,X,_,
- _,X,X,_,X,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(X) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(Y) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(Z) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(l_square) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(backslash) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(r_square) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(hat) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,X,_,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(underscore) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
-X ,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(backtilt) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(a) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(b) = {
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(c) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(d) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(e) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(f) = {
- _,_,_,_,_,_,_,
- _,_,_,X,X,X,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,X,X,X,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(g) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_
-};
-
-C(h) = {
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(i) = {
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(j) = {
- _,_,_,_,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,X,_,_,X,_,_,
- _,_,X,X,_,_,_
-};
-
-C(k) = {
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,X,_,_,
- _,X,_,X,_,_,_,
- _,X,X,_,_,_,_,
- _,X,_,X,_,_,_,
- _,X,_,_,X,_,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(l) = {
- _,_,_,_,_,_,_,
- _,_,X,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(m) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(n) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(o) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(p) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_
-};
-
-C(q) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X
-};
-
-C(r) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,X,X,X,X,
- _,X,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(s) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(t) = {
- _,_,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,X,X,X,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(u) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(v) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(w) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,_,X,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(x) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(y) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_
-};
-
-C(z) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(l_curly) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,X,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(pipe) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(r_curly) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,X,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(tilde) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,_,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-FONT(font_14x7);
diff --git a/font_14x7.h b/font_14x7.h
@@ -1 +0,0 @@
-extern Font font_14x7;
diff --git a/ploot-feed.c b/ploot-feed.c
@@ -0,0 +1,236 @@
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "arg.h"
+#include "util.h"
+
+#define WIDTH_MAX 1024
+#define BRAILLE_START 10240
+
+int wflag = 80;
+int width;
+char *argv0;
+
+/*
+ * Turn the bit at position (row, col) on in the .
+ */
+static void
+plot_dot(long *out, int row, int col)
+{
+ long flags[4][2] = {
+ { 0x01, 0x08 },
+ { 0x02, 0x10 },
+ { 0x04, 0x20 },
+ { 0x40, 0x80 },
+ };
+
+ *out |= flags[row][col];;
+}
+
+static void
+plot_val(long *out, double val, double max, int row)
+{
+ int col, c;
+
+ val = MIN(max, val);
+ col = (int)(val * (double)(width - 1) / max * 2);
+ for (c = 0; c < col; c++)
+ plot_dot(out + c / 2, row, c % 2);
+}
+
+/*
+ * Change the braille characters on a whole row, this for all the
+ * values line.
+ */
+static time_t
+plot_row(long *out, char *line, double *max, int nrow, int ncol)
+{
+ time_t epoch;
+ double val;
+ int n;
+ char *tok;
+
+ if ((tok = strsep(&line, ",")) == NULL)
+ fputs("*** missing epoch value\n", stderr), exit(1);
+ epoch = eatol(tok);
+
+ for (n = 0; (tok = strsep(&line, ",")) != NULL; n++) {
+ if (n >= ncol)
+ fputs("too many values\n", stderr), exit(1);
+ val = atof(tok);
+ plot_val(out + n * width, val, max[n], nrow);
+ }
+ if (n < ncol)
+ fputs("not enough values\n", stderr), exit(1);
+
+ return epoch;
+}
+
+/*
+ * Read enough input in order to print one line and plot it into 'out'.
+ */
+static time_t
+plot_line(long *out, double *max, int ncol)
+{
+ time_t epoch;
+ int n, nrow;
+ long *o, rune;
+ char line[LINE_MAX];
+
+ for (rune = BRAILLE_START, o = out, n = ncol * width; n > 0; o++, n--)
+ memcpy(o, &rune, sizeof(rune));
+ *o = '\0';
+ for (rune = 0x2502, o = out, n = 0; n < ncol; o += width, n++)
+ memcpy(o, &rune, sizeof(rune));
+ out++;
+
+ for (nrow = 0; nrow < 4; nrow++) {
+ if ((esfgets(line, LINE_MAX, stdin)) == NULL)
+ exit(0);
+ epoch = plot_row(out, line, max, nrow, ncol);
+ }
+
+ return epoch;
+}
+
+static void
+put_time(time_t epoch, time_t last, int nline)
+{
+ char *out, buf[sizeof("XXxXXxXX ")];
+
+ switch (nline % 3) {
+ case 0:
+ strftime(buf, sizeof(buf), "%H:%M:%S _", localtime(&epoch));
+ out = buf;
+ break;
+ case 1:
+ strftime(buf, sizeof(buf), "%y/%m/%d ", localtime(&last));
+ out = buf;
+ break;
+ case 2:
+ out = " ";
+ break;
+ }
+
+ fputs(out, stdout);
+}
+
+static void
+put_line(long *out)
+{
+ for (; *out != '\0'; out++)
+ put3utf(*out);
+ puts("│");
+}
+
+static void
+plot(char labels[LINE_MAX], double *max, int ncol)
+{
+ time_t epoch, last_epoch;
+ long out[WIDTH_MAX + 1];
+ int n;
+
+ last_epoch = epoch = 0;
+
+ for (n = 0;; n = n == 25 ? 0 : n + 1) {
+ if (n == 0)
+ put_time(0, 0, 2), fputs(labels, stdout), puts("│");
+
+ epoch = plot_line(out, max, ncol);
+ put_time(epoch, last_epoch, n);
+ last_epoch = epoch;
+ put_line(out);
+
+ fflush(stdout);
+ }
+}
+
+/*
+ * Label must be able to store all pointers to token buf has to
+ * offer: sizeof(*buf / 2).
+ */
+static int
+read_labels(char *labv[LINE_MAX])
+{
+ int ncol;
+ char *l, line[LINE_MAX], *tok;
+
+ if ((l = esfgets(line, LINE_MAX, stdin)) == NULL)
+ fputs("missing label line\n", stderr), exit(1);
+
+ if (strcmp(strsep(&l, ","), "epoch") != 0)
+ fputs("first label must be \"epoch\"\n", stderr), exit(1);
+
+ for (ncol = 0; (tok = strsep(&l, ",")) != NULL; ncol++, labv++)
+ *labv = tok;
+ *labv = NULL;
+
+ if (ncol < 1)
+ fputs("no label found\n", stderr), exit(1);
+
+ return ncol;
+}
+
+static void
+fmt_labels(char out[LINE_MAX], int ncol, char *labels[LINE_MAX / 2])
+{
+ int i, n;
+
+ for (i = 0; i < ncol; labels++, i++) {
+ n = LINE_MAX - (width + sizeof("│")) * i;
+ out += snprintf(out, n, "│%-*s", width - 1, *labels);
+ }
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr, "usage: %s [-w width] maxval... <csv\n", argv0);
+ exit(1);
+}
+
+static int
+parse_args(int argc, char **argv, double *max)
+{
+ int n;
+
+ ARGBEGIN {
+ case 'w':
+ wflag = atoi(EARGF(usage()));
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if (argc == 0)
+ usage();
+
+ for (n = argc; n > 0; n--, argv++, max++)
+ *max = eatof(*argv);
+
+ return argc;
+}
+
+int
+main(int argc, char **argv)
+{
+ double max[LINE_MAX / 2];
+ int ncol, nmax;
+ char *labv[LINE_MAX / 2], labels[LINE_MAX];
+
+ setvbuf(stdin, NULL, _IOLBF, 0);
+ nmax = parse_args(argc, argv, max);
+ ncol = read_labels(labv);
+ width = (wflag - sizeof("XXxXXxXX _")) / ncol - sizeof("|");
+ fmt_labels(labels, ncol, labv);
+ if (ncol != nmax)
+ fputs("not as many labels and arguments\n", stderr), exit(1);
+ plot(labels, max, ncol);
+
+ return 0;
+}
diff --git a/ploot-ff.c b/ploot-ff.c
@@ -0,0 +1,640 @@
+#include <arpa/inet.h>
+
+#include <math.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <stdint.h>
+
+#include "arg.h"
+#include "util.h"
+#include "font.h"
+
+#define MARGIN 4
+
+#define XDENSITY 7 /* nb of values on x axis */
+#define YDENSITY 7 /* nb of values on y axis */
+
+#define TITLE_X (IMAGE_H - TITLE_H)
+#define TITLE_Y (XLABEL_W)
+#define TITLE_H (FONT_H * 2)
+#define TITLE_W (PLOT_W)
+
+#define XLABEL_X (PLOT_X)
+#define XLABEL_Y (0)
+#define XLABEL_H (PLOT_H)
+#define XLABEL_W (FONT_W * 9 + MARGIN)
+
+#define YLABEL_X (0)
+#define YLABEL_Y (PLOT_Y)
+#define YLABEL_H (FONT_H * 2)
+#define YLABEL_W (PLOT_W)
+
+#define PLOT_X (YLABEL_H)
+#define PLOT_Y (XLABEL_W)
+#define PLOT_W 700
+#define PLOT_H 160
+
+#define LEGEND_X (YLABEL_H)
+#define LEGEND_Y (IMAGE_W - LEGEND_W)
+#define LEGEND_W (FONT_W + 150 + FONT_W)
+#define LEGEND_H (PLOT_H)
+
+#define IMAGE_H (TITLE_H + PLOT_H + YLABEL_H)
+#define IMAGE_W (XLABEL_W + PLOT_W + LEGEND_W)
+
+typedef uint16_t Color[4];
+typedef struct clist Clist;
+typedef struct vlist Vlist;
+typedef struct canvas Canvas;
+typedef struct font Font;
+
+struct vlist {
+ Color col; /* color to use to draw the line */
+ time_t *t; /* array of timestamps */
+ double *v; /* array of values */
+ int n; /* number of values */
+ char *label; /* for the legend */
+};
+
+struct canvas {
+ int w; /* width */
+ int h; /* height */
+ int x; /* x offset */
+ int y; /* x offset */
+ Color b[IMAGE_W * IMAGE_H];
+};
+
+struct font {
+ int w; /* width */
+ int h; /* height */
+ char **b; /* buffer */
+};
+
+struct clist {
+ char *name;
+ Color col;
+};
+
+char *argv0;
+char *tflag = "";
+char *uflag = "";
+
+Clist clist[] = {
+ /* name red green blue alpha */
+ { "red", { 0xffff, 0x4444, 0x4444, 0xffff } },
+ { "orange", { 0xffff, 0x9999, 0x4444, 0xffff } },
+ { "yellow", { 0xffff, 0xffff, 0x4444, 0xffff } },
+ { "green", { 0x2222, 0xffff, 0x5555, 0xffff } },
+ { "cyan", { 0x0000, 0xffff, 0xdddd, 0xffff } },
+ { "blue", { 0x2222, 0x9999, 0xffff, 0xffff } },
+ { NULL, { 0, 0, 0, 0 } }
+};
+
+Font font = { FONT_W, FONT_H, glyph };
+
+static int
+color(Color *col, char *name)
+{
+ Clist *c;
+
+ for (c = clist; c->name != NULL; c++) {
+ if (strcmp(name, c->name) == 0) {
+ memcpy(col, c->col, sizeof(*col));
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+static void
+scale_minmax(Vlist *v, int n,
+ double *vmin, double *vmax,
+ time_t *tmin, time_t *tmax)
+{
+ int i;
+
+ *vmin = *vmax = 0;
+ *tmin = *tmax = *v->t;
+
+ for (; n-- > 0; v++) {
+ for (i = 0; i < v->n; i++) {
+ if (v->v[i] < *vmin)
+ *vmin = v->v[i];
+ if (v->v[i] > *vmax)
+ *vmax = v->v[i];
+ if (v->t[i] < *tmin)
+ *tmin = v->t[i];
+ if (v->t[i] > *tmax)
+ *tmax = v->t[i];
+ }
+ }
+}
+
+static void
+scale_tstep(time_t *step, int density, time_t min, time_t max)
+{
+ time_t dt, *s, scale[] = {
+ 1, 5, 2, 10, 20, 30, 60, 60*2, 60*5, 60*10, 60*20, 60*30, 3600…
+ 3600*2, 3600*5, 3600*10, 3600*18, 3600*24, 3600*24*2,
+ 3600*24*5, 3600*24*10, 3600*24*20, 3600*24*30, 3600*24*50,
+ 3600*24*100, 3600*24*365
+ };
+
+ dt = max - min;
+
+ for (s = scale; s < scale + LEN(scale); s++) {
+ if (dt < *s * density) {
+ *step = *s;
+ break;
+ }
+ }
+}
+
+static void
+scale_vstep(double *step, int density, double min, double max)
+{
+ double dv, *s, scale[] = { 1, 2, 3, 5 };
+ int i;
+
+ dv = max - min;
+
+ if (dv > 1) {
+ for (i = 1; i != 0; i *= 10) {
+ for (s = scale; s < scale + LEN(scale); s++) {
+ if (dv < *s * i * density) {
+ *step = *s * i;
+ return;
+ }
+ }
+ }
+ } else {
+ for (i = 1; i != 0; i *= 10) {
+ for (s = scale + LEN(scale) - 1; s >= scale; s--) {
+ if (dv > *s / i * density / 2) {
+ *step = *s / i;
+ return;
+ }
+ }
+ }
+ }
+}
+
+static void
+scale(Vlist *v, int n,
+ double *vmin, double *vmax, double *vstep,
+ time_t *tmin, time_t *tmax, time_t *tstep)
+{
+ scale_minmax(v, n, vmin, vmax, tmin, tmax);
+ scale_tstep(tstep, YDENSITY, *tmin, *tmax);
+ scale_vstep(vstep, XDENSITY, *vmin, *vmax);
+}
+
+/*
+ * Convert (x,y) coordinates to (row,col) for printing into the buffer.
+ * The buffer only contain one number, so the coordinate is a single integer:
+ * width * x + y.
+ * The coordinates are shifted by offx and offy to permit relative coordinates.
+ *
+ * The convention used: y
+ * - (0,0) is at the lower left corner of the canvas. |
+ * - (0,1) is above it. +--x
+ */
+static void
+ff_pixel(Canvas *can, Color *col,
+ int x, int y)
+{
+ x += can->x;
+ y += can->y;
+ if (x < 0 || x >= can->h || y < 0 || y >= can->w)
+ return;
+ memcpy(can->b + can->w * (can->h - 1 - x) + y, col, sizeof(*can->b));
+}
+
+static void
+ff_rectangle(Canvas *can, Color *col,
+ int x1, int y1,
+ int x2, int y2)
+{
+ int x, y, xmin, ymin, xmax, ymax;
+
+ xmin = MIN(x1, x2); xmax = MAX(x1, x2);
+ ymin = MIN(y1, y2); ymax = MAX(y1, y2);
+
+ for (x = xmin; x <= xmax; x++)
+ for (y = ymin; y <= ymax; y++)
+ ff_pixel(can, col, x, y);
+}
+
+/*
+ * From Bresenham's line algorithm and dcat's tplot.
+ */
+static void
+ff_line(Canvas *can, Color *col,
+ int x0, int y0,
+ int x1, int y1)
+{
+ int dx, dy, sx, sy, err, e;
+
+ sx = x0 < x1 ? 1 : -1;
+ sy = y0 < y1 ? 1 : -1;
+ dx = abs(x1 - x0);
+ dy = abs(y1 - y0);
+ err = (dx > dy ? dx : -dy) / 2;
+
+ for (;;) {
+ ff_pixel(can, col, x0, y0);
+
+ if (x0 == x1 && y0 == y1)
+ break;
+
+ e = err;
+ if (e > -dx) {
+ x0 += sx;
+ err -= dy;
+ }
+ if (e < dy) {
+ y0 += sy;
+ err += dx;
+ }
+ }
+}
+
+/*
+ * Draw a coloured glyph from font f centered on x.
+ */
+static void
+ff_char(Canvas *can, Color *col, char c, Font *f,
+ int x, int y)
+{
+ int xf, yf;
+
+ if (c & 0x80)
+ c = '\0';
+
+
+ x -= f->h / 2;
+
+ for (xf = 0; xf < f->h; xf++)
+ for (yf = 0; yf < f->w; yf++)
+ if (f->b[(int)c][f->w * (f->h - xf) + yf] == 1)
+ ff_pixel(can, col, x + xf, y + yf);
+}
+
+/*
+ * Draw a left aligned string without wrapping it.
+ */
+static void
+ff_str_left(Canvas *can, Color *col, char *s, Font *f,
+ int x, int y)
+{
+ for (; *s != '\0'; y += f->w, s++)
+ ff_char(can, col, *s, f, x, y);
+}
+
+/*
+ * Draw a center aligned string without wrapping it.
+ */
+static void
+ff_str_center(Canvas *can, Color *col, char *s, Font *f,
+ int x, int y)
+{
+ y -= f->w * strlen(s) / 2;
+ ff_str_left(can, col, s, f, x, y);
+}
+
+/*
+ * Draw a right aligned string without wrapping it.
+ */
+static void
+ff_str_right(Canvas *can, Color *col, char *s, Font *f,
+ int x, int y)
+{
+ y -= f->w * strlen(s);
+ ff_str_left(can, col, s, f, x, y);
+}
+
+static void
+ff_print(Canvas *can)
+{
+ uint32_t w, h;
+
+ w = htonl(can->w);
+ h = htonl(can->h);
+
+ fputs("farbfeld", stdout);
+ fwrite(&w, sizeof(w), 1, stdout);
+ fwrite(&h, sizeof(h), 1, stdout);
+ fwrite(can->b, can->w * can->h, sizeof(*can->b), stdout);
+}
+
+static int
+ff_t2y(time_t t, time_t tmin, time_t tmax)
+{
+ return (t - tmin) * PLOT_W / (tmax - tmin);
+}
+
+static int
+ff_v2x(double v, double vmin, double vmax)
+{
+ return (v - vmin) * PLOT_H / (vmax - vmin);
+}
+
+static void
+ff_xaxis(Canvas *can, Color *label, Color *grid,
+ double vmin, double vmax, double vstep)
+{
+ double v;
+ int x;
+ char str[8 + 1];
+
+ for (v = vmax - fmod(vmax, vstep); v >= vmin; v -= vstep) {
+ x = ff_v2x(v, vmin, vmax);
+
+ ff_line(can, grid,
+ x, XLABEL_W,
+ x, XLABEL_W + PLOT_W);
+
+ humanize(str, v);
+ ff_str_right(can, label, str, &font,
+ x, XLABEL_W - MARGIN);
+ }
+}
+
+static void
+ff_yaxis(Canvas *can, Color *label, Color *grid,
+ time_t tmin, time_t tmax, time_t tstep)
+{
+ time_t t;
+ int y;
+ char str[sizeof("MM/DD HH/MM")], *fmt;
+
+ if (tstep < 3600 * 12)
+ fmt = "%H:%M:%S";
+ else if (tstep < 3600 * 24)
+ fmt = "%m/%d %H:%M";
+ else
+ fmt = "%Y/%m/%d";
+
+ for (t = tmax - tmax % tstep; t >= tmin; t -= tstep) {
+ y = ff_t2y(t, tmin, tmax);
+
+ ff_line(can, grid,
+ YLABEL_H, y,
+ YLABEL_H + PLOT_H, y);
+
+ strftime(str, sizeof(str), fmt, localtime(&t));
+ ff_str_center(can, label, str, &font,
+ YLABEL_H / 2, y);
+ }
+}
+
+static void
+ff_title(Canvas *can,
+ Color *ct, char *title,
+ Color *cu, char *unit)
+{
+ ff_str_left(can, ct, title, &font,
+ TITLE_H / 2, 0);
+ ff_str_right(can, cu, unit, &font,
+ TITLE_H / 2, TITLE_W);
+}
+
+static void
+ff_plot(Canvas *can, Vlist *v,
+ double vmin, double vmax,
+ time_t tmin, time_t tmax)
+{
+ time_t *tp;
+ double *vp;
+ int x, y, n, xlast, ylast, first;
+
+ first = 1;
+ for (tp = v->t, vp = v->v, n = v->n; n > 0; n--, vp++, tp++) {
+ x = ff_v2x(*vp, vmin, vmax);
+ y = ff_t2y(*tp, tmin, tmax);
+
+ if (!first)
+ ff_line(can, &v->col, xlast, ylast, x, y);
+
+ xlast = x;
+ ylast = y;
+ first = 0;
+ }
+}
+
+static void
+ff_values(Canvas *can, Vlist *v, int n,
+ double vmin, double vmax,
+ time_t tmin, time_t tmax)
+{
+ for (; n > 0; n--, v++)
+ ff_plot(can, v, vmin, vmax, tmin, tmax);
+}
+
+static void
+ff_legend(Canvas *can, Color *label_fg, Vlist *v, int n)
+{
+ int i, x, y;
+
+ for (i = 0; i < n; i++, v++) {
+ x = LEGEND_H - i * (FONT_H + MARGIN) - FONT_H / 2;
+
+ y = MARGIN + FONT_W;
+ ff_str_left(can, &v->col, "\1", &font, x, y);
+
+ y += FONT_W * 2;
+ ff_str_left(can, label_fg, v->label, &font, x, y);
+ }
+}
+
+/*
+ * Plot the 'n' values list of the 'v' array with title 'name' and
+ * 'units' label.
+ *
+ * Title (units)
+ * y ^ Legend
+ * label |- + - + - + - + - ....
+ * here |- + - + - + - + - ....
+ * +--+---+---+---+-->
+ * x label here
+ */
+static void
+ff(Vlist *v, int n, char *name, char *units)
+{
+ Canvas can = { IMAGE_W, IMAGE_H, 0, 0, { { 0 }, { 0 } } };
+ Color plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff };
+ Color grid_bg = { 0x2929, 0x2929, 0x2929, 0xffff };
+ Color grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff };
+ Color label_fg = { 0x8888, 0x8888, 0x8888, 0xffff };
+ Color title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff };
+ double vmin, vmax, vstep;
+ time_t tmin, tmax, tstep;
+
+ scale(v, n, &vmin, &vmax, &vstep, &tmin, &tmax, &tstep);
+
+ can.x = 0;
+ can.y = 0;
+ ff_rectangle(&can, &plot_bg, 0, 0, IMAGE_H - 1, IMAGE_W - 1);
+
+ can.x = PLOT_X;
+ can.y = PLOT_Y;
+ ff_rectangle(&can, &grid_bg, 0, 0, PLOT_H, PLOT_W);
+
+ can.x = YLABEL_X;
+ can.y = YLABEL_Y;
+ ff_yaxis(&can, &label_fg, &grid_fg, tmin, tmax, tstep);
+
+ can.x = XLABEL_X;
+ can.y = XLABEL_Y;
+ ff_xaxis(&can, &label_fg, &grid_fg, vmin, vmax, vstep);
+
+ can.x = TITLE_X;
+ can.y = TITLE_Y;
+ ff_title(&can, &title_fg, name, &label_fg, units);
+
+ can.x = PLOT_X;
+ can.y = PLOT_Y;
+ ff_values(&can, v, n, vmin, vmax, tmin, tmax);
+
+ can.x = LEGEND_X;
+ can.y = LEGEND_Y;
+ ff_legend(&can, &label_fg, v, n);
+
+ ff_print(&can);
+}
+
+static void
+csv_labels(Vlist *v, char **argv, char *buf)
+{
+ if (esfgets(buf, LINE_MAX, stdin) == NULL)
+ fputs("missing label line\n", stderr), exit(1);
+
+ if (strcmp(strsep(&buf, ","), "epoch") != 0)
+ fputs("first label must be \"epoch\"\n", stderr), exit(1);
+
+ for (; *argv != NULL; v++, argv++) {
+ if ((v->label = strsep(&buf, ",")) == NULL)
+ fputs("more arguments than columns\n", stderr), exit(1…
+ else if (color(&v->col, *argv) == -1)
+ fprintf(stderr, "unknown color: %s\n", *argv), exit(1);
+ }
+
+ if (strsep(&buf, ",") != NULL)
+ fputs("more columns than arguments\n", stderr), exit(1);
+}
+
+static int
+csv_addval(Vlist *v, int bufsize, int nval, double field, time_t epoch)
+{
+ if (nval >= bufsize) {
+ bufsize = bufsize * 2 + 1;
+ if ((v->v = realloc(v->v, bufsize * sizeof(*v->v))) == NULL)
+ perror("reallocating values buffer"), exit(1);
+ if ((v->t = realloc(v->t, bufsize * sizeof(*v->t))) == NULL)
+ perror("reallocating values buffer"), exit(1);
+ }
+ v->v[nval] = field;
+ v->t[nval] = epoch;
+ v->n = nval + 1;
+
+ return bufsize;
+}
+
+/*
+ * Add to each column the value on the current row.
+ */
+static int
+csv_addrow(Vlist *v, int bufsize, int ncol, int nval, char *line)
+{
+ time_t epoch;
+ int bs;
+ char *field, *dot;
+
+ if ((field = strsep(&line, ",")) == NULL)
+ fprintf(stderr, "%d: missing epoch\n", nval), exit(1);
+
+ if ((dot = strchr(field, '.')) != NULL)
+ *dot = '\0';
+ epoch = eatol(field);
+ for (; (field = strsep(&line, ",")) != NULL; ncol--, v++) {
+ if (ncol <= 0)
+ fprintf(stderr, "%d: too many fields\n", nval), exit(1…
+ bs = csv_addval(v, bufsize, nval, eatof(field), epoch);
+ }
+ if (ncol > 0)
+ fprintf(stderr, "%d: too few fields\n", nval), exit(1);
+
+ return bs;
+}
+
+/*
+ * < ncol >
+ * epoch,a1,b1,c1 ^
+ * epoch,a2,b2,c2 nval
+ * epoch,a3,b3,c3 v
+ */
+static void
+csv_values(Vlist *v, int ncol)
+{
+ int nval, bufsize;
+ char line[LINE_MAX];
+
+ bufsize = 0;
+ for (nval = 0; esfgets(line, sizeof(line), stdin) != NULL; nval++)
+ bufsize = csv_addrow(v, bufsize, ncol, nval, line);
+ if (nval == 0)
+ fputs("no value could be read\n", stderr), exit(1);
+}
+
+static void
+usage(void)
+{
+ Clist *c;
+
+ fprintf(stderr, "usage: %s [-t title] [-u unit] {", argv0);
+ fputs(clist->name, stderr);
+ for (c = clist + 1; c->name != NULL; c++)
+ fprintf(stderr, ",%s", c->name);
+ fputs("}...\n", stderr);
+ exit(1);
+}
+
+int
+main(int argc, char **argv)
+{
+ Vlist *v;
+ char labels[LINE_MAX];
+
+ ARGBEGIN {
+ case 't':
+ tflag = EARGF(usage());
+ break;
+ case 'u':
+ uflag = EARGF(usage());
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if ((v = calloc(argc, sizeof(*v))) == NULL)
+ perror("calloc value list"), exit(1);
+
+ csv_labels(v, argv, labels);
+ csv_values(v, argc);
+
+ ff(v, argc, tflag, uflag);
+
+ return 0;
+}
diff --git a/ploot.1 b/ploot.1
@@ -1,94 +0,0 @@
-.Dd $Mdocdate: February 15 2018$
-.Dt PLOOT 1
-.Os
-.
-.
-.Sh NAME
-.
-.Nm ploot
-.Nd plain text plotting tool
-.
-.
-.Sh SYNOPSIS
-.
-.Nm
-.Op Fl h Ar height
-.Op Fl o Ar offset
-.Op Fl t Ar title
-.
-.
-.Sh DESCRIPTION
-.
-The
-.Nm
-utility reads decimal values from stdin and print a plain text graph
-of the values to stdout.
-The values are separated by blanks or newlines, and can be either a plain
-list or a time serie
-.Po
-if the
-.Fl o
-flag is set
-.Pc
-.
-.Bl -tag -width 6n
-.
-.It Fl h Ar height
-Sets the height of the plot in characters.
-.
-.It Fl o Ar offset
-Read data as time series: the input alternates UNIX epoch and value
-to be plotted.
-The time stamps are assumed to be at an interval of
-.Ar offset .
-.
-.It Fl t Ar title
-Print
-.Ar title
-centered at the bottom of the graph.
-.
-.El
-.
-.
-.Sh EXIT STATUS
-.
-.Ex -std
-.
-.
-.Sh EXAMPLES
-.
-.Bd -literal
-% awk 'BEGIN { for (i=0; i<60; i++) print sin(i/3)+1 }' | ploot -h 10 -t List
-
- | .... .... ....
- 1.5963 -| ::::::. ::::::. .:::::: .:
- |.::::::::. .::::::::. .::::::::. .::
- 0.7982 -|::::::::::: .::::::::::. .::::::::::. ::::
- |::::::::::::. ::::::::::::::. .:::::::::::::: .:::::
- 0 -+------------------------------------------------------------
- List
-.Ed
-.
-.Bd -literal
-% ploot -h 8 -o 200 -t 'Time series'
-1518780448 12 1518780643 13 1518780848 31 1518781028 19 1518781291 23
-1518781423 20 1518781687 10 1518781819 13 1518782215 22 1518782412 11
-1518782632 18 1518782822 11 1518783039 16 1518783235 21 1518783499 21
-1518786629 30 1518786812 28 1518787012 11 1518787202 11 1518787433 11
-1518787629 10 1518788042 16 1518788333 29 1518788494 26 1518788633 12
-1518788821 28 1518789072 11 1518789201 11 1518789421 11 1518789630 11
-
- 31.000 -| : .. . .
- | : .. . .. :: :: :
- 15.500 -|..:::: . : : ::: :: :::.:
- |:::::::: ::::::: :::::: :::::::::
- 0 -+--------x-------xxxxxxxxxxxxxxx------x---------
- 12:27 12:50 13:14 13:37 14:00 14:24 14:47
- 2018/02/16 2018/02/16
- Time series
-.Ed
-.
-.Pp
-The
-.Sq x
-symbols on the horizontal axis represent a lack of data for that interval.
diff --git a/ploot.c b/ploot.c
@@ -1,154 +0,0 @@
-#include <time.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "arg.h"
-#include "ploot.h"
-#include "util.h"
-#include "config.h" /* after ploot.h for type definitions */
-
-char *argv0;
-char *tflag = "";
-char *uflag = "";
-
-static int
-color(Color *col, char *name)
-{
- ColorList *c;
-
- for (c = colorlist; c->name != NULL; c++) {
- if (strcmp(name, c->name) == 0) {
- memcpy(col, &c->col, sizeof(*col));
- return 0;
- }
- }
-
- return -1;
-}
-
-static void
-read_labels(Vlist *v, char **argv, char *buf)
-{
- if (esfgets(buf, LINE_MAX, stdin) == NULL)
- fputs("missing label line\n", stderr), exit(1);
-
- if (strcmp(strsep(&buf, ","), "epoch") != 0)
- fputs("first label must be \"epoch\"\n", stderr), exit(1);
-
- for (; *argv != NULL; v++, argv++)
- if ((v->label = strsep(&buf, ",")) == NULL)
- fputs("more arguments than columns\n", stderr), exit(1…
- else if (color(&v->col, *argv) == -1)
- fprintf(stderr, "unknown color: %s\n", *argv), exit(1);
-
- if (strsep(&buf, ",") != NULL)
- fputs("more columns than arguments\n", stderr), exit(1);
-}
-
-static int
-add_val(Vlist *v, int bufsize, int nval, double field, time_t epoch)
-{
- if (nval >= bufsize) {
- bufsize = bufsize * 2 + 1;
- if ((v->v = realloc(v->v, bufsize * sizeof(*v->v))) == NULL)
- perror("reallocating values buffer"), exit(1);
- if ((v->t = realloc(v->t, bufsize * sizeof(*v->t))) == NULL)
- perror("reallocating values buffer"), exit(1);
- }
- v->v[nval] = field;
- v->t[nval] = epoch;
- v->n = nval + 1;
-
- return bufsize;
-}
-
-/*
- * Add to each column the value on the current row.
- */
-static int
-add_row(Vlist *v, int bufsize, int ncol, int nval, char *line)
-{
- time_t epoch;
- int bs;
- char *field, *dot;
-
- if ((field = strsep(&line, ",")) == NULL)
- fprintf(stderr, "%d: missing epoch\n", nval), exit(1);
-
- if ((dot = strchr(field, '.')) != NULL)
- *dot = '\0';
- epoch = eatol(field);
- for (; (field = strsep(&line, ",")) != NULL; ncol--, v++) {
- if (ncol <= 0)
- fprintf(stderr, "%d: too many fields\n", nval), exit(1…
- bs = add_val(v, bufsize, nval, eatof(field), epoch);
- }
- if (ncol > 0)
- fprintf(stderr, "%d: too few fields\n", nval), exit(1);
-
- return bs;
-}
-
-/*
- * < ncol >
- * epoch,a1,b1,c1 ^
- * epoch,a2,b2,c2 nval
- * epoch,a3,b3,c3 v
- */
-static void
-read_values(Vlist *v, int ncol)
-{
- int nval, bufsize;
- char line[LINE_MAX];
-
- bufsize = 0;
- for (nval = 0; esfgets(line, sizeof(line), stdin) != NULL; nval++)
- bufsize = add_row(v, bufsize, ncol, nval, line);
- if (nval == 0)
- fputs("no value could be read\n", stderr), exit(1);
-}
-
-static void
-usage(void)
-{
- ColorList *c;
-
- fprintf(stderr, "usage: %s [-t title] [-u unit] {", argv0);
- fputs(colorlist->name, stderr);
- for (c = colorlist + 1; c->name != NULL; c++)
- fprintf(stderr, ",%s", c->name);
- fputs("}...\n", stderr);
- exit(1);
-}
-
-int
-main(int argc, char **argv)
-{
- Vlist *v;
- char labels[LINE_MAX];
-
- ARGBEGIN {
- case 't':
- tflag = EARGF(usage());
- break;
- case 'u':
- uflag = EARGF(usage());
- break;
- default:
- usage();
- } ARGEND;
-
- if ((v = calloc(argc, sizeof(*v))) == NULL)
- perror("calloc value list"), exit(1);
-
- read_labels(v, argv, labels);
- read_values(v, argc);
-
- ffplot(v, argc, tflag, uflag);
-
- return 0;
-}
diff --git a/ploot.h b/ploot.h
@@ -1,49 +0,0 @@
-#include <time.h>
-#include <stdint.h>
-
-typedef uint16_t Color[4];
-
-typedef struct {
- int w; /* width */
- int h; /* height */
- Color *b; /* buffer */
- int x; /* x offset */
- int y; /* x offset */
-} Canvas;
-
-typedef struct {
- int w; /* width */
- int h; /* height */
- char *b[128]; /* buffer */
-} Font;
-
-typedef struct {
- Color col; /* for drawing the curve and the legend */
- time_t *t; /* array of timestamps */
- double *v; /* array of values */
- int n; /* number of values */
- char *label; /* for the legend */
-} Vlist;
-
-typedef struct {
- char *name;
- Color col;
-} ColorList;
-
-/* ffdraw.c */
-void ffdraw_pixel (Canvas *, Color *, int, int);
-void ffdraw_rectangle(Canvas *, Color *, int, int, int, int);
-void ffdraw_line (Canvas *, Color *, int, int, int, int…
-void ffdraw_char (Canvas *, Color *, char, Font *, int,…
-void ffdraw_str_left(Canvas *, Color *, char *, Font *, int, i…
-void ffdraw_str_center(Canvas *, Color *, char *, Font *, int,…
-void ffdraw_str_right(Canvas *, Color *, char *, Font *, int, …
-void ffdraw_fill (Canvas *, Color *);
-void ffdraw_print (Canvas *);
-
-/* ffplot.c */
-void ffplot (Vlist *, int, char *, char *);
-
-/* util.c */
-char *strsep (char **, const char *);
-
diff --git a/plootxt.c b/plootxt.c
@@ -1,247 +0,0 @@
-#include <time.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "arg.h"
-#include "util.h"
-
-#define LEN(x) (sizeof(x) / sizeof(*x))
-
-#define WIDTH_MAX 1024
-#define BRAILLE_START 10240
-
-int wflag = 80;
-int width;
-
-char *argv0;
-
-/*
- * Turn the bit at position (row, col) on in the .
- */
-static void
-plot_dot(long *out, int row, int col)
-{
- long flags[4][2] = {
- { 0x01, 0x08 },
- { 0x02, 0x10 },
- { 0x04, 0x20 },
- { 0x40, 0x80 },
- };
-
- *out |= flags[row][col];;
-}
-
-static void
-plot_val(long *out, double val, double max, int row)
-{
- int col, c;
-
- val = MIN(max, val);
- col = (int)(val * (double)(width - 1) / max * 2);
- for (c = 0; c < col; c++)
- plot_dot(out + c / 2, row, c % 2);
-}
-
-/*
- * Change the braille characters on a whole row, this for all the
- * values line.
- */
-static time_t
-plot_row(long *out, char *line, double *max, int nrow, int ncol)
-{
- time_t epoch;
- double val;
- int n;
- char *tok;
-
- if ((tok = strsep(&line, ",")) == NULL)
- fputs("*** missing epoch value\n", stderr), exit(1);
- epoch = eatol(tok);
-
- for (n = 0; (tok = strsep(&line, ",")) != NULL; n++) {
- if (n >= ncol)
- fputs("too many values\n", stderr), exit(1);
- val = atof(tok);
- plot_val(out + n * width, val, max[n], nrow);
- }
- if (n < ncol)
- fputs("not enough values\n", stderr), exit(1);
-
- return epoch;
-}
-
-/*
- * Read enough input in order to print one line and plot it into 'out'.
- */
-static time_t
-plot_line(long *out, double *max, int ncol)
-{
- time_t epoch;
- int n, nrow;
- long *o, rune;
- char line[LINE_MAX];
-
- for (rune = BRAILLE_START, o = out, n = ncol * width; n > 0; o++, n--)
- memcpy(o, &rune, sizeof(rune));
- *o = '\0';
- for (rune = 0x2502, o = out, n = 0; n < ncol; o += width, n++)
- memcpy(o, &rune, sizeof(rune));
- out++;
-
- for (nrow = 0; nrow < 4; nrow++) {
- if ((esfgets(line, LINE_MAX, stdin)) == NULL)
- exit(0);
- epoch = plot_row(out, line, max, nrow, ncol);
- }
-
- return epoch;
-}
-
-static void
-put_time(time_t epoch, time_t last, int nline)
-{
- char *out, buf[sizeof("XXxXXxXX ")];
-
- switch (nline % 3) {
- case 0:
- strftime(buf, sizeof(buf), "%H:%M:%S _", localtime(&epoch));
- out = buf;
- break;
- case 1:
- strftime(buf, sizeof(buf), "%y/%m/%d ", localtime(&last));
- out = buf;
- break;
- case 2:
- out = " ";
- break;
- }
-
- fputs(out, stdout);
-}
-
-static void
-print_utf8_3bytes(long rune)
-{
- putchar((char)(0xe0 | (0x0f & (rune >> 12)))); /* 1110xxxx */
- putchar((char)(0x80 | (0x3f & (rune >> 6)))); /* 10xxxxxx */
- putchar((char)(0x80 | (0x3f & (rune)))); /* 10xxxxxx */
-}
-
-static void
-put_line(long *out)
-{
- for (; *out != '\0'; out++)
- print_utf8_3bytes(*out);
- puts("│");
-}
-
-static void
-plot(char labels[LINE_MAX], double *max, int ncol)
-{
- time_t epoch, last_epoch;
- long out[WIDTH_MAX + 1];
- int n;
-
- last_epoch = epoch = 0;
-
- for (n = 0;; n = n == 25 ? 0 : n + 1) {
- if (n == 0)
- put_time(0, 0, 2), fputs(labels, stdout), puts("│");
-
- epoch = plot_line(out, max, ncol);
- put_time(epoch, last_epoch, n);
- last_epoch = epoch;
- put_line(out);
-
- fflush(stdout);
- }
-}
-
-/*
- * Label must be able to store all pointers to token buf has to
- * offer: sizeof(*buf / 2).
- */
-static int
-read_labels(char *labv[LINE_MAX])
-{
- int ncol;
- char *l, line[LINE_MAX], *tok;
-
- if ((l = esfgets(line, LINE_MAX, stdin)) == NULL)
- fputs("missing label line\n", stderr), exit(1);
-
- if (strcmp(strsep(&l, ","), "epoch") != 0)
- fputs("first label must be \"epoch\"\n", stderr), exit(1);
-
- for (ncol = 0; (tok = strsep(&l, ",")) != NULL; ncol++, labv++)
- *labv = tok;
- *labv = NULL;
-
- if (ncol < 1)
- fputs("no label found\n", stderr), exit(1);
-
- return ncol;
-}
-
-static void
-fmt_labels(char out[LINE_MAX], int ncol, char *labels[LINE_MAX / 2])
-{
- int i, n;
-
- for (i = 0; i < ncol; labels++, i++) {
- n = LINE_MAX - (width + sizeof("│")) * i;
- out += snprintf(out, n, "│%-*s", width - 1, *labels);
- }
-}
-
-static void
-usage(void)
-{
- fprintf(stderr, "usage: %s [-w width] maxval... <csv\n", argv0);
- exit(1);
-}
-
-static int
-parse_args(int argc, char **argv, double *max)
-{
- int n;
-
- ARGBEGIN {
- case 'w':
- wflag = atoi(EARGF(usage()));
- break;
- default:
- usage();
- } ARGEND;
-
- if (argc == 0)
- usage();
-
- for (n = argc; n > 0; n--, argv++, max++)
- *max = eatof(*argv);
-
- return argc;
-}
-
-int
-main(int argc, char **argv)
-{
- double max[LINE_MAX / 2];
- int ncol, nmax;
- char *labv[LINE_MAX / 2], labels[LINE_MAX];
-
- setvbuf(stdin, NULL, _IOLBF, 0);
- nmax = parse_args(argc, argv, max);
- ncol = read_labels(labv);
- width = (wflag - sizeof("XXxXXxXX _")) / ncol - sizeof("|");
- fmt_labels(labels, ncol, labv);
- if (ncol != nmax)
- fputs("not as many labels and arguments\n", stderr), exit(1);
- plot(labels, max, ncol);
-
- return 0;
-}
diff --git a/util.c b/util.c
@@ -5,7 +5,15 @@
#include <stdlib.h>
#include <ctype.h>
-#include "ploot.h"
+#include "util.h"
+
+void
+put3utf(long rune)
+{
+ putchar((char)(0xe0 | (0x0f & (rune >> 12)))); /* 1110xxxx */
+ putchar((char)(0x80 | (0x3f & (rune >> 6)))); /* 10xxxxxx */
+ putchar((char)(0x80 | (0x3f & (rune)))); /* 10xxxxxx */
+}
char *
strsep(char **strp, const char *sep)
@@ -69,3 +77,28 @@ esfgets(char *buf, size_t n, FILE *file)
estriplf(buf);
return buf;
}
+
+/*
+ * Set 'str' to a human-readable form of 'num' with always a width of 8 (+ 1
+ * the '\0' terminator). Buffer overflow is ensured not to happen due to the
+ * max size of a double. Return the exponent.
+ */
+int
+humanize(char *str, double val)
+{
+ int exp, precision;
+ char label[] = { '\0', 'M', 'G', 'T', 'E' };
+
+ for (exp = 0; ABS(val) > 1000; exp++)
+ val /= 1000;
+
+ precision = (ABS(val) < 10) ? 2 : (ABS(val) < 100) ? 1 : 0;
+ precision += (exp == 0);
+
+ snprintf(str, 9, "%+.*f %c", precision, val, label[exp]);
+ str[8] = '\0';
+ if (val >= 0)
+ str[0] = ' ';
+
+ return exp * 3;
+}
diff --git a/util.h b/util.h
@@ -1,10 +1,12 @@
-#define MIN(x, y) ((x) < (y) ? (x) : (y))
-#define MAX(x, y) ((x) > (y) ? (x) : (y))
-#define LEN(x) (sizeof(x) / sizeof(*x))
+#define LEN(x) (sizeof(x) / sizeof(*x))
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+#define ABS(x) ((x) < 0 ? -(x) : (x))
-/* util.c */
+void put3utf (long);
char *strsep (char **, const char *);
void estriplf (char *);
double eatof (char *);
long eatol (char *);
char *esfgets (char *, size_t, FILE *);
+int humanize (char *, double);
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.