DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T c

⟦525666bd3⟧ TextFile

    Length: 17807 (0x458f)
    Types: TextFile
    Names: »cati.c«

Derivation

└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89
    └─⟦this⟧ »./DVIware/laser-setters/quicspool/src/cati.c« 
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
    └─⟦af5ba6c8e⟧ »unix3.0/DVIWARE.tar.Z« 
        └─⟦ca79c7339⟧ 
            └─⟦this⟧ »DVIware/laser-setters/quicspool/src/cati.c« 

TextFile

#ifndef lint
static char *rcs = "$Header: cati.c,v 1.1 88/01/15 13:03:12 simpson Rel $";
#endif
/*
$Log:	cati.c,v $
 * Revision 1.1  88/01/15  13:03:12  simpson
 * initial release
 * 
 * Revision 0.1  87/12/11  18:30:41  simpson
 * beta test
 * 
*/
#include <stdio.h>
/* mask for high order 4 bits of byte */
#define CAT_HIGH_NIBBLE 0xf0
#define CAT_MAX_BYTE 0xff

#define CAT_ESCAPE_CODE 0x80
#define CAT_ESCAPE_MASK 0x7f
#define CAT_MAX_ESCAPE 0x7f
/* nonzero if escape command and zero otherwise */
#define CAT_IS_ESCAPE(x) (((x) & (CAT_HIGH_NIBBLE << 3)) == CAT_ESCAPE_CODE)
/* magnitude of escape */
#define CAT_ESCAPE(x) (~(x) & CAT_ESCAPE_MASK)
#define CAT_ENCODE_ESCAPE(n) (CAT_ESCAPE_CODE | (~(n) & CAT_ESCAPE_MASK))

#define CAT_LEAD_CODE 0x60
#define CAT_LEAD_MASK 0x1f
#define CAT_MAX_LEAD 0x1f
/* nonzero if leading command and zero otherwise */
#define CAT_IS_LEADING(x) (((x) & (CAT_HIGH_NIBBLE << 1)) == CAT_LEAD_CODE)
/* magnitude of leading */
#define CAT_LEAD(x) (~(x) & CAT_MAX_LEAD)
#define CAT_ENCODE_LEAD(n) (CAT_LEAD_CODE | (~(n) & CAT_LEAD_MASK))

#define CAT_SIZE_CHANGE_CODE 0x50
/* nonzero if point size change command and zero otherwise */
#define CAT_IS_SIZE_CHANGE(x) (((x) & CAT_HIGH_NIBBLE) == CAT_SIZE_CHANGE_CODE)

/* translates from the weird CAT point size change codes into something sane */
#define CAT_SIZE_CHANGE(x) \
	((x) == 0x50 ? 7 : \
	 (x) == 0x51 ? 8 : \
	 (x) == 0x52 ? 10 : \
	 (x) == 0x53 ? 11 : \
	 (x) == 0x54 ? 12 : \
	 (x) == 0x55 ? 14 : \
	 (x) == 0x56 ? 18 : \
	 (x) == 0x57 ? 9 : \
	 (x) == 0x58 ? 6 : \
	 (x) == 0x59 ? 16 : \
	 (x) == 0x5a ? 20 : \
	 (x) == 0x5b ? 22 : \
	 (x) == 0x5c ? 24 : \
	 (x) == 0x5d ? 28 : \
	 (x) == 0x5e ? 36 : 0)

/* translates from sane point sizes into the weird CAT encodings */
#define CAT_ENCODE_SIZE(x) \
	((x) == 6 ? 0x58 : \
	 (x) == 7 ? 0x50 : \
	 (x) == 8 ? 0x51 : \
	 (x) == 9 ? 0x57 : \
	 (x) == 10 ? 0x52 : \
	 (x) == 11 ? 0x53 : \
	 (x) == 12 ? 0x54 : \
	 (x) == 14 ? 0x55 : \
	 (x) == 16 ? 0x59 : \
	 (x) == 18 ? 0x56 : \
	 (x) == 20 ? 0x5a : \
	 (x) == 22 ? 0x5b : \
	 (x) == 24 ? 0x5c : \
	 (x) == 28 ? 0x5d : \
	 (x) == 36 ? 0x5e : 0)

