refactor - ploot - simple plotting tools
(HTM) git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
(DIR) LICENSE
---
(DIR) commit a07960fb4acccb2f1cc7d5dab19e3ec4ffc89684
(DIR) parent a2f50e1cb8af6ef5571c142b93b8ade388e0bfa5
(HTM) Author: Josuah Demangeon <me@josuah.net>
Date: Sat, 22 Feb 2020 16:54:07 +0100
refactor
Diffstat:
M .gitignore | 5 +----
M Makefile | 31 ++++++++++++++++++-------------
D arg.h | 18 ------------------
A config.mk | 3 +++
D csv.c | 95 ------------------------------
D def.h | 68 -------------------------------
D drawille.c | 221 -------------------------------
D font.c | 20 --------------------
D font13.c | 1576 -------------------------------
D font7.c | 743 -------------------------------
D font8.c | 743 -------------------------------
M ploot-braille.c | 114 +++++++++++++++++++++-----------
M ploot-farbfeld.c | 369 ++++++++++---------------------
M ploot-feed.c | 133 +++++++++++++++++--------------
A proto.sh | 73 +++++++++++++++++++++++++++++++
D scale.c | 139 ------------------------------
A src/csv.c | 109 +++++++++++++++++++++++++++++++
A src/csv.h | 22 ++++++++++++++++++++++
A src/drawille.c | 193 +++++++++++++++++++++++++++++++
A src/drawille.h | 28 ++++++++++++++++++++++++++++
A src/ffplot.c | 147 +++++++++++++++++++++++++++++++
A src/ffplot.h | 34 +++++++++++++++++++++++++++++++
A src/font.c | 20 ++++++++++++++++++++
A src/font.h | 22 ++++++++++++++++++++++
A src/font13.c | 1576 +++++++++++++++++++++++++++++++
A src/font7.c | 743 +++++++++++++++++++++++++++++++
A src/font8.c | 743 +++++++++++++++++++++++++++++++
A src/log.c | 99 +++++++++++++++++++++++++++++++
A src/log.h | 15 +++++++++++++++
A src/scale.c | 141 +++++++++++++++++++++++++++++++
A src/scale.h | 18 ++++++++++++++++++
A src/tool.c | 103 +++++++++++++++++++++++++++++++
A src/tool.h | 20 ++++++++++++++++++++
D util.c | 103 -------------------------------
34 files changed, 4388 insertions(+), 4099 deletions(-)
---
(DIR) diff --git a/.gitignore b/.gitignore
@@ -1,5 +1,2 @@
*.o
-*.core
-ploot-braille
-ploot-farbfeld
-ploot-feed
+/ploot-*[!.]?
(DIR) diff --git a/Makefile b/Makefile
@@ -1,22 +1,27 @@
-CFLAGS = -Wall -Wextra -std=c99 -pedantic -fPIC
-LFLAGS = -static
-BIN = ploot-farbfeld ploot-feed ploot-braille
-LIB = -lm
-MANDIR = $(PREFIX)/share/man
+include config.mk
-SRC = csv.c drawille.c font.c font7.c font8.c font13.c util.c scale.c
+src = src/csv.c src/drawille.c src/ffplot.c src/font.c src/font13.c \
+ src/font7.c src/font8.c src/log.c src/scale.c src/tool.c
+inc = src/csv.h src/drawille.h src/ffplot.h src/font.h src/log.h \
+ src/scale.h src/tool.h
+bin = ploot-farbfeld ploot-feed ploot-braille
+obj = ${src:.c=.o}
+lib = -lm
-all: $(BIN)
+all: $(bin)
-${SRC:.c=.o} ${BIN:=.o}: arg.h def.h Makefile
-${BIN}: ${SRC:.c=.o} ${BIN:=.o}
- ${CC} $(LFLAGS) -o $@ $@.o ${SRC:.c=.o} $(LIB)
+.c.o:
+ ${CC} -c ${CFLAGS} -o $@ $<
-install: $(BIN)
+${obj} ${bin:=.o}: ${inc} Makefile
+${bin}: ${obj} ${bin:=.o}
+ ${CC} $(LFLAGS) -o $@ $@.o ${obj} $(lib)
+
+install: $(bin)
mkdir -p ${PREFIX}/bin $(MANDIR)/man1 $(MANDIR)/man7
- cp $(BIN) ${PREFIX}/bin
+ cp $(bin) ${PREFIX}/bin
cp ploot-farbfeld.1 ploot-feed.1 $(MANDIR)/man1
cp ploot-csv.7 $(MANDIR)/man7
clean:
- rm -f *.o
+ rm -f *.o */*.o ${bin}
(DIR) diff --git a/arg.h b/arg.h
@@ -1,18 +0,0 @@
-#ifndef ARG_H
-#define ARG_H
-
-#define ARG_SWITCH(argc, argv) \
- arg0 = *argv; \
- while (++argv && --argc && **argv == '-' && (*argv)[1]) \
- if ((*argv)[1] == '-' && (*argv)[2] == '\0') { \
- ++argv; break; \
- } else for (int stop = 0; !stop && *++*argv != '\0' ;) \
- switch (**argv)
-
-#define ARG ((*++*argv != '\0' || *++argv != NULL) \
- ? ((stop = 1), argc--, *argv) \
- : (usage(), NULL))
-
-extern char const *arg0;
-
-#endif
(DIR) diff --git a/config.mk b/config.mk
@@ -0,0 +1,3 @@
+CFLAGS = -Wall -Wextra -std=c99 -pedantic -fPIC -I"src" -D_POSIX_C_SOURCE=200811L
+LFLAGS = -static
+MANDIR = $(PREFIX)/share/man
(DIR) diff --git a/csv.c b/csv.c
@@ -1,95 +0,0 @@
-/*
- * Read CSV data onto a set of (struct vlist).
- */
-
-#include <string.h>
-#include <time.h>
-#include <stdlib.h>
-
-#include "def.h"
-
-static void
-csv_addtime(struct vlist *vl, time_t epoch)
-{
- if ((vl->t = realloc(vl->t, (vl->n + 1) * sizeof(*vl->t))) == NULL)
- err(1, "reallocating values buffer");
- vl->t[vl->n] = epoch;
-}
-
-static void
-csv_addval(struct vlist *vl, double field)
-{
- if ((vl->v = realloc(vl->v, (vl->n + 1) * sizeof(*vl->v))) == NULL)
- err(1, "reallocating values buffer");
- vl->v[vl->n] = field;
-}
-
-/*
- * Add to each column the value on the current row.
- */
-void
-csv_addrow(struct vlist *vl, size_t ncol, char *line)
-{
- char *field;
-
- if ((field = strsep(&line, ",")) == NULL)
- err(1, "missing epoch at row %zu", vl->n);
-
- csv_addtime(vl, eatol(field));
- for (; (field = strsep(&line, ",")) != NULL; ncol--, vl->n++, vl++) {
- if (ncol == 0)
- err(1, "too many fields at line %zu", vl->n);
- csv_addval(vl, eatof(field));
- }
- if (ncol > 0)
- err(1, "too few fields at line %zu", vl->n);
-}
-
-/*
- * < *ncol >
- * epoch,label1,label2,label3
- */
-void
-csv_labels(FILE *fp, char *buf, struct vlist **vl, size_t *ncol)
-{
- char *field;
- size_t sz;
-
- if (esfgets(buf, LINE_MAX, fp) == NULL)
- err(1, "missing label line");
-
- if (strcmp(strsep(&buf, ","), "epoch") != 0)
- err(1, "first label must be \"epoch\"");
-
- *vl = NULL;
- for (*ncol = 0; (field = strsep(&buf, ",")) != NULL; ++*ncol) {
- sz = (*ncol + 1) * sizeof **vl;
- if ((*vl = realloc(*vl, sz)) == NULL)
- err(1, "realloc");
- (*vl)[*ncol].label = field;
- }
-}
-
-/*
- * < ncol >
- * epoch,a1,b1,c1 ^
- * epoch,a2,b2,c2 vl->n
- * epoch,a3,b3,c3 v
- */
-void
-csv_values(FILE *fp, struct vlist *vl, size_t ncol)
-{
- char line[LINE_MAX];
- time_t *tbuf;
-
- while (esfgets(line, sizeof(line), fp) != NULL)
- csv_addrow(vl, ncol, line);
- if (vl->n == 0)
- err(1, "no value could be read");
- if (vl->n == 1)
- err(1, "only one value could be read");
-
- /* The same time buffer can be used for all. */
- for (tbuf = vl->t; ncol > 0; ncol--, vl++)
- vl->t = tbuf;
-}
(DIR) diff --git a/def.h b/def.h
@@ -1,68 +0,0 @@
-#include <limits.h>
-#include <stdarg.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#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))
-
-/*
- * Canvas to draw on with braille characters.
- */
-struct drawille {
- int col, row; /* number of dots in total */
- uint8_t buf[]; /* buffer of size (col * row) */
-};
-
-/*
- * Bitmapped font saved as a '_' and 'X' pattern in a C source file.
- */
-struct font {
- int height; /* The width is variable. */
- char *glyph[128]; /* 0: end, 1: off, 2: on. */
-};
-
-/*
- * List of values and timestamps. Both have their dedicated buffer
- * so that the timestamp buffer can be shared across vlist objects.
- */
-struct vlist {
- time_t *t; /* array of timestamps */
- double *v; /* array of values */
- size_t n; /* number of values */
- char *label; /* for the legend */
-};
-
-/**/
-void csv_addrow (struct vlist *, size_t, char *);
-void csv_labels (FILE *, char *, struct vlist **, size_t *);
-void csv_values (FILE *, struct vlist *, size_t);
-size_t drawille_put_row (struct drawille *, FILE *, int);
-void drawille_dot (struct drawille *, int, int);
-struct drawille *drawille_new (int, int);
-void drawille_line (struct drawille *, int, int, int, int);
-void drawille_histogram_dot (struct drawille *, int, int, int);
-void drawille_histogram_line (struct drawille *, int, int, int, int, int);
-int drawille_histogram (struct vlist *, struct drawille *, time_t, time_t, double, double);
-char * drawille_text (struct drawille *, int, int, struct font *, char *);
-size_t font_width (struct font *, int);
-size_t font_strlen (struct font *, char *);
-struct font font13;
-struct font font7;
-struct font font8;
-char const *arg0;
-int scale_ypos (double, double, double, int);
-int scale_xpos (time_t, time_t, time_t, int);
-void scale_vminmax (double *, double *, int);
-void scale (struct vlist *, int, time_t *, time_t *, time_t *, double *, double *, double *);
-size_t strlcpy (char *, const char *, size_t);
-void put3utf (long);
-char * strsep (char **, const char *);
-void estriplf (char *);
-double eatof (char *);
-long eatol (char *);
-int humanize (char *, double);
-
-#endif
(DIR) diff --git a/drawille.c b/drawille.c
@@ -1,221 +0,0 @@
-/*
- * Terminal-based plotting using drawille character, aka drawille.
- */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#include "def.h"
-
-/* parameters used to draw a line */
-struct line {
- int x0, y0, x1, y1; /* point of the line */
- int dx, dy, sx, sy, err; /* parameters for the algorythm */
-};
-
-/*
- * Turn on the bit at position (row, col) of a single cell. The
- * pattern is not linear (1-4-2-5-3-6-7-8), because it matches the
- * drawille pattern.
- */
-static void
-drawille_cell_dot(uint8_t *cell, int row, int col)
-{
- uint8_t flags[4][2] = {
- { 0x01, 0x08 },
- { 0x02, 0x10 },
- { 0x04, 0x20 },
- { 0x40, 0x80 },
- };
-
- *cell |= flags[row][col];
-}
-
-static size_t
-drawille_cell_utf(uint8_t cell, char *utf)
-{
- long rune;
-
- rune = 10240 + cell;
- utf[0] = (char)(0xe0 | (0x0f & (rune >> 12))); /* 1110xxxx */
- utf[1] = (char)(0x80 | (0x3f & (rune >> 6))); /* 10xxxxxx */
- utf[2] = (char)(0x80 | (0x3f & (rune))); /* 10xxxxxx */
- return 3;
-}
-
-static uint8_t
-drawille_get(struct drawille *drw, int row, int col)
-{
- return drw->buf[row * drw->col + col];
-}
-
-size_t
-drawille_put_row(struct drawille *drw, FILE *fp, int row)
-{
- char txt[] = "xxx";
- size_t n;
-
- n = 0;
- for (int col = 0; col < drw->col; col++) {
- drawille_cell_utf(drawille_get(drw, row, col), txt);
- n += fputs(txt, fp);
- }
- return n;
-}
-
-/*
- * Coordinates are passed as (x, y), but the canvas stores bits as
- * (row, col). Conversion is made by this function.
- */
-void
-drawille_dot(struct drawille *drw, int x, int y)
-{
- if (x < 0 || x / 2 >= drw->col || y < 0 || y / 4 >= drw->row)
- return;
- drawille_cell_dot(drw->buf + (drw->row - y / 4 - 1) * drw->col + (x / 2),
- 3 - y % 4,
- x % 2);
-}
-
-struct drawille *
-drawille_new(int row, int col)
-{
- struct drawille *drw;
-
- if ((drw = calloc(sizeof(struct drawille) + row * col, 1)) == NULL)
- return NULL;
- drw->row = row;
- drw->col = col;
- return drw;
-}
-
-static void
-drawille_line_init(struct line *l, int x0, int y0, int x1, int y1)
-{
- l->x0 = x0;
- l->y0 = y0;
- l->x1 = x1;
- l->y1 = y1;
- l->sx = x0 < x1 ? 1 : -1;
- l->sy = y0 < y1 ? 1 : -1;
- l->dx = abs(x1 - x0);
- l->dy = abs(y1 - y0);
- l->err = (l->dx > l->dy ? l->dx : -l->dy) / 2;
-}
-
-static int
-drawille_line_next(struct line *l)
-{
- int e;
-
- if (l->x0 == l->x1 && l->y0 == l->y1)
- return 0;
-
- e = l->err;
- if (e > -l->dx) {
- l->x0 += l->sx;
- l->err -= l->dy;
- }
- if (e < l->dy) {
- l->y0 += l->sy;
- l->err += l->dx;
- }
- return 1;
-}
-
-void
-drawille_line(struct drawille *drw, int x0, int y0, int x1, int y1)
-{
- struct line l;
-
- drawille_line_init(&l, x0, y0, x1, y1);
- do {
- drawille_dot(drw, l.x0, l.y0);
- } while (drawille_line_next(&l));
-}
-
-void
-drawille_histogram_dot(struct drawille *drw, int x, int y, int zero)
-{
- int sign;
-
- sign = (y > zero) ? (+1) : (-1);
- for (; y != zero + sign; y -= sign)
- drawille_dot(drw, x, y);
-}
-
-void
-drawille_histogram_line(struct drawille *drw, int x0, int y0, int x1, int y1, int zero)
-{
- struct line l;
-
- drawille_line_init(&l, x0, y0, x1, y1);
- do {
- drawille_histogram_dot(drw, l.x0, l.y0, zero);
- } while (drawille_line_next(&l));
-}
-
-/*
- * Plot the body as an histogram interpolating the gaps and include
- * a vertical and horizontal axis.
- */
-int
-drawille_histogram(struct vlist *vl, struct drawille *drw,
- time_t tmin, time_t tmax, double vmin, double vmax)
-{
- int x, xprev, y, yprev, zero;
- double *v;
- time_t *t;
- size_t n;
-
- zero = scale_ypos(0, vmin, vmax, drw->row*4);
- v = vl->v;
- t = vl->t;
- n = vl->n;
- for (; n > 0; n--, t++, v++) {
- if (isnan(*v)) /* XXX: better handling? */
- continue;
- y = scale_ypos(*v, vmin, vmax, drw->row * 4);
- x = scale_xpos(*t, tmin, tmax, drw->col * 2);
- if (n < vl->n)
- drawille_histogram_line(drw, xprev, yprev, x, y, zero);
- xprev = x;
- yprev = y;
- }
- return 0;
-}
-
-static int
-drawille_text_glyph(struct drawille *drw, int x, int y, struct font *font, char c)
-{
- int width;
- char *glyph;
-
- if ((unsigned)c > 127)
- glyph = font->glyph[0];
- else
- glyph = font->glyph[(unsigned)c];
-
- width = strlen(glyph) / font->height;
-
- for (int ix = 0; ix < width; ix++)
- for (int iy = 0; iy < font->height; iy++) {
- if (glyph[ix + (font->height - 1) * width - iy * width] == 3)
- drawille_dot(drw, x + ix, y + iy);
- }
-
- return width;
-}
-
-char *
-drawille_text(struct drawille *drw, int x, int y, struct font *font, char *s)
-{
- if (drw->row*4 < font->height)
- return NULL;
- for (; *s != '\0' && x < drw->col/2; s++, x++)
- x += drawille_text_glyph(drw, x, y, font, *s);
- return s;
-}
(DIR) diff --git a/font.c b/font.c
@@ -1,20 +0,0 @@
-#include <string.h>
-
-#include "def.h"
-
-size_t
-font_width(struct font *ft, int c)
-{
- return strlen(ft->glyph[c]) / ft->height;
-}
-
-size_t
-font_strlen(struct font *ft, char *s)
-{
- size_t len;
-
- len = 0;
- for (; *s != '\0'; s++)
- len += font_width(ft, *s);
- return len;
-}
(DIR) diff --git a/font13.c b/font13.c
@@ -1,1576 +0,0 @@
-#include "def.h"
-
-#define C(x) static char glyph_##x[]
-#define _ 2
-#define X 3
-
-C(error) = {
- _,_,_,_,_,
- 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,X,
- _,_,_,_,_,
-0};
-
-C(space) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(bang) = {
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(double) = {
- _,_,_,_,_,
- _,X,_,X,_,
- _,X,_,X,_,
- _,X,_,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-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,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-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,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(percent) = {
- _,_,_,_,_,
- X,X,_,_,X,
- X,X,_,_,X,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,X,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- X,_,_,X,X,
- X,_,_,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(amp) = {
- _,_,_,_,_,
- _,_,X,_,_,
- _,X,_,X,_,
- _,X,_,X,_,
- _,_,X,_,_,
- _,X,X,_,X,
- X,_,_,X,_,
- X,_,_,X,_,
- X,_,_,X,_,
- _,X,X,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(single) = {
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(l_round) = {
- _,_,_,_,_,
- _,_,_,X,_,
- _,_,X,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,_,X,_,_,
- _,_,_,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(r_round) = {
- _,_,_,_,_,
- _,X,_,_,_,
- _,_,X,_,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,X,_,_,
- _,X,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(asterisk) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,X,_,_,
- X,_,X,_,X,
- _,X,X,X,_,
- _,_,X,_,_,
- _,X,X,X,_,
- X,_,X,_,X,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(plus) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- X,X,X,X,X,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(coma) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,X,_,_,_,
- _,_,_,_,_,
-0};
-
-C(minus) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(dot) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(slash) = {
- _,_,_,_,_,
- _,_,_,_,X,
- _,_,_,_,X,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,X,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(0) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,X,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(1) = {
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,X,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(2) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,X,
- _,_,_,X,_,
- _,_,X,_,_,
- _,X,_,_,_,
- X,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(3) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- _,_,_,_,X,
- _,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,X,
- _,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(4) = {
- _,_,_,_,_,
- _,_,_,_,X,
- _,_,_,X,X,
- _,_,X,_,X,
- _,X,_,_,X,
- X,_,_,_,X,
- X,X,X,X,X,
- _,_,_,_,X,
- _,_,_,_,X,
- _,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(5) = {
- _,_,_,_,_,
- X,X,X,X,X,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,X,X,X,_,
- _,_,_,_,X,
- _,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(6) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,_,
- X,_,_,_,_,
- X,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(7) = {
- _,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,X,
- _,_,_,_,X,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(8) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(9) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,X,
- _,_,_,_,X,
- _,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(column) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(semicolumn) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,X,_,_,_,
- _,_,_,_,_,
-0};
-
-C(l_angle) = {
- _,_,_,_,_,
- _,_,_,_,X,
- _,_,_,X,_,
- _,_,X,_,_,
- _,X,_,_,_,
- X,_,_,_,_,
- _,X,_,_,_,
- _,_,X,_,_,
- _,_,_,X,_,
- _,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(equal) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(r_angle) = {
- _,_,_,_,_,
- X,_,_,_,_,
- _,X,_,_,_,
- _,_,X,_,_,
- _,_,_,X,_,
- _,_,_,_,X,
- _,_,_,X,_,
- _,_,X,_,_,
- _,X,_,_,_,
- X,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(question) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,X,
- _,_,_,X,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-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,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(A) = {
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,X,_,X,_,
- _,X,_,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,X,X,X,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-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,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(C) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(D) = {
- _,_,_,_,_,
- X,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(E) = {
- _,_,_,_,_,
- X,X,X,X,X,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,X,X,X,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(F) = {
- _,_,_,_,_,
- X,X,X,X,X,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,X,X,X,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(G) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,X,X,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(H) = {
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,X,X,X,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(I) = {
- _,_,_,_,_,
- _,X,X,X,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(J) = {
- _,_,_,_,_,
- _,X,X,X,X,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- X,_,_,X,_,
- _,X,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(K) = {
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,X,_,
- X,_,X,_,_,
- X,X,_,_,_,
- X,_,X,_,_,
- X,_,_,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(L) = {
- _,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-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,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-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,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(O) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(P) = {
- _,_,_,_,_,
- X,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,X,X,X,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(Q) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,X,_,X,
- _,X,X,X,_,
- _,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(R) = {
- _,_,_,_,_,
- X,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,X,X,X,_,
- X,_,X,_,_,
- X,_,_,X,_,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(S) = {
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,_,
- X,_,_,_,_,
- _,X,X,X,_,
- _,_,_,_,X,
- _,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(T) = {
- _,_,_,_,_,
- X,X,X,X,X,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(U) = {
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(V) = {
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,_,X,_,
- _,X,_,X,_,
- _,X,_,X,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-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,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(X) = {
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,_,X,_,
- _,X,_,X,_,
- _,_,X,_,_,
- _,X,_,X,_,
- _,X,_,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(Y) = {
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,_,X,_,
- _,X,_,X,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(Z) = {
- _,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,X,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,X,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- X,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(l_square) = {
- _,_,_,_,_,
- _,X,X,X,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(backsl) = {
- _,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,_,X,_,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,_,X,
- _,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(r_square) = {
- _,_,_,_,_,
- _,X,X,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(hat) = {
- _,_,_,_,_,
- _,_,X,_,_,
- _,X,_,X,_,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(underscore) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-X ,X,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(backtilt) = {
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(a) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,X,X,X,_,
- _,_,_,_,X,
- _,_,_,_,X,
- _,X,X,X,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(b) = {
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(c) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(d) = {
- _,_,_,_,X,
- _,_,_,_,X,
- _,_,_,_,X,
- _,X,X,X,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(e) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,X,X,X,X,
- X,_,_,_,_,
- X,_,_,_,_,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(f) = {
- _,_,X,X,X,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- X,X,X,X,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-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,_,
-0};
-
-C(h) = {
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(i) = {
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,X,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(j) = {
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,_,_,
- _,_,X,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- X,_,_,X,_,
- _,X,X,_,_,
-0};
-
-C(k) = {
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,X,
- X,_,_,X,_,
- X,_,X,_,_,
- X,X,_,_,_,
- X,_,X,_,_,
- X,_,_,X,_,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(l) = {
- _,X,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(m) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,X,X,X,_,
- X,_,X,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(n) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(o) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(p) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,X,X,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,X,X,X,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
-0};
-
-C(q) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,X,X,X,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,X,
- _,_,_,_,X,
- _,_,_,_,X,
- _,_,_,_,X,
-0};
-
-C(r) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,_,X,X,X,
- X,X,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- X,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(s) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,X,X,X,X,
- X,_,_,_,_,
- X,_,_,_,_,
- _,X,X,X,_,
- _,_,_,_,X,
- _,_,_,_,X,
- X,X,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(t) = {
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- X,X,X,X,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,_,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(u) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(v) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,_,X,_,
- _,X,_,X,_,
- _,X,_,X,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(w) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- _,X,_,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(x) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,_,X,_,
- _,_,X,_,_,
- _,X,_,X,_,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(y) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,X,X,X,
- _,_,_,_,X,
- _,_,_,_,X,
- X,X,X,X,_,
-0};
-
-C(z) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,X,
- _,_,_,X,_,
- _,_,X,_,_,
- _,X,_,_,_,
- X,_,_,_,_,
- X,X,X,X,X,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(l_curly) = {
- _,_,_,_,_,
- _,_,X,X,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- X,_,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,X,_,_,_,
- _,_,X,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(pipe) = {
- _,_,_,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(r_curly) = {
- _,_,_,_,_,
- _,X,X,_,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,_,X,
- _,_,_,X,_,
- _,_,_,X,_,
- _,_,_,X,_,
- _,X,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(tilde) = {
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,X,_,_,X,
- X,_,X,_,X,
- X,_,_,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-struct font font13 = { 13, {
- 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_amp, 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_backsl, 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
-} };
(DIR) diff --git a/font7.c b/font7.c
@@ -1,743 +0,0 @@
-#include "def.h"
-
-#define C(x) static char glyph_##x[]
-#define _ 2
-#define X 3
-
-C(err) = {
- X,X,X,X,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,X,X,X,
-0};
-
-C(A) = {
- _,_,_,_,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,X,X,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(B) = {
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,X,X,_,
- X,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(C) = {
- _,_,_,_,
- _,X,X,X,
- X,_,_,_,
- X,_,_,_,
- X,_,_,_,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(D) = {
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(E) = {
- _,_,_,_,
- X,X,X,X,
- X,_,_,_,
- X,X,X,_,
- X,_,_,_,
- X,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(F) = {
- _,_,_,_,
- X,X,X,X,
- X,_,_,_,
- X,X,X,_,
- X,_,_,_,
- X,_,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(G) = {
- _,_,_,_,
- _,X,X,X,
- X,_,_,_,
- X,_,X,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(H) = {
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- X,X,X,X,
- X,_,_,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(I) = {
- _,_,_,
- X,X,X,
- _,X,_,
- _,X,_,
- _,X,_,
- X,X,X,
- _,_,_,
- _,_,_,
-0};
-
-C(J) = {
- _,_,_,_,
- _,X,X,X,
- _,_,X,_,
- _,_,X,_,
- _,_,X,_,
- X,X,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(K) = {
- _,_,_,_,
- X,_,_,X,
- X,_,X,_,
- X,X,_,_,
- X,_,X,_,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(L) = {
- _,_,_,_,
- X,_,_,_,
- X,_,_,_,
- X,_,_,_,
- X,_,_,_,
- X,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(M) = {
- _,_,_,_,_,
- X,_,_,_,X,
- X,X,_,X,X,
- X,_,X,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(N) = {
- _,_,_,_,
- X,_,_,X,
- X,X,_,X,
- X,X,X,X,
- X,_,X,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(O) = {
- _,_,_,_,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(P) = {
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,X,X,_,
- X,_,_,_,
- X,_,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(Q) = {
- _,_,_,_,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,_,X,X,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(R) = {
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,X,X,_,
- X,_,X,_,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(S) = {
- _,_,_,_,
- _,X,X,X,
- X,_,_,_,
- _,X,X,_,
- _,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(T) = {
- _,_,_,_,
- X,X,X,X,
- _,X,X,_,
- _,X,X,_,
- _,X,X,_,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(U) = {
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(V) = {
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- X,_,X,_,
- X,_,X,_,
- X,X,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(W) = {
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- _,X,_,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(X) = {
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(Y) = {
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,X,_,_,
- X,_,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(Z) = {
- _,_,_,_,
- X,X,X,X,
- _,_,_,X,
- _,X,X,_,
- X,_,_,_,
- X,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(a) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(b) = {
- X,_,_,_,
- X,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(c) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,_,_,_,
- X,_,_,_,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(d) = {
- _,_,_,X,
- _,_,_,X,
- _,X,X,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(e) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,X,X,X,
- X,_,_,_,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(f) = {
- _,X,X,
- X,_,_,
- X,_,_,
- X,X,_,
- X,_,_,
- X,_,_,
- _,_,_,
- _,_,_,
-0};
-
-C(g) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,X,
- _,X,X,_,
-0};
-
-C(h) = {
- X,_,_,_,
- X,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(i) = {
- _,X,_,
- _,_,_,
- X,X,_,
- _,X,_,
- _,X,_,
- _,X,X,
- _,_,_,
- _,_,_,
-0};
-
-C(j) = {
- _,X,_,
- _,_,_,
- X,X,_,
- _,X,_,
- _,X,_,
- _,X,_,
- _,X,_,
- X,_,_,
-0};
-
-C(k) = {
- X,_,_,_,
- X,_,_,_,
- X,_,_,X,
- X,_,X,_,
- X,X,X,_,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(l) = {
- X,X,_,
- _,X,_,
- _,X,_,
- _,X,_,
- _,X,_,
- X,X,X,
- _,_,_,
- _,_,_,
-0};
-
-C(m) = {
- _,_,_,_,_,
- _,_,_,_,_,
- X,X,X,X,_,
- X,_,X,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(n) = {
- _,_,_,_,
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(o) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(p) = {
- _,_,_,_,
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,X,X,_,
- X,_,_,_,
- X,_,_,_,
-0};
-
-C(q) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,X,
- _,_,_,X,
-0};
-
-C(r) = {
- _,_,_,_,
- _,_,_,_,
- X,_,X,X,
- X,X,_,_,
- X,_,_,_,
- X,_,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(s) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,X,_,_,
- _,_,X,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(t) = {
- X,_,_,
- X,_,_,
- X,X,X,
- X,_,_,
- X,_,_,
- _,X,X,
- _,_,_,
- _,_,_,
-0};
-
-C(u) = {
- _,_,_,_,
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(v) = {
- _,_,_,_,_,
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,_,X,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(w) = {
- _,_,_,_,_,
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- _,X,_,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(x) = {
- _,_,_,_,
- _,_,_,_,
- X,_,_,X,
- _,X,X,_,
- _,X,X,_,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(y) = {
- _,_,_,_,
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,X,
- _,X,X,_,
-0};
-
-C(z) = {
- _,_,_,_,
- _,_,_,_,
- X,X,X,X,
- _,_,X,_,
- _,X,_,_,
- X,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(0) = {
- _,X,X,_,
- X,_,_,X,
- X,_,X,X,
- X,X,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(1) = {
- _,X,_,
- X,X,_,
- _,X,_,
- _,X,_,
- _,X,_,
- X,X,X,
- _,_,_,
- _,_,_,
-0};
-
-C(2) = {
- _,X,X,_,
- X,_,_,X,
- _,_,_,X,
- _,_,X,_,
- _,X,_,_,
- X,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(3) = {
- X,X,X,_,
- _,_,_,X,
- _,X,X,X,
- _,_,_,X,
- _,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(4) = {
- _,_,X,X,
- _,X,_,X,
- X,_,_,X,
- X,X,X,X,
- _,_,_,X,
- _,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(5) = {
- X,X,X,X,
- X,_,_,_,
- X,X,X,_,
- _,_,_,X,
- _,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(6) = {
- _,X,X,_,
- X,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(7) = {
- X,X,X,X,
- _,_,_,X,
- _,_,X,_,
- _,_,X,_,
- _,X,_,_,
- _,X,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(8) = {
- _,X,X,_,
- X,_,_,X,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(9) = {
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(space) = {
- _,_,_,
- _,_,_,
- _,_,_,
- _,_,_,
- _,_,_,
- _,_,_,
- _,_,_,
-0};
-
-struct font font7 = { 8, {
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_space, glyph_err, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_0, glyph_1, glyph_2, glyph_3,
- glyph_4, glyph_5, glyph_6, glyph_7,
- glyph_8, glyph_9, glyph_err, glyph_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, 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_err,
- glyph_err, glyph_err, glyph_err, glyph_err,
- glyph_err, 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_err,
- glyph_err, glyph_err, glyph_err, glyph_err
-} };
(DIR) diff --git a/font8.c b/font8.c
@@ -1,743 +0,0 @@
-#include "def.h"
-
-#define C(x) static char glyph_##x[]
-#define _ 2
-#define X 3
-
-C(error) = {
- X,X,X,X,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,X,X,X,
-0};
-
-C(A) = {
- _,_,_,_,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,X,X,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(B) = {
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,X,X,_,
- X,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(C) = {
- _,_,_,_,
- _,X,X,X,
- X,_,_,_,
- X,_,_,_,
- X,_,_,_,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(D) = {
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(E) = {
- _,_,_,_,
- X,X,X,X,
- X,_,_,_,
- X,X,X,_,
- X,_,_,_,
- X,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(F) = {
- _,_,_,_,
- X,X,X,X,
- X,_,_,_,
- X,X,X,_,
- X,_,_,_,
- X,_,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(G) = {
- _,_,_,_,
- _,X,X,X,
- X,_,_,_,
- X,_,X,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(H) = {
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- X,X,X,X,
- X,_,_,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(I) = {
- _,_,_,
- X,X,X,
- _,X,_,
- _,X,_,
- _,X,_,
- X,X,X,
- _,_,_,
- _,_,_,
-0};
-
-C(J) = {
- _,_,_,_,
- _,X,X,X,
- _,_,X,_,
- _,_,X,_,
- _,_,X,_,
- X,X,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(K) = {
- _,_,_,_,
- X,_,_,X,
- X,_,X,_,
- X,X,_,_,
- X,_,X,_,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(L) = {
- _,_,_,_,
- X,_,_,_,
- X,_,_,_,
- X,_,_,_,
- X,_,_,_,
- X,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(M) = {
- _,_,_,_,_,
- X,_,_,_,X,
- X,X,_,X,X,
- X,_,X,_,X,
- X,_,_,_,X,
- X,_,_,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(N) = {
- _,_,_,_,
- X,_,_,X,
- X,X,_,X,
- X,X,X,X,
- X,_,X,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(O) = {
- _,_,_,_,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(P) = {
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,X,X,_,
- X,_,_,_,
- X,_,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(Q) = {
- _,_,_,_,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,_,X,X,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(R) = {
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,X,X,_,
- X,_,X,_,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(S) = {
- _,_,_,_,
- _,X,X,X,
- X,_,_,_,
- _,X,X,_,
- _,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(T) = {
- _,_,_,_,
- X,X,X,X,
- _,X,X,_,
- _,X,X,_,
- _,X,X,_,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(U) = {
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(V) = {
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- X,_,X,_,
- X,_,X,_,
- X,X,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(W) = {
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- _,X,_,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(X) = {
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(Y) = {
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,X,_,_,
- X,_,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(Z) = {
- _,_,_,_,
- X,X,X,X,
- _,_,_,X,
- _,X,X,_,
- X,_,_,_,
- X,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(a) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(b) = {
- X,_,_,_,
- X,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(c) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,_,_,_,
- X,_,_,_,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(d) = {
- _,_,_,X,
- _,_,_,X,
- _,X,X,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(e) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,X,X,X,
- X,_,_,_,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(f) = {
- _,X,X,
- X,_,_,
- X,_,_,
- X,X,_,
- X,_,_,
- X,_,_,
- _,_,_,
- _,_,_,
-0};
-
-C(g) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,X,
- _,X,X,_,
-0};
-
-C(h) = {
- X,_,_,_,
- X,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(i) = {
- _,X,_,
- _,_,_,
- X,X,_,
- _,X,_,
- _,X,_,
- _,X,X,
- _,_,_,
- _,_,_,
-0};
-
-C(j) = {
- _,X,_,
- _,_,_,
- X,X,_,
- _,X,_,
- _,X,_,
- _,X,_,
- _,X,_,
- X,_,_,
-0};
-
-C(k) = {
- X,_,_,_,
- X,_,_,_,
- X,_,_,X,
- X,_,X,_,
- X,X,X,_,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(l) = {
- X,X,_,
- _,X,_,
- _,X,_,
- _,X,_,
- _,X,_,
- X,X,X,
- _,_,_,
- _,_,_,
-0};
-
-C(m) = {
- _,_,_,_,_,
- _,_,_,_,_,
- X,X,X,X,_,
- X,_,X,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(n) = {
- _,_,_,_,
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(o) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(p) = {
- _,_,_,_,
- _,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- X,X,X,_,
- X,_,_,_,
- X,_,_,_,
-0};
-
-C(q) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,X,
- _,_,_,X,
-0};
-
-C(r) = {
- _,_,_,_,
- _,_,_,_,
- X,_,X,X,
- X,X,_,_,
- X,_,_,_,
- X,_,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(s) = {
- _,_,_,_,
- _,_,_,_,
- _,X,X,X,
- X,X,_,_,
- _,_,X,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(t) = {
- X,_,_,
- X,_,_,
- X,X,X,
- X,_,_,
- X,_,_,
- _,X,X,
- _,_,_,
- _,_,_,
-0};
-
-C(u) = {
- _,_,_,_,
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(v) = {
- _,_,_,_,_,
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,_,_,X,
- _,X,_,X,_,
- _,_,X,_,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(w) = {
- _,_,_,_,_,
- _,_,_,_,_,
- X,_,_,_,X,
- X,_,X,_,X,
- X,_,X,_,X,
- _,X,_,X,_,
- _,_,_,_,_,
- _,_,_,_,_,
-0};
-
-C(x) = {
- _,_,_,_,
- _,_,_,_,
- X,_,_,X,
- _,X,X,_,
- _,X,X,_,
- X,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(y) = {
- _,_,_,_,
- _,_,_,_,
- X,_,_,X,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,X,
- _,X,X,_,
-0};
-
-C(z) = {
- _,_,_,_,
- _,_,_,_,
- X,X,X,X,
- _,_,X,_,
- _,X,_,_,
- X,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(0) = {
- _,X,X,_,
- X,_,_,X,
- X,_,X,X,
- X,X,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(1) = {
- _,X,_,
- X,X,_,
- _,X,_,
- _,X,_,
- _,X,_,
- X,X,X,
- _,_,_,
- _,_,_,
-0};
-
-C(2) = {
- _,X,X,_,
- X,_,_,X,
- _,_,_,X,
- _,_,X,_,
- _,X,_,_,
- X,X,X,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(3) = {
- X,X,X,_,
- _,_,_,X,
- _,X,X,X,
- _,_,_,X,
- _,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(4) = {
- _,_,X,X,
- _,X,_,X,
- X,_,_,X,
- X,X,X,X,
- _,_,_,X,
- _,_,_,X,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(5) = {
- X,X,X,X,
- X,_,_,_,
- X,X,X,_,
- _,_,_,X,
- _,_,_,X,
- X,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(6) = {
- _,X,X,_,
- X,_,_,_,
- X,X,X,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(7) = {
- X,X,X,X,
- _,_,_,X,
- _,_,X,_,
- _,_,X,_,
- _,X,_,_,
- _,X,_,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(8) = {
- _,X,X,_,
- X,_,_,X,
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(9) = {
- _,X,X,_,
- X,_,_,X,
- X,_,_,X,
- _,X,X,X,
- _,_,_,X,
- _,X,X,_,
- _,_,_,_,
- _,_,_,_,
-0};
-
-C(space) = {
- _,_,_,
- _,_,_,
- _,_,_,
- _,_,_,
- _,_,_,
- _,_,_,
- _,_,_,
-0};
-
-struct font font8 = { 8, {
- 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_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_0, glyph_1, glyph_2, glyph_3,
- glyph_4, glyph_5, glyph_6, glyph_7,
- glyph_8, glyph_9, glyph_error, glyph_error,
- glyph_error, glyph_error, glyph_error, glyph_error,
- glyph_error, 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_error,
- glyph_error, glyph_error, glyph_error, glyph_error,
- glyph_error, 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_error,
- glyph_error, glyph_error, glyph_error, glyph_error
-} };
(DIR) diff --git a/ploot-braille.c b/ploot-braille.c
@@ -6,27 +6,60 @@
#include <string.h>
#include <time.h>
#include <math.h>
+#include <unistd.h>
-#include "def.h"
-#include "arg.h"
+#include "drawille.h"
+#include "scale.h"
+#include "tool.h"
+#include "log.h"
-char const *arg0 = NULL;
+char const *arg0 = NULL;
-static int
-braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t tstep, int col)
+/*
+ * Plot the body as an histogram interpolating the gaps and include
+ * a vertical and horizontal axis.
+ */
+int
+braille_histogram(struct vlist *vl, struct drawille *drw,
+ time_t tmin, time_t tmax, double vmin, double vmax)
{
- int x, o, prec;
- char tmp[sizeof("MM/DD HH:MM")], *fmt;
+ int x, xprev, y, yprev, zero;
+ double *v;
+ time_t *t;
size_t n;
- time_t t;
- fmt = (tstep < 3600 * 12) ? "^%H:%M:%S" :
- (tstep < 3600 * 24) ? "^%m/%d %H:%M" :
- "^%Y/%m/%d";
+ zero = scale_ypos(0, vmin, vmax, drw->row*4);
+ v = vl->v;
+ t = vl->t;
+ n = vl->n;
+ for (; n > 0; n--, t++, v++) {
+ if (isnan(*v)) /* XXX: better handling? */
+ continue;
+ y = scale_ypos(*v, vmin, vmax, drw->row * 4);
+ x = scale_xpos(*t, tmin, tmax, drw->col * 2);
+ if (n < vl->n)
+ drawille_histogram_line(drw, xprev, yprev, x, y, zero);
+ xprev = x;
+ yprev = y;
+ }
+ return 0;
+}
+
+static int
+braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t tstep, int col)
+{
+ int x, o, prec;
+ char tmp[sizeof("MM/DD HH:MM")], *fmt;
+ size_t n;
+ time_t t;
+
+ fmt =
+ (tstep < 3600 * 12) ? "^%H:%M:%S" :
+ (tstep < 3600 * 24) ? "^%m/%d %H:%M" :
+ "^%Y/%m/%d";
n = x = 0;
- t = tmin;
- t += tstep - t % tstep;
+ t = tmin + tstep - tmin % tstep;
for (; t < tmax; t += tstep) {
x = (t - tmin) * col / (tmax - tmin);
strftime(tmp, sizeof tmp, fmt, localtime(&t));
@@ -35,7 +68,7 @@ braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t tstep, int col)
return -1;
n += o;
}
- fputc('\n', fp);
+ fprintf(fp, "\n");
return 0;
}
@@ -45,25 +78,25 @@ braille_axis_x(FILE *fp, time_t tmin, time_t tmax, time_t tstep, int col)
static void
braille_axis_y(FILE *fp, double vmin, double vmax, int r, int rows)
{
- char tmp[10] = "", *s;
- double val;
+ char tmp[10] = "", *s;
+ double val;
val = (rows - r) * (vmax - vmin) / rows;
humanize(tmp, val);
- s = (r == 0) ? "┌" :
- (r == rows - 1) ? "â””" :
- "├";
+ s =
+ (r == 0) ? "┌" :
+ (r == rows - 1) ? "â””" :
+ "├";
fprintf(fp, "%s%-6s ", s, tmp);
}
static int
braille_render(struct drawille *drw, FILE *fp, double vmin, double vmax)
{
- /* Render the plot line by line. */
for (int row = 0; row < drw->row; row++) {
drawille_put_row(drw, fp, row);
braille_axis_y(fp, vmin, vmax, row, drw->row);
- fputc('\n', fp);
+ fprintf(fp, "\n");
}
return 0;
}
@@ -71,10 +104,10 @@ braille_render(struct drawille *drw, FILE *fp, double vmin, double vmax)
static void
plot(struct vlist *vl, FILE *fp, size_t ncol, int row, int col)
{
- size_t len;
- double vmin, vmax, vstep;
- time_t tmin, tmax, tstep;
- struct drawille *drw;
+ size_t len;
+ double vmin, vmax, vstep;
+ time_t tmin, tmax, tstep;
+ struct drawille *drw;
len = 500;
col -= 8;
@@ -83,13 +116,13 @@ plot(struct vlist *vl, FILE *fp, size_t ncol, int row, int col)
warn("vstep=%lf vstep=%ld", vstep, tstep);
if ((drw = drawille_new(row, col)) == NULL)
- err(1, "allocating drawille canvas");
- if (drawille_histogram(vl, drw, tmin, tmax, vmin, vmax) == -1)
- err(1, "allocating drawille canvas");
+ fatal(1, "allocating drawille canvas");
+ if (braille_histogram(vl, drw, tmin, tmax, vmin, vmax) == -1)
+ fatal(1, "allocating drawille canvas");
if (braille_render(drw, fp, vmin, vmax) == -1)
- err(1, "rendering braille canvas");
+ fatal(1, "rendering braille canvas");
if (braille_axis_x(fp, tmin, tmax, tstep, col) == -1)
- err(1, "printing x axis");;
+ fatal(1, "printing x axis");;
free(drw);
}
@@ -103,19 +136,24 @@ usage(void)
int
main(int argc, char **argv)
{
- struct vlist *vl;
- char labels[LINE_MAX];
- size_t ncol;
-
- ARG_SWITCH(argc, argv) {
- default:
- usage();
+ struct vlist *vl;
+ size_t ncol;
+ int c;
+
+ optind = 0;
+ while ((c = getopt(argc, argv, "")) > -1) {
+ switch (c) {
+ default:
+ usage();
+ }
}
+ argc -= optind;
+ argv += optind;
if (argc > 0)
usage();
- csv_labels(stdin, labels, &vl, &ncol);
+ csv_labels(stdin, &vl, &ncol);
csv_values(stdin, vl, ncol);
plot(vl, stdout, ncol, 20, 80);
(DIR) diff --git a/ploot-farbfeld.c b/ploot-farbfeld.c
@@ -1,19 +1,22 @@
+#include <arpa/inet.h>
#include <assert.h>
#include <ctype.h>
#include <fcntl.h>
#include <limits.h>
+#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
+#include <unistd.h>
-#include <arpa/inet.h>
-
-#include <math.h>
-
-#include "arg.h"
-#include "def.h"
+#include "csv.h"
+#include "ffplot.h"
+#include "font.h"
+#include "log.h"
+#include "tool.h"
+#include "scale.h"
#define MARGIN 4
@@ -45,32 +48,17 @@
#define LEGEND_W (100)
#define LEGEND_H (PLOT_H)
-struct color {
- uint16_t red;
- uint16_t green;
- uint16_t blue;
- uint16_t alpha;
-};
-
-struct cname {
- char *name;
- struct color color;
+struct colorname {
+ char *name;
+ struct ffcolor color;
};
-struct canvas {
- int w; /* width */
- int h; /* height */
- int x; /* x offset */
- int y; /* y offset */
- struct color *buf;
-};
-
-char const *arg0 = NULL;
-static char *tflag = "";
-static char *uflag = "";
+char const *arg0 = NULL;
+static char *tflag = "";
+static char *uflag = "";
static struct font *font = &font13;
-static struct cname cname[] = {
+static struct colorname colorname[] = {
/* name red green blue alpha */
{ "red", { 0xffff, 0x4444, 0x4444, 0xffff } },
{ "orange", { 0xffff, 0x9999, 0x4444, 0xffff } },
@@ -81,146 +69,8 @@ static struct cname cname[] = {
{ NULL, { 0, 0, 0, 0 } }
};
-/*
- * 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 * y + 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(struct canvas *can, struct color *color,
- int x, int y)
-{
- x += can->x;
- y += can->y;
- if (x < 0 || x >= can->w || y < 0 || y >= can->h)
- return;
- memcpy(can->buf + can->w * (can->h - 1 - y) + x, color, sizeof(*can->buf));
-}
-
-static void
-ff_rectangle(struct canvas *can, struct color *color,
- int y1, int x1,
- int y2, int x2)
-{
- int x, y, ymin, xmin, ymax, xmax;
-
- ymin = MIN(y1, y2); ymax = MAX(y1, y2);
- xmin = MIN(x1, x2); xmax = MAX(x1, x2);
-
- for (y = ymin; y <= ymax; y++)
- for (x = xmin; x <= xmax; x++)
- ff_pixel(can, color, x, y);
-}
-
-/*
- * From Bresenham's line algorithm and dcat's tplot.
- */
-static void
-ff_line(struct canvas *can, struct color *color,
- int x0, int y0,
- int x1, int y1)
-{
- int dy, dx, sy, sx, err, e;
-
- sx = x0 < x1 ? 1 : -1;
- sy = y0 < y1 ? 1 : -1;
- dx = abs(x1 - x0);
- dy = abs(y1 - y0);
- err = (dy > dx ? dy : -dx) / 2;
-
- for (;;) {
- ff_pixel(can, color, x0, y0);
-
- if (y0 == y1 && x0 == x1)
- break;
-
- e = err;
- if (e > -dy) {
- y0 += sy;
- err -= dx;
- }
- if (e < dx) {
- x0 += sx;
- err += dy;
- }
- }
-}
-
-/*
- * Draw a coloured glyph from font f centered on y.
- */
-static int
-ff_char(struct canvas *can, struct color *color, char c,
- int x, int y)
-{
- int yf, xf, wf;
-
- if (c & 0x80)
- c = '\0';
- y -= font->height / 2;
- wf = font_width(font, c);
- for (xf = 0; xf < wf; xf++)
- for (yf = 0; yf < font->height; yf++)
- if (font->glyph[(int)c][wf * (font->height - yf) + xf] == 3)
- ff_pixel(can, color, x + xf, y + yf);
- return wf + 1;
-}
-
-/*
- * Draw a left aligned string without wrapping it.
- */
-static size_t
-ff_text_left(struct canvas *can, struct color *color, char *s,
- int x, int y)
-{
- for (; *s != '\0'; s++)
- x += ff_char(can, color, *s, x, y);
- return x;
-}
-
-/*
- * Draw a center aligned string without wrapping it.
- */
-static size_t
-ff_text_center(struct canvas *can, struct color *color, char *s,
- int x, int y)
-{
- x -= font_strlen(font, s) / 2;
- return ff_text_left(can, color, s, x, y);
-}
-
-/*
- * Draw a right aligned string without wrapping it.
- */
-static size_t
-ff_text_right(struct canvas *can, struct color *color, char *s,
- int x, int y)
-{
- x -= font_strlen(font, s);
- return ff_text_left(can, color, s, x, y);
-}
-
-static void
-ff_print(struct 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->buf, can->w * can->h, sizeof(*can->buf), stdout);
-}
-
static int
-ff_t2x(time_t t, time_t tmin, time_t tmax)
+farbfeld_t2x(time_t t, time_t tmin, time_t tmax)
{
if (tmin == tmax)
return PLOT_W;
@@ -228,7 +78,7 @@ ff_t2x(time_t t, time_t tmin, time_t tmax)
}
static int
-ff_v2y(double v, double vmin, double vmax)
+farbfeld_v2y(double v, double vmin, double vmax)
{
if (vmin == vmax)
return PLOT_H;
@@ -236,12 +86,12 @@ ff_v2y(double v, double vmin, double vmax)
}
static void
-ff_xaxis(struct canvas *can, struct color *label, struct color *grid,
+farbfeld_xaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid,
time_t tmin, time_t tmax, time_t tstep)
{
- time_t t;
- int x;
- char str[sizeof("MM/DD HH/MM")], *fmt;
+ time_t t;
+ int x;
+ char str[sizeof("MM/DD HH/MM")], *fmt;
if (tstep < 3600 * 12)
fmt = "%H:%M:%S";
@@ -251,64 +101,64 @@ ff_xaxis(struct canvas *can, struct color *label, struct color *grid,
fmt = "%X/%m/%d";
for (t = tmax - tmax % tstep; t >= tmin; t -= tstep) {
- x = ff_t2x(t, tmin, tmax);
+ x = farbfeld_t2x(t, tmin, tmax);
- ff_line(can, grid,
+ ffplot_line(plot, grid,
x, XLABEL_H,
x, XLABEL_H + PLOT_H);
strftime(str, sizeof(str), fmt, localtime(&t));
- ff_text_center(can, label, str,
+ ffplot_text_center(plot, label, font, str,
x, XLABEL_H / 2);
}
}
static void
-ff_yaxis(struct canvas *can, struct color *label, struct color *grid,
+farbfeld_yaxis(struct ffplot *plot, struct ffcolor *label, struct ffcolor *grid,
double vmin, double vmax, double vstep)
{
- double v;
- int y;
- char str[8 + 1];
+ double v;
+ int y;
+ char str[8 + 1];
for (v = vmax - fmod(vmax, vstep); v >= vmin; v -= vstep) {
- y = ff_v2y(v, vmin, vmax);
+ y = farbfeld_v2y(v, vmin, vmax);
- ff_line(can, grid,
+ ffplot_line(plot, grid,
YLABEL_W, y,
YLABEL_W + PLOT_W, y);
humanize(str, v);
- ff_text_right(can, label, str,
+ ffplot_text_right(plot, label, font, str,
YLABEL_W - MARGIN, y);
}
}
static void
-ff_title(struct canvas *can,
- struct color *ct, char *title,
- struct color *cu, char *unit)
+farbfeld_title(struct ffplot *plot,
+ struct ffcolor *ct, char *title,
+ struct ffcolor *cu, char *unit)
{
- ff_text_left(can, ct, title, TITLE_H / 2, 0);
- ff_text_right(can, cu, unit, TITLE_H / 2, TITLE_W);
+ ffplot_text_left(plot, ct, font, title, TITLE_H / 2, 0);
+ ffplot_text_right(plot, cu, font, unit, TITLE_H / 2, TITLE_W);
}
static void
-ff_plot(struct canvas *can, struct vlist *vl, struct color *color,
+farbfeld_plot(struct ffplot *plot, struct vlist *vl, struct ffcolor *color,
double vmin, double vmax,
time_t tmin, time_t tmax)
{
- time_t *tp;
- double *vp;
- int x, y, n, ylast, xlast, first;
+ time_t *tp;
+ double *vp;
+ int x, y, n, ylast, xlast, first;
first = 1;
for (tp = vl->t, vp = vl->v, n = vl->n; n > 0; n--, vp++, tp++) {
- y = ff_v2y(*vp, vmin, vmax);
- x = ff_t2x(*tp, tmin, tmax);
+ y = farbfeld_v2y(*vp, vmin, vmax);
+ x = farbfeld_t2x(*tp, tmin, tmax);
if (!first)
- ff_line(can, color, xlast, ylast, x, y);
+ ffplot_line(plot, color, xlast, ylast, x, y);
ylast = y;
xlast = x;
@@ -317,24 +167,24 @@ ff_plot(struct canvas *can, struct vlist *vl, struct color *color,
}
static void
-ff_values(struct canvas *can, struct vlist *vl, struct color **cl, size_t ncol,
+farbfeld_values(struct ffplot *plot, struct vlist *vl, struct ffcolor **cl, size_t ncol,
time_t tmin, time_t tmax,
double vmin, double vmax)
{
for (; ncol > 0; ncol--, vl++, cl++)
- ff_plot(can, vl, *cl, vmin, vmax, tmin, tmax);
+ farbfeld_plot(plot, vl, *cl, vmin, vmax, tmin, tmax);
}
static void
-ff_legend(struct canvas *can, struct color *fg, struct vlist *vl, struct color **cl, size_t ncol)
+farbfeld_legend(struct ffplot *plot, struct ffcolor *fg, struct vlist *vl, struct ffcolor **cl, size_t ncol)
{
- size_t x, y;
+ size_t x, y;
for (; ncol > 0; ncol--, vl++, cl++) {
y = -(ncol - 1) * (font->height + MARGIN);
x = MARGIN * 2;
- x = ff_text_left(can, *cl, "-", x, y) + MARGIN;
- x = ff_text_left(can, fg, vl->label, x, y);
+ x = ffplot_text_left(plot, *cl, font, "-", x, y) + MARGIN;
+ x = ffplot_text_left(plot, fg, font, vl->label, x, y);
}
}
@@ -350,77 +200,77 @@ ff_legend(struct canvas *can, struct color *fg, struct vlist *vl, struct color *
* x label here
*/
static void
-ff(struct vlist *vl, struct color **cl, size_t ncol, char *name, char *units)
+plot(struct vlist *vl, struct ffcolor **cl, size_t ncol, char *name, char *units)
{
- struct canvas can = { IMAGE_W, IMAGE_H, 0, 0, NULL };
- struct color plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff };
- struct color grid_bg = { 0x2929, 0x2929, 0x2929, 0xffff };
- struct color grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff };
- struct color label_fg = { 0x8888, 0x8888, 0x8888, 0xffff };
- struct color title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff };
- double vmin, vmax, vstep;
- time_t tmin, tmax, tstep;
+ struct ffplot plot = { IMAGE_W, IMAGE_H, 0, 0, NULL };
+ struct ffcolor plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff };
+ struct ffcolor grid_bg = { 0x2929, 0x2929, 0x2929, 0xffff };
+ struct ffcolor grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff };
+ struct ffcolor label_fg = { 0x8888, 0x8888, 0x8888, 0xffff };
+ struct ffcolor title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff };
+ double vmin, vmax, vstep;
+ time_t tmin, tmax, tstep;
scale(vl, ncol, &tmin, &tmax, &tstep, &vmin, &vmax, &vstep);
- assert(can.buf = calloc(IMAGE_H * IMAGE_W, sizeof *can.buf));
+ assert(plot.buf = calloc(IMAGE_H * IMAGE_W, sizeof *plot.buf));
- can.y = 0;
- can.x = 0;
- ff_rectangle(&can, &plot_bg, 0, 0, IMAGE_H - 1, IMAGE_W - 1);
+ plot.y = 0;
+ plot.x = 0;
+ ffplot_rectangle(&plot, &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);
+ plot.x = PLOT_X;
+ plot.y = PLOT_Y;
+ ffplot_rectangle(&plot, &grid_bg, 0, 0, PLOT_H, PLOT_W);
- can.x = XLABEL_X;
- can.y = XLABEL_Y;
- ff_xaxis(&can, &label_fg, &grid_fg, tmin, tmax, tstep);
+ plot.x = XLABEL_X;
+ plot.y = XLABEL_Y;
+ farbfeld_xaxis(&plot, &label_fg, &grid_fg, tmin, tmax, tstep);
- can.x = YLABEL_X;
- can.y = YLABEL_Y;
- ff_yaxis(&can, &label_fg, &grid_fg, vmin, vmax, vstep);
+ plot.x = YLABEL_X;
+ plot.y = YLABEL_Y;
+ farbfeld_yaxis(&plot, &label_fg, &grid_fg, vmin, vmax, vstep);
- can.x = TITLE_X;
- can.y = TITLE_Y;
- ff_title(&can, &title_fg, name, &label_fg, units);
+ plot.x = TITLE_X;
+ plot.y = TITLE_Y;
+ farbfeld_title(&plot, &title_fg, name, &label_fg, units);
- can.x = PLOT_X;
- can.y = PLOT_Y;
- ff_values(&can, vl, cl, ncol, tmin, tmax, vmin, vmax);
+ plot.x = PLOT_X;
+ plot.y = PLOT_Y;
+ farbfeld_values(&plot, vl, cl, ncol, tmin, tmax, vmin, vmax);
- can.x = LEGEND_X;
- can.y = LEGEND_Y;
- ff_legend(&can, &label_fg, vl, cl, ncol);
+ plot.x = LEGEND_X;
+ plot.y = LEGEND_Y;
+ farbfeld_legend(&plot, &label_fg, vl, cl, ncol);
- ff_print(&can);
+ ffplot_print(stdout, &plot);
}
-static struct color *
+static struct ffcolor *
name_to_color(char *name)
{
- struct cname *cn;
+ struct colorname *cn;
- for (cn = cname; cn->name != NULL; cn++)
+ for (cn = colorname; cn->name != NULL; cn++)
if (strcmp(name, cn->name) == 0)
return &cn->color;
return NULL;
}
static void
-argv_to_color(struct color **cl, char **argv)
+argv_to_color(struct ffcolor **cl, char **argv)
{
for (; *argv != NULL; cl++, argv++)
if ((*cl = name_to_color(*argv)) == NULL)
- err(1, "unknown color name: %s", *argv);
+ fatal(1, "unknown color name: %s", *argv);
}
static void
usage(void)
{
fprintf(stderr, "usage: %s [-t title] [-u unit] {", arg0);
- fputs(cname->name, stderr);
- for (struct cname *cn = cname + 1; cn->name != NULL; cn++)
+ fputs(colorname->name, stderr);
+ for (struct colorname *cn = colorname + 1; cn->name != NULL; cn++)
fprintf(stderr, ",%s", cn->name);
fputs("}...\n", stderr);
exit(1);
@@ -429,36 +279,41 @@ usage(void)
int
main(int argc, char **argv)
{
- struct vlist *vl;
- struct color **cl;
- char labels[LINE_MAX];
- size_t ncol;
-
- ARG_SWITCH(argc, argv) {
- case 't':
- tflag = ARG;
- break;
- case 'u':
- uflag = ARG;
- break;
- default:
- usage();
+ struct vlist *vl;
+ struct ffcolor **cl;
+ size_t ncol;
+ int c;
+
+ optind = 0;
+ while ((c = getopt(argc, argv, "")) > -1) {
+ switch (c) {
+ case 't':
+ tflag = optarg;
+ break;
+ case 'u':
+ uflag = optarg;
+ break;
+ default:
+ usage();
+ }
}
+ argc -= optind;
+ argv += optind;
if (argc == 0)
usage();
assert(cl = calloc(argc, sizeof(*cl)));
- csv_labels(stdin, labels, &vl, &ncol);
+ csv_labels(stdin, &vl, &ncol);
if (ncol > (size_t)argc)
- err(1, "too many columns or not enough arguments");
+ fatal(1, "too many columns or not enough arguments");
else if (ncol < (size_t)argc)
- err(1, "too many arguments or not enough columns");
+ fatal(1, "too many arguments or not enough columns");
csv_values(stdin, vl, ncol);
argv_to_color(cl, argv);
- ff(vl, cl, argc, tflag, uflag);
+ plot(vl, cl, argc, tflag, uflag);
free(vl);
free(cl);
(DIR) diff --git a/ploot-feed.c b/ploot-feed.c
@@ -6,16 +6,17 @@
#include <string.h>
#include <ctype.h>
#include <stdint.h>
+#include <unistd.h>
-#include "arg.h"
-#include "def.h"
+#include "tool.h"
+#include "log.h"
#define WIDTH_MAX 1024
#define BRAILLE_START 10240
-char const *arg0 = NULL;
-static int wflag = 80;
-static int width = 0;
+char const *arg0 = NULL;
+static int wflag = 80;
+static int width = 0;
/*
* Turn the bit at position (row, col) on in the .
@@ -36,7 +37,7 @@ plot_dot(long *out, int row, int col)
static void
plot_val(long *out, double val, double max, int row)
{
- int col, c;
+ int col, c;
val = MIN(max, val);
col = (int)(val * (double)(width - 1) / max * 2);
@@ -51,23 +52,23 @@ plot_val(long *out, double val, double max, int row)
static time_t
plot_row(long *out, char *line, double *max, int nrow, int ncol)
{
- time_t epoch;
- double val;
- int n;
- char *tok;
+ time_t epoch;
+ double val;
+ int n;
+ char *tok;
if ((tok = strsep(&line, ",")) == NULL)
- fputs("*** missing epoch value\n", stderr), exit(1);
+ fatal(100, "*** missing epoch value");
epoch = eatol(tok);
for (n = 0; (tok = strsep(&line, ",")) != NULL; n++) {
if (n >= ncol)
- fputs("too many values\n", stderr), exit(1);
+ fatal(100, "too many values");
val = atof(tok);
plot_val(out + n * width, val, max[n], nrow);
}
if (n < ncol)
- fputs("not enough values\n", stderr), exit(1);
+ fatal(100, "not enough values");
return epoch;
}
@@ -78,10 +79,11 @@ plot_row(long *out, char *line, double *max, int nrow, int ncol)
static time_t
plot_line(long *out, double *max, int ncol)
{
- time_t epoch;
- int n, nrow;
- long *o, rune;
- char line[LINE_MAX];
+ time_t epoch;
+ int n, nrow;
+ long *o, rune;
+ char *line;
+ size_t sz;
for (rune = BRAILLE_START, o = out, n = ncol * width; n > 0; o++, n--)
memcpy(o, &rune, sizeof(rune));
@@ -90,19 +92,24 @@ plot_line(long *out, double *max, int ncol)
memcpy(o, &rune, sizeof(rune));
out++;
+ sz = 0;
for (nrow = 0; nrow < 4; nrow++) {
- if ((esfgets(line, LINE_MAX, stdin)) == NULL)
+ if (getline(&line, &sz, stdin) == -1) {
+ if (ferror(stdin))
+ fatal(111, "reading row from stdin");
exit(0);
+ }
epoch = plot_row(out, line, max, nrow, ncol);
}
+ free(line);
return epoch;
}
static void
put_time(time_t epoch, time_t last, int nline)
{
- char *out, buf[sizeof("XXxXXxXX ")];
+ char *out, buf[sizeof("XXxXXxXX ")];
switch (nline % 3) {
case 0:
@@ -130,11 +137,11 @@ put_line(long *out)
}
static void
-plot(char labels[LINE_MAX], double *max, int ncol)
+plot(char labels[4069], double *max, int ncol)
{
- time_t epoch, last_epoch;
- long out[WIDTH_MAX + 1];
- int n;
+ time_t epoch, last_epoch;
+ long out[WIDTH_MAX + 1];
+ int n;
last_epoch = epoch = 0;
@@ -159,34 +166,40 @@ plot(char labels[LINE_MAX], double *max, int ncol)
* offer: sizeof(*buf / 2).
*/
static int
-read_labels(char *labv[LINE_MAX])
+read_labels(char **labv)
{
- int ncol;
- char *l, line[LINE_MAX], *tok;
-
- if ((l = esfgets(line, LINE_MAX, stdin)) == NULL)
- fputs("missing label line\n", stderr), exit(1);
+ int ncol;
+ char *cp, *line, *tok;
+ size_t sz;
+
+ sz = 0;
+ if (getline(&line, &sz, stdin) == -1) {
+ if (ferror(stdin))
+ fatal(111, "reading labels from stdin");
+ fatal(100, "missing label line", stderr);
+ }
+ cp = line;
- if (strcmp(strsep(&l, ","), "epoch") != 0)
- fputs("first label must be \"epoch\"\n", stderr), exit(1);
+ if (strcmp(strsep(&cp, ","), "epoch") != 0)
+ fatal(100, "first label must be 'epoch'");
- for (ncol = 0; (tok = strsep(&l, ",")) != NULL; ncol++, labv++)
+ for (ncol = 0; (tok = strsep(&cp, ",")) != NULL; ncol++, labv++)
*labv = tok;
*labv = NULL;
if (ncol < 1)
- fputs("no label found\n", stderr), exit(1);
-
+ fatal(100, "no label found");
+ free(line);
return ncol;
}
static void
-fmt_labels(char out[LINE_MAX], int ncol, char *labels[LINE_MAX / 2])
+fmt_labels(char out[4069], int ncol, char *labels[4069 / 2])
{
- int i, n;
+ int i, n;
for (i = 0; i < ncol; labels++, i++) {
- n = LINE_MAX - (width + sizeof("│")) * i;
+ n = 4069 - (width + sizeof("│")) * i;
out += snprintf(out, n, "│%-*s", width - 1, *labels);
}
}
@@ -198,41 +211,39 @@ usage(void)
exit(1);
}
-static int
-parse_args(int argc, char **argv, double *max)
+int
+main(int argc, char **argv)
{
- int n;
-
- ARG_SWITCH(argc, argv) {
- case 'w':
- wflag = atoi(ARG);
- break;
- default:
- usage();
+ double max[4069 / 2], *m;
+ int ncol, nmax;
+ char *labv[4069 / 2], labels[4069];
+ int c;
+
+ optind = 0;
+ while ((c = getopt(argc, argv, "w:")) > -1) {
+ switch (c) {
+ case 'w':
+ wflag = atoi(optarg);
+ break;
+ default:
+ usage();
+ }
}
+ argc -= optind;
+ argv += optind;
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];
+ nmax = argc;
+ for (m = max; argc > 0; argc--, argv++, m++)
+ *m = eatof(*argv);
- 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);
+ fatal(100, "not as many labels and arguments");
plot(labels, max, ncol);
return 0;
(DIR) diff --git a/proto.sh b/proto.sh
@@ -0,0 +1,73 @@
+#!/bin/sh
+awk='
+BEGIN {
+ tab = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
+ print "/**/"
+}
+
+END {
+ print ""
+ print "#endif"
+}
+
+# functions
+
+args {
+ sub(/^[ \t]*/, " ")
+ args = args $0
+}
+
+/^[a-zA-Z0-9_]+\([][)(a-z_A-Z0-9*,. \t]*$/ {
+ if (match(type, "static") || match($0, ";$"))
+ next
+
+ symbol = $0
+ sub(/\(.*/, "", symbol)
+ sub(/[a-zA-Z0-9_]*\(/, "", $0)
+ if (symbol == "main")
+ next
+
+ args = $0
+ sub(/^[a-z]*\(/, "", args)
+}
+
+args && /\)$/ {
+ gsub(/[\n \t]+/, " ", args)
+
+ sub(/\)$/, "", args)
+
+ gsub(/[a-zA-Z0-9_]+\[[^]]*\]/, "[]", args)
+ gsub(/[*][a-zA-Z0-9_]+/, "*", args)
+ gsub(/[ ][a-zA-Z0-9_]+,/, ",", args)
+ gsub(/[ ][a-zA-Z0-9_]+$/, "", args)
+ gsub(/[ ][a-zA-Z0-9_]+\*/, "*", args)
+ gsub(/\.\.\.\$/, "...", args)
+ gsub(/void\)$/, "void", args)
+
+ printf("%s%s%s%s(%s);\n",
+ type, substr(tab, 1, 20 / 8 - (length(type) - 3) / 8),
+ symbol, substr(tab, 1, 30 / 8 - (length(symbol) - 1) / 8),
+ args)
+
+ args = ""
+}
+
+!args {
+ type = $0
+}
+
+# variables
+
+/^[a-zA-Z][][ \t*a-z_A-Z0-9]*=.*[;{]$/ && $1 != "static" && $1 != "enum" {
+ sub(/ *=.*/, ";")
+ sub(/[ \t]*;$/, ";");
+ print
+}
+'
+
+for file in src/*.c; do file=${file%.c}
+ grep -Fq '/**/' "$file.h" 2>/dev/null || continue
+ header=$(awk '$0 == "/**/" { exit(0) } 1' "$file.h"
+ awk "$awk" "$file.c")
+ printf '%s\n' "$header" >"$file.h"
+done
(DIR) diff --git a/scale.c b/scale.c
@@ -1,139 +0,0 @@
-#include "def.h"
-#include "err.h"
-
-#define XDENSITY 7 /* nb of values on x axis */
-#define YDENSITY 7 /* nb of values on y axis */
-
-/*
- * - <max ^
- * - | Translate the coordinates between double values
- * - <val szy and height in the plot of <row> rows.
- * - |
- * - <min v
- */
-int
-scale_ypos(double val, double min, double max, int szy)
-{
- return szy * (val - min) / (max - min);
-}
-
-/*
- * <---- szx ----> Translate the coordinates between the time
- * range and position in the plot of <col> cols.
- * t1 t t2
- * | . . | . . |
- */
-int
-scale_xpos(time_t t, time_t t1, time_t t2, int szx)
-{
- return szx * (t - t1) / (t2 - t1);
-}
-
-static void
-scale_minmax(struct vlist *vl, int ncol,
- time_t *tmin, time_t *tmax,
- double *vmin, double *vmax)
-{
- double *v;
- time_t *t;
- size_t n;
-
- *vmin = *vmax = 0;
- *tmin = *tmax = *vl->t;
-
- for (; ncol > 0; ncol--, vl++) {
- for (t = vl->t, v = vl->v, n = vl->n; n > 0; t++, v++, n--) {
- if (*v < *vmin) *vmin = *v;
- if (*v > *vmax) *vmax = *v;
- if (*t < *tmin) *tmin = *t;
- if (*t > *tmax) *tmax = *t;
- }
- }
-
- if (*tmin == *tmax)
- err(1, "invalid time scale: min=%lld max=%lld", *tmin, *tmax);
-}
-
-static time_t
-scale_tstep(time_t min, time_t max, int density)
-{
- 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, 0
- };
-
- dt = max - min;
- for (s = scale; s < scale + LEN(scale); s++)
- if (dt < *s * density)
- return *s;
- return 0;
-}
-
-static double
-scale_vstep(double min, double max, int density)
-{
- double dv, d, *s, scale[] = { 1, 2, 3, 5 };
-
- dv = max - min;
-
- if (dv > 1)
- for (d = 1; d != 0; d *= 10)
- for (s = scale; s < scale + LEN(scale); s++)
- if (dv < *s * d * density)
- return *s * d;
- if (dv < 1)
- for (d = 1; d != 0; d *= 10)
- for (s = scale + LEN(scale) - 1; s >= scale; s--)
- if (dv > *s / d * density / 2)
- return *s / d;
- return 0;
-}
-
-/*
- * Adjust the vertical scale so that everything fits, with nice
- * scale values.
- */
-void
-scale_vminmax(double *min, double *max, int row)
-{
- double unit, range, mi;
-
- range = *max - *min;
- unit = 1;
-
- /* Zoom until it fills the canvas. */
- for (; (row - 1) * unit > range; unit /= 10)
- continue;
-
- /* Dezoom until it fits the canvas. */
- for (; (row - 1) * unit < range; unit *= 10)
- continue;
-
- /* Fine tune. */
- if ((row - 1) * unit / 5 > range)
- unit /= 5;
- if ((row - 1) * unit / 4 > range)
- unit /= 4;
- if ((row - 1) * unit / 2 > range)
- unit /= 2;
-
- /* Align the minimum (and the zero). */
- for (mi = 0; mi > *min - unit; mi -= unit)
- continue;
-
- /* Update the displayed minimal and maximal. */
- *min = mi;
- *max = mi + unit * row;
-}
-
-void
-scale(struct vlist *vl, int ncol,
- time_t *tmin, time_t *tmax, time_t *tstep,
- double *vmin, double *vmax, double *vstep)
-{
- scale_minmax(vl, ncol, tmin, tmax, vmin, vmax);
- *tstep = scale_tstep(*tmin, *tmax, XDENSITY);
- *vstep = scale_vstep(*vmin, *vmax, YDENSITY);
-}
(DIR) diff --git a/src/csv.c b/src/csv.c
@@ -0,0 +1,109 @@
+#include "csv.h"
+
+#include <assert.h>
+#include <string.h>
+#include <time.h>
+#include <stdlib.h>
+
+#include "log.h"
+#include "tool.h"
+
+/*
+ * Read CSV data onto a set of (struct vlist).
+ */
+
+static void
+csv_addtime(struct vlist *vl, time_t epoch)
+{
+ assert(vl->t = realloc(vl->t, (vl->n + 1) * sizeof(*vl->t)));
+ vl->t[vl->n] = epoch;
+}
+
+static void
+csv_addval(struct vlist *vl, double field)
+{
+ assert(vl->v = realloc(vl->v, (vl->n + 1) * sizeof(*vl->v)));
+ vl->v[vl->n] = field;
+}
+
+/*
+ * Add to each column the value on the current row. The time_t
+ * buffer is shared among all fields.
+ */
+void
+csv_addrow(struct vlist *vl, size_t ncol, char *line)
+{
+ char *field;
+ time_t *tbuf;
+
+ if ((field = strsep(&line, ",")) == NULL)
+ fatal(1, "missing epoch at row %zu", vl->n);
+
+ csv_addtime(vl, eatol(field));
+ for (; (field = strsep(&line, ",")) != NULL; ncol--, vl->n++, vl++) {
+ if (ncol == 0)
+ fatal(1, "too many fields at line %zu", vl->n);
+ csv_addval(vl, eatof(field));
+ }
+ if (ncol > 0)
+ fatal(1, "too few fields at line %zu", vl->n);
+
+ /* the same time buffer can be used for all columns */
+ for (tbuf = vl->t; ncol > 0; ncol--, vl++)
+ vl->t = tbuf;
+}
+
+/*
+ * < *ncol >
+ * epoch,label1,label2,label3
+ */
+void
+csv_labels(FILE *fp, struct vlist **vl, size_t *ncol)
+{
+ char *field, *line, *cp, *label;
+ size_t sz;
+ ssize_t r;
+
+ r = getline(&line, &sz, fp);
+ if (ferror(fp))
+ fatal(111, "error while reading from file");
+ if (r == -1)
+ fatal(100, "missing label line");
+
+ cp = line;
+ if (strcmp(strsep(&cp, ","), "epoch") != 0)
+ fatal(1, "first label must be 'epoch'");
+
+ *vl = NULL;
+ *ncol = 0;
+ while ((field = strsep(&cp, ","))) {
+ assert(*vl = realloc(*vl, sz += sizeof(**vl)));
+ label = (*vl)[(*ncol)++].label;
+ strlcpy(label, field, sizeof(label));
+ }
+
+ free(line);
+}
+
+/*
+ * < ncol >
+ * epoch,a1,b1,c1 ^
+ * epoch,a2,b2,c2 vl->n
+ * epoch,a3,b3,c3 v
+ */
+void
+csv_values(FILE *fp, struct vlist *vl, size_t ncol)
+{
+ char *line;
+ size_t sz;
+
+ sz = 0;
+ while (getline(&line, &sz, fp) > -1)
+ csv_addrow(vl, ncol, line);
+ if (vl->n == 0)
+ fatal(1, "no value could be read");
+ if (vl->n == 1)
+ fatal(1, "only one value could be read");
+
+ free(line);
+}
(DIR) diff --git a/src/csv.h b/src/csv.h
@@ -0,0 +1,22 @@
+#ifndef CSV_H
+#define CSV_H
+
+#include <stdio.h>
+
+/*
+ * List of values and timestamps. Both have their dedicated buffer
+ * so that the timestamp buffer can be shared across vlist objects.
+ */
+struct vlist {
+ time_t *t; /* array of timestamps */
+ double *v; /* array of values */
+ size_t n; /* number of values */
+ char label[64]; /* for the legend */
+};
+
+/**/
+void csv_addrow (struct vlist *, size_t, char *);
+void csv_labels (FILE *, struct vlist **, size_t *);
+void csv_values (FILE *, struct vlist *, size_t);
+
+#endif
(DIR) diff --git a/src/drawille.c b/src/drawille.c
@@ -0,0 +1,193 @@
+#include "drawille.h"
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "font.h"
+
+/*
+ * Terminal-based plotting using drawille character, aka drawille.
+ */
+
+/* parameters used to draw a line */
+struct line {
+ int x0, y0, x1, y1; /* point of the line */
+ int dx, dy, sx, sy, err; /* parameters for the algorythm */
+};
+
+/*
+ * Turn on the bit at position (row, col) of a single cell. The
+ * pattern is not linear (1-4-2-5-3-6-7-8), because it matches the
+ * drawille pattern.
+ */
+static void
+drawille_cell_dot(uint8_t *cell, int row, int col)
+{
+ uint8_t flags[4][2] = {
+ { 0x01, 0x08 },
+ { 0x02, 0x10 },
+ { 0x04, 0x20 },
+ { 0x40, 0x80 },
+ };
+
+ *cell |= flags[row][col];
+}
+
+static size_t
+drawille_cell_utf(uint8_t cell, char *utf)
+{
+ long rune;
+
+ rune = 10240 + cell;
+ utf[0] = (char)(0xe0 | (0x0f & (rune >> 12))); /* 1110xxxx */
+ utf[1] = (char)(0x80 | (0x3f & (rune >> 6))); /* 10xxxxxx */
+ utf[2] = (char)(0x80 | (0x3f & (rune))); /* 10xxxxxx */
+ return 3;
+}
+
+static uint8_t
+drawille_get(struct drawille *drw, int row, int col)
+{
+ return drw->buf[row * drw->col + col];
+}
+
+size_t
+drawille_put_row(struct drawille *drw, FILE *fp, int row)
+{
+ char txt[] = "xxx";
+ size_t n;
+
+ n = 0;
+ for (int col = 0; col < drw->col; col++) {
+ drawille_cell_utf(drawille_get(drw, row, col), txt);
+ n += fputs(txt, fp);
+ }
+ return n;
+}
+
+/*
+ * Coordinates are passed as (x, y), but the canvas stores bits as
+ * (row, col). Conversion is made by this function.
+ */
+void
+drawille_dot(struct drawille *drw, int x, int y)
+{
+ if (x < 0 || x / 2 >= drw->col || y < 0 || y / 4 >= drw->row)
+ return;
+ drawille_cell_dot(drw->buf + (drw->row - y / 4 - 1) * drw->col + (x / 2),
+ 3 - y % 4,
+ x % 2);
+}
+
+struct drawille *
+drawille_new(int row, int col)
+{
+ struct drawille *drw;
+
+ if ((drw = calloc(sizeof(struct drawille) + row * col, 1)) == NULL)
+ return NULL;
+ drw->row = row;
+ drw->col = col;
+ return drw;
+}
+
+static void
+drawille_line_init(struct line *l, int x0, int y0, int x1, int y1)
+{
+ l->x0 = x0;
+ l->y0 = y0;
+ l->x1 = x1;
+ l->y1 = y1;
+ l->sx = x0 < x1 ? 1 : -1;
+ l->sy = y0 < y1 ? 1 : -1;
+ l->dx = abs(x1 - x0);
+ l->dy = abs(y1 - y0);
+ l->err = (l->dx > l->dy ? l->dx : -l->dy) / 2;
+}
+
+static int
+drawille_line_next(struct line *l)
+{
+ int e;
+
+ if (l->x0 == l->x1 && l->y0 == l->y1)
+ return 0;
+
+ e = l->err;
+ if (e > -l->dx) {
+ l->x0 += l->sx;
+ l->err -= l->dy;
+ }
+ if (e < l->dy) {
+ l->y0 += l->sy;
+ l->err += l->dx;
+ }
+ return 1;
+}
+
+void
+drawille_line(struct drawille *drw, int x0, int y0, int x1, int y1)
+{
+ struct line l;
+
+ drawille_line_init(&l, x0, y0, x1, y1);
+ do {
+ drawille_dot(drw, l.x0, l.y0);
+ } while (drawille_line_next(&l));
+}
+
+void
+drawille_histogram_dot(struct drawille *drw, int x, int y, int zero)
+{
+ int sign;
+
+ sign = (y > zero) ? (+1) : (-1);
+ for (; y != zero + sign; y -= sign)
+ drawille_dot(drw, x, y);
+}
+
+void
+drawille_histogram_line(struct drawille *drw, int x0, int y0, int x1, int y1, int zero)
+{
+ struct line l;
+
+ drawille_line_init(&l, x0, y0, x1, y1);
+ do {
+ drawille_histogram_dot(drw, l.x0, l.y0, zero);
+ } while (drawille_line_next(&l));
+}
+
+static int
+drawille_text_glyph(struct drawille *drw, int x, int y, struct font *font, char c)
+{
+ int width;
+ char *glyph;
+
+ if ((unsigned)c > 127)
+ glyph = font->glyph[0];
+ else
+ glyph = font->glyph[(unsigned)c];
+
+ width = strlen(glyph) / font->height;
+
+ for (int ix = 0; ix < width; ix++)
+ for (int iy = 0; iy < font->height; iy++) {
+ if (glyph[ix + (font->height - 1) * width - iy * width] == 3)
+ drawille_dot(drw, x + ix, y + iy);
+ }
+
+ return width;
+}
+
+char *
+drawille_text(struct drawille *drw, int x, int y, struct font *font, char *s)
+{
+ if (drw->row*4 < font->height)
+ return NULL;
+ for (; *s != '\0' && x < drw->col/2; s++, x++)
+ x += drawille_text_glyph(drw, x, y, font, *s);
+ return s;
+}
(DIR) diff --git a/src/drawille.h b/src/drawille.h
@@ -0,0 +1,28 @@
+#ifndef DRAWILLE_H
+#define DRAWILLE_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "csv.h"
+#include "font.h"
+
+/*
+ * Canvas to draw on with braille characters.
+ */
+struct drawille {
+ int col, row; /* number of dots in total */
+ uint8_t buf[]; /* buffer of size (col * row) */
+};
+
+/**/
+size_t drawille_put_row (struct drawille *, FILE *, int);
+void drawille_dot (struct drawille *, int, int);
+struct drawille *drawille_new (int, int);
+void drawille_line (struct drawille *, int, int, int, int);
+void drawille_histogram_dot (struct drawille *, int, int, int);
+void drawille_histogram_line (struct drawille *, int, int, int, int, int);
+char * drawille_text (struct drawille *, int, int, struct font *, char *);
+
+#endif
(DIR) diff --git a/src/ffplot.c b/src/ffplot.c
@@ -0,0 +1,147 @@
+#include "ffplot.h"
+
+#include <arpa/inet.h>
+#include <stddef.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "font.h"
+#include "tool.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 * y + 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 plotvas. |
+ * - (0,1) is above it. +--x
+ */
+void
+ffplot_pixel(struct ffplot *plot, struct ffcolor *color,
+ int x, int y)
+{
+ x += plot->x;
+ y += plot->y;
+ if (x < 0 || x >= plot->w || y < 0 || y >= plot->h)
+ return;
+ memcpy(plot->buf + plot->w * (plot->h - 1 - y) + x, color, sizeof(*plot->buf));
+}
+
+void
+ffplot_rectangle(struct ffplot *plot, struct ffcolor *color,
+ int y1, int x1,
+ int y2, int x2)
+{
+ int x, y, ymin, xmin, ymax, xmax;
+
+ ymin = MIN(y1, y2); ymax = MAX(y1, y2);
+ xmin = MIN(x1, x2); xmax = MAX(x1, x2);
+
+ for (y = ymin; y <= ymax; y++)
+ for (x = xmin; x <= xmax; x++)
+ ffplot_pixel(plot, color, x, y);
+}
+
+/*
+ * From Bresenham's line algorithm and dcat's tplot.
+ */
+void
+ffplot_line(struct ffplot *plot, struct ffcolor *color,
+ int x0, int y0,
+ int x1, int y1)
+{
+ int dy, dx, sy, sx, err, e;
+
+ sx = x0 < x1 ? 1 : -1;
+ sy = y0 < y1 ? 1 : -1;
+ dx = ABS(x1 - x0);
+ dy = ABS(y1 - y0);
+ err = (dy > dx ? dy : -dx) / 2;
+
+ for (;;) {
+ ffplot_pixel(plot, color, x0, y0);
+
+ if (y0 == y1 && x0 == x1)
+ break;
+
+ e = err;
+ if (e > -dy) {
+ y0 += sy;
+ err -= dx;
+ }
+ if (e < dx) {
+ x0 += sx;
+ err += dy;
+ }
+ }
+}
+
+/*
+ * Draw a coloured glyph from font f centered on y.
+ */
+int
+ffplot_char(struct ffplot *plot, struct ffcolor *color, struct font *ft, char c,
+ int x, int y)
+{
+ int yf, xf, wf;
+
+ if (c & 0x80)
+ c = '\0';
+ y -= ft->height / 2;
+ wf = font_width(ft, c);
+ for (xf = 0; xf < wf; xf++)
+ for (yf = 0; yf < ft->height; yf++)
+ if (ft->glyph[(int)c][wf * (ft->height - yf) + xf] == 3)
+ ffplot_pixel(plot, color, x + xf, y + yf);
+ return wf + 1;
+}
+
+/*
+ * Draw a left aligned string without wrapping it.
+ */
+size_t
+ffplot_text_left(struct ffplot *plot, struct ffcolor *color, struct font *ft,
+ char *s, int x, int y)
+{
+ for (; *s != '\0'; s++)
+ x += ffplot_char(plot, color, ft, *s, x, y);
+ return x;
+}
+
+/*
+ * Draw a center aligned string without wrapping it.
+ */
+size_t
+ffplot_text_center(struct ffplot *plot, struct ffcolor *color, struct font *ft,
+ char *s, int x, int y)
+{
+ x -= font_strlen(ft, s) / 2;
+ return ffplot_text_left(plot, color, ft, s, x, y);
+}
+
+/*
+ * Draw a right aligned string without wrapping it.
+ */
+size_t
+ffplot_text_right(struct ffplot *plot, struct ffcolor *color, struct font *ft,
+ char *s, int x, int y)
+{
+ x -= font_strlen(ft, s);
+ return ffplot_text_left(plot, color, ft, s, x, y);
+}
+
+void
+ffplot_print(FILE *fp, struct ffplot *plot)
+{
+ uint32_t w, h;
+
+ w = htonl(plot->w);
+ h = htonl(plot->h);
+
+ fputs("ffplot", stdout);
+ fwrite(&w, sizeof(w), 1, fp);
+ fwrite(&h, sizeof(h), 1, fp);
+ fwrite(plot->buf, plot->w * plot->h, sizeof(*plot->buf), fp);
+}
(DIR) diff --git a/src/ffplot.h b/src/ffplot.h
@@ -0,0 +1,34 @@
+#ifndef FFPLOT_H
+#define FFPLOT_H
+
+#include <stdio.h>
+#include <stddef.h>
+
+#include "font.h"
+
+struct ffcolor {
+ uint16_t red;
+ uint16_t green;
+ uint16_t blue;
+ uint16_t alpha;
+};
+
+struct ffplot {
+ int w; /* width */
+ int h; /* height */
+ int x; /* x offset */
+ int y; /* y offset */
+ struct ffcolor *buf;
+};
+
+/**/
+void ffplot_pixel (struct ffplot *, struct ffcolor *, int, int);
+void ffplot_rectangle (struct ffplot *, struct ffcolor *, int, int, int, int);
+void ffplot_line (struct ffplot *, struct ffcolor *, int, int, int, int);
+int ffplot_char (struct ffplot *, struct ffcolor *, struct font *, char, int, int);
+size_t ffplot_text_left (struct ffplot *, struct ffcolor *, struct font *, char *, int, int);
+size_t ffplot_text_center (struct ffplot *, struct ffcolor *, struct font *, char *, int, int);
+size_t ffplot_text_right (struct ffplot *, struct ffcolor *, struct font *, char *, int, int);
+void ffplot_print (FILE *, struct ffplot *);
+
+#endif
(DIR) diff --git a/src/font.c b/src/font.c
@@ -0,0 +1,20 @@
+#include "font.h"
+
+#include <string.h>
+
+size_t
+font_width(struct font *ft, int c)
+{
+ return strlen(ft->glyph[c]) / ft->height;
+}
+
+size_t
+font_strlen(struct font *ft, char *s)
+{
+ size_t len;
+
+ len = 0;
+ for (; *s != '\0'; s++)
+ len += font_width(ft, *s);
+ return len;
+}
(DIR) diff --git a/src/font.h b/src/font.h
@@ -0,0 +1,22 @@
+#ifndef FONT_H
+#define FONT_H
+
+#include <stddef.h>
+
+/*
+ * Bitmapped font saved as a '_' and 'X' pattern in a C source file.
+ */
+struct font {
+ int height; /* The width is variable. */
+ char *glyph[128]; /* 0: end, 1: off, 2: on. */
+};
+
+struct font font13;
+struct font font7;
+struct font font8;
+
+/**/
+size_t font_width (struct font *, int);
+size_t font_strlen (struct font *, char *);
+
+#endif
(DIR) diff --git a/src/font13.c b/src/font13.c
@@ -0,0 +1,1576 @@
+#include "font.h"
+
+#define C(x) static char glyph_##x[]
+#define _ 2
+#define X 3
+
+C(error) = {
+ _,_,_,_,_,
+ 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,X,
+ _,_,_,_,_,
+0};
+
+C(space) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(bang) = {
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(double) = {
+ _,_,_,_,_,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+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,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+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,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(percent) = {
+ _,_,_,_,_,
+ X,X,_,_,X,
+ X,X,_,_,X,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ X,_,_,X,X,
+ X,_,_,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(amp) = {
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ _,_,X,_,_,
+ _,X,X,_,X,
+ X,_,_,X,_,
+ X,_,_,X,_,
+ X,_,_,X,_,
+ _,X,X,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(single) = {
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(l_round) = {
+ _,_,_,_,_,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,_,X,_,_,
+ _,_,_,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(r_round) = {
+ _,_,_,_,_,
+ _,X,_,_,_,
+ _,_,X,_,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(asterisk) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,X,_,_,
+ X,_,X,_,X,
+ _,X,X,X,_,
+ _,_,X,_,_,
+ _,X,X,X,_,
+ X,_,X,_,X,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(plus) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ X,X,X,X,X,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(coma) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(minus) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(dot) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(slash) = {
+ _,_,_,_,_,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(0) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,X,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(1) = {
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,X,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(2) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,X,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(3) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(4) = {
+ _,_,_,_,_,
+ _,_,_,_,X,
+ _,_,_,X,X,
+ _,_,X,_,X,
+ _,X,_,_,X,
+ X,_,_,_,X,
+ X,X,X,X,X,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(5) = {
+ _,_,_,_,_,
+ X,X,X,X,X,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,_,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(6) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(7) = {
+ _,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(8) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(9) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,X,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(column) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(semicolumn) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(l_angle) = {
+ _,_,_,_,_,
+ _,_,_,_,X,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ X,_,_,_,_,
+ _,X,_,_,_,
+ _,_,X,_,_,
+ _,_,_,X,_,
+ _,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(equal) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(r_angle) = {
+ _,_,_,_,_,
+ X,_,_,_,_,
+ _,X,_,_,_,
+ _,_,X,_,_,
+ _,_,_,X,_,
+ _,_,_,_,X,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ X,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(question) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,X,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+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,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(A) = {
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,X,X,X,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+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,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(C) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(D) = {
+ _,_,_,_,_,
+ X,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(E) = {
+ _,_,_,_,_,
+ X,X,X,X,X,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(F) = {
+ _,_,_,_,_,
+ X,X,X,X,X,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(G) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,X,X,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(H) = {
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,X,X,X,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(I) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(J) = {
+ _,_,_,_,_,
+ _,X,X,X,X,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ X,_,_,X,_,
+ _,X,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(K) = {
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,X,_,
+ X,_,X,_,_,
+ X,X,_,_,_,
+ X,_,X,_,_,
+ X,_,_,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(L) = {
+ _,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+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,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+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,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(O) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(P) = {
+ _,_,_,_,_,
+ X,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,X,X,X,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(Q) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,X,_,X,
+ _,X,X,X,_,
+ _,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(R) = {
+ _,_,_,_,_,
+ X,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,X,X,X,_,
+ X,_,X,_,_,
+ X,_,_,X,_,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(S) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ _,X,X,X,_,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(T) = {
+ _,_,_,_,_,
+ X,X,X,X,X,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(U) = {
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(V) = {
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+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,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(X) = {
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ _,_,X,_,_,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(Y) = {
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(Z) = {
+ _,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,X,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(l_square) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(backsl) = {
+ _,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,_,X,_,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(r_square) = {
+ _,_,_,_,_,
+ _,X,X,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(hat) = {
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,X,_,X,_,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(underscore) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+X ,X,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(backtilt) = {
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(a) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,X,X,X,_,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ _,X,X,X,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(b) = {
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(c) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(d) = {
+ _,_,_,_,X,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ _,X,X,X,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(e) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,X,X,X,X,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(f) = {
+ _,_,X,X,X,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ X,X,X,X,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+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,_,
+0};
+
+C(h) = {
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(i) = {
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,X,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(j) = {
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,_,_,
+ _,_,X,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ X,_,_,X,_,
+ _,X,X,_,_,
+0};
+
+C(k) = {
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,X,_,
+ X,_,X,_,_,
+ X,X,_,_,_,
+ X,_,X,_,_,
+ X,_,_,X,_,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(l) = {
+ _,X,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(m) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,X,X,X,_,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(n) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(o) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(p) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,X,X,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,X,X,X,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+0};
+
+C(q) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,X,X,X,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,X,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ _,_,_,_,X,
+0};
+
+C(r) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,_,X,X,X,
+ X,X,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(s) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,X,X,X,X,
+ X,_,_,_,_,
+ X,_,_,_,_,
+ _,X,X,X,_,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ X,X,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(t) = {
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ X,X,X,X,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,_,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(u) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(v) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ _,X,_,X,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(w) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ _,X,_,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(x) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,_,X,_,
+ _,_,X,_,_,
+ _,X,_,X,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(y) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,X,X,X,
+ _,_,_,_,X,
+ _,_,_,_,X,
+ X,X,X,X,_,
+0};
+
+C(z) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,X,
+ _,_,_,X,_,
+ _,_,X,_,_,
+ _,X,_,_,_,
+ X,_,_,_,_,
+ X,X,X,X,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(l_curly) = {
+ _,_,_,_,_,
+ _,_,X,X,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ X,_,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,X,_,_,_,
+ _,_,X,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(pipe) = {
+ _,_,_,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(r_curly) = {
+ _,_,_,_,_,
+ _,X,X,_,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,_,X,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,_,_,X,_,
+ _,X,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(tilde) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,X,_,_,X,
+ X,_,X,_,X,
+ X,_,_,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+struct font font13 = { 13, {
+ 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_amp, 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_backsl, 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
+} };
(DIR) diff --git a/src/font7.c b/src/font7.c
@@ -0,0 +1,743 @@
+#include "font.h"
+
+#define C(x) static char glyph_##x[]
+#define _ 2
+#define X 3
+
+C(err) = {
+ X,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,X,
+0};
+
+C(A) = {
+ _,_,_,_,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(B) = {
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,X,X,_,
+ X,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(C) = {
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,_,
+ X,_,_,_,
+ X,_,_,_,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(D) = {
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(E) = {
+ _,_,_,_,
+ X,X,X,X,
+ X,_,_,_,
+ X,X,X,_,
+ X,_,_,_,
+ X,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(F) = {
+ _,_,_,_,
+ X,X,X,X,
+ X,_,_,_,
+ X,X,X,_,
+ X,_,_,_,
+ X,_,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(G) = {
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,_,
+ X,_,X,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(H) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(I) = {
+ _,_,_,
+ X,X,X,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ X,X,X,
+ _,_,_,
+ _,_,_,
+0};
+
+C(J) = {
+ _,_,_,_,
+ _,X,X,X,
+ _,_,X,_,
+ _,_,X,_,
+ _,_,X,_,
+ X,X,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(K) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,X,_,
+ X,X,_,_,
+ X,_,X,_,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(L) = {
+ _,_,_,_,
+ X,_,_,_,
+ X,_,_,_,
+ X,_,_,_,
+ X,_,_,_,
+ X,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(M) = {
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,X,_,X,X,
+ X,_,X,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(N) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,X,_,X,
+ X,X,X,X,
+ X,_,X,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(O) = {
+ _,_,_,_,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(P) = {
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,X,X,_,
+ X,_,_,_,
+ X,_,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(Q) = {
+ _,_,_,_,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,X,X,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(R) = {
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,X,X,_,
+ X,_,X,_,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(S) = {
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,_,
+ _,X,X,_,
+ _,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(T) = {
+ _,_,_,_,
+ X,X,X,X,
+ _,X,X,_,
+ _,X,X,_,
+ _,X,X,_,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(U) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(V) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,X,_,
+ X,_,X,_,
+ X,X,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(W) = {
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ _,X,_,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(X) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(Y) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,X,_,_,
+ X,_,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(Z) = {
+ _,_,_,_,
+ X,X,X,X,
+ _,_,_,X,
+ _,X,X,_,
+ X,_,_,_,
+ X,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(a) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(b) = {
+ X,_,_,_,
+ X,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(c) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,_,
+ X,_,_,_,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(d) = {
+ _,_,_,X,
+ _,_,_,X,
+ _,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(e) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,X,X,X,
+ X,_,_,_,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(f) = {
+ _,X,X,
+ X,_,_,
+ X,_,_,
+ X,X,_,
+ X,_,_,
+ X,_,_,
+ _,_,_,
+ _,_,_,
+0};
+
+C(g) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,X,
+ _,X,X,_,
+0};
+
+C(h) = {
+ X,_,_,_,
+ X,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(i) = {
+ _,X,_,
+ _,_,_,
+ X,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,X,
+ _,_,_,
+ _,_,_,
+0};
+
+C(j) = {
+ _,X,_,
+ _,_,_,
+ X,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ X,_,_,
+0};
+
+C(k) = {
+ X,_,_,_,
+ X,_,_,_,
+ X,_,_,X,
+ X,_,X,_,
+ X,X,X,_,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(l) = {
+ X,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ X,X,X,
+ _,_,_,
+ _,_,_,
+0};
+
+C(m) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,X,X,X,_,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(n) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(o) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(p) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,_,
+ X,_,_,_,
+ X,_,_,_,
+0};
+
+C(q) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,X,
+ _,_,_,X,
+0};
+
+C(r) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,_,X,X,
+ X,X,_,_,
+ X,_,_,_,
+ X,_,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(s) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,X,_,_,
+ _,_,X,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(t) = {
+ X,_,_,
+ X,_,_,
+ X,X,X,
+ X,_,_,
+ X,_,_,
+ _,X,X,
+ _,_,_,
+ _,_,_,
+0};
+
+C(u) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(v) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,_,X,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(w) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ _,X,_,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(x) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,_,_,X,
+ _,X,X,_,
+ _,X,X,_,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(y) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,X,
+ _,X,X,_,
+0};
+
+C(z) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,X,X,X,
+ _,_,X,_,
+ _,X,_,_,
+ X,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(0) = {
+ _,X,X,_,
+ X,_,_,X,
+ X,_,X,X,
+ X,X,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(1) = {
+ _,X,_,
+ X,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ X,X,X,
+ _,_,_,
+ _,_,_,
+0};
+
+C(2) = {
+ _,X,X,_,
+ X,_,_,X,
+ _,_,_,X,
+ _,_,X,_,
+ _,X,_,_,
+ X,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(3) = {
+ X,X,X,_,
+ _,_,_,X,
+ _,X,X,X,
+ _,_,_,X,
+ _,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(4) = {
+ _,_,X,X,
+ _,X,_,X,
+ X,_,_,X,
+ X,X,X,X,
+ _,_,_,X,
+ _,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(5) = {
+ X,X,X,X,
+ X,_,_,_,
+ X,X,X,_,
+ _,_,_,X,
+ _,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(6) = {
+ _,X,X,_,
+ X,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(7) = {
+ X,X,X,X,
+ _,_,_,X,
+ _,_,X,_,
+ _,_,X,_,
+ _,X,_,_,
+ _,X,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(8) = {
+ _,X,X,_,
+ X,_,_,X,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(9) = {
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(space) = {
+ _,_,_,
+ _,_,_,
+ _,_,_,
+ _,_,_,
+ _,_,_,
+ _,_,_,
+ _,_,_,
+0};
+
+struct font font7 = { 8, {
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_space, glyph_err, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_0, glyph_1, glyph_2, glyph_3,
+ glyph_4, glyph_5, glyph_6, glyph_7,
+ glyph_8, glyph_9, glyph_err, glyph_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, 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_err,
+ glyph_err, glyph_err, glyph_err, glyph_err,
+ glyph_err, 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_err,
+ glyph_err, glyph_err, glyph_err, glyph_err
+} };
(DIR) diff --git a/src/font8.c b/src/font8.c
@@ -0,0 +1,743 @@
+#include "font.h"
+
+#define C(x) static char glyph_##x[]
+#define _ 2
+#define X 3
+
+C(error) = {
+ X,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,X,
+0};
+
+C(A) = {
+ _,_,_,_,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(B) = {
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,X,X,_,
+ X,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(C) = {
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,_,
+ X,_,_,_,
+ X,_,_,_,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(D) = {
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(E) = {
+ _,_,_,_,
+ X,X,X,X,
+ X,_,_,_,
+ X,X,X,_,
+ X,_,_,_,
+ X,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(F) = {
+ _,_,_,_,
+ X,X,X,X,
+ X,_,_,_,
+ X,X,X,_,
+ X,_,_,_,
+ X,_,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(G) = {
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,_,
+ X,_,X,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(H) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(I) = {
+ _,_,_,
+ X,X,X,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ X,X,X,
+ _,_,_,
+ _,_,_,
+0};
+
+C(J) = {
+ _,_,_,_,
+ _,X,X,X,
+ _,_,X,_,
+ _,_,X,_,
+ _,_,X,_,
+ X,X,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(K) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,X,_,
+ X,X,_,_,
+ X,_,X,_,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(L) = {
+ _,_,_,_,
+ X,_,_,_,
+ X,_,_,_,
+ X,_,_,_,
+ X,_,_,_,
+ X,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(M) = {
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,X,_,X,X,
+ X,_,X,_,X,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(N) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,X,_,X,
+ X,X,X,X,
+ X,_,X,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(O) = {
+ _,_,_,_,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(P) = {
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,X,X,_,
+ X,_,_,_,
+ X,_,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(Q) = {
+ _,_,_,_,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,X,X,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(R) = {
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,X,X,_,
+ X,_,X,_,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(S) = {
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,_,
+ _,X,X,_,
+ _,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(T) = {
+ _,_,_,_,
+ X,X,X,X,
+ _,X,X,_,
+ _,X,X,_,
+ _,X,X,_,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(U) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(V) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,X,_,
+ X,_,X,_,
+ X,X,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(W) = {
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ _,X,_,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(X) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(Y) = {
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,X,_,_,
+ X,_,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(Z) = {
+ _,_,_,_,
+ X,X,X,X,
+ _,_,_,X,
+ _,X,X,_,
+ X,_,_,_,
+ X,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(a) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(b) = {
+ X,_,_,_,
+ X,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(c) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,_,
+ X,_,_,_,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(d) = {
+ _,_,_,X,
+ _,_,_,X,
+ _,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(e) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,X,X,X,
+ X,_,_,_,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(f) = {
+ _,X,X,
+ X,_,_,
+ X,_,_,
+ X,X,_,
+ X,_,_,
+ X,_,_,
+ _,_,_,
+ _,_,_,
+0};
+
+C(g) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,X,
+ _,X,X,_,
+0};
+
+C(h) = {
+ X,_,_,_,
+ X,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(i) = {
+ _,X,_,
+ _,_,_,
+ X,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,X,
+ _,_,_,
+ _,_,_,
+0};
+
+C(j) = {
+ _,X,_,
+ _,_,_,
+ X,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ X,_,_,
+0};
+
+C(k) = {
+ X,_,_,_,
+ X,_,_,_,
+ X,_,_,X,
+ X,_,X,_,
+ X,X,X,_,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(l) = {
+ X,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ X,X,X,
+ _,_,_,
+ _,_,_,
+0};
+
+C(m) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,X,X,X,_,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(n) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(o) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(p) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,X,X,_,
+ X,_,_,_,
+ X,_,_,_,
+0};
+
+C(q) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,X,
+ _,_,_,X,
+0};
+
+C(r) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,_,X,X,
+ X,X,_,_,
+ X,_,_,_,
+ X,_,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(s) = {
+ _,_,_,_,
+ _,_,_,_,
+ _,X,X,X,
+ X,X,_,_,
+ _,_,X,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(t) = {
+ X,_,_,
+ X,_,_,
+ X,X,X,
+ X,_,_,
+ X,_,_,
+ _,X,X,
+ _,_,_,
+ _,_,_,
+0};
+
+C(u) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(v) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,_,_,X,
+ _,X,_,X,_,
+ _,_,X,_,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(w) = {
+ _,_,_,_,_,
+ _,_,_,_,_,
+ X,_,_,_,X,
+ X,_,X,_,X,
+ X,_,X,_,X,
+ _,X,_,X,_,
+ _,_,_,_,_,
+ _,_,_,_,_,
+0};
+
+C(x) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,_,_,X,
+ _,X,X,_,
+ _,X,X,_,
+ X,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(y) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,_,_,X,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,X,
+ _,X,X,_,
+0};
+
+C(z) = {
+ _,_,_,_,
+ _,_,_,_,
+ X,X,X,X,
+ _,_,X,_,
+ _,X,_,_,
+ X,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(0) = {
+ _,X,X,_,
+ X,_,_,X,
+ X,_,X,X,
+ X,X,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(1) = {
+ _,X,_,
+ X,X,_,
+ _,X,_,
+ _,X,_,
+ _,X,_,
+ X,X,X,
+ _,_,_,
+ _,_,_,
+0};
+
+C(2) = {
+ _,X,X,_,
+ X,_,_,X,
+ _,_,_,X,
+ _,_,X,_,
+ _,X,_,_,
+ X,X,X,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(3) = {
+ X,X,X,_,
+ _,_,_,X,
+ _,X,X,X,
+ _,_,_,X,
+ _,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(4) = {
+ _,_,X,X,
+ _,X,_,X,
+ X,_,_,X,
+ X,X,X,X,
+ _,_,_,X,
+ _,_,_,X,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(5) = {
+ X,X,X,X,
+ X,_,_,_,
+ X,X,X,_,
+ _,_,_,X,
+ _,_,_,X,
+ X,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(6) = {
+ _,X,X,_,
+ X,_,_,_,
+ X,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(7) = {
+ X,X,X,X,
+ _,_,_,X,
+ _,_,X,_,
+ _,_,X,_,
+ _,X,_,_,
+ _,X,_,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(8) = {
+ _,X,X,_,
+ X,_,_,X,
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(9) = {
+ _,X,X,_,
+ X,_,_,X,
+ X,_,_,X,
+ _,X,X,X,
+ _,_,_,X,
+ _,X,X,_,
+ _,_,_,_,
+ _,_,_,_,
+0};
+
+C(space) = {
+ _,_,_,
+ _,_,_,
+ _,_,_,
+ _,_,_,
+ _,_,_,
+ _,_,_,
+ _,_,_,
+0};
+
+struct font font8 = { 8, {
+ 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_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_0, glyph_1, glyph_2, glyph_3,
+ glyph_4, glyph_5, glyph_6, glyph_7,
+ glyph_8, glyph_9, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, 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_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, 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_error,
+ glyph_error, glyph_error, glyph_error, glyph_error
+} };
(DIR) diff --git a/src/log.c b/src/log.c
@@ -0,0 +1,99 @@
+#include "log.h"
+
+#include <string.h>
+
+/*
+ * log.c - log to standard error according to the log level
+ *
+ * Instead of logging to syslog, delegate logging to a separate
+ * tool, such as FreeBSD's daemon(8), POSIX's logger(1).
+ *
+ * log_init() sets the log level to the "LOG" environment variable
+ * if set, or to 4 (log down to info included) otherwise.
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#define LOG_DEFAULT 3
+
+int log_level = -1;
+
+void
+vlogf(int exitcode, int level, char const *flag, char const *fmt, va_list va)
+{
+ char *env;
+
+ if (log_level == -1) {
+ env = getenv("LOG");
+ log_level = env ? atoi(env) : 0;
+ log_level = log_level > 0 ? log_level : LOG_DEFAULT;
+ }
+
+ if (log_level < level)
+ goto end;
+
+ fprintf(stderr, "%s: ", flag);
+ vfprintf(stderr, fmt, va);
+
+ if (errno)
+ fprintf(stderr, ": %s", strerror(errno));
+ errno = 0;
+
+ fprintf(stderr, "\n");
+ fflush(stderr);
+end:
+ if (exitcode)
+ exit(exitcode);
+}
+
+void
+fatal(int exitcode, char const *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ vlogf(exitcode, 0, "fatal", fmt, va);
+ va_end(va);
+}
+
+void
+error(char const *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ vlogf(0, 1, "error", fmt, va);
+ va_end(va);
+}
+
+void
+warn(char const *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ vlogf(0, 2, "warn", fmt, va);
+ va_end(va);
+}
+
+void
+info(char const *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ vlogf(0, 3, "info", fmt, va);
+ va_end(va);
+}
+
+void
+debug(char const *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ vlogf(0, 4, "debug", fmt, va);
+ va_end(va);
+}
(DIR) diff --git a/src/log.h b/src/log.h
@@ -0,0 +1,15 @@
+#ifndef LOG_H
+#define LOG_H
+
+#include <stdarg.h>
+
+/**/
+int log_level;
+void vlogf (int, int, char const *, char const *, va_list);
+void fatal (int, char const *, ...);
+void error (char const *, ...);
+void warn (char const *, ...);
+void info (char const *, ...);
+void debug (char const *, ...);
+
+#endif
(DIR) diff --git a/src/scale.c b/src/scale.c
@@ -0,0 +1,141 @@
+#include "scale.h"
+
+#include <stddef.h>
+#include <time.h>
+
+#include "tool.h"
+#include "log.h"
+
+/*
+ * - <max ^
+ * - | Translate the coordinates between double values
+ * - <val szy and height in the plot of <row> rows.
+ * - |
+ * - <min v
+ */
+int
+scale_ypos(double val, double min, double max, int szy)
+{
+ return szy * (val - min) / (max - min);
+}
+
+/*
+ * <---- szx ----> Translate the coordinates between the time
+ * range and position in the plot of <col> cols.
+ * t1 t t2
+ * | . . | . . |
+ */
+int
+scale_xpos(time_t t, time_t t1, time_t t2, int szx)
+{
+ return szx * (t - t1) / (t2 - t1);
+}
+
+static void
+scale_minmax(struct vlist *vl, int ncol,
+ time_t *tmin, time_t *tmax,
+ double *vmin, double *vmax)
+{
+ double *v;
+ time_t *t;
+ size_t n;
+
+ *vmin = *vmax = 0;
+ *tmin = *tmax = *vl->t;
+
+ for (; ncol > 0; ncol--, vl++) {
+ for (t = vl->t, v = vl->v, n = vl->n; n > 0; t++, v++, n--) {
+ if (*v < *vmin) *vmin = *v;
+ if (*v > *vmax) *vmax = *v;
+ if (*t < *tmin) *tmin = *t;
+ if (*t > *tmax) *tmax = *t;
+ }
+ }
+
+ if (*tmin == *tmax)
+ fatal(1, "invalid time scale: min=%lld max=%lld", *tmin, *tmax);
+}
+
+static time_t
+scale_tstep(time_t min, time_t max, int density)
+{
+ 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, 0
+ };
+
+ dt = max - min;
+ for (s = scale; s < scale + LEN(scale); s++)
+ if (dt < *s * density)
+ return *s;
+ return 0;
+}
+
+static double
+scale_vstep(double min, double max, int density)
+{
+ double dv, d, *s, scale[] = { 1, 2, 3, 5 };
+
+ dv = max - min;
+
+ if (dv > 1)
+ for (d = 1; d != 0; d *= 10)
+ for (s = scale; s < scale + LEN(scale); s++)
+ if (dv < *s * d * density)
+ return *s * d;
+ if (dv < 1)
+ for (d = 1; d != 0; d *= 10)
+ for (s = scale + LEN(scale) - 1; s >= scale; s--)
+ if (dv > *s / d * density / 2)
+ return *s / d;
+ return 0;
+}
+
+/*
+ * Adjust the vertical scale so that everything fits, with nice
+ * scale values.
+ */
+void
+scale_vminmax(double *min, double *max, int row)
+{
+ double unit, range, mi;
+
+ range = *max - *min;
+ unit = 1;
+
+ /* Zoom until it fills the canvas. */
+ for (; (row - 1) * unit > range; unit /= 10)
+ continue;
+
+ /* Dezoom until it fits the canvas. */
+ for (; (row - 1) * unit < range; unit *= 10)
+ continue;
+
+ /* Fine tune. */
+ if ((row - 1) * unit / 5 > range)
+ unit /= 5;
+ if ((row - 1) * unit / 4 > range)
+ unit /= 4;
+ if ((row - 1) * unit / 2 > range)
+ unit /= 2;
+
+ /* Align the minimum (and the zero). */
+ for (mi = 0; mi > *min - unit; mi -= unit)
+ continue;
+
+ /* Update the displayed minimal and maximal. */
+ *min = mi;
+ *max = mi + unit * row;
+}
+
+void
+scale(struct vlist *vl, int ncol,
+ time_t *tmin, time_t *tmax, time_t *tstep,
+ double *vmin, double *vmax, double *vstep)
+{
+ scale_minmax(vl, ncol, tmin, tmax, vmin, vmax);
+ *tstep = scale_tstep(*tmin, *tmax, SCALE_X);
+ *vstep = scale_vstep(*vmin, *vmax, SCALE_Y);
+}
(DIR) diff --git a/src/scale.h b/src/scale.h
@@ -0,0 +1,18 @@
+#ifndef SCALE_H
+#define SCALE_H
+
+#include <stddef.h>
+#include <time.h>
+
+#include "csv.h"
+
+#define SCALE_X 7 /* nb of values on x axis */
+#define SCALE_Y 7 /* nb of values on y axis */
+
+/**/
+int scale_ypos (double, double, double, int);
+int scale_xpos (time_t, time_t, time_t, int);
+void scale_vminmax (double *, double *, int);
+void scale (struct vlist *, int, time_t *, time_t *, time_t *, double *, double *, double *);
+
+#endif
(DIR) diff --git a/src/tool.c b/src/tool.c
@@ -0,0 +1,103 @@
+#include "tool.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+size_t
+strlcpy(char *buf, const char *str, size_t sz)
+{
+ size_t len, cpy;
+
+ cpy = ((len = strlen(str)) > sz) ? (sz) : (len);
+ memcpy(buf, str, cpy);
+ buf[sz - 1] = '\0';
+ return len;
+}
+
+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)
+{
+ char *s, *prev;
+
+ if (*strp == NULL)
+ return NULL;
+ for (s = prev = *strp; strchr(sep, *s) == NULL; s++);
+ if (*s == '\0') {
+ *strp = NULL;
+ return prev;
+ }
+ *s = '\0';
+ *strp = s + 1;
+
+ return prev;
+}
+
+void
+estriplf(char *line)
+{
+ char *lf;
+
+ if ((lf = strchr(line, '\n')) == NULL || lf[1] != '\0')
+ fputs("invalid input\n", stderr), exit(1);
+ *lf = '\0';
+}
+
+double
+eatof(char *str)
+{
+ char *s;
+
+ for (s = str; *s != '\0'; s++)
+ if (!isdigit(*s) && *s != '-' && *s != '.')
+ fputs("invalid float format\n", stderr), exit(1);
+ return atof(str);
+}
+
+long
+eatol(char *str)
+{
+ char *s;
+
+ for (s = str; *s != '\0'; s++)
+ if (!isdigit(*s) && *s != '-')
+ fputs("invalid number format\n", stderr), exit(1);
+ return atol(str);
+}
+
+/*
+ * Set 'str' to a human-readable form of 'num' with always a width of 8 (+1 for
+ * 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;
+}
(DIR) diff --git a/src/tool.h b/src/tool.h
@@ -0,0 +1,20 @@
+#ifndef TOOL_H
+#define TOOL_H
+
+#include <stddef.h>
+
+#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))
+
+/**/
+size_t strlcpy (char *, const char *, size_t);
+void put3utf (long);
+char * strsep (char **, const char *);
+void estriplf (char *);
+double eatof (char *);
+long eatol (char *);
+int humanize (char *, double);
+
+#endif
(DIR) diff --git a/util.c b/util.c
@@ -1,103 +0,0 @@
-#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "def.h"
-
-size_t
-strlcpy(char *buf, const char *str, size_t sz)
-{
- size_t len, cpy;
-
- cpy = ((len = strlen(str)) > sz) ? (sz) : (len);
- memcpy(buf, str, cpy);
- buf[sz - 1] = '\0';
- return len;
-}
-
-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)
-{
- char *s, *prev;
-
- if (*strp == NULL)
- return NULL;
- for (s = prev = *strp; strchr(sep, *s) == NULL; s++);
- if (*s == '\0') {
- *strp = NULL;
- return prev;
- }
- *s = '\0';
- *strp = s + 1;
-
- return prev;
-}
-
-void
-estriplf(char *line)
-{
- char *lf;
-
- if ((lf = strchr(line, '\n')) == NULL || lf[1] != '\0')
- fputs("invalid input\n", stderr), exit(1);
- *lf = '\0';
-}
-
-double
-eatof(char *str)
-{
- char *s;
-
- for (s = str; *s != '\0'; s++)
- if (!isdigit(*s) && *s != '-' && *s != '.')
- fputs("invalid float format\n", stderr), exit(1);
- return atof(str);
-}
-
-long
-eatol(char *str)
-{
- char *s;
-
- for (s = str; *s != '\0'; s++)
- if (!isdigit(*s) && *s != '-')
- fputs("invalid number format\n", stderr), exit(1);
- return atol(str);
-}
-
-/*
- * Set 'str' to a human-readable form of 'num' with always a width of 8 (+1 for
- * 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;
-}