]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/eqn/lookup.c
merge
[plan9front.git] / sys / src / cmd / eqn / lookup.c
1 #include "e.h"
2 #include "y.tab.h"
3
4 tbl     *keytbl[TBLSIZE];       /* key words */
5 tbl     *restbl[TBLSIZE];       /* reserved words */
6 tbl     *deftbl[TBLSIZE];       /* user-defined names */
7
8 struct keyword {
9         char    *key;
10         int     keyval;
11 } keyword[]     ={
12         "sub",          SUB, 
13         "sup",          SUP, 
14         ".EN",          DOTEN,
15         ".EQ",          DOTEQ, 
16         "from",         FROM, 
17         "to",           TO, 
18         "sum",          SUM, 
19         "hat",          HAT, 
20         "vec",          VEC, 
21         "dyad",         DYAD, 
22         "dot",          DOT, 
23         "dotdot",       DOTDOT, 
24         "bar",          BAR,
25         "lowbar",       LOWBAR,
26         "highbar",      HIGHBAR, 
27         "tilde",        TILDE, 
28         "utilde",       UTILDE, 
29         "under",        UNDER, 
30         "prod",         PROD, 
31         "int",          INT, 
32         "integral",     INT, 
33         "union",        UNION, 
34         "inter",        INTER, 
35         "matrix",       MATRIX, 
36         "col",          COL, 
37         "lcol",         LCOL, 
38         "ccol",         CCOL, 
39         "rcol",         RCOL, 
40         "pile",         COL,    /* synonyms ... */ 
41         "lpile",        LCOL, 
42         "cpile",        CCOL, 
43         "rpile",        RCOL, 
44         "over",         OVER, 
45         "sqrt",         SQRT, 
46         "above",        ABOVE, 
47         "size",         SIZE, 
48         "font",         FONT, 
49         "fat",          FAT, 
50         "roman",        ROMAN, 
51         "italic",       ITALIC, 
52         "bold",         BOLD, 
53         "left",         LEFT, 
54         "right",        RIGHT, 
55         "delim",        DELIM, 
56         "define",       DEFINE, 
57         "tdefine",      DEFINE, 
58         "ndefine",      NDEFINE, 
59         "ifdef",        IFDEF,
60         "gsize",        GSIZE, 
61         ".gsize",       GSIZE, 
62         "gfont",        GFONT, 
63         "include",      INCLUDE, 
64         "copy",         INCLUDE, 
65         "space",        SPACE,
66         "up",           UP, 
67         "down",         DOWN, 
68         "fwd",          FWD, 
69         "back",         BACK, 
70         "mark",         MARK, 
71         "lineup",       LINEUP, 
72         0,      0
73 };
74
75 struct resword {
76         char    *res;
77         char    *resval;
78 } resword[]     ={
79         ">=",           "\\(>=",
80         "<=",           "\\(<=",
81         "==",           "\\(==",
82         "!=",           "\\(!=",
83         "+-",           "\\(+-",
84         "->",           "\\(->",
85         "<-",           "\\(<-",
86         "inf",          "\\(if",
87         "infinity",     "\\(if",
88         "partial",      "\\(pd",
89         "half",         "\\f1\\(12\\fP",
90         "prime",        "\\f1\\v'.5m'\\s+3\\(fm\\s-3\\v'-.5m'\\fP",
91         "dollar",       "\\f1$\\fP",
92         "nothing",      "",
93         "times",        "\\(mu",
94         "del",          "\\(gr",
95         "grad",         "\\(gr",
96         "approx",       "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'",
97         "cdot",         "\\v'-.3m'.\\v'.3m'",
98         "...",          "\\v'-.25m'\\ .\\ .\\ .\\ \\v'.25m'",
99         ",...,",        "\\f1,\\fP\\ .\\ .\\ .\\ \\f1,\\fP\\|",
100         "alpha",        "α",
101         "ALPHA",        "Α",
102         "beta",         "β",
103         "BETA",         "Β",
104         "gamma",        "γ",
105         "GAMMA",        "Γ",
106         "delta",        "δ",
107         "DELTA",        "Δ",
108         "epsilon",      "ε",
109         "EPSILON",      "Ε",
110         "omega",        "ω",
111         "OMEGA",        "Ω",
112         "lambda",       "λ",
113         "LAMBDA",       "Λ",
114         "mu",           "μ",
115         "MU",           "Μ",
116         "nu",           "ν",
117         "NU",           "Ν",
118         "theta",        "θ",
119         "THETA",        "Θ",
120         "phi",          "φ",
121         "PHI",          "Φ",
122         "pi",           "π",
123         "PI",           "Π",
124         "sigma",        "σ",
125         "SIGMA",        "Σ",
126         "xi",           "ξ",
127         "XI",           "Ξ",
128         "zeta",         "ζ",
129         "ZETA",         "Ζ",
130         "iota",         "ι",
131         "IOTA",         "Ι",
132         "eta",          "η",
133         "ETA",          "Η",
134         "kappa",        "κ",
135         "KAPPA",        "Κ",
136         "rho",          "ρ",
137         "RHO",          "Ρ",
138         "tau",          "τ",
139         "TAU",          "Τ",
140         "omicron",      "ο",
141         "OMICRON",      "Ο",
142         "upsilon",      "υ",
143         "UPSILON",      "Υ",
144         "psi",          "ψ",
145         "PSI",          "Ψ",
146         "chi",          "χ",
147         "CHI",          "Χ",
148         "and",          "\\f1and\\fP",
149         "for",          "\\f1for\\fP",
150         "if",           "\\f1if\\fP",
151         "Re",           "\\f1Re\\fP",
152         "Im",           "\\f1Im\\fP",
153         "sin",          "\\f1sin\\fP",
154         "cos",          "\\f1cos\\fP",
155         "tan",          "\\f1tan\\fP",
156         "arc",          "\\f1arc\\fP",
157         "sinh",         "\\f1sinh\\fP",
158         "coth",         "\\f1coth\\fP",
159         "tanh",         "\\f1tanh\\fP",
160         "cosh",         "\\f1cosh\\fP",
161         "lim",          "\\f1lim\\fP",
162         "log",          "\\f1log\\fP",
163         "ln",           "\\f1ln\\fP",
164         "max",          "\\f1max\\fP",
165         "min",          "\\f1min\\fP",
166         "exp",          "\\f1exp\\fP",
167         "det",          "\\f1det\\fP",
168         0,      0
169 };
170
171 int hash(char *s)
172 {
173         register unsigned int h;
174
175         for (h = 0; *s != '\0'; )
176                 h += *s++;
177         h %= TBLSIZE;
178         return h;
179 }
180
181 tbl *lookup(tbl **tblp, char *name)     /* find name in tbl */
182 {
183         register tbl *p;
184
185         for (p = tblp[hash(name)]; p != NULL; p = p->next)
186                 if (strcmp(name, p->name) == 0)
187                         return(p);
188         return(NULL);
189 }
190
191 void install(tbl **tblp, char *name, char *cval, int ival)      /* install name, vals in tblp */
192 {
193         register tbl *p;
194         int h;
195
196         if ((p = lookup(tblp, name)) == NULL) {
197                 p = (tbl *) malloc(sizeof(tbl));
198                 if (p == NULL)
199                         ERROR "out of space in install" FATAL;
200                 h = hash(name); /* bad visibility here */
201                 p->name = name;
202                 p->next = tblp[h];
203                 tblp[h] = p;
204         }
205         p->cval = cval;
206         p->ival = ival;
207 }
208
209 void init_tbl(void)     /* initialize tables */
210 {
211         int i;
212         extern int init_tune(void);
213
214         for (i = 0; keyword[i].key != NULL; i++)
215                 install(keytbl, keyword[i].key, (char *) 0, keyword[i].keyval);
216         for (i = 0; resword[i].res != NULL; i++)
217                 install(restbl, resword[i].res, resword[i].resval, 0);
218         init_tune();    /* tuning table done in tuning.c */
219 }