1 #ifndef lint 2 static char sccsid[] = "@(#)lookup.c 4.2 08/11/83"; 3 #endif 4 5 # include "e.h" 6 #include "e.def" 7 8 #define TBLSIZE 100 9 10 tbl *keytbl[TBLSIZE]; /* key words */ 11 tbl *restbl[TBLSIZE]; /* reserved words */ 12 tbl *deftbl[TBLSIZE]; /* user-defined names */ 13 14 struct { 15 char *key; 16 int keyval; 17 } keyword[] ={ 18 "sub", SUB, 19 "sup", SUP, 20 ".EN", EOF, 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 "tilde", TILDE, 31 "under", UNDER, 32 "prod", PROD, 33 "int", INT, 34 "integral", INT, 35 "union", UNION, 36 "inter", INTER, 37 "pile", PILE, 38 "lpile", LPILE, 39 "cpile", CPILE, 40 "rpile", RPILE, 41 "over", OVER, 42 "sqrt", SQRT, 43 "above", ABOVE, 44 "size", SIZE, 45 "font", FONT, 46 "fat", FAT, 47 "roman", ROMAN, 48 "italic", ITALIC, 49 "bold", BOLD, 50 "left", LEFT, 51 "right", RIGHT, 52 "delim", DELIM, 53 "define", DEFINE, 54 55 #ifdef NEQN /* make ndefine synonym for define, tdefine a no-op */ 56 57 "tdefine", TDEFINE, 58 "ndefine", DEFINE, 59 60 #else /* tdefine = define, ndefine = no-op */ 61 62 "tdefine", DEFINE, 63 "ndefine", NDEFINE, 64 65 #endif 66 67 "gsize", GSIZE, 68 ".gsize", GSIZE, 69 "gfont", GFONT, 70 "include", INCLUDE, 71 "up", UP, 72 "down", DOWN, 73 "fwd", FWD, 74 "back", BACK, 75 "mark", MARK, 76 "lineup", LINEUP, 77 "matrix", MATRIX, 78 "col", COL, 79 "lcol", LCOL, 80 "ccol", CCOL, 81 "rcol", RCOL, 82 0, 0 83 }; 84 85 struct { 86 char *res; 87 char *resval; 88 } resword[] ={ 89 ">=", "\\(>=", 90 "<=", "\\(<=", 91 "==", "\\(==", 92 "!=", "\\(!=", 93 "+-", "\\(+-", 94 "->", "\\(->", 95 "<-", "\\(<-", 96 "inf", "\\(if", 97 "infinity", "\\(if", 98 "partial", "\\(pd", 99 "half", "\\f1\\(12\\fP", 100 "prime", "\\f1\\(fm\\fP", 101 "dollar", "\\f1$\\fP", 102 "nothing", "", 103 "times", "\\(mu", 104 "del", "\\(gr", 105 "grad", "\\(gr", 106 #ifdef NEQN 107 "<<", "<<", 108 ">>", ">>", 109 "approx", "~\b\\d~\\u", 110 "cdot", "\\v'-.5'.\\v'.5'", 111 "...", "...", 112 ",...,", ",...,", 113 #else 114 "<<", "<\\h'-.3m'<", 115 ">>", ">\\h'-.3m'>", 116 "approx", "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'", 117 "cdot", "\\v'-.3m'.\\v'.3m'", 118 "...", "\\v'-.3m'\\ .\\ .\\ .\\ \\v'.3m'", 119 ",...,", ",\\ .\\ .\\ .\\ ,\\|", 120 #endif 121 122 "alpha", "\\(*a", 123 "beta", "\\(*b", 124 "gamma", "\\(*g", 125 "GAMMA", "\\(*G", 126 "delta", "\\(*d", 127 "DELTA", "\\(*D", 128 "epsilon", "\\(*e", 129 "EPSILON", "\\f1E\\fP", 130 "omega", "\\(*w", 131 "OMEGA", "\\(*W", 132 "lambda", "\\(*l", 133 "LAMBDA", "\\(*L", 134 "mu", "\\(*m", 135 "nu", "\\(*n", 136 "theta", "\\(*h", 137 "THETA", "\\(*H", 138 "phi", "\\(*f", 139 "PHI", "\\(*F", 140 "pi", "\\(*p", 141 "PI", "\\(*P", 142 "sigma", "\\(*s", 143 "SIGMA", "\\(*S", 144 "xi", "\\(*c", 145 "XI", "\\(*C", 146 "zeta", "\\(*z", 147 "iota", "\\(*i", 148 "eta", "\\(*y", 149 "kappa", "\\(*k", 150 "rho", "\\(*r", 151 "tau", "\\(*t", 152 "omicron", "\\(*o", 153 "upsilon", "\\(*u", 154 "UPSILON", "\\(*U", 155 "psi", "\\(*q", 156 "PSI", "\\(*Q", 157 "chi", "\\(*x", 158 "and", "\\f1and\\fP", 159 "for", "\\f1for\\fP", 160 "if", "\\f1if\\fP", 161 "Re", "\\f1Re\\fP", 162 "Im", "\\f1Im\\fP", 163 "sin", "\\f1sin\\fP", 164 "cos", "\\f1cos\\fP", 165 "tan", "\\f1tan\\fP", 166 "sec", "\\f1sec\\fP", 167 "csc", "\\f1csc\\fP", 168 "arc", "\\f1arc\\fP", 169 "asin", "\\f1asin\\fP", 170 "acos", "\\f1acos\\fP", 171 "atan", "\\f1atan\\fP", 172 "asec", "\\f1asec\\fP", 173 "acsc", "\\f1acsc\\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 char *malloc(); 196 197 for (h = 0; *s != '\0'; ) 198 h += *s++; 199 h %= TBLSIZE; 200 201 for (p = tblp[h]; p != NULL; p = p->next) 202 if (strcmp(name, p->name) == 0) { /* found it */ 203 if (defn != NULL) 204 p->defn = defn; 205 return(p); 206 } 207 /* didn't find it */ 208 if (defn == NULL) 209 return(NULL); 210 p = (tbl *) malloc(sizeof (tbl)); 211 if (p == NULL) 212 error(FATAL, "out of space in lookup"); 213 p->name = name; 214 p->defn = defn; 215 p->next = tblp[h]; 216 tblp[h] = p; 217 return(p); 218 } 219 220 init_tbl() /* initialize all tables */ 221 { 222 int i; 223 224 for (i = 0; keyword[i].key != NULL; i++) 225 lookup(keytbl, keyword[i].key, keyword[i].keyval); 226 for (i = 0; resword[i].res != NULL; i++) 227 lookup(restbl, resword[i].res, resword[i].resval); 228 } 229