From 5cedca1b69d020c32466f70843a11767773d7e3b Mon Sep 17 00:00:00 2001 From: rsc Date: Sat, 15 May 2004 23:24:00 +0000 Subject: Let's try this. It's BUGGERED. --- src/cmd/eqn/lookup.c | 219 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 src/cmd/eqn/lookup.c (limited to 'src/cmd/eqn/lookup.c') diff --git a/src/cmd/eqn/lookup.c b/src/cmd/eqn/lookup.c new file mode 100644 index 00000000..4eb94373 --- /dev/null +++ b/src/cmd/eqn/lookup.c @@ -0,0 +1,219 @@ +#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 */ +} -- cgit v1.2.3