Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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