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);