#include "e.h"
#include "y.tab.h"

tbl	*keytbl[TBLSIZE];	/* key words */
tbl	*restbl[TBLSIZE];	/* reserved words */
tbl	*deftbl[TBLSIZE];	/* user-defined names */

struct keyword {
	char	*key;
	int	keyval;
} keyword[]	={
	{ "sub",	 SUB, },
	{ "sup",	 SUP, },
	{ ".EN",	 DOTEN, },
	{ ".EQ",	 DOTEQ, },
	{ "from",	 FROM, },
	{ "to",	         TO, },
	{ "sum",	 SUM, },
	{ "hat",	 HAT, },
	{ "vec",	 VEC, },
	{ "dyad",	 DYAD, },
	{ "dot",	 DOT, },
	{ "dotdot",	 DOTDOT, },
	{ "bar",	 BAR, },
	{ "lowbar",	 LOWBAR, },
	{ "highbar",	 HIGHBAR, },
	{ "tilde",	 TILDE, },
	{ "utilde",	 UTILDE, },
	{ "under",	 UNDER, },
	{ "prod",	 PROD, },
	{ "int",	 INT, },
	{ "integral",	 INT, },
	{ "union",	 UNION, },
	{ "inter",	 INTER, },
	{ "matrix",	 MATRIX, },
	{ "col",	 COL, },
	{ "lcol",	 LCOL, },
	{ "ccol",	 CCOL, },
	{ "rcol",	 RCOL, },
	{ "pile",	 COL },  /* synonyms ... */
	{ "lpile",	 LCOL, },
	{ "cpile",	 CCOL, },
	{ "rpile",	 RCOL, },
	{ "over",	 OVER, },
	{ "sqrt",	 SQRT, },
	{ "above",	 ABOVE, },
	{ "size",	 SIZE, },
	{ "font",	 FONT, },
	{ "fat",	 FAT, },
	{ "roman",	 ROMAN, },
	{ "italic",	 ITALIC, },
	{ "bold",	 BOLD, },
	{ "left",	 LEFT, },
	{ "right",	 RIGHT, },
	{ "delim",	 DELIM, },
	{ "define",	 DEFINE, },
	{ "tdefine",	 DEFINE, },
	{ "ndefine",	 NDEFINE, },
	{ "ifdef",	 IFDEF, },
	{ "gsize",	 GSIZE, },
	{ ".gsize",	 GSIZE, },
	{ "gfont",	 GFONT, },
	{ "include",	 INCLUDE, },
	{ "copy",	 INCLUDE, },
	{ "space",	 SPACE, },
	{ "up",	         UP, },
	{ "down",	 DOWN, },
	{ "fwd",	 FWD, },
	{ "back",	 BACK, },
	{ "mark",	 MARK, },
	{ "lineup",	 LINEUP, },
	{ 0, 	0 }
};