#define CAT_FLASH_CODE 0x00
#define CAT_FLASH_MASK 0x3f
#define CAT_MAX_FLASH 0x3f
/* nonzero if printable character and zero otherwise */
#define CAT_IS_FLASH(x) (((x) & (CAT_HIGH_NIBBLE << 2)) == CAT_FLASH_CODE)
#define CAT_FLASH(x) ((x) & CAT_MAX_FLASH)
#define CAT_ENCODE_FLASH(n) (CAT_FLASH_CODE | ((n) & CAT_FLASH_MASK))

#define CAT_CONTROL_CODE 0x40
/* nonzero if control command and zero otherwise */
#define CAT_IS_CONTROL(x) (((x) & CAT_HIGH_NIBBLE) == CAT_CONTROL_CODE)

/* CAT-8 control commands */
#define CAT_INITIALIZE 0x40
#define CAT_LOWER_RAIL 0x41
#define CAT_UPPER_RAIL 0x42
#define CAT_UPPER_MAGAZINE 0x43
#define CAT_LOWER_MAGAZINE 0x44
#define CAT_LOWER_FONT 0x45
#define CAT_UPPER_FONT 0x46
#define CAT_ESCAPE_FORWARD 0x47
#define CAT_ESCAPE_BACKWARD 0x48
#define CAT_STOP 0x49
#define CAT_LEAD_FORWARD 0x4a
#define CAT_LEAD_BACKWARD 0x4c
#define CAT_TILT_UP 0x4e
#define CAT_TILT_DOWN 0x4f
#define CAT_NOOP 0x00
/* trapdoor for CAT extensions */
#define CAT_EXTENSION 0x4b

/* CAT_BIG_LEAD means take the next byte * 64 to obtain leading */
#define CAT_BIG_LEAD 0x01
#define CAT_BIG_LEAD_MULTIPLIER 64
#define CAT_MIN_BIG_LEAD (CAT_BIG_LEAD_MULTIPLIER * 0x01)
#define CAT_MAX_BIG_LEAD (CAT_BIG_LEAD_MULTIPLIER * 0xff)

/* CAT_BIG_ESCAPE means take the next byte * 128 to obtain escape */
#define CAT_BIG_ESCAPE 0x02
#define CAT_BIG_ESCAPE_MULTIPLIER 128
#define CAT_MIN_BIG_ESCAPE (CAT_BIG_ESCAPE_MULTIPLIER * 0x01)
#define CAT_MAX_BIG_ESCAPE (CAT_BIG_ESCAPE_MULTIPLIER * 0xff)

/*
 * CAT_FORMFEED means advance to next page resetting current row
 * and column to <0,0>.
 */
#define CAT_FORMFEED 0x03

/*
 * Returns nonzero if a single point size and zero otherwise.
 * The parameter is the `sane' point size and NOT the weird CAT encoding.
 */
#define CAT_IS_SINGLE(p) ((6 <= (p) && (p) <= 14) || (p) == 18)

/*
 * Returns nonzero is a double point size and zero otherwise.
 * The parmeter is the `sane' point size and NOT the weird CAT encoding.
 */
#define CAT_IS_DOUBLE(p) ((p) == 16 || (p) >= 20)

/*
 * Returns nonzero if the old to new point size transition is a
 * single to double transition and zero otherwise.
 * The parameters are the `sane' point sizes NOT the weird CAT encodings.
 */
#define CAT_IS_SINGLE_TO_DOUBLE(old, new) \
	(CAT_IS_SINGLE(old) && CAT_IS_DOUBLE(new))

/*
 * Returns nonzero if the old to new point size transition is a
 * double to single transition and zero otherwise.
 * The parameters are the `sane' point sizes NOT the weird CAT encodings.
 */
#define CAT_IS_DOUBLE_TO_SINGLE(old, new) \
	(CAT_IS_DOUBLE(old) && CAT_IS_SINGLE(new))

typedef struct CAT {
	char escape_where;	/* BACKWARD or FORWARD */
	char lead_where;	/* BACKWARD or FORWARD */
	char font;		/* bit 0 => tilt, bit 1 => rail, bit 2 => magazine */
	char font_half;		/* LOWER or UPPER */
	char point_size;	/* current point size */
} CAT;

#define CAT_FORWARD 0
#define CAT_BACKWARD 1
#define CAT_UPPER 0
#define CAT_LOWER 1

