|  | #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 */ | 
|  | } |