1: #ifndef lint 2: static char sccsid[] = "@(#)lookup.c 4.2 8/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: }