add conses, add if, some examples
[mTask.git] / int / int.c
1 #include <stdio.h>
2
3 #include "mTaskSymbols.h"
4
5 #define STACKSIZE 1024
6 #define PROGRAMSIZE 1024
7
8 #define DEBUG
9 #ifdef DEBUG
10 #define debug(s, ...) printf(s, ##__VA_ARGS__);
11 #else
12 #define debug(s, ...) ;
13 #endif
14
15 #define die(s, ...) {fprintf(stderr, s, ##__VA_ARGS__); return 1;}
16
17 char program[PROGRAMSIZE+1] = {0};
18 int stack[STACKSIZE+1] = {0};
19
20 int main(void)
21 {
22 char c;
23 int pl, sp, pc;
24
25 //Read program
26 pc = 0;
27 while ((c = getchar()) != EOF && pc < PROGRAMSIZE)
28 program[pc++] = c;
29 if (pc >= PROGRAMSIZE)
30 die("Max program size: %d\n", PROGRAMSIZE);
31 pl = pc;
32 debug("Done reading, program length: %d\n", pl);
33
34 //Evaluate program
35 //Reset program counter and stack counter
36 pc = 0;
37 sp = 0;
38 while(pc != pl){
39 switch(program[pc++]){
40 case BCNop:;
41 break;
42 case BCPush:
43 stack[sp++] = program[pc++];
44 break;
45 case BCPop:
46 sp--;
47 break;
48 case BCNot:
49 stack[sp] = stack[sp] > 0 ? 0 : 1;
50 break;
51 case BCAdd:
52 stack[sp-1] = stack[sp] + stack[sp-1];
53 sp -= 1;
54 break;
55 case BCSub:
56 stack[sp-1] = stack[sp] - stack[sp-1];
57 sp -= 1;
58 break;
59 case BCMul:
60 stack[sp-1] = stack[sp] * stack[sp-1];
61 sp -= 1;
62 break;
63 case BCDiv:
64 stack[sp-1] = stack[sp] / stack[sp-1];
65 sp -= 1;
66 break;
67 case BCAnd:
68 stack[sp-1] = stack[sp] && stack[sp-1];
69 sp -= 1;
70 break;
71 case BCOr:
72 stack[sp-1] = stack[sp] || stack[sp-1];
73 sp -= 1;
74 break;
75 case BCEq:
76 stack[sp-1] = stack[sp] == stack[sp-1];
77 sp -= 1;
78 break;
79 case BCNeq:
80 stack[sp-1] = stack[sp] != stack[sp-1];
81 sp -= 1;
82 break;
83 case BCLes:
84 stack[sp-1] = stack[sp] < stack[sp-1];
85 sp -= 1;
86 break;
87 case BCGre:
88 stack[sp-1] = stack[sp] > stack[sp-1];
89 sp -= 1;
90 break;
91 case BCLeq:
92 stack[sp-1] = stack[sp] <= stack[sp-1];
93 sp -= 1;
94 break;
95 case BCGeq:
96 stack[sp-1] = stack[sp] >= stack[sp-1];
97 sp -= 1;
98 break;
99 case BCJmp:
100 pc = pc + program[pc];
101 break;
102 case BCJmpT:
103 pc += stack[sp] ? program[pc] : 1;
104 break;
105 case BCJmpF:
106 pc += stack[sp] ? 1 : program[pc];
107 break;
108 case BCSERIALAVAIL:
109 printf("SerialAvailable()\n");
110 break;
111 case BCSERIALPRINT:
112 printf("SerialPrint()\n");
113 break;
114 case BCSERIALPRINTLN:
115 printf("SerialPrintln()\n");
116 break;
117 case BCSERIALREAD:
118 printf("SerialRead()\n");
119 break;
120 case BCSERIALPARSEINT:
121 printf("SerialParseInt()\n");
122 break;
123 case BCANALOGREAD:
124 printf("AnalogRead()\n");
125 break;
126 case BCANALOGWRITE:
127 printf("AnalogWrite()\n");
128 default:
129 die("Unrecognized command: %X\n", program[--pc]);
130 }
131 }
132 return 0;
133 }