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