1*48252Sbostic /*-
2*48252Sbostic * Copyright (c) 1991 The Regents of the University of California.
3*48252Sbostic * All rights reserved.
4*48252Sbostic *
5*48252Sbostic * %sccs.include.proprietary.c%
6*48252Sbostic */
7*48252Sbostic
814486Ssam #ifndef lint
9*48252Sbostic static char sccsid[] = "@(#)lookup.c 4.3 (Berkeley) 04/17/91";
10*48252Sbostic #endif /* not lint */
1111009Sshannon
1211009Sshannon # include "e.h"
1311009Sshannon #include "e.def"
1411009Sshannon
1511009Sshannon #define TBLSIZE 100
1611009Sshannon
1711009Sshannon tbl *keytbl[TBLSIZE]; /* key words */
1811009Sshannon tbl *restbl[TBLSIZE]; /* reserved words */
1911009Sshannon tbl *deftbl[TBLSIZE]; /* user-defined names */
2011009Sshannon
2111009Sshannon struct {
2211009Sshannon char *key;
2311009Sshannon int keyval;
2411009Sshannon } keyword[] ={
2511009Sshannon "sub", SUB,
2611009Sshannon "sup", SUP,
2711009Sshannon ".EN", EOF,
2811009Sshannon "from", FROM,
2911009Sshannon "to", TO,
3011009Sshannon "sum", SUM,
3111009Sshannon "hat", HAT,
3211009Sshannon "vec", VEC,
3311009Sshannon "dyad", DYAD,
3411009Sshannon "dot", DOT,
3511009Sshannon "dotdot", DOTDOT,
3611009Sshannon "bar", BAR,
3711009Sshannon "tilde", TILDE,
3811009Sshannon "under", UNDER,
3911009Sshannon "prod", PROD,
4011009Sshannon "int", INT,
4111009Sshannon "integral", INT,
4211009Sshannon "union", UNION,
4311009Sshannon "inter", INTER,
4411009Sshannon "pile", PILE,
4511009Sshannon "lpile", LPILE,
4611009Sshannon "cpile", CPILE,
4711009Sshannon "rpile", RPILE,
4811009Sshannon "over", OVER,
4911009Sshannon "sqrt", SQRT,
5011009Sshannon "above", ABOVE,
5111009Sshannon "size", SIZE,
5211009Sshannon "font", FONT,
5311009Sshannon "fat", FAT,
5411009Sshannon "roman", ROMAN,
5511009Sshannon "italic", ITALIC,
5611009Sshannon "bold", BOLD,
5711009Sshannon "left", LEFT,
5811009Sshannon "right", RIGHT,
5911009Sshannon "delim", DELIM,
6011009Sshannon "define", DEFINE,
6111009Sshannon
6211009Sshannon #ifdef NEQN /* make ndefine synonym for define, tdefine a no-op */
6311009Sshannon
6411009Sshannon "tdefine", TDEFINE,
6511009Sshannon "ndefine", DEFINE,
6611009Sshannon
6711009Sshannon #else /* tdefine = define, ndefine = no-op */
6811009Sshannon
6911009Sshannon "tdefine", DEFINE,
7011009Sshannon "ndefine", NDEFINE,
7111009Sshannon
7211009Sshannon #endif
7311009Sshannon
7411009Sshannon "gsize", GSIZE,
7511009Sshannon ".gsize", GSIZE,
7611009Sshannon "gfont", GFONT,
7711009Sshannon "include", INCLUDE,
7811009Sshannon "up", UP,
7911009Sshannon "down", DOWN,
8011009Sshannon "fwd", FWD,
8111009Sshannon "back", BACK,
8211009Sshannon "mark", MARK,
8311009Sshannon "lineup", LINEUP,
8411009Sshannon "matrix", MATRIX,
8511009Sshannon "col", COL,
8611009Sshannon "lcol", LCOL,
8711009Sshannon "ccol", CCOL,
8811009Sshannon "rcol", RCOL,
8911009Sshannon 0, 0
9011009Sshannon };
9111009Sshannon
9211009Sshannon struct {
9311009Sshannon char *res;
9411009Sshannon char *resval;
9511009Sshannon } resword[] ={
9611009Sshannon ">=", "\\(>=",
9711009Sshannon "<=", "\\(<=",
9811009Sshannon "==", "\\(==",
9911009Sshannon "!=", "\\(!=",
10011009Sshannon "+-", "\\(+-",
10111009Sshannon "->", "\\(->",
10211009Sshannon "<-", "\\(<-",
10311009Sshannon "inf", "\\(if",
10411009Sshannon "infinity", "\\(if",
10511009Sshannon "partial", "\\(pd",
10611009Sshannon "half", "\\f1\\(12\\fP",
10711009Sshannon "prime", "\\f1\\(fm\\fP",
10811009Sshannon "dollar", "\\f1$\\fP",
10911009Sshannon "nothing", "",
11011009Sshannon "times", "\\(mu",
11111009Sshannon "del", "\\(gr",
11211009Sshannon "grad", "\\(gr",
11311009Sshannon #ifdef NEQN
11411009Sshannon "<<", "<<",
11511009Sshannon ">>", ">>",
11611009Sshannon "approx", "~\b\\d~\\u",
11711009Sshannon "cdot", "\\v'-.5'.\\v'.5'",
11811009Sshannon "...", "...",
11911009Sshannon ",...,", ",...,",
12011009Sshannon #else
12111009Sshannon "<<", "<\\h'-.3m'<",
12211009Sshannon ">>", ">\\h'-.3m'>",
12311009Sshannon "approx", "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'",
12411009Sshannon "cdot", "\\v'-.3m'.\\v'.3m'",
12511009Sshannon "...", "\\v'-.3m'\\ .\\ .\\ .\\ \\v'.3m'",
12611009Sshannon ",...,", ",\\ .\\ .\\ .\\ ,\\|",
12711009Sshannon #endif
12811009Sshannon
12911009Sshannon "alpha", "\\(*a",
13011009Sshannon "beta", "\\(*b",
13111009Sshannon "gamma", "\\(*g",
13211009Sshannon "GAMMA", "\\(*G",
13311009Sshannon "delta", "\\(*d",
13411009Sshannon "DELTA", "\\(*D",
13511009Sshannon "epsilon", "\\(*e",
13611009Sshannon "EPSILON", "\\f1E\\fP",
13711009Sshannon "omega", "\\(*w",
13811009Sshannon "OMEGA", "\\(*W",
13911009Sshannon "lambda", "\\(*l",
14011009Sshannon "LAMBDA", "\\(*L",
14111009Sshannon "mu", "\\(*m",
14211009Sshannon "nu", "\\(*n",
14311009Sshannon "theta", "\\(*h",
14411009Sshannon "THETA", "\\(*H",
14511009Sshannon "phi", "\\(*f",
14611009Sshannon "PHI", "\\(*F",
14711009Sshannon "pi", "\\(*p",
14811009Sshannon "PI", "\\(*P",
14911009Sshannon "sigma", "\\(*s",
15011009Sshannon "SIGMA", "\\(*S",
15111009Sshannon "xi", "\\(*c",
15211009Sshannon "XI", "\\(*C",
15311009Sshannon "zeta", "\\(*z",
15411009Sshannon "iota", "\\(*i",
15511009Sshannon "eta", "\\(*y",
15611009Sshannon "kappa", "\\(*k",
15711009Sshannon "rho", "\\(*r",
15811009Sshannon "tau", "\\(*t",
15911009Sshannon "omicron", "\\(*o",
16011009Sshannon "upsilon", "\\(*u",
16111009Sshannon "UPSILON", "\\(*U",
16211009Sshannon "psi", "\\(*q",
16311009Sshannon "PSI", "\\(*Q",
16411009Sshannon "chi", "\\(*x",
16511009Sshannon "and", "\\f1and\\fP",
16611009Sshannon "for", "\\f1for\\fP",
16711009Sshannon "if", "\\f1if\\fP",
16811009Sshannon "Re", "\\f1Re\\fP",
16911009Sshannon "Im", "\\f1Im\\fP",
17011009Sshannon "sin", "\\f1sin\\fP",
17111009Sshannon "cos", "\\f1cos\\fP",
17211009Sshannon "tan", "\\f1tan\\fP",
17311009Sshannon "sec", "\\f1sec\\fP",
17411009Sshannon "csc", "\\f1csc\\fP",
17511009Sshannon "arc", "\\f1arc\\fP",
17611009Sshannon "asin", "\\f1asin\\fP",
17711009Sshannon "acos", "\\f1acos\\fP",
17811009Sshannon "atan", "\\f1atan\\fP",
17911009Sshannon "asec", "\\f1asec\\fP",
18011009Sshannon "acsc", "\\f1acsc\\fP",
18111009Sshannon "sinh", "\\f1sinh\\fP",
18211009Sshannon "coth", "\\f1coth\\fP",
18311009Sshannon "tanh", "\\f1tanh\\fP",
18411009Sshannon "cosh", "\\f1cosh\\fP",
18511009Sshannon "lim", "\\f1lim\\fP",
18611009Sshannon "log", "\\f1log\\fP",
18711009Sshannon "max", "\\f1max\\fP",
18811009Sshannon "min", "\\f1min\\fP",
18911009Sshannon "ln", "\\f1ln\\fP",
19011009Sshannon "exp", "\\f1exp\\fP",
19111009Sshannon "det", "\\f1det\\fP",
19211009Sshannon 0, 0
19311009Sshannon };
19411009Sshannon
lookup(tblp,name,defn)19511009Sshannon tbl *lookup(tblp, name, defn) /* find name in tbl. if defn non-null, install */
19611009Sshannon tbl **tblp;
19711009Sshannon char *name, *defn;
19811009Sshannon {
19911009Sshannon register tbl *p;
20011009Sshannon register int h;
20111009Sshannon register char *s = name;
20211009Sshannon char *malloc();
20311009Sshannon
20411009Sshannon for (h = 0; *s != '\0'; )
20511009Sshannon h += *s++;
20611009Sshannon h %= TBLSIZE;
20711009Sshannon
20811009Sshannon for (p = tblp[h]; p != NULL; p = p->next)
20911009Sshannon if (strcmp(name, p->name) == 0) { /* found it */
21011009Sshannon if (defn != NULL)
21111009Sshannon p->defn = defn;
21211009Sshannon return(p);
21311009Sshannon }
21411009Sshannon /* didn't find it */
21511009Sshannon if (defn == NULL)
21611009Sshannon return(NULL);
21711009Sshannon p = (tbl *) malloc(sizeof (tbl));
21811009Sshannon if (p == NULL)
21911009Sshannon error(FATAL, "out of space in lookup");
22011009Sshannon p->name = name;
22111009Sshannon p->defn = defn;
22211009Sshannon p->next = tblp[h];
22311009Sshannon tblp[h] = p;
22411009Sshannon return(p);
22511009Sshannon }
22611009Sshannon
init_tbl()22711009Sshannon init_tbl() /* initialize all tables */
22811009Sshannon {
22911009Sshannon int i;
23011009Sshannon
23111009Sshannon for (i = 0; keyword[i].key != NULL; i++)
23211009Sshannon lookup(keytbl, keyword[i].key, keyword[i].keyval);
23311009Sshannon for (i = 0; resword[i].res != NULL; i++)
23411009Sshannon lookup(restbl, resword[i].res, resword[i].resval);
23511009Sshannon }
236