xref: /csrg-svn/old/eqn/common_source/lookup.c (revision 48252)
1*48252Sbostic /*-
2*48252Sbostic  * Copyright (c) 1991 The Regents of the University of California.
3*48252Sbostic  * All rights reserved.
4*48252Sbostic  *
5*48252Sbostic  * %sccs.include.proprietary.c%
6*48252Sbostic  */
7*48252Sbostic 
814486Ssam #ifndef lint
9*48252Sbostic static char sccsid[] = "@(#)lookup.c	4.3 (Berkeley) 04/17/91";
10*48252Sbostic #endif /* not lint */
1111009Sshannon 
1211009Sshannon # include "e.h"
1311009Sshannon #include "e.def"
1411009Sshannon 
1511009Sshannon #define	TBLSIZE	100
1611009Sshannon 
1711009Sshannon tbl	*keytbl[TBLSIZE];	/* key words */
1811009Sshannon tbl	*restbl[TBLSIZE];	/* reserved words */
1911009Sshannon tbl	*deftbl[TBLSIZE];	/* user-defined names */
2011009Sshannon 
2111009Sshannon struct {
2211009Sshannon 	char	*key;
2311009Sshannon 	int	keyval;
2411009Sshannon } keyword[]	={
2511009Sshannon 	"sub", 	SUB,
2611009Sshannon 	"sup", 	SUP,
2711009Sshannon 	".EN", 	EOF,
2811009Sshannon 	"from", 	FROM,
2911009Sshannon 	"to", 	TO,
3011009Sshannon 	"sum", 	SUM,
3111009Sshannon 	"hat", 	HAT,
3211009Sshannon 	"vec", VEC,
3311009Sshannon 	"dyad", DYAD,
3411009Sshannon 	"dot", 	DOT,
3511009Sshannon 	"dotdot", 	DOTDOT,
3611009Sshannon 	"bar", 	BAR,
3711009Sshannon 	"tilde", 	TILDE,
3811009Sshannon 	"under", 	UNDER,
3911009Sshannon 	"prod", 	PROD,
4011009Sshannon 	"int", 	INT,
4111009Sshannon 	"integral", 	INT,
4211009Sshannon 	"union", 	UNION,
4311009Sshannon 	"inter", 	INTER,
4411009Sshannon 	"pile", 	PILE,
4511009Sshannon 	"lpile", 	LPILE,
4611009Sshannon 	"cpile", 	CPILE,
4711009Sshannon 	"rpile", 	RPILE,
4811009Sshannon 	"over", 	OVER,
4911009Sshannon 	"sqrt", 	SQRT,
5011009Sshannon 	"above", 	ABOVE,
5111009Sshannon 	"size", 	SIZE,
5211009Sshannon 	"font", 	FONT,
5311009Sshannon 	"fat", FAT,
5411009Sshannon 	"roman", 	ROMAN,
5511009Sshannon 	"italic", 	ITALIC,
5611009Sshannon 	"bold", 	BOLD,
5711009Sshannon 	"left", 	LEFT,
5811009Sshannon 	"right", 	RIGHT,
5911009Sshannon 	"delim", 	DELIM,
6011009Sshannon 	"define", 	DEFINE,
6111009Sshannon 
6211009Sshannon #ifdef	NEQN	/* make ndefine synonym for define, tdefine a no-op */
6311009Sshannon 
6411009Sshannon 	"tdefine",	TDEFINE,
6511009Sshannon 	"ndefine",	DEFINE,
6611009Sshannon 
6711009Sshannon #else		/* tdefine = define, ndefine = no-op */
6811009Sshannon 
6911009Sshannon 	"tdefine", 	DEFINE,
7011009Sshannon 	"ndefine", 	NDEFINE,
7111009Sshannon 
7211009Sshannon #endif
7311009Sshannon 
7411009Sshannon 	"gsize", 	GSIZE,
7511009Sshannon 	".gsize", 	GSIZE,
7611009Sshannon 	"gfont", 	GFONT,
7711009Sshannon 	"include", 	INCLUDE,
7811009Sshannon 	"up", 	UP,
7911009Sshannon 	"down", 	DOWN,
8011009Sshannon 	"fwd", 	FWD,
8111009Sshannon 	"back", 	BACK,
8211009Sshannon 	"mark", 	MARK,
8311009Sshannon 	"lineup", 	LINEUP,
8411009Sshannon 	"matrix", 	MATRIX,
8511009Sshannon 	"col", 	COL,
8611009Sshannon 	"lcol", 	LCOL,
8711009Sshannon 	"ccol", 	CCOL,
8811009Sshannon 	"rcol", 	RCOL,
8911009Sshannon 	0, 	0
9011009Sshannon };
9111009Sshannon 
9211009Sshannon struct {
9311009Sshannon 	char	*res;
9411009Sshannon 	char	*resval;
9511009Sshannon } resword[]	={
9611009Sshannon 	">=",	"\\(>=",
9711009Sshannon 	"<=",	"\\(<=",
9811009Sshannon 	"==",	"\\(==",
9911009Sshannon 	"!=",	"\\(!=",
10011009Sshannon 	"+-",	"\\(+-",
10111009Sshannon 	"->",	"\\(->",
10211009Sshannon 	"<-",	"\\(<-",
10311009Sshannon 	"inf",	"\\(if",
10411009Sshannon 	"infinity",	"\\(if",
10511009Sshannon 	"partial",	"\\(pd",
10611009Sshannon 	"half",	"\\f1\\(12\\fP",
10711009Sshannon 	"prime",	"\\f1\\(fm\\fP",
10811009Sshannon 	"dollar",	"\\f1$\\fP",
10911009Sshannon 	"nothing",	"",
11011009Sshannon 	"times",	"\\(mu",
11111009Sshannon 	"del",	"\\(gr",
11211009Sshannon 	"grad",	"\\(gr",
11311009Sshannon #ifdef	NEQN
11411009Sshannon 	"<<",	"<<",
11511009Sshannon 	">>",	">>",
11611009Sshannon 	"approx",	"~\b\\d~\\u",
11711009Sshannon 	"cdot",	"\\v'-.5'.\\v'.5'",
11811009Sshannon 	"...",	"...",
11911009Sshannon 	",...,",	",...,",
12011009Sshannon #else
12111009Sshannon 	"<<",	"<\\h'-.3m'<",
12211009Sshannon 	">>",	">\\h'-.3m'>",
12311009Sshannon 	"approx",	"\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'",
12411009Sshannon 	"cdot",	"\\v'-.3m'.\\v'.3m'",
12511009Sshannon 	"...",	"\\v'-.3m'\\ .\\ .\\ .\\ \\v'.3m'",
12611009Sshannon 	",...,",	",\\ .\\ .\\ .\\ ,\\|",
12711009Sshannon #endif
12811009Sshannon 
12911009Sshannon 	"alpha",	"\\(*a",
13011009Sshannon 	"beta",	"\\(*b",
13111009Sshannon 	"gamma",	"\\(*g",
13211009Sshannon 	"GAMMA",	"\\(*G",
13311009Sshannon 	"delta",	"\\(*d",
13411009Sshannon 	"DELTA",	"\\(*D",
13511009Sshannon 	"epsilon",	"\\(*e",
13611009Sshannon 	"EPSILON",	"\\f1E\\fP",
13711009Sshannon 	"omega",	"\\(*w",
13811009Sshannon 	"OMEGA",	"\\(*W",
13911009Sshannon 	"lambda",	"\\(*l",
14011009Sshannon 	"LAMBDA",	"\\(*L",
14111009Sshannon 	"mu",	"\\(*m",
14211009Sshannon 	"nu",	"\\(*n",
14311009Sshannon 	"theta",	"\\(*h",
14411009Sshannon 	"THETA",	"\\(*H",
14511009Sshannon 	"phi",	"\\(*f",
14611009Sshannon 	"PHI",	"\\(*F",
14711009Sshannon 	"pi",	"\\(*p",
14811009Sshannon 	"PI",	"\\(*P",
14911009Sshannon 	"sigma",	"\\(*s",
15011009Sshannon 	"SIGMA",	"\\(*S",
15111009Sshannon 	"xi",	"\\(*c",
15211009Sshannon 	"XI",	"\\(*C",
15311009Sshannon 	"zeta",	"\\(*z",
15411009Sshannon 	"iota",	"\\(*i",
15511009Sshannon 	"eta",	"\\(*y",
15611009Sshannon 	"kappa",	"\\(*k",
15711009Sshannon 	"rho",	"\\(*r",
15811009Sshannon 	"tau",	"\\(*t",
15911009Sshannon 	"omicron",	"\\(*o",
16011009Sshannon 	"upsilon",	"\\(*u",
16111009Sshannon 	"UPSILON",	"\\(*U",
16211009Sshannon 	"psi",	"\\(*q",
16311009Sshannon 	"PSI",	"\\(*Q",
16411009Sshannon 	"chi",	"\\(*x",
16511009Sshannon 	"and",	"\\f1and\\fP",
16611009Sshannon 	"for",	"\\f1for\\fP",
16711009Sshannon 	"if",	"\\f1if\\fP",
16811009Sshannon 	"Re",	"\\f1Re\\fP",
16911009Sshannon 	"Im",	"\\f1Im\\fP",
17011009Sshannon 	"sin",	"\\f1sin\\fP",
17111009Sshannon 	"cos",	"\\f1cos\\fP",
17211009Sshannon 	"tan",	"\\f1tan\\fP",
17311009Sshannon 	"sec",  "\\f1sec\\fP",
17411009Sshannon 	"csc",  "\\f1csc\\fP",
17511009Sshannon 	"arc",	"\\f1arc\\fP",
17611009Sshannon 	"asin", "\\f1asin\\fP",
17711009Sshannon 	"acos", "\\f1acos\\fP",
17811009Sshannon 	"atan", "\\f1atan\\fP",
17911009Sshannon 	"asec", "\\f1asec\\fP",
18011009Sshannon 	"acsc", "\\f1acsc\\fP",
18111009Sshannon 	"sinh",	"\\f1sinh\\fP",
18211009Sshannon 	"coth",	"\\f1coth\\fP",
18311009Sshannon 	"tanh",	"\\f1tanh\\fP",
18411009Sshannon 	"cosh",	"\\f1cosh\\fP",
18511009Sshannon 	"lim",	"\\f1lim\\fP",
18611009Sshannon 	"log",	"\\f1log\\fP",
18711009Sshannon 	"max",	"\\f1max\\fP",
18811009Sshannon 	"min",	"\\f1min\\fP",
18911009Sshannon 	"ln",	"\\f1ln\\fP",
19011009Sshannon 	"exp",	"\\f1exp\\fP",
19111009Sshannon 	"det",	"\\f1det\\fP",
19211009Sshannon 	0,	0
19311009Sshannon };
19411009Sshannon 
lookup(tblp,name,defn)19511009Sshannon tbl *lookup(tblp, name, defn)	/* find name in tbl. if defn non-null, install */
19611009Sshannon tbl **tblp;
19711009Sshannon char *name, *defn;
19811009Sshannon {
19911009Sshannon 	register tbl *p;
20011009Sshannon 	register int h;
20111009Sshannon 	register char *s = name;
20211009Sshannon 	char *malloc();
20311009Sshannon 
20411009Sshannon 	for (h = 0; *s != '\0'; )
20511009Sshannon 		h += *s++;
20611009Sshannon 	h %= TBLSIZE;
20711009Sshannon 
20811009Sshannon 	for (p = tblp[h]; p != NULL; p = p->next)
20911009Sshannon 		if (strcmp(name, p->name) == 0) {	/* found it */
21011009Sshannon 			if (defn != NULL)
21111009Sshannon 				p->defn = defn;
21211009Sshannon 			return(p);
21311009Sshannon 		}
21411009Sshannon 	/* didn't find it */
21511009Sshannon 	if (defn == NULL)
21611009Sshannon 		return(NULL);
21711009Sshannon 	p = (tbl *) malloc(sizeof (tbl));
21811009Sshannon 	if (p == NULL)
21911009Sshannon 		error(FATAL, "out of space in lookup");
22011009Sshannon 	p->name = name;
22111009Sshannon 	p->defn = defn;
22211009Sshannon 	p->next = tblp[h];
22311009Sshannon 	tblp[h] = p;
22411009Sshannon 	return(p);
22511009Sshannon }
22611009Sshannon 
init_tbl()22711009Sshannon init_tbl()	/* initialize all tables */
22811009Sshannon {
22911009Sshannon 	int i;
23011009Sshannon 
23111009Sshannon 	for (i = 0; keyword[i].key != NULL; i++)
23211009Sshannon 		lookup(keytbl, keyword[i].key, keyword[i].keyval);
23311009Sshannon 	for (i = 0; resword[i].res != NULL; i++)
23411009Sshannon 		lookup(restbl, resword[i].res, resword[i].resval);
23511009Sshannon }
236