/* vertical resolution per inch */
#define CAT_VERTICAL_UNITS 144.0
/* horizontal resolution per inch */
#define CAT_HORIZONTAL_UNITS 432.0

/* compensatory escape for single/double point size transitions */
#define CAT_LENSE_COMPENSATION 55

#define CAT_TILT 01
#define CAT_RAIL 02
#define CAT_MAGAZINE 04

/* default troff and scribe font mountings for CAT-8 */
#define CAT_ROMAN_FONT 0
#define CAT_ITALIC_FONT 2
#define CAT_BOLD_FONT 4
#define CAT_SPECIAL_FONT 6

/* the maximum number of characters on a filmstrip */
#define CAT_MAX_FONT_INDEX 108


FILE *freopen();

typedef struct STATE {
	CAT cat;
	long escape;		/* temporary escape accumulator */
	long forward_escape;	/* total forward escape to date */
	long backward_escape;	/* total backward escape to date */
	long lead;		/* temporary lead accumulator */
	long forward_lead;	/* total forward lead to date */
	long backward_lead;	/* total backward lead to date */
	long row;		/* current row */
	long column;		/* current column */
} STATE;

char *regular[128];
char *special[128];
char *Whoami;

main (argc, argv)
int argc;
char *argv[];
{
	int lead_only_flag = 0;
	int verbose_flag = 0;
	STATE s;
	int i;

	Whoami = argv[0];
	for (argc--, argv++; argc > 0 && argv[0][0] == '-'; argc--, argv++)
		switch (argv[0][1]) {
		case 'l':
			lead_only_flag++;
			continue;

		case 'v':
			verbose_flag++;
			continue;

		default:
			fprintf(stderr, "%s: unknown option %s\n", Whoami, argv[0]);
			exit(1);
		}
	
	if (argc > 0)
		if (freopen(argv[0], "r", stdin) == NULL) {
			fprintf(stderr, "%s: cannot open %s\n", Whoami, argv[0]);
			exit(1);
		} 

	s.escape = s.forward_escape = s.backward_escape = 0;
	s.lead = s.forward_lead = s.backward_lead = 0;
	s.row = s.column = 0;
	while ((i = getchar()) != EOF)
		interpret(i, &s, !lead_only_flag, verbose_flag);
	printf("Total lead %d\n", s.forward_lead + s.backward_lead);
	exit(0);
}