struct resword {
	char	*res;
	char	*resval;
} resword[]	={
	{ ">=",	 "\\(>=", },
	{ "<=",	 "\\(<=", },
	{ "==",	 "\\(==", },
	{ "!=",	 "\\(!=", },
	{ "+-",	 "\\(+-", },
	{ "->",	 "\\(->", },
	{ "<-",	 "\\(<-", },
	{ "inf",	 "\\(if", },
	{ "infinity",	 "\\(if", },
	{ "partial",	 "\\(pd", },
	{ "half",	 "\\f1\\(12\\fP", },
	{ "prime",	 "\\f1\\v'.5m'\\s+3\\(fm\\s-3\\v'-.5m'\\fP", },
	{ "dollar",	 "\\f1$\\fP", },
	{ "nothing",	 "", },
	{ "times",	 "\\(mu", },
	{ "del",	 "\\(gr", },
	{ "grad",	 "\\(gr", },
	{ "approx",	 "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'", },
	{ "cdot",	 "\\v'-.3m'.\\v'.3m'", },
	{ "...",	 "\\v'-.25m'\\ .\\ .\\ .\\ \\v'.25m'", },
	{ ",...,",	 "\\f1,\\fP\\ .\\ .\\ .\\ \\f1,\\fP\\|", },
	{ "alpha",	 "α", },
	{ "ALPHA",	 "Α", },
	{ "beta",	 "β", },
	{ "BETA",	 "Β", },
	{ "gamma",	 "γ", },
	{ "GAMMA",	 "Γ", },
	{ "delta",	 "δ", },
	{ "DELTA",	 "Δ", },
	{ "epsilon",	 "ε", },
	{ "EPSILON",	 "Ε", },
	{ "omega",	 "ω", },
	{ "OMEGA",	 "Ω", },
	{ "lambda",	 "λ", },
	{ "LAMBDA",	 "Λ", },
	{ "mu",	 "μ", },
	{ "MU",	 "Μ", },
	{ "nu",	 "ν", },
	{ "NU",	 "Ν", },
	{ "theta",	 "θ", },
	{ "THETA",	 "Θ", },
	{ "phi",	 "φ", },
	{ "PHI",	 "Φ", },
	{ "pi",	 "π", },
	{ "PI",	 "Π", },
	{ "sigma",	 "σ", },
	{ "SIGMA",	 "Σ", },
	{ "xi",	 "ξ", },
	{ "XI",	 "Ξ", },
	{ "zeta",	 "ζ", },
	{ "ZETA",	 "Ζ", },
	{ "iota",	 "ι", },
	{ "IOTA",	 "Ι", },
	{ "eta",	 "η", },
	{ "ETA",	 "Η", },
	{ "kappa",	 "κ", },
	{ "KAPPA",	 "Κ", },
	{ "rho",	 "ρ", },
	{ "RHO",	 "Ρ", },
	{ "tau",	 "τ", },
	{ "TAU",	 "Τ", },
	{ "omicron",	 "ο", },
	{ "OMICRON",	 "Ο", },
	{ "upsilon",	 "υ", },
	{ "UPSILON",	 "Υ", },
	{ "psi",	 "ψ", },
	{ "PSI",	 "Ψ", },
	{ "chi",	 "χ", },
	{ "CHI",	 "Χ", },
	{ "and",	 "\\f1and\\fP", },
	{ "for",	 "\\f1for\\fP", },
	{ "if",	 "\\f1if\\fP", },
	{ "Re",	 "\\f1Re\\fP", },
	{ "Im",	 "\\f1Im\\fP", },
	{ "sin",	 "\\f1sin\\fP", },
	{ "cos",	 "\\f1cos\\fP", },
	{ "tan",	 "\\f1tan\\fP", },
	{ "arc",	 "\\f1arc\\fP", },
	{ "sinh",	 "\\f1sinh\\fP", },
	{ "coth",	 "\\f1coth\\fP", },
	{ "tanh",	 "\\f1tanh\\fP", },
	{ "cosh",	 "\\f1cosh\\fP", },
	{ "lim",	 "\\f1lim\\fP", },
	{ "log",	 "\\f1log\\fP", },
	{ "ln",	 "\\f1ln\\fP", },
	{ "max",	 "\\f1max\\fP", },
	{ "min",	 "\\f1min\\fP", },
	{ "exp",	 "\\f1exp\\fP", },
	{ "det",	 "\\f1det\\fP", },
	{ 0,	0 }
};

int hash(char *s)
{
	register unsigned int h;

	for (h = 0; *s != '\0'; )
		h += *s++;
	h %= TBLSIZE;
	return h;
}

tbl *lookup(tbl **tblp, char *name)	/* find name in tbl */
{
	register tbl *p;

	for (p = tblp[hash(name)]; p != NULL; p = p->next)
		if (strcmp(name, p->name) == 0)
			return(p);
	return(NULL);
}

void install(tbl **tblp, char *name, char *cval, int ival)	/* install name, vals in tblp */
{
	register tbl *p;
	int h;

	if ((p = lookup(tblp, name)) == NULL) {
		p = (tbl *) malloc(sizeof(tbl));
		if (p == NULL)
			ERROR "out of space in install" FATAL;
		h = hash(name);	/* bad visibility here */
		p->name = name;
		p->next = tblp[h];
		tblp[h] = p;
	}
	p->cval = cval;
	p->ival = ival;
}

void init_tbl(void)	/* initialize tables */
{
	int i;
	extern int init_tune(void);

	for (i = 0; keyword[i].key != NULL; i++)
		install(keytbl, keyword[i].key, (char *) 0, keyword[i].keyval);
	for (i = 0; resword[i].res != NULL; i++)
		install(restbl, resword[i].res, resword[i].resval, 0);
	init_tune();	/* tuning table done in tuning.c */
}
