219 lines
4.1 KiB
C
219 lines
4.1 KiB
C
#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 */
|
||
}
|