comparison templates/esolanginterptemp-ciol- @ 7693:a573f47054f0

<moon_> ` mv BGTV9E93 templates/esolanginterptemp-ciol-
author HackBot
date Tue, 03 May 2016 22:14:24 +0000
parents BGTV9E93@a7f8873d0079
children
comparison
equal deleted inserted replaced
7692:b92bf1268231 7693:a573f47054f0
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include <stdio.h>
5 #include <string.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 // initialize the tape with 30,000 zeroes
9 unsigned long long int tape[30000] = {0};
10 unsigned long long int registrar[3] = {0}; // R1, R2, and R3
11 // set the pointer to point at the left-most cell of the tape
12 unsigned long long int* ptr = tape;
13
14
15
16 void interpret(char* input) {
17 char current_char;
18 size_t i;
19 size_t i2;
20 size_t i3;
21 size_t loop;
22 char i4;
23
24 for (i = 0; input[i] != 0; i++) {
25 current_char = input[i];
26 if (current_char == 'p') {
27 ++ptr;
28 } else if (current_char == 'P') {
29 --ptr;
30 } else if (current_char == '+') {
31 ++*ptr;
32 } else if (current_char == '-') {
33 --*ptr;
34 } else if (current_char == 'o' ) {
35 putchar(*ptr);
36 } else if (current_char == 'i') {
37
38 *ptr = getchar();
39
40 } else if (current_char == '[') {
41 continue;
42 } else if (current_char == ']' && *ptr) {
43 loop = 1;
44 while (loop > 0) {
45 current_char = input[--i];
46 if (current_char == '[') {
47 loop--;
48 } else if (current_char == ']') {
49 loop++;
50 }
51 }
52 } else if (current_char == '/') { //push the value under the pointer to the register specified by the next value under the pointer
53 ++ptr;
54 if (*ptr > 2) {
55 --ptr;
56 } else {
57 char temp1 = *ptr;
58 --ptr;
59 registrar[temp1] = *ptr;
60 }
61 } else if (current_char == '\\') { //Same as /, except popped
62 ++ptr;
63 if (*ptr > 2) {
64 --ptr;
65 } else {
66 char temp1 = *ptr;
67 --ptr;
68 *ptr = registrar[temp1];
69 }
70 } else if (current_char == 'a') { //Add R1 to R2 and put the sum in R3
71 registrar[2] = registrar[0] + registrar[1];
72 } else if (current_char == 's') { //Subtract R1 from R2 and put the diffrence in R3
73 registrar[2] = registrar[0] - registrar[1];
74 } else if (current_char == 'd') { // Divide R1 by R2 and put the quotient in R3
75 if (registrar[1] == 0) {
76 printf("Division by zero occured, Ending!");
77 break;
78 }
79 registrar[2] = registrar[0] / registrar[1];
80 } else if (current_char == 'm') { // Multiply R1 by R2 and put the result in R3
81 registrar[2] = registrar[0] * registrar[1];
82 } else if (current_char == '*') { // Terminate
83 break;
84 } else if (current_char == 'j') { // Jump forward n spaces
85
86 for (i2 = *ptr; i2 != 0; i2--) {
87 i++;
88 current_char = input[i];
89 }
90 } else if (current_char == 'J') { // Jump backword n spaces
91 for (i2 = *ptr; i2 != 0; i2--) {
92 i--;
93 current_char = input[i];
94 }
95 } else if (current_char == 'r') { //prints out the data in the source until it hits a ;
96 i++;
97
98 i3 = i;
99 for (input[i3];input[i3] != ';';i3++){
100 putchar(input[i3]);
101 i++;
102
103 }
104
105 } else if (current_char == 'R') {
106 i++;
107
108 putchar(input[i]);
109 }
110 // More commands to come, the CIOL specs are not done
111 }
112 }
113
114
115 int main( int argc, char *argv[] ) {
116
117 interpret(argv[1]); // outputs input
118 return 0;
119 }