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