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