OLD | NEW |
| (Empty) |
1 | |
2 /* | |
3 * Copyright 2011 Google Inc. | |
4 * | |
5 * Use of this source code is governed by a BSD-style license that can be | |
6 * found in the LICENSE file. | |
7 */ | |
8 | |
9 #ifndef Forth_DEFINED | |
10 #define Forth_DEFINED | |
11 | |
12 #include "SkTypes.h" | |
13 | |
14 class ForthOutput { | |
15 public: | |
16 virtual void show(const char output[]) = 0; | |
17 }; | |
18 | |
19 union FloatIntDual { | |
20 int32_t fInt; | |
21 float fFloat; | |
22 }; | |
23 | |
24 static inline int32_t f2i_bits(float x) { | |
25 FloatIntDual d; | |
26 d.fFloat = x; | |
27 return d.fInt; | |
28 } | |
29 | |
30 static inline float i2f_bits(int32_t x) { | |
31 FloatIntDual d; | |
32 d.fInt = x; | |
33 return d.fFloat; | |
34 } | |
35 | |
36 class ForthEngine { | |
37 public: | |
38 ForthEngine(ForthOutput*); | |
39 ~ForthEngine(); | |
40 | |
41 int depth() const { return fStackStop - fStackCurr; } | |
42 void clearStack() { fStackCurr = fStackStop; } | |
43 | |
44 void push(intptr_t value); | |
45 intptr_t top() const { return this->peek(0); } | |
46 intptr_t peek(size_t index) const; | |
47 void setTop(intptr_t value); | |
48 intptr_t pop(); | |
49 | |
50 void fpush(float value) { this->push(f2i_bits(value)); } | |
51 float fpeek(size_t i) const { return i2f_bits(this->fpeek(i)); } | |
52 float ftop() const { return i2f_bits(this->top()); } | |
53 void fsetTop(float value) { this->setTop(f2i_bits(value)); } | |
54 float fpop() { return i2f_bits(this->pop()); } | |
55 | |
56 void sendOutput(const char text[]); | |
57 | |
58 private: | |
59 ForthOutput* fOutput; | |
60 intptr_t* fStackBase; | |
61 intptr_t* fStackCurr; | |
62 intptr_t* fStackStop; | |
63 | |
64 void signal_error(const char msg[]) const { | |
65 SkDebugf("ForthEngine error: %s\n", msg); | |
66 } | |
67 }; | |
68 | |
69 struct ForthCallBlock { | |
70 const intptr_t* in_data; | |
71 size_t in_count; | |
72 intptr_t* out_data; | |
73 size_t out_count; | |
74 size_t out_depth; | |
75 }; | |
76 | |
77 class ForthWord { | |
78 public: | |
79 virtual ~ForthWord() {} | |
80 virtual void exec(ForthEngine*) = 0; | |
81 | |
82 // todo: return error state of the engine | |
83 void call(ForthCallBlock*); | |
84 }; | |
85 | |
86 class ForthEnv { | |
87 public: | |
88 ForthEnv(); | |
89 ~ForthEnv(); | |
90 | |
91 | |
92 void addWord(const char name[], ForthWord*); | |
93 | |
94 void parse(const char code[]); | |
95 | |
96 ForthWord* findWord(const char name[]); | |
97 | |
98 void run(ForthOutput* = NULL); | |
99 | |
100 private: | |
101 class Impl; | |
102 Impl* fImpl; | |
103 }; | |
104 | |
105 #endif | |
OLD | NEW |