lookup.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 }