import source code from monit, reverse x and y in ploot-ff.c - ploot - simple plotting tools
(HTM) git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
(DIR) LICENSE
---
(DIR) commit 62211b846caa7b980b6a43dea1fdf0a0e2f6de34
(DIR) parent f62864eb417aedad38a233fd05ea7a8b46cd2d8e
(HTM) Author: Josuah Demangeon <me@josuah.net>
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(-)
---
(DIR) 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 $@ $@.o ${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)
(DIR) 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
(DIR) 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 * row) */
+};
+
+/*
+ * Bitmapped font saved as a '_' and 'X' pattern in a C source file.
+ */
+struct font {
+ int height; /* The width is variable. */
+ char *glyph[128]; /* 0: end, 1: off, 2: on. */
+};
+
+/* drawille.c */
+
+size_t drawille_fmt_row (struct drawille *, char *, size_t, int);
+void drawille_dot (struct drawille *, int, int);
+struct drawille *drawille_new (int, int);
+void drawille_line (struct drawille *, int, int, int, int);
+void drawille_line_hist (struct drawille *, int, int, int, int, int);
+void drawille_dot_hist (struct drawille *, int, int, int);
+char * drawille_text (struct drawille *, int, int, struct font *, char *);
+
+/* 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);
(DIR) 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 / 2),
+ 3 - y % 4,
+ x % 2);
+}
+
+struct drawille *
+drawille_new(int row, int col)
+{
+ struct drawille *drw;
+
+ if ((drw = calloc(sizeof(struct drawille) + row * col, 1)) == NULL)
+ return NULL;
+ drw->row = row;
+ drw->col = col;
+ return drw;
+}
+
+static void
+drawille_line_init(struct line *l, int x0, int y0, int x1, int y1)
+{
+ l->x0 = x0;
+ l->y0 = y0;
+ l->x1 = x1;
+ l->y1 = y1;
+ l->sx = x0 < x1 ? 1 : -1;
+ l->sy = y0 < y1 ? 1 : -1;
+ l->dx = abs(x1 - x0);
+ l->dy = abs(y1 - y0);
+ l->err = (l->dx > l->dy ? l->dx : -l->dy) / 2;
+}
+
+static int
+drawille_line_next(struct line *l)
+{
+ int e;
+
+ if (l->x0 == l->x1 && l->y0 == l->y1)
+ return 0;
+
+ e = l->err;
+ if (e > -l->dx) {
+ l->x0 += l->sx;
+ l->err -= l->dy;
+ }
+ if (e < l->dy) {
+ l->y0 += l->sy;
+ l->err += l->dx;
+ }
+ return 1;
+}
+
+void
+drawille_line(struct drawille *drw, int x0, int y0, int x1, int y1)
+{
+ struct line l;
+
+ drawille_line_init(&l, x0, y0, x1, y1);
+ do {
+ drawille_dot(drw, l.x0, l.y0);
+ } while (drawille_line_next(&l));
+}
+
+void
+drawille_line_hist(struct drawille *drw, int x0, int y0, int x1, int y1, int zero)
+{
+ 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, char c)
+{
+ int width;
+ char *glyph;
+
+ if ((unsigned)c > 127)
+ glyph = font->glyph[0];
+ else
+ glyph = font->glyph[(unsigned)c];
+
+ width = strlen(glyph) / font->height;
+
+ for (int ix = 0; ix < width; ix++)
+ for (int iy = 0; iy < font->height; iy++) {
+ if (glyph[ix + (font->height - 1) * width - iy * width] == 3)
+ drawille_dot(drw, x + ix, y + iy);
+ }
+
+ return width;
+}
+
+char *
+drawille_text(struct drawille *drw, int x, int y, struct font *font, char *s)
+{
+ if (drw->row*4 < font->height)
+ return NULL;
+
+ for (; *s != '\0' && x < drw->col/2; s++, x++)
+ x += drawille_text_glyph(drw, x, y, font, *s);
+ return s;
+}
(DIR) diff --git a/font.c b/font.c
@@ -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;
+}
(DIR) 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
-};
(DIR) 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_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_space, glyph_bang, glyph_double, glyph_hash,
+ glyph_dollar, glyph_percent, glyph_amp, glyph_single,
+ glyph_l_round, glyph_r_round, glyph_asterisk, glyph_plus,
+ glyph_coma, glyph_minus, glyph_dot, glyph_slash,
+ glyph_0, glyph_1, glyph_2, glyph_3,
+ glyph_4, glyph_5, glyph_6, glyph_7,
+ glyph_8, glyph_9, glyph_column, glyph_semicolumn,
+ glyph_l_angle, glyph_equal, glyph_r_angle, glyph_question,
+ glyph_at, glyph_A, glyph_B, glyph_C,
+ glyph_D, glyph_E, glyph_F, glyph_G,
+ glyph_H, glyph_I, glyph_J, glyph_K,
+ glyph_L, glyph_M, glyph_N, glyph_O,
+ glyph_P, glyph_Q, glyph_R, glyph_S,
+ glyph_T, glyph_U, glyph_V, glyph_W,
+ glyph_X, glyph_Y, glyph_Z, glyph_l_square,
+ glyph_backsl, glyph_r_square, glyph_hat, glyph_underscore,
+ glyph_backtilt, glyph_a, glyph_b, glyph_c,
+ glyph_d, glyph_e, glyph_f, glyph_g,
+ glyph_h, glyph_i, glyph_j, glyph_k,
+ glyph_l, glyph_m, glyph_n, glyph_o,
+ glyph_p, glyph_q, glyph_r, glyph_s,
+ glyph_t, glyph_u, glyph_v, glyph_w,
+ glyph_x, glyph_y, glyph_z, glyph_l_curly,
+ glyph_pipe, glyph_r_curly, glyph_tilde, glyph_error
+} };
(DIR) diff --git a/font7.c b/font7.c
@@ -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
+} };
(DIR) 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_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_space, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_0, glyph_1, glyph_2, glyph_3,
+ glyph_4, glyph_5, glyph_6, glyph_7,
+ glyph_8, glyph_9, glyph_error, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_A, glyph_B, glyph_C,
+ glyph_D, glyph_E, glyph_F, glyph_G,
+ glyph_H, glyph_I, glyph_J, glyph_K,
+ glyph_L, glyph_M, glyph_N, glyph_O,
+ glyph_P, glyph_Q, glyph_R, glyph_S,
+ glyph_T, glyph_U, glyph_V, glyph_W,
+ glyph_X, glyph_Y, glyph_Z, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error,
+ glyph_error, glyph_a, glyph_b, glyph_c,
+ glyph_d, glyph_e, glyph_f, glyph_g,
+ glyph_h, glyph_i, glyph_j, glyph_k,
+ glyph_l, glyph_m, glyph_n, glyph_o,
+ glyph_p, glyph_q, glyph_r, glyph_s,
+ glyph_t, glyph_u, glyph_v, glyph_w,
+ glyph_x, glyph_y, glyph_z, glyph_error,
+ glyph_error, glyph_error, glyph_error, glyph_error
+} };
(DIR) diff --git a/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
(DIR) 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 mail@josuah.net
-.
-.
-.\" .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 order.
+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 mail@josuah.net
+.Aq Mt me@josuah.net
(DIR) 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 ncol)
static time_t
plot_line(long *out, double *max, int ncol)
{
- time_t epoch;
- int n, nrow;
- long *o, rune;
- char line[LINE_MAX];
+ time_t epoch;
+ int n, nrow;
+ long *o, rune;
+ char line[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[LINE_MAX / 2])
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);
(DIR) 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
.
(DIR) 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 line */
+ time_t *t; /* array of timestamps */
+ double *v; /* array of values */
+ int n; /* number of values */
+ char *label; /* for the legend */
};
struct canvas {
- int w; /* width */
- int h; /* height */
- int x; /* x offset */
- int y; /* x offset */
- Color b[IMAGE_W * IMAGE_H];
-};
-
-struct font {
- int w; /* width */
- int h; /* height */
- char **b; /* buffer */
+ 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 max)
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 max)
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 max)
}
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] == 3)
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, char *line)
* 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);
(DIR) 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 t2)
+{
+ 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;
+}
(DIR) 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)
(DIR) 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);