URI: 
       import source code from monit, reverse x and y in ploot-ff.c - ploot - simple plotting tools
  HTML 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
  HTML 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);