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