Commit | Line | Data |
---|---|---|
9590d267 BS |
1 | /* lookup.c 4.1 83/02/11 */ |
2 | ||
3 | # include "e.h" | |
4 | #include "e.def" | |
5 | ||
6 | #define TBLSIZE 100 | |
7 | ||
8 | tbl *keytbl[TBLSIZE]; /* key words */ | |
9 | tbl *restbl[TBLSIZE]; /* reserved words */ | |
10 | tbl *deftbl[TBLSIZE]; /* user-defined names */ | |
11 | ||
12 | struct { | |
13 | char *key; | |
14 | int keyval; | |
15 | } keyword[] ={ | |
16 | "sub", SUB, | |
17 | "sup", SUP, | |
18 | ".EN", EOF, | |
19 | "from", FROM, | |
20 | "to", TO, | |
21 | "sum", SUM, | |
22 | "hat", HAT, | |
23 | "vec", VEC, | |
24 | "dyad", DYAD, | |
25 | "dot", DOT, | |
26 | "dotdot", DOTDOT, | |
27 | "bar", BAR, | |
28 | "tilde", TILDE, | |
29 | "under", UNDER, | |
30 | "prod", PROD, | |
31 | "int", INT, | |
32 | "integral", INT, | |
33 | "union", UNION, | |
34 | "inter", INTER, | |
35 | "pile", PILE, | |
36 | "lpile", LPILE, | |
37 | "cpile", CPILE, | |
38 | "rpile", RPILE, | |
39 | "over", OVER, | |
40 | "sqrt", SQRT, | |
41 | "above", ABOVE, | |
42 | "size", SIZE, | |
43 | "font", FONT, | |
44 | "fat", FAT, | |
45 | "roman", ROMAN, | |
46 | "italic", ITALIC, | |
47 | "bold", BOLD, | |
48 | "left", LEFT, | |
49 | "right", RIGHT, | |
50 | "delim", DELIM, | |
51 | "define", DEFINE, | |
52 | ||
53 | #ifdef NEQN /* make ndefine synonym for define, tdefine a no-op */ | |
54 | ||
55 | "tdefine", TDEFINE, | |
56 | "ndefine", DEFINE, | |
57 | ||
58 | #else /* tdefine = define, ndefine = no-op */ | |
59 | ||
60 | "tdefine", DEFINE, | |
61 | "ndefine", NDEFINE, | |
62 | ||
63 | #endif | |
64 | ||
65 | "gsize", GSIZE, | |
66 | ".gsize", GSIZE, | |
67 | "gfont", GFONT, | |
68 | "include", INCLUDE, | |
69 | "up", UP, | |
70 | "down", DOWN, | |
71 | "fwd", FWD, | |
72 | "back", BACK, | |
73 | "mark", MARK, | |
74 | "lineup", LINEUP, | |
75 | "matrix", MATRIX, | |
76 | "col", COL, | |
77 | "lcol", LCOL, | |
78 | "ccol", CCOL, | |
79 | "rcol", RCOL, | |
80 | 0, 0 | |
81 | }; | |
82 | ||
83 | struct { | |
84 | char *res; | |
85 | char *resval; | |
86 | } resword[] ={ | |
87 | ">=", "\\(>=", | |
88 | "<=", "\\(<=", | |
89 | "==", "\\(==", | |
90 | "!=", "\\(!=", | |
91 | "+-", "\\(+-", | |
92 | "->", "\\(->", | |
93 | "<-", "\\(<-", | |
94 | "inf", "\\(if", | |
95 | "infinity", "\\(if", | |
96 | "partial", "\\(pd", | |
97 | "half", "\\f1\\(12\\fP", | |
98 | "prime", "\\f1\\(fm\\fP", | |
99 | "dollar", "\\f1$\\fP", | |
100 | "nothing", "", | |
101 | "times", "\\(mu", | |
102 | "del", "\\(gr", | |
103 | "grad", "\\(gr", | |
104 | #ifdef NEQN | |
105 | "<<", "<<", | |
106 | ">>", ">>", | |
107 | "approx", "~\b\\d~\\u", | |
108 | "cdot", "\\v'-.5'.\\v'.5'", | |
109 | "...", "...", | |
110 | ",...,", ",...,", | |
111 | #else | |
112 | "<<", "<\\h'-.3m'<", | |
113 | ">>", ">\\h'-.3m'>", | |
114 | "approx", "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'", | |
115 | "cdot", "\\v'-.3m'.\\v'.3m'", | |
116 | "...", "\\v'-.3m'\\ .\\ .\\ .\\ \\v'.3m'", | |
117 | ",...,", ",\\ .\\ .\\ .\\ ,\\|", | |
118 | #endif | |
119 | ||
120 | "alpha", "\\(*a", | |
121 | "beta", "\\(*b", | |
122 | "gamma", "\\(*g", | |
123 | "GAMMA", "\\(*G", | |
124 | "delta", "\\(*d", | |
125 | "DELTA", "\\(*D", | |
126 | "epsilon", "\\(*e", | |
127 | "EPSILON", "\\f1E\\fP", | |
128 | "omega", "\\(*w", | |
129 | "OMEGA", "\\(*W", | |
130 | "lambda", "\\(*l", | |
131 | "LAMBDA", "\\(*L", | |
132 | "mu", "\\(*m", | |
133 | "nu", "\\(*n", | |
134 | "theta", "\\(*h", | |
135 | "THETA", "\\(*H", | |
136 | "phi", "\\(*f", | |
137 | "PHI", "\\(*F", | |
138 | "pi", "\\(*p", | |
139 | "PI", "\\(*P", | |
140 | "sigma", "\\(*s", | |
141 | "SIGMA", "\\(*S", | |
142 | "xi", "\\(*c", | |
143 | "XI", "\\(*C", | |
144 | "zeta", "\\(*z", | |
145 | "iota", "\\(*i", | |
146 | "eta", "\\(*y", | |
147 | "kappa", "\\(*k", | |
148 | "rho", "\\(*r", | |
149 | "tau", "\\(*t", | |
150 | "omicron", "\\(*o", | |
151 | "upsilon", "\\(*u", | |
152 | "UPSILON", "\\(*U", | |
153 | "psi", "\\(*q", | |
154 | "PSI", "\\(*Q", | |
155 | "chi", "\\(*x", | |
156 | "and", "\\f1and\\fP", | |
157 | "for", "\\f1for\\fP", | |
158 | "if", "\\f1if\\fP", | |
159 | "Re", "\\f1Re\\fP", | |
160 | "Im", "\\f1Im\\fP", | |
161 | "sin", "\\f1sin\\fP", | |
162 | "cos", "\\f1cos\\fP", | |
163 | "tan", "\\f1tan\\fP", | |
164 | "sec", "\\f1sec\\fP", | |
165 | "csc", "\\f1csc\\fP", | |
166 | "arc", "\\f1arc\\fP", | |
167 | "asin", "\\f1asin\\fP", | |
168 | "acos", "\\f1acos\\fP", | |
169 | "atan", "\\f1atan\\fP", | |
170 | "asec", "\\f1asec\\fP", | |
171 | "acsc", "\\f1acsc\\fP", | |
172 | "sinh", "\\f1sinh\\fP", | |
173 | "coth", "\\f1coth\\fP", | |
174 | "tanh", "\\f1tanh\\fP", | |
175 | "cosh", "\\f1cosh\\fP", | |
176 | "lim", "\\f1lim\\fP", | |
177 | "log", "\\f1log\\fP", | |
178 | "max", "\\f1max\\fP", | |
179 | "min", "\\f1min\\fP", | |
180 | "ln", "\\f1ln\\fP", | |
181 | "exp", "\\f1exp\\fP", | |
182 | "det", "\\f1det\\fP", | |
183 | 0, 0 | |
184 | }; | |
185 | ||
186 | tbl *lookup(tblp, name, defn) /* find name in tbl. if defn non-null, install */ | |
187 | tbl **tblp; | |
188 | char *name, *defn; | |
189 | { | |
190 | register tbl *p; | |
191 | register int h; | |
192 | register char *s = name; | |
193 | char *malloc(); | |
194 | ||
195 | for (h = 0; *s != '\0'; ) | |
196 | h += *s++; | |
197 | h %= TBLSIZE; | |
198 | ||
199 | for (p = tblp[h]; p != NULL; p = p->next) | |
200 | if (strcmp(name, p->name) == 0) { /* found it */ | |
201 | if (defn != NULL) | |
202 | p->defn = defn; | |
203 | return(p); | |
204 | } | |
205 | /* didn't find it */ | |
206 | if (defn == NULL) | |
207 | return(NULL); | |
208 | p = (tbl *) malloc(sizeof (tbl)); | |
209 | if (p == NULL) | |
210 | error(FATAL, "out of space in lookup"); | |
211 | p->name = name; | |
212 | p->defn = defn; | |
213 | p->next = tblp[h]; | |
214 | tblp[h] = p; | |
215 | return(p); | |
216 | } | |
217 | ||
218 | init_tbl() /* initialize all tables */ | |
219 | { | |
220 | int i; | |
221 | ||
222 | for (i = 0; keyword[i].key != NULL; i++) | |
223 | lookup(keytbl, keyword[i].key, keyword[i].keyval); | |
224 | for (i = 0; resword[i].res != NULL; i++) | |
225 | lookup(restbl, resword[i].res, resword[i].resval); | |
226 | } |