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