mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
220 lines
4.1 KiB
C
220 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 */
|
|||
|
}
|