1 #include "e.h"
2 #include "y.tab.h"
3
4 tbl *keytbl[TBLSIZE]; /* key words */
5 tbl *restbl[TBLSIZE]; /* reserved words */
6 tbl *deftbl[TBLSIZE]; /* user-defined names */
7
8 struct keyword {
9 char *key;
10 int keyval;
11 } keyword[] ={
12 "sub", SUB,
13 "sup", SUP,
14 ".EN", DOTEN,
15 ".EQ", DOTEQ,
16 "from", FROM,
17 "to", TO,
18 "sum", SUM,
19 "hat", HAT,
20 "vec", VEC,
21 "dyad", DYAD,
22 "dot", DOT,
23 "dotdot", DOTDOT,
24 "bar", BAR,
25 "lowbar", LOWBAR,
26 "highbar", HIGHBAR,
27 "tilde", TILDE,
28 "utilde", UTILDE,
29 "under", UNDER,
30 "prod", PROD,
31 "int", INT,
32 "integral", INT,
33 "union", UNION,
34 "inter", INTER,
35 "matrix", MATRIX,
36 "col", COL,
37 "lcol", LCOL,
38 "ccol", CCOL,
39 "rcol", RCOL,
40 "pile", COL, /* synonyms ... */
41 "lpile", LCOL,
42 "cpile", CCOL,
43 "rpile", RCOL,
44 "over", OVER,
45 "sqrt", SQRT,
46 "above", ABOVE,
47 "size", SIZE,
48 "font", FONT,
49 "fat", FAT,
50 "roman", ROMAN,
51 "italic", ITALIC,
52 "bold", BOLD,
53 "left", LEFT,
54 "right", RIGHT,
55 "delim", DELIM,
56 "define", DEFINE,
57 "tdefine", DEFINE,
58 "ndefine", NDEFINE,
59 "ifdef", IFDEF,
60 "gsize", GSIZE,
61 ".gsize", GSIZE,
62 "gfont", GFONT,
63 "include", INCLUDE,
64 "copy", INCLUDE,
65 "space", SPACE,
66 "up", UP,
67 "down", DOWN,
68 "fwd", FWD,
69 "back", BACK,
70 "mark", MARK,
71 "lineup", LINEUP,
72 0, 0
73 };
74
75 struct resword {
76 char *res;
77 char *resval;
78 } resword[] ={
79 ">=", "\\(>=",
80 "<=", "\\(<=",
81 "==", "\\(==",
82 "!=", "\\(!=",
83 "+-", "\\(+-",
84 "->", "\\(->",
85 "<-", "\\(<-",
86 "inf", "\\(if",
87 "infinity", "\\(if",
88 "partial", "\\(pd",
89 "half", "\\f1\\(12\\fP",
90 "prime", "\\f1\\v'.5m'\\s+3\\(fm\\s-3\\v'-.5m'\\fP",
91 "dollar", "\\f1$\\fP",
92 "nothing", "",
93 "times", "\\(mu",
94 "del", "\\(gr",
95 "grad", "\\(gr",
96 "approx", "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'",
97 "cdot", "\\v'-.3m'.\\v'.3m'",
98 "...", "\\v'-.25m'\\ .\\ .\\ .\\ \\v'.25m'",
99 ",...,", "\\f1,\\fP\\ .\\ .\\ .\\ \\f1,\\fP\\|",
100 "alpha", "α",
101 "ALPHA", "Α",
102 "beta", "β",
103 "BETA", "Β",
104 "gamma", "γ",
105 "GAMMA", "Γ",
106 "delta", "δ",
107 "DELTA", "Δ",
108 "epsilon", "ε",
109 "EPSILON", "Ε",
110 "omega", "ω",
111 "OMEGA", "Ω",
112 "lambda", "λ",
113 "LAMBDA", "Λ",
114 "mu", "μ",
115 "MU", "Μ",
116 "nu", "ν",
117 "NU", "Ν",
118 "theta", "θ",
119 "THETA", "Θ",
120 "phi", "φ",
121 "PHI", "Φ",
122 "pi", "π",
123 "PI", "Π",
124 "sigma", "σ",
125 "SIGMA", "Σ",
126 "xi", "ξ",
127 "XI", "Ξ",
128 "zeta", "ζ",
129 "ZETA", "Ζ",
130 "iota", "ι",
131 "IOTA", "Ι",
132 "eta", "η",
133 "ETA", "Η",
134 "kappa", "κ",
135 "KAPPA", "Κ",
136 "rho", "ρ",
137 "RHO", "Ρ",
138 "tau", "τ",
139 "TAU", "Τ",
140 "omicron", "ο",
141 "OMICRON", "Ο",
142 "upsilon", "υ",
143 "UPSILON", "Υ",
144 "psi", "ψ",
145 "PSI", "Ψ",
146 "chi", "χ",
147 "CHI", "Χ",
148 "and", "\\f1and\\fP",
149 "for", "\\f1for\\fP",
150 "if", "\\f1if\\fP",
151 "Re", "\\f1Re\\fP",
152 "Im", "\\f1Im\\fP",
153 "sin", "\\f1sin\\fP",
154 "cos", "\\f1cos\\fP",
155 "tan", "\\f1tan\\fP",
156 "arc", "\\f1arc\\fP",
157 "sinh", "\\f1sinh\\fP",
158 "coth", "\\f1coth\\fP",
159 "tanh", "\\f1tanh\\fP",
160 "cosh", "\\f1cosh\\fP",
161 "lim", "\\f1lim\\fP",
162 "log", "\\f1log\\fP",
163 "ln", "\\f1ln\\fP",
164 "max", "\\f1max\\fP",
165 "min", "\\f1min\\fP",
166 "exp", "\\f1exp\\fP",
167 "det", "\\f1det\\fP",
168 0, 0
169 };
170
hash(char * s)171 int hash(char *s)
172 {
173 register unsigned int h;
174
175 for (h = 0; *s != '\0'; )
176 h += *s++;
177 h %= TBLSIZE;
178 return h;
179 }
180
lookup(tbl ** tblp,char * name)181 tbl *lookup(tbl **tblp, char *name) /* find name in tbl */
182 {
183 register tbl *p;
184
185 for (p = tblp[hash(name)]; p != NULL; p = p->next)
186 if (strcmp(name, p->name) == 0)
187 return(p);
188 return(NULL);
189 }
190
install(tbl ** tblp,char * name,char * cval,int ival)191 void install(tbl **tblp, char *name, char *cval, int ival) /* install name, vals in tblp */
192 {
193 register tbl *p;
194 int h;
195
196 if ((p = lookup(tblp, name)) == NULL) {
197 p = (tbl *) malloc(sizeof(tbl));
198 if (p == NULL)
199 ERROR "out of space in install" FATAL;
200 h = hash(name); /* bad visibility here */
201 p->name = name;
202 p->next = tblp[h];
203 tblp[h] = p;
204 }
205 p->cval = cval;
206 p->ival = ival;
207 }
208
init_tbl(void)209 void init_tbl(void) /* initialize tables */
210 {
211 int i;
212 extern int init_tune(void);
213
214 for (i = 0; keyword[i].key != NULL; i++)
215 install(keytbl, keyword[i].key, (char *) 0, keyword[i].keyval);
216 for (i = 0; resword[i].res != NULL; i++)
217 install(restbl, resword[i].res, resword[i].resval, 0);
218 init_tune(); /* tuning table done in tuning.c */
219 }
220