plan9port/src/cmd/eqn/lookup.c
2004-05-16 07:57:50 +00:00

219 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 */
}