#include "e.h"
#include "y.tab.h"
tbl *keytbl[TBLSIZE]; /* key words */
tbl *restbl[TBLSIZE]; /* reserved words */
tbl *deftbl[TBLSIZE]; /* user-defined names */
struct keyword {
char *key;
int keyval;
} keyword[] ={
"sub", SUB,
"sup", SUP,
".EN", DOTEN,
".EQ", DOTEQ,
"from", FROM,
"to", TO,
"sum", SUM,
"hat", HAT,
"vec", VEC,
"dyad", DYAD,
"dot", DOT,
"dotdot", DOTDOT,
"bar", BAR,
"lowbar", LOWBAR,
"highbar", HIGHBAR,
"tilde", TILDE,
"utilde", UTILDE,
"under", UNDER,
"prod", PROD,
"int", INT,
"integral", INT,
"union", UNION,
"inter", INTER,
"matrix", MATRIX,
"col", COL,
"lcol", LCOL,
"ccol", CCOL,
"rcol", RCOL,
"pile", COL, /* synonyms ... */
"lpile", LCOL,
"cpile", CCOL,
"rpile", RCOL,
"over", OVER,
"sqrt", SQRT,
"above", ABOVE,
"size", SIZE,
"font", FONT,
"fat", FAT,
"roman", ROMAN,
"italic", ITALIC,
"bold", BOLD,
"left", LEFT,
"right", RIGHT,
"delim", DELIM,
"define", DEFINE,
"tdefine", DEFINE,
"ndefine", NDEFINE,
"ifdef", IFDEF,
"gsize", GSIZE,
".gsize", GSIZE,
"gfont", GFONT,
"include", INCLUDE,
"copy", INCLUDE,
"space", SPACE,
"up", UP,
"down", DOWN,
"fwd", FWD,
"back", BACK,
"mark", MARK,
"lineup", LINEUP,
0, 0
};
struct resword {
char *res;
char *resval;
} resword[] ={
">=", "\\(>=",
"<=", "\\(<=",
"==", "\\(==",
"!=", "\\(!=",
"+-", "\\(+-",
"->", "\\(->",
"<-", "\\(<-",
"inf", "\\(if",
"infinity", "\\(if",
"partial", "\\(pd",
"half", "\\f1\\(12\\fP",
"prime", "\\f1\\v'.5m'\\s+3\\(fm\\s-3\\v'-.5m'\\fP",
"dollar", "\\f1$\\fP",
"nothing", "",
"times", "\\(mu",
"del", "\\(gr",
"grad", "\\(gr",
"approx", "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'",
"cdot", "\\v'-.3m'.\\v'.3m'",
"...", "\\v'-.25m'\\ .\\ .\\ .\\ \\v'.25m'",
",...,", "\\f1,\\fP\\ .\\ .\\ .\\ \\f1,\\fP\\|",
"alpha", "α",
"ALPHA", "Α",
"beta", "β",
"BETA", "Β",
"gamma", "γ",
"GAMMA", "Γ",
"delta", "δ",
"DELTA", "Δ",
"epsilon", "ε",
"EPSILON", "Ε",
"omega", "ω",
"OMEGA", "Ω",
"lambda", "λ",
"LAMBDA", "Λ",
"mu", "μ",
"MU", "Μ",
"nu", "ν",
"NU", "Ν",
"theta", "θ",
"THETA", "Θ",
"phi", "φ",
"PHI", "Φ",
"pi", "π",
"PI", "Π",
"sigma", "σ",
"SIGMA", "Σ",
"xi", "ξ",
"XI", "Ξ",
"zeta", "ζ",
"ZETA", "Ζ",
"iota", "ι",
"IOTA", "Ι",
"eta", "η",
"ETA", "Η",
"kappa", "κ",
"KAPPA", "Κ",
"rho", "ρ",
"RHO", "Ρ",
"tau", "τ",
"TAU", "Τ",
"omicron", "ο",
"OMICRON", "Ο",
"upsilon", "υ",
"UPSILON", "Υ",
"psi", "ψ",
"PSI", "Ψ",
"chi", "χ",
"CHI", "Χ",
"and", "\\f1and\\fP",
"for", "\\f1for\\fP",
"if", "\\f1if\\fP",
"Re", "\\f1Re\\fP",
"Im", "\\f1Im\\fP",
"sin", "\\f1sin\\fP",
"cos", "\\f1cos\\fP",
"tan", "\\f1tan\\fP",
"arc", "\\f1arc\\fP",
"sinh", "\\f1sinh\\fP",
"coth", "\\f1coth\\fP",
"tanh", "\\f1tanh\\fP",
"cosh", "\\f1cosh\\fP",
"lim", "\\f1lim\\fP",
"log", "\\f1log\\fP",
"ln", "\\f1ln\\fP",
"max", "\\f1max\\fP",
"min", "\\f1min\\fP",
"exp", "\\f1exp\\fP",
"det", "\\f1det\\fP",
0, 0
};
int hash(char *s)
{
register unsigned int h;
for (h = 0; *s != '\0'; )
h += *s++;
h %= TBLSIZE;
return h;
}
tbl *lookup(tbl **tblp, char *name) /* find name in tbl */
{
register tbl *p;
for (p = tblp[hash(name)]; p != NULL; p = p->next)
if (strcmp(name, p->name) == 0)
return(p);
return(NULL);
}
void install(tbl **tblp, char *name, char *cval, int ival) /* install name, vals in tblp */
{
register tbl *p;
int h;
if ((p = lookup(tblp, name)) == NULL) {
p = (tbl *) malloc(sizeof(tbl));
if (p == NULL)
ERROR "out of space in install" FATAL;
h = hash(name); /* bad visibility here */
p->name = name;
p->next = tblp[h];
tblp[h] = p;
}
p->cval = cval;
p->ival = ival;
}
void init_tbl(void) /* initialize tables */
{
int i;
extern int init_tune(void);
for (i = 0; keyword[i].key != NULL; i++)
install(keytbl, keyword[i].key, (char *) 0, keyword[i].keyval);
for (i = 0; resword[i].res != NULL; i++)
install(restbl, resword[i].res, resword[i].resval, 0);
init_tune(); /* tuning table done in tuning.c */
}
|