/*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This module is believed to contain source code proprietary to AT&T. * Use and redistribution is subject to the Berkeley Software License * Agreement and your Software Agreement with AT&T (Western Electric). */ #ifndef lint static char sccsid[] = "@(#)lookup.c 4.3 (Berkeley) 4/17/91"; #endif /* not lint */ # include "e.h" #include "e.def" #define TBLSIZE 100 tbl *keytbl[TBLSIZE]; /* key words */ tbl *restbl[TBLSIZE]; /* reserved words */ tbl *deftbl[TBLSIZE]; /* user-defined names */ struct { char *key; int keyval; } keyword[] ={ "sub", SUB, "sup", SUP, ".EN", EOF, "from", FROM, "to", TO, "sum", SUM, "hat", HAT, "vec", VEC, "dyad", DYAD, "dot", DOT, "dotdot", DOTDOT, "bar", BAR, "tilde", TILDE, "under", UNDER, "prod", PROD, "int", INT, "integral", INT, "union", UNION, "inter", INTER, "pile", PILE, "lpile", LPILE, "cpile", CPILE, "rpile", RPILE, "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, #ifdef NEQN /* make ndefine synonym for define, tdefine a no-op */ "tdefine", TDEFINE, "ndefine", DEFINE, #else /* tdefine = define, ndefine = no-op */ "tdefine", DEFINE, "ndefine", NDEFINE, #endif "gsize", GSIZE, ".gsize", GSIZE, "gfont", GFONT, "include", INCLUDE, "up", UP, "down", DOWN, "fwd", FWD, "back", BACK, "mark", MARK, "lineup", LINEUP, "matrix", MATRIX, "col", COL, "lcol", LCOL, "ccol", CCOL, "rcol", RCOL, 0, 0 }; struct { char *res; char *resval; } resword[] ={ ">=", "\\(>=", "<=", "\\(<=", "==", "\\(==", "!=", "\\(!=", "+-", "\\(+-", "->", "\\(->", "<-", "\\(<-", "inf", "\\(if", "infinity", "\\(if", "partial", "\\(pd", "half", "\\f1\\(12\\fP", "prime", "\\f1\\(fm\\fP", "dollar", "\\f1$\\fP", "nothing", "", "times", "\\(mu", "del", "\\(gr", "grad", "\\(gr", #ifdef NEQN "<<", "<<", ">>", ">>", "approx", "~\b\\d~\\u", "cdot", "\\v'-.5'.\\v'.5'", "...", "...", ",...,", ",...,", #else "<<", "<\\h'-.3m'<", ">>", ">\\h'-.3m'>", "approx", "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'", "cdot", "\\v'-.3m'.\\v'.3m'", "...", "\\v'-.3m'\\ .\\ .\\ .\\ \\v'.3m'", ",...,", ",\\ .\\ .\\ .\\ ,\\|", #endif "alpha", "\\(*a", "beta", "\\(*b", "gamma", "\\(*g", "GAMMA", "\\(*G", "delta", "\\(*d", "DELTA", "\\(*D", "epsilon", "\\(*e", "EPSILON", "\\f1E\\fP", "omega", "\\(*w", "OMEGA", "\\(*W", "lambda", "\\(*l", "LAMBDA", "\\(*L", "mu", "\\(*m", "nu", "\\(*n", "theta", "\\(*h", "THETA", "\\(*H", "phi", "\\(*f", "PHI", "\\(*F", "pi", "\\(*p", "PI", "\\(*P", "sigma", "\\(*s", "SIGMA", "\\(*S", "xi", "\\(*c", "XI", "\\(*C", "zeta", "\\(*z", "iota", "\\(*i", "eta", "\\(*y", "kappa", "\\(*k", "rho", "\\(*r", "tau", "\\(*t", "omicron", "\\(*o", "upsilon", "\\(*u", "UPSILON", "\\(*U", "psi", "\\(*q", "PSI", "\\(*Q", "chi", "\\(*x", "and", "\\f1and\\fP", "for", "\\f1for\\fP", "if", "\\f1if\\fP", "Re", "\\f1Re\\fP", "Im", "\\f1Im\\fP", "sin", "\\f1sin\\fP", "cos", "\\f1cos\\fP", "tan", "\\f1tan\\fP", "sec", "\\f1sec\\fP", "csc", "\\f1csc\\fP", "arc", "\\f1arc\\fP", "asin", "\\f1asin\\fP", "acos", "\\f1acos\\fP", "atan", "\\f1atan\\fP", "asec", "\\f1asec\\fP", "acsc", "\\f1acsc\\fP", "sinh", "\\f1sinh\\fP", "coth", "\\f1coth\\fP", "tanh", "\\f1tanh\\fP", "cosh", "\\f1cosh\\fP", "lim", "\\f1lim\\fP", "log", "\\f1log\\fP", "max", "\\f1max\\fP", "min", "\\f1min\\fP", "ln", "\\f1ln\\fP", "exp", "\\f1exp\\fP", "det", "\\f1det\\fP", 0, 0 }; tbl *lookup(tblp, name, defn) /* find name in tbl. if defn non-null, install */ tbl **tblp; char *name, *defn; { register tbl *p; register int h; register char *s = name; char *malloc(); for (h = 0; *s != '\0'; ) h += *s++; h %= TBLSIZE; for (p = tblp[h]; p != NULL; p = p->next) if (strcmp(name, p->name) == 0) { /* found it */ if (defn != NULL) p->defn = defn; return(p); } /* didn't find it */ if (defn == NULL) return(NULL); p = (tbl *) malloc(sizeof (tbl)); if (p == NULL) error(FATAL, "out of space in lookup"); p->name = name; p->defn = defn; p->next = tblp[h]; tblp[h] = p; return(p); } init_tbl() /* initialize all tables */ { int i; for (i = 0; keyword[i].key != NULL; i++) lookup(keytbl, keyword[i].key, keyword[i].keyval); for (i = 0; resword[i].res != NULL; i++) lookup(restbl, resword[i].res, resword[i].resval); }