aboutsummaryrefslogtreecommitdiffhomepage
path: root/forth
diff options
context:
space:
mode:
authorGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-08-31 18:04:51 +0000
committerGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-08-31 18:04:51 +0000
commit289e4fca4394ca0964b9b76a834e61bcdec821c9 (patch)
treeda8ec0e78883b623aaabb4389f884fa508e57f36 /forth
parent19a89f287f3af6fd34470a7aab92a989109d513f (diff)
add missing files
git-svn-id: http://skia.googlecode.com/svn/trunk@345 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'forth')
-rw-r--r--forth/ForthParser.h35
-rw-r--r--forth/StdWords.cpp353
2 files changed, 388 insertions, 0 deletions
diff --git a/forth/ForthParser.h b/forth/ForthParser.h
new file mode 100644
index 0000000000..9c939f83db
--- /dev/null
+++ b/forth/ForthParser.h
@@ -0,0 +1,35 @@
+#ifndef ForthParser_DEFINED
+#define ForthParser_DEFINED
+
+#include "SkTDict.h"
+
+class ForthWord;
+class FCode;
+
+class ForthParser {
+public:
+ ForthParser();
+ ~ForthParser();
+
+ const char* parse(const char text[], FCode*);
+
+ void addWord(const char name[], ForthWord* word) {
+ this->add(name, strlen(name), word);
+ }
+
+ void add(const char name[], size_t len, ForthWord* word) {
+ (void)fDict.set(name, len, word);
+ }
+
+ ForthWord* find(const char name[], size_t len) const {
+ ForthWord* word;
+ return fDict.find(name, len, &word) ? word : NULL;
+ }
+
+private:
+ void addStdWords();
+
+ SkTDict<ForthWord*> fDict;
+};
+
+#endif
diff --git a/forth/StdWords.cpp b/forth/StdWords.cpp
new file mode 100644
index 0000000000..4216e610ce
--- /dev/null
+++ b/forth/StdWords.cpp
@@ -0,0 +1,353 @@
+#include "Forth.h"
+#include "ForthParser.h"
+#include "SkString.h"
+
+class drop_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ (void)fe->pop();
+ }
+};
+
+class clearStack_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ fe->clearStack();
+ }
+};
+
+class dup_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ fe->push(fe->top());
+ }
+};
+
+class swap_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ int32_t a = fe->pop();
+ int32_t b = fe->top();
+ fe->setTop(a);
+ fe->push(b);
+ }
+};
+
+class rot_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ fe->push(fe->peek(1));
+ }
+};
+
+///////////////// ints
+
+class add_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ intptr_t tmp = fe->pop();
+ fe->setTop(fe->top() + tmp);
+ }
+};
+
+class sub_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ intptr_t tmp = fe->pop();
+ fe->setTop(fe->top() - tmp);
+ }
+};
+
+class mul_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ intptr_t tmp = fe->pop();
+ fe->setTop(fe->top() * tmp);
+ }
+};
+
+class div_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ intptr_t tmp = fe->pop();
+ fe->setTop(fe->top() / tmp);
+ }
+};
+
+class dot_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ SkString str;
+ str.printf("%d ", fe->pop());
+ fe->sendOutput(str.c_str());
+ }
+};
+
+class abs_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ int32_t value = fe->top();
+ if (value < 0) {
+ fe->setTop(-value);
+ }
+ }
+};
+
+class min_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ int32_t value = fe->pop();
+ if (value < fe->top()) {
+ fe->setTop(value);
+ }
+ }
+};
+
+class max_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ int32_t value = fe->pop();
+ if (value > fe->top()) {
+ fe->setTop(value);
+ }
+ }
+};
+
+///////////////// floats
+
+class fadd_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ float tmp = fe->fpop();
+ fe->fsetTop(fe->ftop() + tmp);
+ }
+};
+
+class fsub_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ float tmp = fe->fpop();
+ fe->fsetTop(fe->ftop() - tmp);
+ }
+};
+
+class fmul_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ float tmp = fe->fpop();
+ fe->fsetTop(fe->ftop() * tmp);
+ }
+};
+
+class fdiv_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ float tmp = fe->fpop();
+ fe->fsetTop(fe->ftop() / tmp);
+ }
+};
+
+class fdot_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ SkString str;
+ str.printf("%g ", fe->fpop());
+ fe->sendOutput(str.c_str());
+ }
+};
+
+class fabs_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ float value = fe->ftop();
+ if (value < 0) {
+ fe->fsetTop(-value);
+ }
+ }
+};
+
+class fmin_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ float value = fe->fpop();
+ if (value < fe->ftop()) {
+ fe->fsetTop(value);
+ }
+ }
+};
+
+class fmax_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ float value = fe->fpop();
+ if (value > fe->ftop()) {
+ fe->fsetTop(value);
+ }
+ }
+};
+
+class floor_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ fe->fsetTop(floorf(fe->ftop()));
+ }
+};
+
+class ceil_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ fe->fsetTop(ceilf(fe->ftop()));
+ }
+};
+
+class round_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ fe->fsetTop(floorf(fe->ftop() + 0.5f));
+ }
+};
+
+class f2i_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ fe->setTop((int)fe->ftop());
+ }
+};
+
+class i2f_ForthWord : public ForthWord {
+public:
+ virtual void exec(ForthEngine* fe) {
+ fe->fsetTop((float)fe->top());
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+class eq_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ fe->push(fe->pop() == fe->pop());
+ }
+};
+
+class neq_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ fe->push(fe->pop() != fe->pop());
+ }
+};
+
+class lt_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ intptr_t tmp = fe->pop();
+ fe->setTop(fe->top() < tmp);
+ }
+};
+
+class le_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ intptr_t tmp = fe->pop();
+ fe->setTop(fe->top() <= tmp);
+ }
+};
+
+class gt_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ intptr_t tmp = fe->pop();
+ fe->setTop(fe->top() > tmp);
+ }
+};
+
+class ge_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ intptr_t tmp = fe->pop();
+ fe->setTop(fe->top() >= tmp);
+ }
+};
+
+class feq_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ fe->push(fe->fpop() == fe->fpop());
+ }
+};
+
+class fneq_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ fe->push(fe->fpop() != fe->fpop());
+ }
+};
+
+class flt_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ float tmp = fe->fpop();
+ fe->setTop(fe->ftop() < tmp);
+ }
+};
+
+class fle_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ float tmp = fe->fpop();
+ fe->setTop(fe->ftop() <= tmp);
+ }
+};
+
+class fgt_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ float tmp = fe->fpop();
+ fe->setTop(fe->ftop() > tmp);
+ }
+};
+
+class fge_ForthWord : public ForthWord { public:
+ virtual void exec(ForthEngine* fe) {
+ float tmp = fe->fpop();
+ fe->setTop(fe->ftop() >= tmp);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+void ForthParser::addStdWords() {
+ this->add("clr", 3, new clearStack_ForthWord);
+ this->add("drop", 4, new drop_ForthWord);
+ this->add("dup", 3, new dup_ForthWord);
+ this->add("swap", 4, new swap_ForthWord);
+ this->add("rot", 3, new rot_ForthWord);
+
+ this->add("+", 1, new add_ForthWord);
+ this->add("-", 1, new sub_ForthWord);
+ this->add("*", 1, new mul_ForthWord);
+ this->add("/", 1, new div_ForthWord);
+ this->add(".", 1, new dot_ForthWord);
+ this->add("abs", 3, new abs_ForthWord);
+ this->add("min", 3, new min_ForthWord);
+ this->add("max", 3, new max_ForthWord);
+
+ this->add("f+", 2, new fadd_ForthWord);
+ this->add("f-", 2, new fsub_ForthWord);
+ this->add("f*", 2, new fmul_ForthWord);
+ this->add("f/", 2, new fdiv_ForthWord);
+ this->add("f.", 2, new fdot_ForthWord);
+ this->add("fabs", 4, new fabs_ForthWord);
+ this->add("fmin", 4, new fmin_ForthWord);
+ this->add("fmax", 4, new fmax_ForthWord);
+ this->add("fmax", 4, new fmax_ForthWord);
+ this->add("floor", 5, new floor_ForthWord);
+ this->add("ceil", 4, new ceil_ForthWord);
+ this->add("round", 5, new round_ForthWord);
+ this->add("f>i", 3, new f2i_ForthWord);
+ this->add("i>f", 3, new i2f_ForthWord);
+
+ this->add("=", 1, new eq_ForthWord);
+ this->add("<>", 2, new neq_ForthWord);
+ this->add("<", 1, new lt_ForthWord);
+ this->add("<=", 2, new le_ForthWord);
+ this->add(">", 1, new gt_ForthWord);
+ this->add(">=", 2, new ge_ForthWord);
+
+ this->add("f=", 2, new feq_ForthWord);
+ this->add("f<>", 3, new fneq_ForthWord);
+ this->add("f<", 2, new flt_ForthWord);
+ this->add("f<=", 3, new fle_ForthWord);
+ this->add("f>", 2, new fgt_ForthWord);
+ this->add("f>=", 3, new fge_ForthWord);
+}
+