Dependents:   WeatherStation

Revision:
1:f8c5afc27878
Parent:
0:684b6fdf080c
Child:
2:64bc38078592
--- a/ILinterpreter.cpp	Sun Jun 26 12:02:32 2011 +0000
+++ b/ILinterpreter.cpp	Sun Jun 26 16:53:49 2011 +0000
@@ -13,7 +13,7 @@
 };
 
 #define IL_MNE_NUM 22
-const struct MNE_str mne_str[IL_MNE_NUM] = {
+static const struct MNE_str mne_str[IL_MNE_NUM] = {
     {MNE_DEF, "DEF"},
     {MNE_LD, "LD"}, {MNE_LDI, "LDI"}, {MNE_LDP, "LDP"}, {MNE_LDF, "LDF"},
     {MNE_OR, "OR"}, {MNE_ORI, "ORI"}, {MNE_ORP, "ORP"}, {MNE_ORF, "ORF"},
@@ -29,15 +29,16 @@
 };
 
 #define IL_EXP_NUM 10
-const struct EXP_str exp_str[IL_EXP_NUM] = {
+static const struct EXP_str exp_str[IL_EXP_NUM] = {
     {EXP_EQ, "=="}, {EXP_EQ, "="}, {EXP_NE, "!="}, {EXP_NE, "<>"},
     {EXP_LT, "<="}, {EXP_LE, "<"}, {EXP_GT, ">"}, {EXP_GE, ">="},
     {EXP_MOD, "%"}, {EXP_NMOD, "!%"},
 };
 
 
-ILinterpreter::ILinterpreter () : stack(IL_STACK) {
+ILinterpreter::ILinterpreter () {
     il_count = 0;
+    printf("<%x>\r\n", &inout);
     memset(&inout, 0, sizeof(inout));
     inout.sec = time(NULL) + (60 * 60 * 9);
     inout_old = inout;
@@ -210,7 +211,7 @@
 
     if (! il_count) return 0;
 
-    stack.clear();
+    addr = 0;
     inout.sec = time(NULL);
     inout_tmp = inout;
 
@@ -218,19 +219,19 @@
     for(i = 0; i < il_count; i ++) {
         switch (il[i].mnemonic) {
         case MNE_LD:
-            stack.push(reg);
+            push(reg);
             reg = input(&inout, i);
             break;
         case MNE_LDI:
-            stack.push(reg);
+            push(reg);
             reg = ! input(&inout, i);
             break;
         case MNE_LDP:
-            stack.push(reg);
+            push(reg);
             reg = input(&inout, i) && ! input(&inout_old, i, 1);
             break;
         case MNE_LDF:
-            stack.push(reg);
+            push(reg);
             reg = ! input(&inout, i) && input(&inout_old, i, 1);
             break;
 
@@ -261,11 +262,11 @@
             break;
 
         case MNE_ANB:
-            if (stack.pop(&j) || j == -1) return -1;
+            if (pop(&j) || j == -1) return -1;
             reg = reg && j;
             break;
         case MNE_ORB:
-            if (stack.pop(&j) || j == -1) return -1;
+            if (pop(&j) || j == -1) return -1;
             reg = reg || j;
             break;
 
@@ -274,13 +275,13 @@
             break;
 
         case MNE_MPS:
-            if (stack.push(reg)) return -1;
+            if (push(reg)) return -1;
             break;
         case MNE_MRD:
-            if (stack.read(&reg) || reg == -1) return -1;
+            if (read(&reg) || reg == -1) return -1;
             break;
         case MNE_MPP:
-            if (stack.pop(&reg) || reg == -1) return -1;
+            if (pop(&reg) || reg == -1) return -1;
             break;
 
         case MNE_OUT:
@@ -300,10 +301,10 @@
 }
 
 // set callback function
-void ILinterpreter::attach (struct tInOut **io, float (*pf_i)(char, int, eEXPRESSION, int), void (*pf_o)(char, int, int, eMNEMONIC)) {
+struct tInOut* ILinterpreter::attach (float (*pf_i)(char, int, eEXPRESSION, int), void (*pf_o)(char, int, int, eMNEMONIC)) {
     cb_input = pf_i;
     cb_output = pf_o;
-    *io = &inout;
+    return &inout;
 }
 
 // timer 10Hz
@@ -418,3 +419,32 @@
 #endif
     return 0;
 }
+
+int ILinterpreter::push (int dat) {
+
+    if (addr >= IL_STACK) {
+        return -1;
+    }
+    stack[addr] = dat;
+    addr ++;
+    return dat;
+}
+
+int ILinterpreter::pop (int *dat) {
+
+    if (addr == 0) {
+        return -1;
+    }
+    addr --;
+    *dat = stack[addr];
+    return 0;
+}
+
+int ILinterpreter::read (int *dat) {
+
+    if (addr == 0) {
+        return -1;
+    }
+    *dat = stack[addr];
+    return 0;
+}
\ No newline at end of file