interpret (c, s, noisy, verbose)
int c;
STATE *s;
int noisy;
int verbose;
{
	int point_size;
	int index;	/* temporary for computing filmstrip index */
	int lead;
	int escape;

	if (c == 0) {
		if (noisy)
			printf("No-op\n");
		return;	/* ascii null is a no-op for the CAT */
	}

	if (CAT_IS_ESCAPE(c)) {
		s->escape += CAT_ESCAPE(c);
		if (noisy & verbose)
			printf("%c %d\n", s->cat.escape_where == CAT_FORWARD ? '>' : '<', CAT_ESCAPE(c));
		return;
	}

	if (s->escape) {
		if (s->cat.escape_where == CAT_FORWARD) {
			s->forward_escape += s->escape;
			s->column += s->escape;
			if (noisy)
				printf("> %d %d %d %d\n",
				       s->escape,
				       s->forward_escape,
				       s->backward_escape,
				       s->forward_escape + s->backward_escape);
		} else {
			s->backward_escape += s->escape;
			s->column -= s->escape;
			if (noisy)
				printf("< %d %d %d %d\n",
				       s->escape,
				       s->forward_escape,
				       s->backward_escape,
				       s->forward_escape + s->backward_escape);
		}
		s->escape = 0;
	}

	if (CAT_IS_LEADING(c)) {
		s->lead += CAT_LEAD(c);
		if (noisy & verbose)
			printf("%c %d\n", s->cat.lead_where == CAT_FORWARD ? '+' : '-', CAT_LEAD(c));
		return;
	}

	if (s->lead) {
		if (s->cat.lead_where == CAT_FORWARD) {
			s->forward_lead += s->lead;
			s->row += s->lead;
			if (noisy)
				printf("+ %d %d %d %d\n",
				       s->lead,
				       s->forward_lead,
				       s->backward_lead,
				       s->forward_lead + s->backward_lead);
		} else {
			s->backward_lead += s->lead;
			s->row -= s->lead;
			if (noisy)
				printf("- %d %d %d %d\n",
				       s->lead,
				       s->forward_lead,
				       s->backward_lead,
				       s->forward_lead + s->backward_lead);
		}
		s->lead = 0;
	}

	if (CAT_IS_SIZE_CHANGE(c)) {
		point_size = CAT_SIZE_CHANGE(c);
		if (noisy) {
			printf("Size %d", point_size);
			if (CAT_IS_SINGLE_TO_DOUBLE(s->cat.point_size, point_size))
				printf(" (double)");
			else if (CAT_IS_DOUBLE_TO_SINGLE(s->cat.point_size, point_size))
				printf(" (single)");
			putchar('\n');
		}
		s->cat.point_size = point_size;
		return;
	}

	if (CAT_IS_FLASH(c)) {
		c = CAT_FLASH(c);
		if (noisy) {
			index = c + (s->cat.font_half == CAT_LOWER ? 0 : 63);
			if (index > CAT_MAX_FONT_INDEX) {
				printf("Flash !!ILLEGAL!! (%d)\n", index);
				return;
			}
			printf("Flash %s (font %d %d%c size %d <%d,%d>)\n",
			       s->cat.font == CAT_SPECIAL_FONT ? special[index] : regular[index],
			       s->cat.font + 1,
			       c,
			       s->cat.font_half == CAT_LOWER ? 'L' : 'U',
			       s->cat.point_size,
			       s->row,
			       s->column);
		}
		return;
	}

	switch (c) {

	case CAT_INITIALIZE:
		s->cat.escape_where = s->cat.lead_where = CAT_FORWARD;
		s->cat.font = 0;  /* tilt up, lower rail and lower magazine */
		s->cat.font_half = CAT_LOWER;
		s->column = 0;
		if (noisy)
			printf("Initialize\n");
		return;

	case CAT_LOWER_RAIL:
		s->cat.font &= ~CAT_RAIL;
		if (noisy)
			printf("Lower rail (font %d)\n", s->cat.font + 1);
		return;

	case CAT_UPPER_RAIL:
		s->cat.font |= CAT_RAIL;
		if (noisy)
			printf("Upper rail (font %d)\n", s->cat.font + 1);
		return;

	case CAT_UPPER_MAGAZINE:
		s->cat.font |= CAT_MAGAZINE;
		if (noisy)
			printf("Upper magazine (font %d)\n", s->cat.font + 1);
		return;

	case CAT_LOWER_MAGAZINE:
		s->cat.font &= ~CAT_MAGAZINE;
		if (noisy)
			printf("Lower magazine (font %d)\n", s->cat.font + 1);
		return;

	case CAT_LOWER_FONT:
		s->cat.font_half = CAT_LOWER;
		if (noisy)
			printf("Font half lower\n");
		return;

	case CAT_UPPER_FONT:
		s->cat.font_half = CAT_UPPER;
		if (noisy)
			printf("Font half upper\n");
		return;

	case CAT_ESCAPE_FORWARD:
		s->cat.escape_where = CAT_FORWARD;
		if (noisy)
			printf("> mode, %d %d %d\n",
			       s->forward_escape,
			       s->backward_escape,
			       s->forward_escape + s->backward_escape);
		return;

	case CAT_ESCAPE_BACKWARD:
		s->cat.escape_where = CAT_BACKWARD;
		if (noisy)
			printf("< mode %d %d %d\n",
			       s->forward_escape,
			       s->backward_escape,
			       s->forward_escape + s->backward_escape);
		return;

	case CAT_STOP:
		if (noisy)
			printf("STOP\n");
		return;

	case CAT_LEAD_FORWARD:
		s->cat.lead_where = CAT_FORWARD;
		if (noisy)
			printf("+ mode %d %d %d\n",
			       s->forward_lead,
			       s->backward_lead,
			       s->forward_lead + s->backward_lead);
		return;

	case CAT_LEAD_BACKWARD:
		s->cat.lead_where = CAT_BACKWARD;
		if (noisy)
			printf("- mode %d %d %d\n",
			       s->forward_lead,
			       s->backward_lead,
			       s->forward_lead + s->backward_lead);
		return;

	case CAT_EXTENSION:
		switch (getchar()) {
		case CAT_BIG_LEAD:
			lead =  getchar() * CAT_BIG_LEAD_MULTIPLIER;
			if (noisy & verbose)
				printf("%s %d\n", s->cat.lead_where == CAT_FORWARD ? "++" : "--", lead);
			s->lead += lead;
			return;

		case CAT_BIG_ESCAPE:
			escape =  getchar() * CAT_BIG_ESCAPE_MULTIPLIER;
			if (noisy & verbose)
				printf("%s %d\n", s->cat.escape_where == CAT_FORWARD ? ">>" : "<<", escape);
			s->escape += escape;
			return;
		
		case CAT_FORMFEED:
			s->row = s->column = 0;
			if (noisy)
				printf("Formfeed\n");
			return;

		default:
			if (noisy)
				printf("Undefined extension\n");
			return;
		}

	case CAT_TILT_UP:
		s->cat.font &= ~CAT_TILT;
		if (noisy)
			printf("Tilt up (font %d)\n", s->cat.font + 1);
		return;

	case CAT_TILT_DOWN:
		s->cat.font |= CAT_TILT;
		if (noisy)
			printf("Tilt down (font %d)\n", s->cat.font + 1);
		return;
	}
}

