xref: /titanic_50/usr/src/cmd/eqn/lookup.c (revision b5cda42e4451eb63c27c9fb170e50e628aa89257)
1779fc935Sceastha /*
2779fc935Sceastha  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
3779fc935Sceastha  * Use is subject to license terms.
4779fc935Sceastha  */
5779fc935Sceastha 
67c478bd9Sstevel@tonic-gate /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
77c478bd9Sstevel@tonic-gate /*	  All Rights Reserved  	*/
87c478bd9Sstevel@tonic-gate 
97c478bd9Sstevel@tonic-gate /*
107c478bd9Sstevel@tonic-gate  * Copyright (c) 1980 Regents of the University of California.
117c478bd9Sstevel@tonic-gate  * All rights reserved. The Berkeley software License Agreement
127c478bd9Sstevel@tonic-gate  * specifies the terms and conditions for redistribution.
137c478bd9Sstevel@tonic-gate  */
147c478bd9Sstevel@tonic-gate 
15779fc935Sceastha #pragma ident	"%Z%%M%	%I%	%E% SMI"
167c478bd9Sstevel@tonic-gate 
177c478bd9Sstevel@tonic-gate #include "e.h"
187c478bd9Sstevel@tonic-gate #include "e.def"
197c478bd9Sstevel@tonic-gate #include <locale.h>
207c478bd9Sstevel@tonic-gate 
217c478bd9Sstevel@tonic-gate #define	TBLSIZE	100
227c478bd9Sstevel@tonic-gate 
237c478bd9Sstevel@tonic-gate tbl	*keytbl[TBLSIZE];	/* key words */
247c478bd9Sstevel@tonic-gate tbl	*restbl[TBLSIZE];	/* reserved words */
257c478bd9Sstevel@tonic-gate tbl	*deftbl[TBLSIZE];	/* user-defined names */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate struct {
287c478bd9Sstevel@tonic-gate 	char	*key;
297c478bd9Sstevel@tonic-gate 	int	keyval;
307c478bd9Sstevel@tonic-gate } keyword[]	= {
317c478bd9Sstevel@tonic-gate 	"sub", 	SUB,
327c478bd9Sstevel@tonic-gate 	"sup", 	SUP,
337c478bd9Sstevel@tonic-gate 	".EN", 	EOF,
347c478bd9Sstevel@tonic-gate 	"from", 	FROM,
357c478bd9Sstevel@tonic-gate 	"to", 	TO,
367c478bd9Sstevel@tonic-gate 	"sum", 	SUM,
377c478bd9Sstevel@tonic-gate 	"hat", 	HAT,
387c478bd9Sstevel@tonic-gate 	"vec", VEC,
397c478bd9Sstevel@tonic-gate 	"dyad", DYAD,
407c478bd9Sstevel@tonic-gate 	"dot", 	DOT,
417c478bd9Sstevel@tonic-gate 	"dotdot", 	DOTDOT,
427c478bd9Sstevel@tonic-gate 	"bar", 	BAR,
437c478bd9Sstevel@tonic-gate 	"tilde", 	TILDE,
447c478bd9Sstevel@tonic-gate 	"under", 	UNDER,
457c478bd9Sstevel@tonic-gate 	"prod", 	PROD,
467c478bd9Sstevel@tonic-gate 	"int", 	INT,
477c478bd9Sstevel@tonic-gate 	"integral", 	INT,
487c478bd9Sstevel@tonic-gate 	"union", 	UNION,
497c478bd9Sstevel@tonic-gate 	"inter", 	INTER,
507c478bd9Sstevel@tonic-gate 	"pile", 	PILE,
517c478bd9Sstevel@tonic-gate 	"lpile", 	LPILE,
527c478bd9Sstevel@tonic-gate 	"cpile", 	CPILE,
537c478bd9Sstevel@tonic-gate 	"rpile", 	RPILE,
547c478bd9Sstevel@tonic-gate 	"over", 	OVER,
557c478bd9Sstevel@tonic-gate 	"sqrt", 	SQRT,
567c478bd9Sstevel@tonic-gate 	"above", 	ABOVE,
577c478bd9Sstevel@tonic-gate 	"size", 	SIZE,
587c478bd9Sstevel@tonic-gate 	"font", 	FONT,
597c478bd9Sstevel@tonic-gate 	"fat", FAT,
607c478bd9Sstevel@tonic-gate 	"roman", 	ROMAN,
617c478bd9Sstevel@tonic-gate 	"italic", 	ITALIC,
627c478bd9Sstevel@tonic-gate 	"bold", 	BOLD,
637c478bd9Sstevel@tonic-gate 	"left", 	LEFT,
647c478bd9Sstevel@tonic-gate 	"right", 	RIGHT,
657c478bd9Sstevel@tonic-gate 	"delim", 	DELIM,
667c478bd9Sstevel@tonic-gate 	"define", 	DEFINE,
677c478bd9Sstevel@tonic-gate 
687c478bd9Sstevel@tonic-gate #ifdef	NEQN	/* make ndefine synonym for define, tdefine a no-op */
697c478bd9Sstevel@tonic-gate 
707c478bd9Sstevel@tonic-gate 	"tdefine",	TDEFINE,
717c478bd9Sstevel@tonic-gate 	"ndefine",	DEFINE,
727c478bd9Sstevel@tonic-gate 
737c478bd9Sstevel@tonic-gate #else		/* tdefine = define, ndefine = no-op */
747c478bd9Sstevel@tonic-gate 
757c478bd9Sstevel@tonic-gate 	"tdefine", 	DEFINE,
767c478bd9Sstevel@tonic-gate 	"ndefine", 	NDEFINE,
777c478bd9Sstevel@tonic-gate 
787c478bd9Sstevel@tonic-gate #endif
797c478bd9Sstevel@tonic-gate 
807c478bd9Sstevel@tonic-gate 	"gsize", 	GSIZE,
817c478bd9Sstevel@tonic-gate 	".gsize", 	GSIZE,
827c478bd9Sstevel@tonic-gate 	"gfont", 	GFONT,
837c478bd9Sstevel@tonic-gate 	"include", 	INCLUDE,
847c478bd9Sstevel@tonic-gate 	"up", 	UP,
857c478bd9Sstevel@tonic-gate 	"down", 	DOWN,
867c478bd9Sstevel@tonic-gate 	"fwd", 	FWD,
877c478bd9Sstevel@tonic-gate 	"back", 	BACK,
887c478bd9Sstevel@tonic-gate 	"mark", 	MARK,
897c478bd9Sstevel@tonic-gate 	"lineup", 	LINEUP,
907c478bd9Sstevel@tonic-gate 	"matrix", 	MATRIX,
917c478bd9Sstevel@tonic-gate 	"col", 	COL,
927c478bd9Sstevel@tonic-gate 	"lcol", 	LCOL,
937c478bd9Sstevel@tonic-gate 	"ccol", 	CCOL,
947c478bd9Sstevel@tonic-gate 	"rcol", 	RCOL,
957c478bd9Sstevel@tonic-gate 	0, 	0
967c478bd9Sstevel@tonic-gate };
977c478bd9Sstevel@tonic-gate 
987c478bd9Sstevel@tonic-gate struct {
997c478bd9Sstevel@tonic-gate 	char	*res;
1007c478bd9Sstevel@tonic-gate 	char	*resval;
1017c478bd9Sstevel@tonic-gate } resword[]	= {
1027c478bd9Sstevel@tonic-gate 	">=",	"\\(>=",
1037c478bd9Sstevel@tonic-gate 	"<=",	"\\(<=",
1047c478bd9Sstevel@tonic-gate 	"==",	"\\(==",
1057c478bd9Sstevel@tonic-gate 	"!=",	"\\(!=",
1067c478bd9Sstevel@tonic-gate 	"+-",	"\\(+-",
1077c478bd9Sstevel@tonic-gate 	"->",	"\\(->",
1087c478bd9Sstevel@tonic-gate 	"<-",	"\\(<-",
1097c478bd9Sstevel@tonic-gate 	"inf",	"\\(if",
1107c478bd9Sstevel@tonic-gate 	"infinity",	"\\(if",
1117c478bd9Sstevel@tonic-gate 	"partial",	"\\(pd",
1127c478bd9Sstevel@tonic-gate 	"half",	"\\f1\\(12\\fP",
1137c478bd9Sstevel@tonic-gate 	"prime",	"\\f1\\(fm\\fP",
1147c478bd9Sstevel@tonic-gate 	"dollar",	"\\f1$\\fP",
1157c478bd9Sstevel@tonic-gate 	"nothing",	"",
1167c478bd9Sstevel@tonic-gate 	"times",	"\\(mu",
1177c478bd9Sstevel@tonic-gate 	"del",	"\\(gr",
1187c478bd9Sstevel@tonic-gate 	"grad",	"\\(gr",
1197c478bd9Sstevel@tonic-gate #ifdef	NEQN
1207c478bd9Sstevel@tonic-gate 	"<<",	"<<",
1217c478bd9Sstevel@tonic-gate 	">>",	">>",
1227c478bd9Sstevel@tonic-gate 	"approx",	"~\b\\d~\\u",
1237c478bd9Sstevel@tonic-gate 	"cdot",	"\\v'-.5'.\\v'.5'",
1247c478bd9Sstevel@tonic-gate 	"...",	"...",
1257c478bd9Sstevel@tonic-gate 	",...,",	",...,",
1267c478bd9Sstevel@tonic-gate #else
1277c478bd9Sstevel@tonic-gate 	"<<",	"<\\h'-.3m'<",
1287c478bd9Sstevel@tonic-gate 	">>",	">\\h'-.3m'>",
1297c478bd9Sstevel@tonic-gate 	"approx",	"\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'",
1307c478bd9Sstevel@tonic-gate 	"cdot",	"\\v'-.3m'.\\v'.3m'",
1317c478bd9Sstevel@tonic-gate 	"...",	"\\v'-.3m'\\ .\\ .\\ .\\ \\v'.3m'",
1327c478bd9Sstevel@tonic-gate 	",...,",	",\\ .\\ .\\ .\\ ,\\|",
1337c478bd9Sstevel@tonic-gate #endif
1347c478bd9Sstevel@tonic-gate 
1357c478bd9Sstevel@tonic-gate 	"alpha",	"\\(*a",
1367c478bd9Sstevel@tonic-gate 	"beta",	"\\(*b",
1377c478bd9Sstevel@tonic-gate 	"gamma",	"\\(*g",
1387c478bd9Sstevel@tonic-gate 	"GAMMA",	"\\(*G",
1397c478bd9Sstevel@tonic-gate 	"delta",	"\\(*d",
1407c478bd9Sstevel@tonic-gate 	"DELTA",	"\\(*D",
1417c478bd9Sstevel@tonic-gate 	"epsilon",	"\\(*e",
1427c478bd9Sstevel@tonic-gate 	"EPSILON",	"\\f1E\\fP",
1437c478bd9Sstevel@tonic-gate 	"omega",	"\\(*w",
1447c478bd9Sstevel@tonic-gate 	"OMEGA",	"\\(*W",
1457c478bd9Sstevel@tonic-gate 	"lambda",	"\\(*l",
1467c478bd9Sstevel@tonic-gate 	"LAMBDA",	"\\(*L",
1477c478bd9Sstevel@tonic-gate 	"mu",	"\\(*m",
1487c478bd9Sstevel@tonic-gate 	"nu",	"\\(*n",
1497c478bd9Sstevel@tonic-gate 	"theta",	"\\(*h",
1507c478bd9Sstevel@tonic-gate 	"THETA",	"\\(*H",
1517c478bd9Sstevel@tonic-gate 	"phi",	"\\(*f",
1527c478bd9Sstevel@tonic-gate 	"PHI",	"\\(*F",
1537c478bd9Sstevel@tonic-gate 	"pi",	"\\(*p",
1547c478bd9Sstevel@tonic-gate 	"PI",	"\\(*P",
1557c478bd9Sstevel@tonic-gate 	"sigma",	"\\(*s",
1567c478bd9Sstevel@tonic-gate 	"SIGMA",	"\\(*S",
1577c478bd9Sstevel@tonic-gate 	"xi",	"\\(*c",
1587c478bd9Sstevel@tonic-gate 	"XI",	"\\(*C",
1597c478bd9Sstevel@tonic-gate 	"zeta",	"\\(*z",
1607c478bd9Sstevel@tonic-gate 	"iota",	"\\(*i",
1617c478bd9Sstevel@tonic-gate 	"eta",	"\\(*y",
1627c478bd9Sstevel@tonic-gate 	"kappa",	"\\(*k",
1637c478bd9Sstevel@tonic-gate 	"rho",	"\\(*r",
1647c478bd9Sstevel@tonic-gate 	"tau",	"\\(*t",
1657c478bd9Sstevel@tonic-gate 	"omicron",	"\\(*o",
1667c478bd9Sstevel@tonic-gate 	"upsilon",	"\\(*u",
1677c478bd9Sstevel@tonic-gate 	"UPSILON",	"\\(*U",
1687c478bd9Sstevel@tonic-gate 	"psi",	"\\(*q",
1697c478bd9Sstevel@tonic-gate 	"PSI",	"\\(*Q",
1707c478bd9Sstevel@tonic-gate 	"chi",	"\\(*x",
1717c478bd9Sstevel@tonic-gate 	"and",	"\\f1and\\fP",
1727c478bd9Sstevel@tonic-gate 	"for",	"\\f1for\\fP",
1737c478bd9Sstevel@tonic-gate 	"if",	"\\f1if\\fP",
1747c478bd9Sstevel@tonic-gate 	"Re",	"\\f1Re\\fP",
1757c478bd9Sstevel@tonic-gate 	"Im",	"\\f1Im\\fP",
1767c478bd9Sstevel@tonic-gate 	"sin",	"\\f1sin\\fP",
1777c478bd9Sstevel@tonic-gate 	"cos",	"\\f1cos\\fP",
1787c478bd9Sstevel@tonic-gate 	"tan",	"\\f1tan\\fP",
1797c478bd9Sstevel@tonic-gate 	"sec",  "\\f1sec\\fP",
1807c478bd9Sstevel@tonic-gate 	"csc",  "\\f1csc\\fP",
1817c478bd9Sstevel@tonic-gate 	"arc",	"\\f1arc\\fP",
1827c478bd9Sstevel@tonic-gate 	"asin", "\\f1asin\\fP",
1837c478bd9Sstevel@tonic-gate 	"acos", "\\f1acos\\fP",
1847c478bd9Sstevel@tonic-gate 	"atan", "\\f1atan\\fP",
1857c478bd9Sstevel@tonic-gate 	"asec", "\\f1asec\\fP",
1867c478bd9Sstevel@tonic-gate 	"acsc", "\\f1acsc\\fP",
1877c478bd9Sstevel@tonic-gate 	"sinh",	"\\f1sinh\\fP",
1887c478bd9Sstevel@tonic-gate 	"coth",	"\\f1coth\\fP",
1897c478bd9Sstevel@tonic-gate 	"tanh",	"\\f1tanh\\fP",
1907c478bd9Sstevel@tonic-gate 	"cosh",	"\\f1cosh\\fP",
1917c478bd9Sstevel@tonic-gate 	"lim",	"\\f1lim\\fP",
1927c478bd9Sstevel@tonic-gate 	"log",	"\\f1log\\fP",
1937c478bd9Sstevel@tonic-gate 	"max",	"\\f1max\\fP",
1947c478bd9Sstevel@tonic-gate 	"min",	"\\f1min\\fP",
1957c478bd9Sstevel@tonic-gate 	"ln",	"\\f1ln\\fP",
1967c478bd9Sstevel@tonic-gate 	"exp",	"\\f1exp\\fP",
1977c478bd9Sstevel@tonic-gate 	"det",	"\\f1det\\fP",
1987c478bd9Sstevel@tonic-gate 	0,	0
1997c478bd9Sstevel@tonic-gate };
2007c478bd9Sstevel@tonic-gate 
201779fc935Sceastha /* find name in tbl. if defn non-null, install */
202779fc935Sceastha tbl *
lookup(tbl * tblp[],char * name,char * defn)203*b5cda42eSceastha lookup(tbl *tblp[], char *name, char *defn)
2047c478bd9Sstevel@tonic-gate {
205779fc935Sceastha 	tbl *p;
206779fc935Sceastha 	int h;
207779fc935Sceastha 	unsigned char *s = (unsigned char *)name;
2087c478bd9Sstevel@tonic-gate 	char *malloc();
2097c478bd9Sstevel@tonic-gate 
2107c478bd9Sstevel@tonic-gate 	for (h = 0; *s != '\0'; )
2117c478bd9Sstevel@tonic-gate 		h += *s++;
2127c478bd9Sstevel@tonic-gate 	h %= TBLSIZE;
2137c478bd9Sstevel@tonic-gate 
2147c478bd9Sstevel@tonic-gate 	for (p = tblp[h]; p != NULL; p = p->next)
2157c478bd9Sstevel@tonic-gate 		if (strcmp(name, p->name) == 0) {	/* found it */
2167c478bd9Sstevel@tonic-gate 			if (defn != NULL)
2177c478bd9Sstevel@tonic-gate 				p->defn = defn;
2187c478bd9Sstevel@tonic-gate 			return (p);
2197c478bd9Sstevel@tonic-gate 		}
2207c478bd9Sstevel@tonic-gate 	/* didn't find it */
2217c478bd9Sstevel@tonic-gate 	if (defn == NULL)
2227c478bd9Sstevel@tonic-gate 		return (NULL);
2237c478bd9Sstevel@tonic-gate 	p = (tbl *) malloc(sizeof (tbl));
2247c478bd9Sstevel@tonic-gate 	if (p == NULL)
225779fc935Sceastha 		error(FATAL, gettext("out of space in lookup"), NULL);
2267c478bd9Sstevel@tonic-gate 	p->name = name;
2277c478bd9Sstevel@tonic-gate 	p->defn = defn;
2287c478bd9Sstevel@tonic-gate 	p->next = tblp[h];
2297c478bd9Sstevel@tonic-gate 	tblp[h] = p;
2307c478bd9Sstevel@tonic-gate 	return (p);
2317c478bd9Sstevel@tonic-gate }
2327c478bd9Sstevel@tonic-gate 
233779fc935Sceastha void
init_tbl(void)234779fc935Sceastha init_tbl(void)	/* initialize all tables */
2357c478bd9Sstevel@tonic-gate {
2367c478bd9Sstevel@tonic-gate 	int i;
2377c478bd9Sstevel@tonic-gate 
2387c478bd9Sstevel@tonic-gate 	for (i = 0; keyword[i].key != NULL; i++)
239779fc935Sceastha 		lookup(keytbl, keyword[i].key, (char *)keyword[i].keyval);
2407c478bd9Sstevel@tonic-gate 	for (i = 0; resword[i].res != NULL; i++)
2417c478bd9Sstevel@tonic-gate 		lookup(restbl, resword[i].res, resword[i].resval);
2427c478bd9Sstevel@tonic-gate }
243