started with interpreter for basic language
[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 //
23 char c;
24 int pl, sp, pc;
25
26 //Read program
27 pc = 0;
28 while ((c = getchar()) != EOF && pc < PROGRAMSIZE)
29 program[pc++] = c;
30 if (pc >= PROGRAMSIZE)
31 die("Max program size: %d\n", PROGRAMSIZE);
32 pl = pc;
33 debug("Done reading, program length: %d\n", pl);
34
35 //Evaluate program
36 //Reset program counter and stack counter
37 pc = 0;
38 sp = 0;
39 while(pc != pl){
40 switch(program[pc++]){
41 case BCNop:;
42 break;
43 case BCPush:
44 stack[sp++] = program[pc++];
45 break;
46 case BCPop:
47 sp--;
48 break;
49 case BCNot:
50 stack[sp] = stack[sp] > 0 ? 0 : 1;
51 break;
52 case BCAdd:
53 stack[sp-1] = stack[sp] + stack[sp-1];
54 sp -= 1;
55 break;
56 case BCSub:
57 stack[sp-1] = stack[sp] - stack[sp-1];
58 sp -= 1;
59 break;
60 case BCMul:
61 stack[sp-1] = stack[sp] * stack[sp-1];
62 sp -= 1;
63 break;
64 case BCDiv:
65 stack[sp-1] = stack[sp] / stack[sp-1];
66 sp -= 1;
67 break;
68 case BCAnd:
69 stack[sp-1] = stack[sp] && stack[sp-1];
70 sp -= 1;
71 break;
72 case BCOr:
73 stack[sp-1] = stack[sp] || stack[sp-1];
74 sp -= 1;
75 break;
76 case BCEq:
77 stack[sp-1] = stack[sp] == stack[sp-1];
78 sp -= 1;
79 break;
80 case BCNeq:
81 stack[sp-1] = stack[sp] != stack[sp-1];
82 sp -= 1;
83 break;
84 case BCLes:
85 stack[sp-1] = stack[sp] < stack[sp-1];
86 sp -= 1;
87 break;
88 case BCGre:
89 stack[sp-1] = stack[sp] > stack[sp-1];
90 sp -= 1;
91 break;
92 case BCLeq:
93 stack[sp-1] = stack[sp] <= stack[sp-1];
94 sp -= 1;
95 break;
96 case BCGeq:
97 stack[sp-1] = stack[sp] >= stack[sp-1];
98 sp -= 1;
99 break;
100 case BCJmp:
101 pc = pc + program[pc];
102 break;
103 case BCJmpT:
104 if (stack[sp])
105 pc = pc + program[pc];
106 else
107 pc++;
108 break;
109 case BCJmpF:
110 if (stack[sp])
111 pc++;
112 else
113 pc = pc + program[pc];
114 break;
115 default:
116 die("Unrecognized command: %X\n", program[--pc]);
117 }
118 }
119 return 0;
120 }