char *regular[128] = {
	"",		/* garbage slot */
	"h",		/* h */
	"t",		/* t */
	"n",		/* n */
	"m",		/* m */
	"l",		/* l */
	"i",		/* i */
	"z",		/* z */
	"s",		/* s */
	"d",		/* d */
	"b",		/* b */
	"x",		/* x */
	"f",		/* f */
	"j",		/* j */
	"u",		/* u */
	"k",		/* k */
	"-blank-",	/* blank */
	"p",		/* p */
	"-",		/* _ 3/4 em dash */
	";",		/* ; */
	"-blank-",	/* blank */
	"a",		/* a */
	"_",		/* rule */
	"c",		/* c */
	"`",		/* ` open */
	"e",		/* e */
	"'",		/* ' close */
	"o",		/* o */
	"-1/4-",	/* 1/4 */
	"r",		/* r */
	"-1/2-",	/* 1/2 */
	"v",		/* v */
	"-",		/* - hyphen */
	"w",		/* w */
	"q",		/* q */
	"/",		/* / */
	".",		/* . */
	"g",		/* g */
	"-3/4-",	/* 3/4 */
	",",		/* , */
	"&",		/* & */
	"y",		/* y */
	"-blank-",	/* blank */
	"%",		/* % */
	"-blank-",	/* blank */
	"Q",		/* Q */
	"T",		/* T */
	"O",		/* O */
	"H",		/* H */
	"N",		/* N */
	"M",		/* M */
	"L",		/* L */
	"R",		/* R */
	"G",		/* G */
	"I",		/* I */
	"P",		/* P */
	"C",		/* C */
	"V",		/* V */
	"E",		/* E */
	"Z",		/* Z */
	"D",		/* D */
	"B",		/* B */
	"S",		/* S */
	"Y",		/* Y */
	"F",		/* F */
	"X",		/* X */
	"A",		/* A */
	"W",		/* W */
	"J",		/* J */
	"U",		/* U */
	"K",		/* K */
	"0",		/* 0 */
	"1",		/* 1 */
	"2",		/* 2 */
	"3",		/* 3 */
	"4",		/* 4 */
	"5",		/* 5 */
	"6",		/* 6 */
	"7",		/* 7 */
	"8",		/* 8 */
	"9",		/* 9 */
	"*",		/* * */
	"-",		/* minus */
 	"-fi-",		/* fi */
	"-fl-",		/* fl */
	"-ff-",		/* ff */
	"-cent mark-",	/* cent mark */
	"-ffl-",	/* ffl */
	"-ffi-",	/*  ffi  */
	"(",		/* ( */
	")",		/* ) */
	"[",		/* [ */
	"]",		/* ] */
	"-degree-",	/* degree */
	"-dagger-",	/* dagger */
	"=",		/* = */
	"-registered-",	/* registered */
	":",		/* : */
	"+",		/* + */
	"-blank-",	/* blank */
	"!",		/* ! */
	"-bullet-",	/* bullet */
	"?",		/* ? */
	"'",		/* foot mark */
	"|",		/* | */
	"-blank-",	/* blank */
	"-copyright-",	/* copyright */
	"-square-",	/* square */
	"$"		/* $ */
};

