blob: 4216e610cefb0bf7a60a9588590819d9af7fe903 [file] [log] [blame]
reed@android.com289e4fc2009-08-31 18:04:51 +00001#include "Forth.h"
2#include "ForthParser.h"
3#include "SkString.h"
4
5class drop_ForthWord : public ForthWord {
6public:
7 virtual void exec(ForthEngine* fe) {
8 (void)fe->pop();
9 }
10};
11
12class clearStack_ForthWord : public ForthWord {
13public:
14 virtual void exec(ForthEngine* fe) {
15 fe->clearStack();
16 }
17};
18
19class dup_ForthWord : public ForthWord {
20public:
21 virtual void exec(ForthEngine* fe) {
22 fe->push(fe->top());
23 }
24};
25
26class swap_ForthWord : public ForthWord {
27public:
28 virtual void exec(ForthEngine* fe) {
29 int32_t a = fe->pop();
30 int32_t b = fe->top();
31 fe->setTop(a);
32 fe->push(b);
33 }
34};
35
36class rot_ForthWord : public ForthWord {
37public:
38 virtual void exec(ForthEngine* fe) {
39 fe->push(fe->peek(1));
40 }
41};
42
43///////////////// ints
44
45class add_ForthWord : public ForthWord {
46public:
47 virtual void exec(ForthEngine* fe) {
48 intptr_t tmp = fe->pop();
49 fe->setTop(fe->top() + tmp);
50 }
51};
52
53class sub_ForthWord : public ForthWord {
54public:
55 virtual void exec(ForthEngine* fe) {
56 intptr_t tmp = fe->pop();
57 fe->setTop(fe->top() - tmp);
58 }
59};
60
61class mul_ForthWord : public ForthWord {
62public:
63 virtual void exec(ForthEngine* fe) {
64 intptr_t tmp = fe->pop();
65 fe->setTop(fe->top() * tmp);
66 }
67};
68
69class div_ForthWord : public ForthWord {
70public:
71 virtual void exec(ForthEngine* fe) {
72 intptr_t tmp = fe->pop();
73 fe->setTop(fe->top() / tmp);
74 }
75};
76
77class dot_ForthWord : public ForthWord {
78public:
79 virtual void exec(ForthEngine* fe) {
80 SkString str;
81 str.printf("%d ", fe->pop());
82 fe->sendOutput(str.c_str());
83 }
84};
85
86class abs_ForthWord : public ForthWord {
87public:
88 virtual void exec(ForthEngine* fe) {
89 int32_t value = fe->top();
90 if (value < 0) {
91 fe->setTop(-value);
92 }
93 }
94};
95
96class min_ForthWord : public ForthWord {
97public:
98 virtual void exec(ForthEngine* fe) {
99 int32_t value = fe->pop();
100 if (value < fe->top()) {
101 fe->setTop(value);
102 }
103 }
104};
105
106class max_ForthWord : public ForthWord {
107public:
108 virtual void exec(ForthEngine* fe) {
109 int32_t value = fe->pop();
110 if (value > fe->top()) {
111 fe->setTop(value);
112 }
113 }
114};
115
116///////////////// floats
117
118class fadd_ForthWord : public ForthWord {
119public:
120 virtual void exec(ForthEngine* fe) {
121 float tmp = fe->fpop();
122 fe->fsetTop(fe->ftop() + tmp);
123 }
124};
125
126class fsub_ForthWord : public ForthWord {
127public:
128 virtual void exec(ForthEngine* fe) {
129 float tmp = fe->fpop();
130 fe->fsetTop(fe->ftop() - tmp);
131 }
132};
133
134class fmul_ForthWord : public ForthWord {
135public:
136 virtual void exec(ForthEngine* fe) {
137 float tmp = fe->fpop();
138 fe->fsetTop(fe->ftop() * tmp);
139 }
140};
141
142class fdiv_ForthWord : public ForthWord {
143public:
144 virtual void exec(ForthEngine* fe) {
145 float tmp = fe->fpop();
146 fe->fsetTop(fe->ftop() / tmp);
147 }
148};
149
150class fdot_ForthWord : public ForthWord {
151public:
152 virtual void exec(ForthEngine* fe) {
153 SkString str;
154 str.printf("%g ", fe->fpop());
155 fe->sendOutput(str.c_str());
156 }
157};
158
159class fabs_ForthWord : public ForthWord {
160public:
161 virtual void exec(ForthEngine* fe) {
162 float value = fe->ftop();
163 if (value < 0) {
164 fe->fsetTop(-value);
165 }
166 }
167};
168
169class fmin_ForthWord : public ForthWord {
170public:
171 virtual void exec(ForthEngine* fe) {
172 float value = fe->fpop();
173 if (value < fe->ftop()) {
174 fe->fsetTop(value);
175 }
176 }
177};
178
179class fmax_ForthWord : public ForthWord {
180public:
181 virtual void exec(ForthEngine* fe) {
182 float value = fe->fpop();
183 if (value > fe->ftop()) {
184 fe->fsetTop(value);
185 }
186 }
187};
188
189class floor_ForthWord : public ForthWord {
190public:
191 virtual void exec(ForthEngine* fe) {
192 fe->fsetTop(floorf(fe->ftop()));
193 }
194};
195
196class ceil_ForthWord : public ForthWord {
197public:
198 virtual void exec(ForthEngine* fe) {
199 fe->fsetTop(ceilf(fe->ftop()));
200 }
201};
202
203class round_ForthWord : public ForthWord {
204public:
205 virtual void exec(ForthEngine* fe) {
206 fe->fsetTop(floorf(fe->ftop() + 0.5f));
207 }
208};
209
210class f2i_ForthWord : public ForthWord {
211public:
212 virtual void exec(ForthEngine* fe) {
213 fe->setTop((int)fe->ftop());
214 }
215};
216
217class i2f_ForthWord : public ForthWord {
218public:
219 virtual void exec(ForthEngine* fe) {
220 fe->fsetTop((float)fe->top());
221 }
222};
223
224///////////////////////////////////////////////////////////////////////////////
225
226class eq_ForthWord : public ForthWord { public:
227 virtual void exec(ForthEngine* fe) {
228 fe->push(fe->pop() == fe->pop());
229 }
230};
231
232class neq_ForthWord : public ForthWord { public:
233 virtual void exec(ForthEngine* fe) {
234 fe->push(fe->pop() != fe->pop());
235 }
236};
237
238class lt_ForthWord : public ForthWord { public:
239 virtual void exec(ForthEngine* fe) {
240 intptr_t tmp = fe->pop();
241 fe->setTop(fe->top() < tmp);
242 }
243};
244
245class le_ForthWord : public ForthWord { public:
246 virtual void exec(ForthEngine* fe) {
247 intptr_t tmp = fe->pop();
248 fe->setTop(fe->top() <= tmp);
249 }
250};
251
252class gt_ForthWord : public ForthWord { public:
253 virtual void exec(ForthEngine* fe) {
254 intptr_t tmp = fe->pop();
255 fe->setTop(fe->top() > tmp);
256 }
257};
258
259class ge_ForthWord : public ForthWord { public:
260 virtual void exec(ForthEngine* fe) {
261 intptr_t tmp = fe->pop();
262 fe->setTop(fe->top() >= tmp);
263 }
264};
265
266class feq_ForthWord : public ForthWord { public:
267 virtual void exec(ForthEngine* fe) {
268 fe->push(fe->fpop() == fe->fpop());
269 }
270};
271
272class fneq_ForthWord : public ForthWord { public:
273 virtual void exec(ForthEngine* fe) {
274 fe->push(fe->fpop() != fe->fpop());
275 }
276};
277
278class flt_ForthWord : public ForthWord { public:
279 virtual void exec(ForthEngine* fe) {
280 float tmp = fe->fpop();
281 fe->setTop(fe->ftop() < tmp);
282 }
283};
284
285class fle_ForthWord : public ForthWord { public:
286 virtual void exec(ForthEngine* fe) {
287 float tmp = fe->fpop();
288 fe->setTop(fe->ftop() <= tmp);
289 }
290};
291
292class fgt_ForthWord : public ForthWord { public:
293 virtual void exec(ForthEngine* fe) {
294 float tmp = fe->fpop();
295 fe->setTop(fe->ftop() > tmp);
296 }
297};
298
299class fge_ForthWord : public ForthWord { public:
300 virtual void exec(ForthEngine* fe) {
301 float tmp = fe->fpop();
302 fe->setTop(fe->ftop() >= tmp);
303 }
304};
305
306///////////////////////////////////////////////////////////////////////////////
307
308void ForthParser::addStdWords() {
309 this->add("clr", 3, new clearStack_ForthWord);
310 this->add("drop", 4, new drop_ForthWord);
311 this->add("dup", 3, new dup_ForthWord);
312 this->add("swap", 4, new swap_ForthWord);
313 this->add("rot", 3, new rot_ForthWord);
314
315 this->add("+", 1, new add_ForthWord);
316 this->add("-", 1, new sub_ForthWord);
317 this->add("*", 1, new mul_ForthWord);
318 this->add("/", 1, new div_ForthWord);
319 this->add(".", 1, new dot_ForthWord);
320 this->add("abs", 3, new abs_ForthWord);
321 this->add("min", 3, new min_ForthWord);
322 this->add("max", 3, new max_ForthWord);
323
324 this->add("f+", 2, new fadd_ForthWord);
325 this->add("f-", 2, new fsub_ForthWord);
326 this->add("f*", 2, new fmul_ForthWord);
327 this->add("f/", 2, new fdiv_ForthWord);
328 this->add("f.", 2, new fdot_ForthWord);
329 this->add("fabs", 4, new fabs_ForthWord);
330 this->add("fmin", 4, new fmin_ForthWord);
331 this->add("fmax", 4, new fmax_ForthWord);
332 this->add("fmax", 4, new fmax_ForthWord);
333 this->add("floor", 5, new floor_ForthWord);
334 this->add("ceil", 4, new ceil_ForthWord);
335 this->add("round", 5, new round_ForthWord);
336 this->add("f>i", 3, new f2i_ForthWord);
337 this->add("i>f", 3, new i2f_ForthWord);
338
339 this->add("=", 1, new eq_ForthWord);
340 this->add("<>", 2, new neq_ForthWord);
341 this->add("<", 1, new lt_ForthWord);
342 this->add("<=", 2, new le_ForthWord);
343 this->add(">", 1, new gt_ForthWord);
344 this->add(">=", 2, new ge_ForthWord);
345
346 this->add("f=", 2, new feq_ForthWord);
347 this->add("f<>", 3, new fneq_ForthWord);
348 this->add("f<", 2, new flt_ForthWord);
349 this->add("f<=", 3, new fle_ForthWord);
350 this->add("f>", 2, new fgt_ForthWord);
351 this->add("f>=", 3, new fge_ForthWord);
352}
353