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