1 #ifndef lint 2 static char sccsid[] = "@(#)lookup.c 2.2 (CWI) 87/04/01"; 3 #endif lint 4 # include "e.h" 5 #include "y.tab.h" 6 7 #define TBLSIZE 100 8 9 tbl *keytbl[TBLSIZE]; /* key words */ 10 tbl *restbl[TBLSIZE]; /* reserved words */ 11 tbl *deftbl[TBLSIZE]; /* user-defined names */ 12 13 struct { 14 char *key; 15 int keyval; 16 } keyword[] ={ 17 "sub", SUB, 18 "sup", SUP, 19 ".EN", DOTEN, 20 ".EQ", DOTEQ, 21 "from", FROM, 22 "to", TO, 23 "sum", SUM, 24 "hat", HAT, 25 "vec", VEC, 26 "dyad", DYAD, 27 "dot", DOT, 28 "dotdot", DOTDOT, 29 "bar", BAR, 30 "lowbar", LOWBAR, 31 "highbar", HIGHBAR, 32 "tilde", TILDE, 33 "utilde", UTILDE, 34 "under", UNDER, 35 "prod", PROD, 36 "int", INT, 37 "integral", INT, 38 "union", UNION, 39 "inter", INTER, 40 "matrix", MATRIX, 41 "col", COL, 42 "lcol", LCOL, 43 "ccol", CCOL, 44 "rcol", RCOL, 45 "pile", COL, /* synonyms ... */ 46 "lpile", LCOL, 47 "cpile", CCOL, 48 "rpile", RCOL, 49 "over", OVER, 50 "sqrt", SQRT, 51 "above", ABOVE, 52 "size", SIZE, 53 "font", FONT, 54 "fat", FAT, 55 "roman", ROMAN, 56 "italic", ITALIC, 57 "bold", BOLD, 58 "left", LEFT, 59 "right", RIGHT, 60 "delim", DELIM, 61 "define", DEFINE, 62 63 #ifdef NEQN /* make ndefine synonym for define, tdefine a no-op */ 64 65 "tdefine", TDEFINE, 66 "ndefine", DEFINE, 67 68 #else /* tdefine = define, ndefine = no-op */ 69 70 "tdefine", DEFINE, 71 "ndefine", NDEFINE, 72 73 #endif 74 75 "ifdef", IFDEF, 76 "gsize", GSIZE, 77 ".gsize", GSIZE, 78 "gfont", GFONT, 79 "include", INCLUDE, 80 "copy", INCLUDE, 81 "space", SPACE, 82 "up", UP, 83 "down", DOWN, 84 "fwd", FWD, 85 "back", BACK, 86 "mark", MARK, 87 "lineup", LINEUP, 88 0, 0 89 }; 90 91 struct { 92 char *res; 93 char *resval; 94 } resword[] ={ 95 ">=", "\\(>=", 96 "<=", "\\(<=", 97 "==", "\\(==", 98 "!=", "\\(!=", 99 "+-", "\\(+-", 100 "->", "\\(->", 101 "<-", "\\(<-", 102 "inf", "\\(if", 103 "infinity", "\\(if", 104 "partial", "\\(pd", 105 "half", "\\f1\\(12\\fP", 106 "prime", "\\f1\\(fm\\fP", 107 "dollar", "\\f1$\\fP", 108 "nothing", "", 109 "times", "\\(mu", 110 "del", "\\(gr", 111 "grad", "\\(gr", 112 113 #ifdef NEQN 114 "<<", "<<", 115 ">>", ">>", 116 "approx", "~\b\\d~\\u", 117 "cdot", "\\v'-.5'.\\v'.5'", 118 "...", "...", 119 ",...,", ",...,", 120 #else 121 "<<", "<\\h'-.3m'<", 122 ">>", ">\\h'-.3m'>", 123 "approx", "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'", 124 "cdot", "\\v'-.3m'.\\v'.3m'", 125 "...", "\\v'-.3m'\\ .\\ .\\ .\\ \\v'.3m'", 126 ",...,", "\\f1,\\fP\\ .\\ .\\ .\\ \\f1,\\fP\\|", 127 #endif 128 129 "alpha", "\\(*a", 130 "beta", "\\(*b", 131 "gamma", "\\(*g", 132 "GAMMA", "\\(*G", 133 "delta", "\\(*d", 134 "DELTA", "\\(*D", 135 "epsilon", "\\(*e", 136 "EPSILON", "\\f1E\\fP", 137 "omega", "\\(*w", 138 "OMEGA", "\\(*W", 139 "lambda", "\\(*l", 140 "LAMBDA", "\\(*L", 141 "mu", "\\(*m", 142 "nu", "\\(*n", 143 "theta", "\\(*h", 144 "THETA", "\\(*H", 145 "phi", "\\(*f", 146 "PHI", "\\(*F", 147 "pi", "\\(*p", 148 "PI", "\\(*P", 149 "sigma", "\\(*s", 150 "SIGMA", "\\(*S", 151 "xi", "\\(*c", 152 "XI", "\\(*C", 153 "zeta", "\\(*z", 154 "iota", "\\(*i", 155 "eta", "\\(*y", 156 "kappa", "\\(*k", 157 "rho", "\\(*r", 158 "tau", "\\(*t", 159 "omicron", "\\(*o", 160 "upsilon", "\\(*u", 161 "UPSILON", "\\(*U", 162 "psi", "\\(*q", 163 "PSI", "\\(*Q", 164 "chi", "\\(*x", 165 "and", "\\f1and\\fP", 166 "for", "\\f1for\\fP", 167 "if", "\\f1if\\fP", 168 "Re", "\\f1Re\\fP", 169 "Im", "\\f1Im\\fP", 170 "sin", "\\f1sin\\fP", 171 "cos", "\\f1cos\\fP", 172 "tan", "\\f1tan\\fP", 173 "arc", "\\f1arc\\fP", 174 "sinh", "\\f1sinh\\fP", 175 "coth", "\\f1coth\\fP", 176 "tanh", "\\f1tanh\\fP", 177 "cosh", "\\f1cosh\\fP", 178 "lim", "\\f1lim\\fP", 179 "log", "\\f1log\\fP", 180 "max", "\\f1max\\fP", 181 "min", "\\f1min\\fP", 182 "ln", "\\f1ln\\fP", 183 "exp", "\\f1exp\\fP", 184 "det", "\\f1det\\fP", 185 0, 0 186 }; 187 188 tbl *lookup(tblp, name, defn) /* find name in tbl. if defn non-null, install */ 189 tbl **tblp; 190 char *name, *defn; 191 { 192 register tbl *p; 193 register int h; 194 register char *s = name; 195 196 for (h = 0; *s != '\0'; ) 197 h += *s++; 198 h %= TBLSIZE; 199 200 for (p = tblp[h]; p != NULL; p = p->next) 201 if (strcmp(name, p->name) == 0) { /* found it */ 202 if (defn != NULL) 203 p->defn = defn; 204 return(p); 205 } 206 /* didn't find it */ 207 if (defn == NULL) 208 return(NULL); 209 p = (tbl *) malloc(sizeof (tbl)); 210 if (p == NULL) 211 error(FATAL, "out of space in lookup"); 212 p->name = name; 213 p->defn = defn; 214 p->next = tblp[h]; 215 tblp[h] = p; 216 return(p); 217 } 218 219 init_tbl() /* initialize all tables */ 220 { 221 int i; 222 223 for (i = 0; keyword[i].key != NULL; i++) 224 lookup(keytbl, keyword[i].key, keyword[i].keyval); 225 for (i = 0; resword[i].res != NULL; i++) 226 lookup(restbl, resword[i].res, resword[i].resval); 227 } 228