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