URI:
       tlookup.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tlookup.c (4962B)
       ---
            1 #include "e.h"
            2 #include "y.tab.h"
            3 
            4 tbl        *keytbl[TBLSIZE];        /* key words */
            5 tbl        *restbl[TBLSIZE];        /* reserved words */
            6 tbl        *deftbl[TBLSIZE];        /* user-defined names */
            7 
            8 struct keyword {
            9         char        *key;
           10         int        keyval;
           11 } keyword[]        ={
           12         { "sub",         SUB, },
           13         { "sup",         SUP, },
           14         { ".EN",         DOTEN, },
           15         { ".EQ",         DOTEQ, },
           16         { "from",         FROM, },
           17         { "to",                 TO, },
           18         { "sum",         SUM, },
           19         { "hat",         HAT, },
           20         { "vec",         VEC, },
           21         { "dyad",         DYAD, },
           22         { "dot",         DOT, },
           23         { "dotdot",         DOTDOT, },
           24         { "bar",         BAR, },
           25         { "lowbar",         LOWBAR, },
           26         { "highbar",         HIGHBAR, },
           27         { "tilde",         TILDE, },
           28         { "utilde",         UTILDE, },
           29         { "under",         UNDER, },
           30         { "prod",         PROD, },
           31         { "int",         INT, },
           32         { "integral",         INT, },
           33         { "union",         UNION, },
           34         { "inter",         INTER, },
           35         { "matrix",         MATRIX, },
           36         { "col",         COL, },
           37         { "lcol",         LCOL, },
           38         { "ccol",         CCOL, },
           39         { "rcol",         RCOL, },
           40         { "pile",         COL },  /* synonyms ... */
           41         { "lpile",         LCOL, },
           42         { "cpile",         CCOL, },
           43         { "rpile",         RCOL, },
           44         { "over",         OVER, },
           45         { "sqrt",         SQRT, },
           46         { "above",         ABOVE, },
           47         { "size",         SIZE, },
           48         { "font",         FONT, },
           49         { "fat",         FAT, },
           50         { "roman",         ROMAN, },
           51         { "italic",         ITALIC, },
           52         { "bold",         BOLD, },
           53         { "left",         LEFT, },
           54         { "right",         RIGHT, },
           55         { "delim",         DELIM, },
           56         { "define",         DEFINE, },
           57         { "tdefine",         DEFINE, },
           58         { "ndefine",         NDEFINE, },
           59         { "ifdef",         IFDEF, },
           60         { "gsize",         GSIZE, },
           61         { ".gsize",         GSIZE, },
           62         { "gfont",         GFONT, },
           63         { "include",         INCLUDE, },
           64         { "copy",         INCLUDE, },
           65         { "space",         SPACE, },
           66         { "up",                 UP, },
           67         { "down",         DOWN, },
           68         { "fwd",         FWD, },
           69         { "back",         BACK, },
           70         { "mark",         MARK, },
           71         { "lineup",         LINEUP, },
           72         { 0,         0 }
           73 };
           74 
           75 struct resword {
           76         char        *res;
           77         char        *resval;
           78 } resword[]        ={
           79         { ">=",         "\\(>=", },
           80         { "<=",         "\\(<=", },
           81         { "==",         "\\(==", },
           82         { "!=",         "\\(!=", },
           83         { "+-",         "\\(+-", },
           84         { "->",         "\\(->", },
           85         { "<-",         "\\(<-", },
           86         { "inf",         "\\(if", },
           87         { "infinity",         "\\(if", },
           88         { "partial",         "\\(pd", },
           89         { "half",         "\\f1\\(12\\fP", },
           90         { "prime",         "\\f1\\v'.5m'\\s+3\\(fm\\s-3\\v'-.5m'\\fP", },
           91         { "dollar",         "\\f1$\\fP", },
           92         { "nothing",         "", },
           93         { "times",         "\\(mu", },
           94         { "del",         "\\(gr", },
           95         { "grad",         "\\(gr", },
           96         { "approx",         "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'", },
           97         { "cdot",         "\\v'-.3m'.\\v'.3m'", },
           98         { "...",         "\\v'-.25m'\\ .\\ .\\ .\\ \\v'.25m'", },
           99         { ",...,",         "\\f1,\\fP\\ .\\ .\\ .\\ \\f1,\\fP\\|", },
          100         { "alpha",         "α", },
          101         { "ALPHA",         "Α", },
          102         { "beta",         "β", },
          103         { "BETA",         "Β", },
          104         { "gamma",         "γ", },
          105         { "GAMMA",         "Γ", },
          106         { "delta",         "δ", },
          107         { "DELTA",         "Δ", },
          108         { "epsilon",         "ε", },
          109         { "EPSILON",         "Ε", },
          110         { "omega",         "ω", },
          111         { "OMEGA",         "Ω", },
          112         { "lambda",         "λ", },
          113         { "LAMBDA",         "Λ", },
          114         { "mu",         "μ", },
          115         { "MU",         "Μ", },
          116         { "nu",         "ν", },
          117         { "NU",         "Ν", },
          118         { "theta",         "θ", },
          119         { "THETA",         "Θ", },
          120         { "phi",         "φ", },
          121         { "PHI",         "Φ", },
          122         { "pi",         "π", },
          123         { "PI",         "Π", },
          124         { "sigma",         "σ", },
          125         { "SIGMA",         "Σ", },
          126         { "xi",         "ξ", },
          127         { "XI",         "Ξ", },
          128         { "zeta",         "ζ", },
          129         { "ZETA",         "Ζ", },
          130         { "iota",         "ι", },
          131         { "IOTA",         "Ι", },
          132         { "eta",         "η", },
          133         { "ETA",         "Η", },
          134         { "kappa",         "κ", },
          135         { "KAPPA",         "Κ", },
          136         { "rho",         "ρ", },
          137         { "RHO",         "Ρ", },
          138         { "tau",         "τ", },
          139         { "TAU",         "Τ", },
          140         { "omicron",         "ο", },
          141         { "OMICRON",         "Ο", },
          142         { "upsilon",         "υ", },
          143         { "UPSILON",         "Υ", },
          144         { "psi",         "ψ", },
          145         { "PSI",         "Ψ", },
          146         { "chi",         "χ", },
          147         { "CHI",         "Χ", },
          148         { "and",         "\\f1and\\fP", },
          149         { "for",         "\\f1for\\fP", },
          150         { "if",         "\\f1if\\fP", },
          151         { "Re",         "\\f1Re\\fP", },
          152         { "Im",         "\\f1Im\\fP", },
          153         { "sin",         "\\f1sin\\fP", },
          154         { "cos",         "\\f1cos\\fP", },
          155         { "tan",         "\\f1tan\\fP", },
          156         { "arc",         "\\f1arc\\fP", },
          157         { "sinh",         "\\f1sinh\\fP", },
          158         { "coth",         "\\f1coth\\fP", },
          159         { "tanh",         "\\f1tanh\\fP", },
          160         { "cosh",         "\\f1cosh\\fP", },
          161         { "lim",         "\\f1lim\\fP", },
          162         { "log",         "\\f1log\\fP", },
          163         { "ln",         "\\f1ln\\fP", },
          164         { "max",         "\\f1max\\fP", },
          165         { "min",         "\\f1min\\fP", },
          166         { "exp",         "\\f1exp\\fP", },
          167         { "det",         "\\f1det\\fP", },
          168         { 0,        0 }
          169 };
          170 
          171 int hash(char *s)
          172 {
          173         register unsigned int h;
          174 
          175         for (h = 0; *s != '\0'; )
          176                 h += *s++;
          177         h %= TBLSIZE;
          178         return h;
          179 }
          180 
          181 tbl *lookup(tbl **tblp, char *name)        /* find name in tbl */
          182 {
          183         register tbl *p;
          184 
          185         for (p = tblp[hash(name)]; p != NULL; p = p->next)
          186                 if (strcmp(name, p->name) == 0)
          187                         return(p);
          188         return(NULL);
          189 }
          190 
          191 void install(tbl **tblp, char *name, char *cval, int ival)        /* install name, vals in tblp */
          192 {
          193         register tbl *p;
          194         int h;
          195 
          196         if ((p = lookup(tblp, name)) == NULL) {
          197                 p = (tbl *) malloc(sizeof(tbl));
          198                 if (p == NULL)
          199                         ERROR "out of space in install" FATAL;
          200                 h = hash(name);        /* bad visibility here */
          201                 p->name = name;
          202                 p->next = tblp[h];
          203                 tblp[h] = p;
          204         }
          205         p->cval = cval;
          206         p->ival = ival;
          207 }
          208 
          209 void init_tbl(void)        /* initialize tables */
          210 {
          211         int i;
          212         extern int init_tune(void);
          213 
          214         for (i = 0; keyword[i].key != NULL; i++)
          215                 install(keytbl, keyword[i].key, (char *) 0, keyword[i].keyval);
          216         for (i = 0; resword[i].res != NULL; i++)
          217                 install(restbl, resword[i].res, resword[i].resval, 0);
          218         init_tune();        /* tuning table done in tuning.c */
          219 }