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