char *special[128] = {
	"",				/* garbage slot */
	"-psi-",			/* psi */
	"-theta-",			/* theta */
	"-nu-",				/* nu */
	"-mu-",				/* mu */
	"-lambda-",			/* lambda */
	"-iota-",			/* iota */
	"-zeta-",			/* zeta */
	"-sigma-",			/* sigma */
	"-delta-",			/* delta */
	"-beta-",			/* beta */
	"-xi-",				/* xi */
	"-eta-",			/* eta */
	"-phi",				/* phi */
	"-upsilon-",			/* upsilon */
	"-kappa-",			/* kappa */
	"-blank-",			/* blank */
	"-pi-",				/* pi */
	"@",				/* at sign @ */
	"-down arrow-",			/* down arrow */
	"-blank-",			/* blank */
	"-alpha-",			/* alpha */
	"|",				/* or */
	"-chi-",			/* chi */
	"\"",				/* " */
	"-epsilon-",			/* epsilon */
	"=",				/* equals */
	"-omicron-",			/* omicron */
	"-left arrow-",			/* left arrow */
	"-rho-",			/* rho */
	"-up arrow-",			/* up arrow */
	"-tau-",			/* tau */
	"_",				/* underrule */
	"\\",				/* \ */
	"-Psi-",			/* Psi */
	"-bell system sign-",		/* bell system sign */
	"-infinity-",			/* infinity */
	"-gamma-",			/* gamma */
	"-improper subset-",		/* improper superset */
	"-proportional to-",		/* proportional to */
	"-right hand-",			/* right hand */
	"-omega-",			/* omega */
	"-blank-",			/* blank */
	"-gradient-",			/* gradient */
	"-blank-",			/* blank */
	"-Phi-",			/* Phi */
	"-Theta-",			/* Theta */
	"-Omega-",			/* Omega */
	"-union-",			/* cup (union) */
	"-root en-",			/* root en */
	"-terminal sigma-",		/* terminal sigma */
	"-Lambda-",			/* Lambda */
	"-",				/* some horizontal line */
	"-Gamma-",			/* Gamma */
	"-integral sign-",		/* integral sign */
	"-Pi-",				/* Pi */
	"-subset of-",			/* subset of */
	"-superset of-",		/* superset of */
	"-approximates-",		/* approximates */
	"-partial derivative-",		/* partial derivative */
	"-Delta-",			/* Delta */
	"-square root-",		/* square root */
	"-Sigma-",			/* Sigma */
	"-approximates-",		/* approximates */
	">",				/* > */
	"-Xi-",				/* Xi */
	"<",				/* < */
	"/",				/* slash (longer) */
	"-cap-",			/* cap (intersection) */
	"-Upsilon-",			/* Upsilon */
	"-not-",			/* not */
	"-right ceiling-",		/* right ceiling */
	"-left curly top-",		/* left top of big curly bracket */
	"-bold vertical-",		/* bold vertical */
	"-left curly center-",		/* left center of big curly bracket */
	"-left curly bottom-",		/* left bottom of big curly bracket */
	"-right curly top-",		/* right top of big curly bracket */
	"-right curly center-",		/* right center of big curly bracket */
	"-right floor-",		/* right floor */
	"-right floor-",		/* right floor */
	"-left floor-",			/* left floor */
	"-left ceiling-",		/* left ceiling */
	"-multiply-",			/* multiply */
	"-divide-",			/* divide */
	"-plus/minus-",			/* plus-minus */
	"-less than or equal-",		/* <= */
	"-greater than or equal-",	/* >= */
	"-identical-",			/* identically equal */
	"-not equal-",			/* not equal */
	"{",				/* { */
	"}",				/* } */
	"'",				/* ' acute accent */
	"`",				/* ` grave accent */
	"^",				/* ^ */
	"#",				/* sharp */
	"-left hand-",			/* left hand */
	"-member of-",			/* member of */
	"~",				/* ~ */
	"-empty set-",			/* empty set */
	"-blank-",			/* blank */
	"-double dagger-",		/* double dagger */
	"-box vertical rule-",		/* box rule */
	"*",				/* telephone asterisk? */
	"-improper subset-",		/* improper subset */
	"-circle-",			/* circle */
	"-blank-",			/* blank */
	"+",				/* equation plus sign */
	"-right arrow-",		/* right arrow */
	"-section mark-"		/* section mark */
};