]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
Add default wordlist for forth-style interpeter
authorMichael D. Lowis <mike@mdlowis.com>
Mon, 31 Mar 2014 20:56:21 +0000 (16:56 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Mon, 31 Mar 2014 20:56:21 +0000 (16:56 -0400)
source/slvm/main.c
source/slvm/wordlist.c [new file with mode: 0644]
source/slvm/wordlist.h [new file with mode: 0644]

index 5a883f1803845eed06d1e240d44b7b1d09de76e8..d56b5af2954fb2a04edd3ecd69a2acddb4b3305f 100644 (file)
@@ -1,4 +1,8 @@
 #include <stdio.h>
+#include <stdint.h>
+#include "wordlist.h"
+
+long* ArgStackPtr;
 
 int main(int argc, char** argv)
 {
diff --git a/source/slvm/wordlist.c b/source/slvm/wordlist.c
new file mode 100644 (file)
index 0000000..12404ea
--- /dev/null
@@ -0,0 +1,72 @@
+#include "wordlist.h"
+
+extern long* ArgStackPtr;
+
+/**
+ * Define a built-in word that executes native code */
+#define defcode(name_str,c_name,flags,prev) \
+    extern void c_name##_code(void);   \
+    extern char c_name##_str[];        \
+    word_t c_name = {                  \
+        prev,                          \
+        flags,                         \
+        c_name##_str,                  \
+        &c_name##_code,                \
+        0                              \
+    };                                 \
+    char c_name##_str[] = name_str;    \
+    void c_name##_code(void)           \
+
+/**
+ * Define a built-in word that is defined by references to other words. */
+#define defword(name_str,c_name,flags,prev) \
+    extern long c_name##_code[];       \
+    extern char c_name##_str[];        \
+    word_t c_name = {                  \
+        prev,                          \
+        flags,                         \
+        c_name##_str,                  \
+        &do_colon,                     \
+        c_name##_code                  \
+    };                                 \
+    char c_name##_str[] = name_str;    \
+    long c_name##_code[] =
+
+/*****************************************************************************/
+defcode("drop", drop, 0, 0){
+    ArgStackPtr--;
+}
+
+defcode("swap", swap, 0, &drop){
+    long temp = *(ArgStackPtr);
+    *(ArgStackPtr) = *(ArgStackPtr-1);
+    *(ArgStackPtr-1) = temp;
+}
+
+defcode("dup", dup, 0, &swap){
+    ArgStackPtr++;
+    *(ArgStackPtr) = *(ArgStackPtr-1);
+}
+
+defcode("over", over, 0, &dup){
+    ArgStackPtr++;
+    *(ArgStackPtr) = *(ArgStackPtr-2);
+}
+
+defcode("rot", rot, 0, &over){
+    long temp = *(ArgStackPtr);
+    *(ArgStackPtr) = *(ArgStackPtr-1);
+    *(ArgStackPtr-1) = *(ArgStackPtr-2);
+    *(ArgStackPtr-2) = temp;
+}
+
+defcode("-rot", nrot, 0, &rot){
+    long temp = *(ArgStackPtr-2);
+    *(ArgStackPtr-2) = *(ArgStackPtr-1);
+    *(ArgStackPtr-1) = *(ArgStackPtr);
+    *(ArgStackPtr) = temp;
+}
+
+/*****************************************************************************/
+word_t* LatestWord = &nrot;
+
diff --git a/source/slvm/wordlist.h b/source/slvm/wordlist.h
new file mode 100644 (file)
index 0000000..49fa6f9
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+  @file wordlist.h
+  @brief This module defines the list of built-in words for the interpreter.
+  $Revision$
+  $HeadURL$
+  */
+#ifndef WORDLIST_H
+#define WORDLIST_H
+
+typedef void (*codeword_t)(void);
+
+typedef struct word_t {
+    struct word_t* link;
+    long flags;
+    char* name;
+    codeword_t codeword;
+    long* code;
+} word_t;
+
+extern word_t* LatestWord;
+
+#endif /* WORDLIST_H */