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