Introduction
Introduction Statistics Contact Development Disclaimer Help
import source code from monit, reverse x and y in ploot-ff.c - ploot - simple p…
git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65…
Log
Files
Refs
Tags
README
LICENSE
---
commit 62211b846caa7b980b6a43dea1fdf0a0e2f6de34
parent f62864eb417aedad38a233fd05ea7a8b46cd2d8e
Author: Josuah Demangeon <[email protected]>
Date: Fri, 7 Feb 2020 19:50:50 +0100
import source code from monit, reverse x and y in ploot-ff.c
Diffstat:
M Makefile | 30 ++++++++----------------------
M arg.h | 31 ++++++++++++-----------------…
A def.h | 61 +++++++++++++++++++++++++++++…
A drawille.c | 194 ++++++++++++++++++++++++++++++
A font.c | 20 ++++++++++++++++++++
D font.h | 1677 -----------------------------…
A font13.c | 1576 +++++++++++++++++++++++++++++…
A font7.c | 743 +++++++++++++++++++++++++++++…
A font8.c | 743 +++++++++++++++++++++++++++++…
A log.h | 45 +++++++++++++++++++++++++++++…
M ploot-csv.7 | 43 +++++++++++------------------…
M ploot-feed.c | 57 ++++++++++++++++-------------…
M ploot-ff.1 | 2 +-
M ploot-ff.c | 502 +++++++++++++++--------------…
A ploot-plot.c | 201 ++++++++++++++++++++++++++++++
M util.c | 2 +-
D util.h | 12 ------------
17 files changed, 3892 insertions(+), 2047 deletions(-)
---
diff --git a/Makefile b/Makefile
@@ -1,25 +1,16 @@
-CFLAGS = -Wall -Wextra -Werror -std=c89 -pedantic -fPIC \
+CFLAGS = -Wall -Wextra -std=c99 -pedantic -fPIC \
-D_POSIX_C_SOURCE=200809L
-LDFLAGS = -static
-BIN = ploot-ff ploot-feed
-LIB = -lm
-MANDIR = $(PREFIX)/share/man
+LFLAGS = -static
+BIN = ploot-ff ploot-feed
+LIB = -lm
+MANDIR = $(PREFIX)/share/man
-SRC_PLOOT_FF = util.c ploot-ff.c
-HDR_PLOOT_FF = arg.h util.h font.h
-OBJ_PLOOT_FF = $(SRC_PLOOT_FF:.c=.o)
-
-SRC_PLOOT_FEED = util.c ploot-feed.c
-HDR_PLOOT_FEED = arg.h util.h
-OBJ_PLOOT_FEED = $(SRC_PLOOT_FEED:.c=.o)
+SRC = util.c drawille.c font.c font7.c font8.c font13.c
all: $(BIN)
-ploot-ff: $(OBJ_PLOOT_FF)
- ${CC} $(LDFLAGS) -o $@ $(OBJ_PLOOT_FF) $(LIB)
-
-ploot-feed: $(OBJ_PLOOT_FEED)
- ${CC} $(LDFLAGS) -o $@ $(OBJ_PLOOT_FEED) $(LIB)
+${BIN}: ${SRC:.c=.o} ${BIN:=.o}
+ ${CC} $(LFLAGS) -o $@ [email protected] ${SRC:.c=.o} $(LIB)
install: $(BIN)
mkdir -p ${PREFIX}/bin $(MANDIR)/man1 $(MANDIR)/man7
@@ -29,8 +20,3 @@ install: $(BIN)
clean:
rm -f *.o
-
-.PHONY: all install clean
-
-$(SRC_PLOOT_FF): $(HDR_PLOOT_FF)
-$(SRC_PLOOT_FEED): $(HDR_PLOOT_FEED)
diff --git a/arg.h b/arg.h
@@ -1,27 +1,20 @@
#ifndef ARG_H
#define ARG_H
-extern char *argv0;
+extern char const *arg0;
-#define ARGBEGIN \
- for (argv0 = *argv, argv++, argc--; \
- argv[0] != NULL && argv[0][0] == '-' && argv[0][1] != '\0'; \
- argc--, argv++) { \
- char **_argv, *_a; \
- if (argv[0][1] == '-' && argv[0][2] == '\0') { \
- argv++, argc--; \
- break; \
- } \
- for (_argv = argv, _a = *argv + 1; *_a != '\0'; _a++) { \
- switch (*_a)
+#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 ARGEND \
- if (_argv != argv) \
- break; \
- } \
- }
+#define ARG ((*++*argv != '\0' || *++argv != NULL) \
+ ? ((stop = 1), argc--, *argv) \
+ : (usage(), NULL))
-#define EARGF(x) \
- ((argv[1] == NULL) ? ((x), (char *)0) : (argc--, argv++, argv[0]))
+extern char const *arg0;
#endif
diff --git a/def.h b/def.h
@@ -0,0 +1,61 @@
+#include <limits.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 * …
+};
+
+/*
+ * 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. */
+};
+
+/* drawille.c */
+
+size_t drawille_fmt_row (struct drawille *, char *, size…
+void drawille_dot (struct drawille *, int, int);
+struct drawille *drawille_new (int, int);
+void drawille_line (struct drawille *, int, int,…
+void drawille_line_hist (struct drawille *, int, int, in…
+void drawille_dot_hist (struct drawille *, int, int, int…
+char * drawille_text (struct drawille *, int, in…
+
+/* font.c */
+
+size_t font_width (struct font *, int);
+size_t font_strlen (struct font *, char *);
+
+/* font13.c */
+
+struct font font13;
+
+/* font7.c */
+
+struct font font8;
+
+/* font8.c */
+
+struct font font8;
+
+/* util.c */
+
+void put3utf (long);
+char * strsep (char **, const char *);
+void estriplf (char *);
+double eatof (char *);
+long eatol (char *);
+char * esfgets (char *, size_t, FILE *);
+int humanize (char *, double);
diff --git a/drawille.c b/drawille.c
@@ -0,0 +1,194 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "def.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_fmt_row(struct drawille *drw, char *buf, size_t sz, 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 += snprintf(buf+n, sz-n, "%s", txt);
+ }
+ 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 / …
+ 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_line_hist(struct drawille *drw, int x0, int y0, int x1, int y1, int z…
+{
+ struct line l;
+ int sign;
+
+ drawille_line_init(&l, x0, y0, x1, y1);
+ do {
+ sign = (l.y0 > zero) ? (-1) : (+1);
+ for (int y = l.y0; y != zero + sign; y += sign)
+ drawille_dot(drw, l.x0, y);
+ } while (drawille_line_next(&l));
+}
+
+void
+drawille_dot_hist(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);
+}
+
+static int
+drawille_text_glyph(struct drawille *drw, int x, int y, struct font *font, cha…
+{
+ 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;
+}
diff --git a/font.c b/font.c
@@ -0,0 +1,20 @@
+#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;
+}
diff --git a/font.h b/font.h
@@ -1,1677 +0,0 @@
-#define FONT_W 7
-#define FONT_H 14
-
-#define C(x) static char glyph_ ## x[FONT_W * FONT_H]
-#define _ 0
-#define X 1
-
-C(error) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,X,X,X,_,_,
- _,_,X,X,X,_,_,
- _,_,X,X,X,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(space) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(bang) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(double) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(hash) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,X,X,X,X,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,X,X,X,X,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(dollar) = {
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,_,_,
- _,X,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,X,_,X,_,
- _,_,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(percent) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,_,_,X,_,
- _,X,X,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,X,X,_,
- _,X,_,_,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(ampersand) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,_,X,_,
- _,X,_,_,X,_,_,
- _,X,_,_,X,_,_,
- _,X,_,_,X,_,_,
- _,_,X,X,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(single) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(l_round) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(r_round) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(asterisk) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,X,_,X,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,X,_,X,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(plus) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(coma) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(minus) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(dot) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(slash) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(0) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(1) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(2) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(3) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(4) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,X,_,
- _,_,_,X,_,X,_,
- _,_,X,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(5) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(6) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(7) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(8) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(9) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(column) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(semicolumn) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(l_angle) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(equal) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(r_angle) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(question) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(at) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,X,X,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,X,X,_,
- _,X,_,_,_,_,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(A) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(B) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(C) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(D) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(E) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(F) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(G) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(H) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(I) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(J) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,X,_,_,X,_,_,
- _,_,X,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(K) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,X,_,_,
- _,X,_,X,_,_,_,
- _,X,X,_,_,_,_,
- _,X,_,X,_,_,_,
- _,X,_,_,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(L) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(M) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,X,_,X,X,_,
- _,X,X,_,X,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(N) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,X,_,_,X,_,
- _,X,X,_,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,_,X,X,_,
- _,X,_,_,X,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(O) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(P) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(Q) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,X,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(R) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,X,_,X,_,_,_,
- _,X,_,_,X,_,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(S) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(T) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(U) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(V) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(W) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,X,_,X,X,_,
- _,X,X,_,X,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(X) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(Y) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(Z) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(l_square) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(backslash) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(r_square) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(hat) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,X,_,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(underscore) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
-X ,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(backtilt) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(a) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(b) = {
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(c) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(d) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(e) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(f) = {
- _,_,_,_,_,_,_,
- _,_,_,X,X,X,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,X,X,X,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(g) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_
-};
-
-C(h) = {
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(i) = {
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(j) = {
- _,_,_,_,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,X,_,_,X,_,_,
- _,_,X,X,_,_,_
-};
-
-C(k) = {
- _,_,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,X,_,_,
- _,X,_,X,_,_,_,
- _,X,X,_,_,_,_,
- _,X,_,X,_,_,_,
- _,X,_,_,X,_,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(l) = {
- _,_,_,_,_,_,_,
- _,_,X,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(m) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(n) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(o) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(p) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_
-};
-
-C(q) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X
-};
-
-C(r) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,X,X,X,X,
- _,X,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(s) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,X,X,_,
- _,X,_,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,X,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,_,X,_,
- _,X,X,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(t) = {
- _,_,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,X,X,X,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(u) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(v) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(w) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,X,_,X,_,
- _,_,X,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(x) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,X,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(y) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,X,_,_,_,X,_,
- _,_,X,X,X,_,_
-};
-
-C(z) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,X,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,X,X,X,X,X,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(l_curly) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,X,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,X,_,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,X,_,_,_,_,
- _,_,_,X,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(pipe) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(r_curly) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,X,_,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,_,X,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,_,_,X,_,_,
- _,_,X,X,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-C(tilde) = {
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,X,_,_,X,_,
- _,X,_,X,_,X,_,
- _,X,_,_,X,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_,
- _,_,_,_,_,_,_
-};
-
-#undef C
-#undef _
-#undef X
-
-char *glyph[128] = {
- glyph_error, glyph_error, glyph_error, glyph_error,
- glyph_error, glyph_error, glyph_error, glyph_error,
- glyph_error, glyph_error, glyph_error, glyph_error,
- glyph_error, glyph_error, glyph_error, glyph_error,
- glyph_error, glyph_error, glyph_error, glyph_error,
- glyph_error, glyph_error, glyph_error, glyph_error,
- glyph_error, glyph_error, glyph_error, glyph_error,
- glyph_error, glyph_error, glyph_error, glyph_error,
- glyph_space, glyph_bang, glyph_double, glyph_hash,
- glyph_dollar, glyph_percent, glyph_ampersand, glyph_single,
- glyph_l_round, glyph_r_round, glyph_asterisk, glyph_plus,
- glyph_coma, glyph_minus, glyph_dot, glyph_slash,
- glyph_0, glyph_1, glyph_2, glyph_3,
- glyph_4, glyph_5, glyph_6, glyph_7,
- glyph_8, glyph_9, glyph_column, glyph_semicolumn,
- glyph_l_angle, glyph_equal, glyph_r_angle, glyph_question,
- glyph_at, glyph_A, glyph_B, glyph_C,
- glyph_D, glyph_E, glyph_F, glyph_G,
- glyph_H, glyph_I, glyph_J, glyph_K,
- glyph_L, glyph_M, glyph_N, glyph_O,
- glyph_P, glyph_Q, glyph_R, glyph_S,
- glyph_T, glyph_U, glyph_V, glyph_W,
- glyph_X, glyph_Y, glyph_Z, glyph_l_square,
- glyph_backslash, glyph_r_square, glyph_hat, glyph_underscore,
- glyph_backtilt, glyph_a, glyph_b, glyph_c,
- glyph_d, glyph_e, glyph_f, glyph_g,
- glyph_h, glyph_i, glyph_j, glyph_k,
- glyph_l, glyph_m, glyph_n, glyph_o,
- glyph_p, glyph_q, glyph_r, glyph_s,
- glyph_t, glyph_u, glyph_v, glyph_w,
- glyph_x, glyph_y, glyph_z, glyph_l_curly,
- glyph_pipe, glyph_r_curly, glyph_tilde, glyph_error
-};
diff --git a/font13.c b/font13.c
@@ -0,0 +1,1576 @@
+#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_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_space, glyph_bang, glyph_double, glyph_hash,
+ glyph_dollar, glyph_percent, glyph_amp, glyph_sin…
+ glyph_l_round, glyph_r_round, glyph_asterisk, gly…
+ 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_…
+ 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_un…
+ 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_err…
+} };
diff --git a/font7.c b/font7.c
@@ -0,0 +1,743 @@
+#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
+} };
diff --git a/font8.c b/font8.c
@@ -0,0 +1,743 @@
+#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_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_space, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ glyph_error, glyph_error, glyph_error, glyph_erro…
+ 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_erro…
+ 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_erro…
+ 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
+} };
diff --git a/log.h b/log.h
@@ -0,0 +1,45 @@
+#ifndef LOG_H
+#define LOG_H
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+char const *arg0; /* Should be set by the library caller. */
+
+static inline void
+vlog(char const *base, char const *fmt, va_list va)
+{
+ fprintf(stderr, "%s: ", base);
+ vfprintf(stderr, fmt, va);
+ if (errno)
+ fprintf(stderr, ": %s", strerror(errno));
+ fputc('\n', stderr);
+ fflush(stderr);
+ errno = 0; /* avoid repeating the error in loop */
+}
+
+static inline void
+warn(char const *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ vlog(arg0, fmt, va);
+ va_end(va);
+}
+
+static inline void
+err(int e, char const *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ vlog(arg0, fmt, va);
+ va_end(va);
+ exit(e);
+}
+
+#endif
diff --git a/ploot-csv.7 b/ploot-csv.7
@@ -1,4 +1,4 @@
-.Dd $Mdocdate: August 08 2018$
+.Dd $Mdocdate: February 01 2020$
.Dt PLOOT-CSV 7
.Os
.
@@ -11,42 +11,32 @@
.
.Sh SYNOPSIS
.
-.Bd -literal -offset indent
+.Bd -literal
epoch,column-name-1,column-name-2
timestamp,value1,value2
+timestamp,value1,value2
+…
.Ed
.
.
.Sh DESCRIPTION
.
This is the simple comma-separated format used by the ploot-* programs.
-.\" .Sh STANDARDS
-.\" .Sh HISTORY
.
.
-.Sh AUTHORS
-.
-.An Josuah Demangeon
-.Aq Mt [email protected]
-.
-.
-.\" .Sh CAVEATS
-.\" .Sh BUGS
.Sh INPUT FORMAT
.
-.Nm reads lines and column from standard input.
-Each line correspond to one entry with the same timestamp.
-Each input column correspond to one output column, one type of data.
-.
-.Pp
+.Nm
+has a first header line, then zero or more data lines, both
+comma-separated list of values.
.
.
.Ss Header line
.
-The program must contain a first header line with the label of each column.
-The first column is always a timestamp, and the first label must be
+The input must contain a first header line with the label of each column in or…
+The first column is always
.Dq epoch .
-The following columns
+Then there are the actual column names.
.
.Bd -literal -offset indent
epoch,free_memory,process_count
@@ -56,13 +46,10 @@ epoch,free_memory,process_count
.Ss Data lines
.
The following lines are the data.
-The first column is an unix timestamp: number of seconds since 00:00:00
-01/01/1970.
-The remaining columns are values, that might be decimal
-.Po
-they will be read as a
-.Vt double
-.Pc .
+The first column is always an unix timestamp as in
+.Vt time_t .
+The remaining columns are values parsed as floating point numbers by
+.Xr strtod 3 :
.
.Bd -literal -offset indent
1533752053,16.3,45
@@ -87,4 +74,4 @@ was defined at
.Sh AUTHORS
.
.An Josuah Demangeon
-.Aq Mt [email protected]
+.Aq Mt [email protected]
diff --git a/ploot-feed.c b/ploot-feed.c
@@ -5,16 +5,17 @@
#include <limits.h>
#include <string.h>
#include <ctype.h>
+#include <stdint.h>
#include "arg.h"
-#include "util.h"
+#include "def.h"
#define WIDTH_MAX 1024
#define BRAILLE_START 10240
-int wflag = 80;
-int width;
-char *argv0;
+int wflag = 80;
+int width = 0;
+char const *arg0 = NULL;
/*
* Turn the bit at position (row, col) on in the .
@@ -35,7 +36,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);
@@ -50,10 +51,10 @@ 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);
@@ -77,10 +78,10 @@ plot_row(long *out, char *line, double *max, int nrow, int …
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[LINE_MAX];
for (rune = BRAILLE_START, o = out, n = ncol * width; n > 0; o++, n--)
memcpy(o, &rune, sizeof(rune));
@@ -101,7 +102,7 @@ plot_line(long *out, double *max, int ncol)
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:
@@ -131,9 +132,9 @@ put_line(long *out)
static void
plot(char labels[LINE_MAX], 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;
@@ -157,8 +158,8 @@ plot(char labels[LINE_MAX], double *max, int ncol)
static int
read_labels(char *labv[LINE_MAX])
{
- int ncol;
- char *l, line[LINE_MAX], *tok;
+ int ncol;
+ char *l, line[LINE_MAX], *tok;
if ((l = esfgets(line, LINE_MAX, stdin)) == NULL)
fputs("missing label line\n", stderr), exit(1);
@@ -179,7 +180,7 @@ read_labels(char *labv[LINE_MAX])
static void
fmt_labels(char out[LINE_MAX], int ncol, char *labels[LINE_MAX / 2])
{
- int i, n;
+ int i, n;
for (i = 0; i < ncol; labels++, i++) {
n = LINE_MAX - (width + sizeof("│")) * i;
@@ -190,22 +191,22 @@ fmt_labels(char out[LINE_MAX], int ncol, char *labels[LIN…
static void
usage(void)
{
- fprintf(stderr, "usage: %s [-w width] maxval... <csv\n", argv0);
+ fprintf(stderr, "usage: %s [-w width] maxval... <csv\n", arg0);
exit(1);
}
static int
parse_args(int argc, char **argv, double *max)
{
- int n;
+ int n;
- ARGBEGIN {
+ ARG_SWITCH(argc, argv) {
case 'w':
- wflag = atoi(EARGF(usage()));
+ wflag = atoi(ARG);
break;
default:
usage();
- } ARGEND;
+ }
if (argc == 0)
usage();
@@ -219,9 +220,9 @@ parse_args(int argc, char **argv, double *max)
int
main(int argc, char **argv)
{
- double max[LINE_MAX / 2];
- int ncol, nmax;
- char *labv[LINE_MAX / 2], labels[LINE_MAX];
+ double max[LINE_MAX / 2];
+ int ncol, nmax;
+ char *labv[LINE_MAX / 2], labels[LINE_MAX];
setvbuf(stdin, NULL, _IOLBF, 0);
nmax = parse_args(argc, argv, max);
diff --git a/ploot-ff.1 b/ploot-ff.1
@@ -35,7 +35,7 @@ Set the unit description printed at the top right corner.
List of argument that specify the color for each column.
If the input csv have 5 columns in addition of the timestamp, there must
be 5 maxval arguments.
-Colors available are red, orange, yellow, green, cyan and blue.
+color_ts available are red, orange, yellow, green, cyan and blue.
.
.El
.
diff --git a/ploot-ff.c b/ploot-ff.c
@@ -1,96 +1,88 @@
-#include <arpa/inet.h>
-
-#include <math.h>
+#include <assert.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <limits.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
-#include <time.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <string.h>
-#include <ctype.h>
-#include <time.h>
-#include <stdint.h>
+
+#include <arpa/inet.h>
+
+#include <math.h>
#include "arg.h"
-#include "util.h"
-#include "font.h"
+#include "log.h"
+#include "def.h"
-#define MARGIN 4
+#define MARGIN 4
-#define XDENSITY 7 /* nb of values on x axis */
-#define YDENSITY 7 /* nb of values on y axis */
+#define XDENSITX 7 /* nb of values on x axis */
+#define YDENSITX 7 /* nb of values on y axis */
-#define TITLE_X (IMAGE_H - TITLE_H)
-#define TITLE_Y (XLABEL_W)
-#define TITLE_H (FONT_H * 2)
-#define TITLE_W (PLOT_W)
+#define IMAGE_H (TITLE_H + PLOT_H + XLABEL_H)
+#define IMAGE_W (YLABEL_W + PLOT_W + LEGEND_W)
-#define XLABEL_X (PLOT_X)
-#define XLABEL_Y (0)
-#define XLABEL_H (PLOT_H)
-#define XLABEL_W (FONT_W * 9 + MARGIN)
+#define TITLE_X (YLABEL_W)
+#define TITLE_Y (IMAGE_H - TITLE_H)
+#define TITLE_H ((font)->height * 2)
+#define TITLE_W (PLOT_W)
#define YLABEL_X (0)
#define YLABEL_Y (PLOT_Y)
-#define YLABEL_H (FONT_H * 2)
-#define YLABEL_W (PLOT_W)
+#define YLABEL_H (PLOT_H)
+#define YLABEL_W (40 + MARGIN)
-#define PLOT_X (YLABEL_H)
-#define PLOT_Y (XLABEL_W)
-#define PLOT_W 700
-#define PLOT_H 160
+#define XLABEL_X (PLOT_X)
+#define XLABEL_Y (0)
+#define XLABEL_H ((font)->height * 2)
+#define XLABEL_W (PLOT_W)
-#define LEGEND_X (YLABEL_H)
-#define LEGEND_Y (IMAGE_W - LEGEND_W)
-#define LEGEND_W (FONT_W + 150 + FONT_W)
-#define LEGEND_H (PLOT_H)
+#define PLOT_X (YLABEL_W)
+#define PLOT_Y (XLABEL_H)
+#define PLOT_W (700)
+#define PLOT_H (160)
-#define IMAGE_H (TITLE_H + PLOT_H + YLABEL_H)
-#define IMAGE_W (XLABEL_W + PLOT_W + LEGEND_W)
+#define LEGEND_X (IMAGE_W - LEGEND_W)
+#define LEGEND_Y (XLABEL_H)
+#define LEGEND_W (150)
+#define LEGEND_H (PLOT_H)
-typedef uint16_t Color[4];
-typedef struct clist Clist;
-typedef struct vlist Vlist;
-typedef struct canvas Canvas;
-typedef struct font Font;
+struct color {
+ uint16_t red;
+ uint16_t green;
+ uint16_t blue;
+ uint16_t alpha;
+};
struct vlist {
- Color col; /* color to use to draw the line */
- time_t *t; /* array of timestamps */
- double *v; /* array of values */
- int n; /* number of values */
- char *label; /* for the legend */
+ struct color color; /* color to use to draw the …
+ time_t *t; /* array of timestamps */
+ double *v; /* array of values */
+ int n; /* number of values */
+ char *label; /* for the legend */
};
struct canvas {
- int w; /* width */
- int h; /* height */
- int x; /* x offset */
- int y; /* x offset */
- Color b[IMAGE_W * IMAGE_H];
-};
-
-struct font {
- int w; /* width */
- int h; /* height */
- char **b; /* buffer */
+ int w; /* width */
+ int h; /* height */
+ int x; /* x offset */
+ int y; /* y offset */
+ struct color *buf;
};
struct clist {
- char *name;
- Color col;
+ char *name;
+ struct color color;
};
-char *argv0;
-char *tflag = "";
-char *uflag = "";
+char const *arg0;
+static char *tflag = "";
+static char *uflag = "";
+static struct font *font = &font13;
-Clist clist[] = {
+struct clist clist[] = {
/* name red green blue alpha */
{ "red", { 0xffff, 0x4444, 0x4444, 0xffff } },
{ "orange", { 0xffff, 0x9999, 0x4444, 0xffff } },
@@ -101,29 +93,21 @@ Clist clist[] = {
{ NULL, { 0, 0, 0, 0 } }
};
-Font font = { FONT_W, FONT_H, glyph };
-
-static int
-color(Color *col, char *name)
+static struct color *
+name_to_color(char *name)
{
- Clist *c;
-
- for (c = clist; c->name != NULL; c++) {
- if (strcmp(name, c->name) == 0) {
- memcpy(col, c->col, sizeof(*col));
- return 0;
- }
- }
-
- return -1;
+ for (struct clist *c = clist; c->name != NULL; c++)
+ if (strcmp(name, c->name) == 0)
+ return &c->color;
+ return NULL;
}
static void
-scale_minmax(Vlist *v, int n,
- double *vmin, double *vmax,
- time_t *tmin, time_t *tmax)
+scale_minmax(struct vlist *v, int n,
+ time_t *tmin, time_t *tmax,
+ double *vmin, double *vmax)
{
- int i;
+ int i;
*vmin = *vmax = 0;
*tmin = *tmax = *v->t;
@@ -149,7 +133,7 @@ scale_tstep(time_t *step, int density, time_t min, time_t m…
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
+ 3600*24*100, 3600*24*365, 0
};
dt = max - min;
@@ -165,8 +149,8 @@ scale_tstep(time_t *step, int density, time_t min, time_t m…
static void
scale_vstep(double *step, int density, double min, double max)
{
- double dv, *s, scale[] = { 1, 2, 3, 5 };
- int i;
+ double dv, *s, scale[] = { 1, 2, 3, 5 };
+ int i;
dv = max - min;
@@ -192,19 +176,19 @@ scale_vstep(double *step, int density, double min, double…
}
static void
-scale(Vlist *v, int n,
- double *vmin, double *vmax, double *vstep,
- time_t *tmin, time_t *tmax, time_t *tstep)
+scale(struct vlist *v, int n,
+ time_t *tmin, time_t *tmax, time_t *tstep,
+ double *vmin, double *vmax, double *vstep)
{
- scale_minmax(v, n, vmin, vmax, tmin, tmax);
- scale_tstep(tstep, YDENSITY, *tmin, *tmax);
- scale_vstep(vstep, XDENSITY, *vmin, *vmax);
+ scale_minmax(v, n, tmin, tmax, vmin, vmax);
+ scale_tstep(tstep, XDENSITX, *tmin, *tmax);
+ scale_vstep(vstep, YDENSITX, *vmin, *vmax);
}
/*
* Convert (x,y) coordinates to (row,col) for printing into the buffer.
* The buffer only contain one number, so the coordinate is a single integer:
- * width * x + y.
+ * width * y + y.
* The coordinates are shifted by offx and offy to permit relative coordinates.
*
* The convention used: y
@@ -212,28 +196,28 @@ scale(Vlist *v, int n,
* - (0,1) is above it. +--x
*/
static void
-ff_pixel(Canvas *can, Color *col,
+ff_pixel(struct canvas *can, struct color *col,
int x, int y)
{
x += can->x;
y += can->y;
- if (x < 0 || x >= can->h || y < 0 || y >= can->w)
+ if (x < 0 || x >= can->w || y < 0 || y >= can->h)
return;
- memcpy(can->b + can->w * (can->h - 1 - x) + y, col, sizeof(*can->b));
+ memcpy(can->buf + can->w * (can->h - 1 - y) + x, col, sizeof(*can->buf…
}
static void
-ff_rectangle(Canvas *can, Color *col,
- int x1, int y1,
- int x2, int y2)
+ff_rectangle(struct canvas *can, struct color *col,
+ int y1, int x1,
+ int y2, int x2)
{
- int x, y, xmin, ymin, xmax, ymax;
+ int x, y, ymin, xmin, ymax, xmax;
- xmin = MIN(x1, x2); xmax = MAX(x1, x2);
ymin = MIN(y1, y2); ymax = MAX(y1, y2);
+ xmin = MIN(x1, x2); xmax = MAX(x1, x2);
- for (x = xmin; x <= xmax; x++)
- for (y = ymin; y <= ymax; y++)
+ for (y = ymin; y <= ymax; y++)
+ for (x = xmin; x <= xmax; x++)
ff_pixel(can, col, x, y);
}
@@ -241,94 +225,94 @@ ff_rectangle(Canvas *can, Color *col,
* From Bresenham's line algorithm and dcat's tplot.
*/
static void
-ff_line(Canvas *can, Color *col,
+ff_line(struct canvas *can, struct color *col,
int x0, int y0,
int x1, int y1)
{
- int dx, dy, sx, sy, err, e;
+ 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 = (dx > dy ? dx : -dy) / 2;
+ err = (dy > dx ? dy : -dx) / 2;
for (;;) {
ff_pixel(can, col, x0, y0);
- if (x0 == x1 && y0 == y1)
+ if (y0 == y1 && x0 == x1)
break;
e = err;
- if (e > -dx) {
- x0 += sx;
- err -= dy;
- }
- if (e < dy) {
+ if (e > -dy) {
y0 += sy;
- err += dx;
+ err -= dx;
+ }
+ if (e < dx) {
+ x0 += sx;
+ err += dy;
}
}
}
/*
- * Draw a coloured glyph from font f centered on x.
+ * Draw a coloured glyph from font f centered on y.
*/
-static void
-ff_char(Canvas *can, Color *col, char c, Font *f,
+static int
+ff_char(struct canvas *can, struct color *col, char c,
int x, int y)
{
- int xf, yf;
+ int yf, xf, wf;
if (c & 0x80)
c = '\0';
-
-
- x -= f->h / 2;
-
- for (xf = 0; xf < f->h; xf++)
- for (yf = 0; yf < f->w; yf++)
- if (f->b[(int)c][f->w * (f->h - xf) + yf] == 1)
+ 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]…
ff_pixel(can, col, x + xf, y + yf);
+ return wf + 1;
}
/*
* Draw a left aligned string without wrapping it.
*/
-static void
-ff_str_left(Canvas *can, Color *col, char *s, Font *f,
+static size_t
+ff_text_left(struct canvas *can, struct color *col, char *s,
int x, int y)
{
- for (; *s != '\0'; y += f->w, s++)
- ff_char(can, col, *s, f, x, y);
+ for (; *s != '\0'; s++)
+ x += ff_char(can, col, *s, x, y);
+ return x;
}
/*
* Draw a center aligned string without wrapping it.
*/
-static void
-ff_str_center(Canvas *can, Color *col, char *s, Font *f,
+static size_t
+ff_text_center(struct canvas *can, struct color *col, char *s,
int x, int y)
{
- y -= f->w * strlen(s) / 2;
- ff_str_left(can, col, s, f, x, y);
+ x -= font_strlen(font, s) / 2;
+ return ff_text_left(can, col, s, x, y);
}
/*
* Draw a right aligned string without wrapping it.
*/
-static void
-ff_str_right(Canvas *can, Color *col, char *s, Font *f,
+static size_t
+ff_text_right(struct canvas *can, struct color *col, char *s,
int x, int y)
{
- y -= f->w * strlen(s);
- ff_str_left(can, col, s, f, x, y);
+ x -= font_strlen(font, s);
+ return ff_text_left(can, col, s, x, y);
}
static void
-ff_print(Canvas *can)
+ff_print(struct canvas *can)
{
- uint32_t w, h;
+ uint32_t w, h;
w = htonl(can->w);
h = htonl(can->h);
@@ -336,169 +320,166 @@ ff_print(Canvas *can)
fputs("farbfeld", stdout);
fwrite(&w, sizeof(w), 1, stdout);
fwrite(&h, sizeof(h), 1, stdout);
- fwrite(can->b, can->w * can->h, sizeof(*can->b), stdout);
+ fwrite(can->buf, can->w * can->h, sizeof(*can->buf), stdout);
}
static int
-ff_t2y(time_t t, time_t tmin, time_t tmax)
+ff_t2x(time_t t, time_t tmin, time_t tmax)
{
return (t - tmin) * PLOT_W / (tmax - tmin);
}
static int
-ff_v2x(double v, double vmin, double vmax)
+ff_v2y(double v, double vmin, double vmax)
{
return (v - vmin) * PLOT_H / (vmax - vmin);
}
static void
-ff_xaxis(Canvas *can, Color *label, Color *grid,
- double vmin, double vmax, double vstep)
-{
- double v;
- int x;
- char str[8 + 1];
-
- for (v = vmax - fmod(vmax, vstep); v >= vmin; v -= vstep) {
- x = ff_v2x(v, vmin, vmax);
-
- ff_line(can, grid,
- x, XLABEL_W,
- x, XLABEL_W + PLOT_W);
-
- humanize(str, v);
- ff_str_right(can, label, str, &font,
- x, XLABEL_W - MARGIN);
- }
-}
-
-static void
-ff_yaxis(Canvas *can, Color *label, Color *grid,
+ff_xaxis(struct canvas *can, struct color *label, struct color *grid,
time_t tmin, time_t tmax, time_t tstep)
{
- time_t t;
- int y;
- 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";
else if (tstep < 3600 * 24)
fmt = "%m/%d %H:%M";
else
- fmt = "%Y/%m/%d";
+ fmt = "%X/%m/%d";
for (t = tmax - tmax % tstep; t >= tmin; t -= tstep) {
- y = ff_t2y(t, tmin, tmax);
+ x = ff_t2x(t, tmin, tmax);
ff_line(can, grid,
- YLABEL_H, y,
- YLABEL_H + PLOT_H, y);
+ x, XLABEL_H,
+ x, XLABEL_H + PLOT_H);
strftime(str, sizeof(str), fmt, localtime(&t));
- ff_str_center(can, label, str, &font,
- YLABEL_H / 2, y);
+ ff_text_center(can, label, str,
+ x, XLABEL_H / 2);
+ }
+}
+
+static void
+ff_yaxis(struct canvas *can, struct color *label, struct color *grid,
+ double vmin, double vmax, double vstep)
+{
+ double v;
+ int y;
+ char str[8 + 1];
+
+ for (v = vmax - fmod(vmax, vstep); v >= vmin; v -= vstep) {
+ y = ff_v2y(v, vmin, vmax);
+
+ ff_line(can, grid,
+ YLABEL_W, y,
+ YLABEL_W + PLOT_W, y);
+
+ humanize(str, v);
+ ff_text_right(can, label, str,
+ YLABEL_W - MARGIN, y);
}
}
static void
-ff_title(Canvas *can,
- Color *ct, char *title,
- Color *cu, char *unit)
+ff_title(struct canvas *can,
+ struct color *ct, char *title,
+ struct color *cu, char *unit)
{
- ff_str_left(can, ct, title, &font,
- TITLE_H / 2, 0);
- ff_str_right(can, cu, unit, &font,
- TITLE_H / 2, TITLE_W);
+ ff_text_left(can, ct, title, TITLE_H / 2, 0);
+ ff_text_right(can, cu, unit, TITLE_H / 2, TITLE_W);
}
static void
-ff_plot(Canvas *can, Vlist *v,
+ff_plot(struct canvas *can, struct vlist *v,
double vmin, double vmax,
time_t tmin, time_t tmax)
{
- time_t *tp;
- double *vp;
- int x, y, n, xlast, ylast, first;
+ time_t *tp;
+ double *vp;
+ int x, y, n, ylast, xlast, first;
first = 1;
for (tp = v->t, vp = v->v, n = v->n; n > 0; n--, vp++, tp++) {
- x = ff_v2x(*vp, vmin, vmax);
- y = ff_t2y(*tp, tmin, tmax);
+ y = ff_v2y(*vp, vmin, vmax);
+ x = ff_t2x(*tp, tmin, tmax);
if (!first)
- ff_line(can, &v->col, xlast, ylast, x, y);
+ ff_line(can, &v->color, xlast, ylast, x, y);
- xlast = x;
ylast = y;
+ xlast = x;
first = 0;
}
}
static void
-ff_values(Canvas *can, Vlist *v, int n,
- double vmin, double vmax,
- time_t tmin, time_t tmax)
+ff_values(struct canvas *can, struct vlist *v, int n,
+ time_t tmin, time_t tmax,
+ double vmin, double vmax)
{
for (; n > 0; n--, v++)
ff_plot(can, v, vmin, vmax, tmin, tmax);
}
static void
-ff_legend(Canvas *can, Color *label_fg, Vlist *v, int n)
+ff_legend(struct canvas *can, struct color *label_fg, struct vlist *v, int n)
{
int i, x, y;
for (i = 0; i < n; i++, v++) {
- x = LEGEND_H - i * (FONT_H + MARGIN) - FONT_H / 2;
-
- y = MARGIN + FONT_W;
- ff_str_left(can, &v->col, "\1", &font, x, y);
-
- y += FONT_W * 2;
- ff_str_left(can, label_fg, v->label, &font, x, y);
+ x = MARGIN;
+ x = ff_text_left(can, &v->color, "\1", x, y);
+ x = ff_text_left(can, label_fg, v->label, x, y);
+ y = LEGEND_H - i * (font->height + MARGIN) - font->height / 2;
}
}
/*
- * Plot the 'n' values list of the 'v' array with title 'name' and
+ * Plot the 'n' values list of the 'v' arrax with title 'name' and
* 'units' label.
*
* Title (units)
- * y ^ Legend
- * label |- + - + - + - + - ....
- * here |- + - + - + - + - ....
- * +--+---+---+---+-->
+ * x ^ Legend
+ * label | - + - + - + - + - ....
+ * here | - + - + - + - + - ....
+ * +---+---+---+---+-->
* x label here
*/
static void
-ff(Vlist *v, int n, char *name, char *units)
+ff(struct vlist *v, int n, char *name, char *units)
{
- Canvas can = { IMAGE_W, IMAGE_H, 0, 0, { { 0 }, { 0 } } };
- Color plot_bg = { 0x2222, 0x2222, 0x2222, 0xffff };
- Color grid_bg = { 0x2929, 0x2929, 0x2929, 0xffff };
- Color grid_fg = { 0x3737, 0x3737, 0x3737, 0xffff };
- Color label_fg = { 0x8888, 0x8888, 0x8888, 0xffff };
- Color title_fg = { 0xdddd, 0xdddd, 0xdddd, 0xffff };
- double vmin, vmax, vstep;
- time_t tmin, tmax, tstep;
+ 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;
- scale(v, n, &vmin, &vmax, &vstep, &tmin, &tmax, &tstep);
+ scale(v, n, &tmin, &tmax, &tstep, &vmin, &vmax, &vstep);
+
+ assert(can.buf = calloc(IMAGE_H * IMAGE_W, sizeof *can.buf));
- can.x = 0;
can.y = 0;
+ can.x = 0;
ff_rectangle(&can, &plot_bg, 0, 0, IMAGE_H - 1, IMAGE_W - 1);
can.x = PLOT_X;
can.y = PLOT_Y;
ff_rectangle(&can, &grid_bg, 0, 0, PLOT_H, PLOT_W);
- can.x = YLABEL_X;
- can.y = YLABEL_Y;
- ff_yaxis(&can, &label_fg, &grid_fg, tmin, tmax, tstep);
-
can.x = XLABEL_X;
can.y = XLABEL_Y;
- ff_xaxis(&can, &label_fg, &grid_fg, vmin, vmax, vstep);
+ ff_xaxis(&can, &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);
can.x = TITLE_X;
can.y = TITLE_Y;
@@ -506,7 +487,7 @@ ff(Vlist *v, int n, char *name, char *units)
can.x = PLOT_X;
can.y = PLOT_Y;
- ff_values(&can, v, n, vmin, vmax, tmin, tmax);
+ ff_values(&can, v, n, tmin, tmax, vmin, vmax);
can.x = LEGEND_X;
can.y = LEGEND_Y;
@@ -516,65 +497,68 @@ ff(Vlist *v, int n, char *name, char *units)
}
static void
-csv_labels(Vlist *v, char **argv, char *buf)
+csv_labels(struct vlist *v, char **argv, char *buf)
{
+ struct color *color;
+
if (esfgets(buf, LINE_MAX, stdin) == NULL)
- fputs("missing label line\n", stderr), exit(1);
+ err(1, "missing label line");
if (strcmp(strsep(&buf, ","), "epoch") != 0)
- fputs("first label must be \"epoch\"\n", stderr), exit(1);
+ err(1, "first label must be \"epoch\"");
for (; *argv != NULL; v++, argv++) {
if ((v->label = strsep(&buf, ",")) == NULL)
- fputs("more arguments than columns\n", stderr), exit(1…
- else if (color(&v->col, *argv) == -1)
- fprintf(stderr, "unknown color: %s\n", *argv), exit(1);
+ err(1, "more arguments than columns");
+ else if ((color = name_to_color(*argv)) == NULL)
+ err(1, "unknown color: %s", *argv);
+ v->color = *color;
}
if (strsep(&buf, ",") != NULL)
- fputs("more columns than arguments\n", stderr), exit(1);
+ err(1, "more columns than arguments");
}
static int
-csv_addval(Vlist *v, int bufsize, int nval, double field, time_t epoch)
+csv_addval(struct vlist *v, size_t sz, size_t nval, double field, time_t epoch)
{
- if (nval >= bufsize) {
- bufsize = bufsize * 2 + 1;
- if ((v->v = realloc(v->v, bufsize * sizeof(*v->v))) == NULL)
- perror("reallocating values buffer"), exit(1);
- if ((v->t = realloc(v->t, bufsize * sizeof(*v->t))) == NULL)
- perror("reallocating values buffer"), exit(1);
+ if (nval >= sz) {
+ sz = sz * 2 + 1;
+ if ((v->v = realloc(v->v, sz * sizeof(*v->v))) == NULL)
+ err(1, "reallocating values buffer");
+ if ((v->t = realloc(v->t, sz * sizeof(*v->t))) == NULL)
+ err(1, "reallocating values buffer");
}
v->v[nval] = field;
v->t[nval] = epoch;
v->n = nval + 1;
- return bufsize;
+ return sz;
}
/*
* Add to each column the value on the current row.
*/
static int
-csv_addrow(Vlist *v, int bufsize, int ncol, int nval, char *line)
+csv_addrow(struct vlist *v, size_t sz, size_t ncol, size_t nval, char *line)
{
- time_t epoch;
- int bs;
- char *field, *dot;
+ time_t epoch;
+ int bs;
+ char *field, *dot;
if ((field = strsep(&line, ",")) == NULL)
- fprintf(stderr, "%d: missing epoch\n", nval), exit(1);
+ err(1, "%d: missing epoch", nval);
if ((dot = strchr(field, '.')) != NULL)
*dot = '\0';
epoch = eatol(field);
for (; (field = strsep(&line, ",")) != NULL; ncol--, v++) {
if (ncol <= 0)
- fprintf(stderr, "%d: too many fields\n", nval), exit(1…
- bs = csv_addval(v, bufsize, nval, eatof(field), epoch);
+ err(1, "%d: too many fields", nval);
+ bs = csv_addval(v, sz, nval, eatof(field), epoch);
}
if (ncol > 0)
- fprintf(stderr, "%d: too few fields\n", nval), exit(1);
+ err(1, "%d: too few fields", ncol);
return bs;
}
@@ -586,26 +570,24 @@ csv_addrow(Vlist *v, int bufsize, int ncol, int nval, cha…
* epoch,a3,b3,c3 v
*/
static void
-csv_values(Vlist *v, int ncol)
+csv_values(struct vlist *v, size_t ncol)
{
- int nval, bufsize;
- char line[LINE_MAX];
+ int nval, sz;
+ char line[LINE_MAX];
- bufsize = 0;
+ sz = 0;
for (nval = 0; esfgets(line, sizeof(line), stdin) != NULL; nval++)
- bufsize = csv_addrow(v, bufsize, ncol, nval, line);
+ sz = csv_addrow(v, sz, ncol, nval, line);
if (nval == 0)
- fputs("no value could be read\n", stderr), exit(1);
+ err(1, "no value could be read\n");
}
static void
usage(void)
{
- Clist *c;
-
- fprintf(stderr, "usage: %s [-t title] [-u unit] {", argv0);
+ fprintf(stderr, "usage: %s [-t title] [-u unit] {", arg0);
fputs(clist->name, stderr);
- for (c = clist + 1; c->name != NULL; c++)
+ for (struct clist *c = clist + 1; c->name != NULL; c++)
fprintf(stderr, ",%s", c->name);
fputs("}...\n", stderr);
exit(1);
@@ -614,22 +596,24 @@ usage(void)
int
main(int argc, char **argv)
{
- Vlist *v;
- char labels[LINE_MAX];
+ struct vlist *v;
+ char labels[LINE_MAX];
- ARGBEGIN {
+ ARG_SWITCH(argc, argv) {
case 't':
- tflag = EARGF(usage());
+ tflag = ARG;
break;
case 'u':
- uflag = EARGF(usage());
+ uflag = ARG;
break;
default:
usage();
- } ARGEND;
+ }
+
+ fflush(stdout);
if ((v = calloc(argc, sizeof(*v))) == NULL)
- perror("calloc value list"), exit(1);
+ err(1, "calloc value list");
csv_labels(v, argv, labels);
csv_values(v, argc);
diff --git a/ploot-plot.c b/ploot-plot.c
@@ -0,0 +1,201 @@
+#include <assert.h>
+#include <errno.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <math.h>
+
+#include "def.h"
+
+/*
+ * Adjust the vertical scale so that it gets possible to
+ */
+static void
+plot_scale(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;
+}
+
+/*
+ * Return the step between two values.
+ */
+static int
+plot_time_interval(time_t step)
+{
+ time_t 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
+ };
+
+ for (time_t *s = scale; *s != 0; s++)
+ if (*s >= 20 * step)
+ return *s;
+ return 1;
+}
+
+static size_t
+plot_axis_x(char *buf, size_t sz, time_t step, time_t t2, int col)
+{
+ int x, prec;
+ char tmp[sizeof("MM/DD HH:MM")], *fmt;
+ size_t n;
+ time_t t, interval;
+
+ interval = plot_time_interval(step);
+ fmt = (step < 3600 * 12) ? "^%H:%M:%S" :
+ (step < 3600 * 24) ? "^%m/%d %H:%M" :
+ "^%Y/%m/%d";
+ n = x = 0;
+
+ t = t2 - col * 2 * step;
+ t += interval - t % interval;
+ for (; t < t2; t += interval) {
+ strftime(tmp, sizeof tmp, fmt, localtime(&t));
+ x = ((t - t2) / 2 + col * step) / step;
+ prec = x - n + strlen(tmp);
+ assert((n += snprintf(buf+n, sz-n, "%*s", prec, tmp)) <= sz);
+ }
+ assert((n += strlcpy(buf+n, "\n", sz-n)) < sz);
+ return n;
+}
+
+/*
+ * Plot a single line out of the y axis, at row <r> out of <rows>.
+ */
+static size_t
+plot_axis_y(char *buf, size_t sz, double min, double max, int r, int rows)
+{
+ size_t i;
+ char tmp[10] = "", *s;
+ double val;
+
+ val = (max - min) * (rows - r) / rows + min;
+ humanize(tmp, sizeof tmp, val);
+ s = (r == 0) ? "┌" :
+ (r == rows - 1) ? "└" :
+ "├";
+ i = snprintf(buf, sz, "%s%-6s ", s, tmp);
+ return (i > sz) ? (sz) : (i);
+}
+
+static char *
+plot_render(struct drawille *drw, double min, double max, time_t step, time_t …
+{
+ char *buf;
+ size_t sz;
+ size_t n;
+
+ /* Render the plot line by line. */
+ sz = drw->row * (20 + drw->col * 3 + 1) + 1;
+ sz += drw->col + 1 + 100000;
+ if ((buf = calloc(sz, 1)) == NULL)
+ goto err;
+ n = 0;
+ for (int row = 0; row < drw->row; row++) {
+ n += drawille_fmt_row(drw, buf+n, sz-n, row);
+ n += plot_axis_y(buf+n, sz-n, min, max, row, drw->row);
+ n += strlcpy(buf+n, "\n", sz-n);
+ }
+ plot_axis_x(buf+n, sz-n, step, t2, drw->col);
+
+ return buf;
+err:
+ errno = ENOBUFS;
+ free(buf);
+ return NULL;
+}
+
+/*
+ * Plot the body as an histogram interpolating the gaps and include
+ * a vertical and horizontal axis.
+ */
+static char *
+plot_hist(struct timeserie *ts, time_t t2, struct drawille *drw)
+{
+ int x, y, zero, shift;
+ double min, max, val;
+ time_t t1, t;
+
+ /* Adjust the y scale. */
+ shift = min = max = 0;
+ timeserie_stats(ts, &min, &max);
+ if (drw->row > 1) {
+ shift = 2; /* Align values to the middle of the scale: |- */
+ plot_scale(&min, &max, drw->row);
+ }
+ zero = timeserie_ypos(0, min, max, drw->row*4) - shift;
+
+ /* Adjust the x scale. */
+ t2 = t2 + ts->step - t2 % ts->step;
+ t1 = t2 - ts->step * ts->len;
+
+ /* Plot the data in memory in <drw> starting from the end (t2). */
+ t = t2;
+ for (x = drw->col * 2; x > 0; x--) {
+ val = timeserie_get(ts, t);
+ if (!isnan(val)) {
+ y = timeserie_ypos(val, min, max, drw->row*4) - shift;
+ drawille_dot_hist(drw, x, y, zero);
+ }
+ t -= ts->step;
+ }
+
+ return plot_render(drw, min, max, ts->step, t2);
+}
+
+static char *
+plot(struct timeserie *ts, time_t t2, int row, int col)
+{
+ struct drawille *drw;
+ size_t len;
+ char *buf;
+
+ len = 500;
+ buf = NULL;
+ drw = NULL;
+ col -= 8;
+
+ if (timeserie_read(ts) == -1)
+ goto err;
+
+ if ((drw = drawille_new(row, col)) == NULL)
+ goto err;
+
+ buf = plot_hist(ts, t2, drw);
+err:
+ if (buf == NULL)
+ timedb_close(&ts->db);
+ free(drw);
+ return buf;
+}
diff --git a/util.c b/util.c
@@ -5,7 +5,7 @@
#include <stdlib.h>
#include <ctype.h>
-#include "util.h"
+#include "def.h"
void
put3utf(long rune)
diff --git a/util.h b/util.h
@@ -1,12 +0,0 @@
-#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))
-
-void put3utf (long);
-char *strsep (char **, const char *);
-void estriplf (char *);
-double eatof (char *);
-long eatol (char *);
-char *esfgets (char *, size_t, FILE *);
-int humanize (char *, double);
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.