annotate src/ciol.c @ 9554:23f43464694e

<Zarutian> le/rn Frams\xc3\xb3knarflokkurinn/A, now defunct, political party in Iceland. Like its sister party Sj\xc3\xa1lfst\xc3\xa6\xc3\xb0isflokkurinn it is named by the antonym of what it is. (The name means the Progressive Party but they have nearly always been highly regressive). Think dumb Hill-Billies in ill fitting suits and you get their constiuents.
author HackBot
date Sun, 30 Oct 2016 14:33:24 +0000
parents b680a67063ff
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7900
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
1 #include <stdio.h>
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
2 #include <stdlib.h>
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
3
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
4 #include <stdio.h>
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
5 #include <string.h>
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
6 #include <stdlib.h>
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
7 #include <unistd.h>
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
8 // initialize the tape with 30,000 zeroes
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
9 unsigned long long int tape[30000] = {0};
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
10 unsigned long long int registrar[3] = {0}; // R1, R2, and R3
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
11 // set the pointer to point at the left-most cell of the tape
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
12 unsigned long long int* ptr = tape;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
13
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
14
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
15
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
16 void interpret(char* input) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
17 char current_char;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
18 size_t i;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
19 size_t i2;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
20 size_t i3;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
21 size_t loop;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
22 char i4;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
23
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
24 for (i = 0; input[i] != 0; i++) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
25 current_char = input[i];
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
26 if (current_char == 'p') {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
27 ++ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
28 } else if (current_char == 'P') {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
29 --ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
30 } else if (current_char == '+') {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
31 ++*ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
32 } else if (current_char == '-') {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
33 --*ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
34 } else if (current_char == 'o' ) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
35 putchar(*ptr);
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
36 } else if (current_char == 'i') {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
37
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
38 *ptr = getchar();
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
39
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
40 } else if (current_char == '[') {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
41 continue;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
42 } else if (current_char == ']' && *ptr) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
43 loop = 1;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
44 while (loop > 0) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
45 current_char = input[--i];
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
46 if (current_char == '[') {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
47 loop--;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
48 } else if (current_char == ']') {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
49 loop++;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
50 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
51 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
52 } else if (current_char == '/') { //push the value under the pointer to the register specified by the next value under the pointer
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
53 ++ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
54 if (*ptr > 2) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
55 --ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
56 } else {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
57 char temp1 = *ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
58 --ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
59 registrar[temp1] = *ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
60 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
61 } else if (current_char == '\\') { //Same as /, except popped
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
62 ++ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
63 if (*ptr > 2) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
64 --ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
65 } else {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
66 char temp1 = *ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
67 --ptr;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
68 *ptr = registrar[temp1];
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
69 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
70 } else if (current_char == 'a') { //Add R1 to R2 and put the sum in R3
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
71 registrar[2] = registrar[0] + registrar[1];
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
72 } else if (current_char == 's') { //Subtract R1 from R2 and put the diffrence in R3
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
73 registrar[2] = registrar[0] - registrar[1];
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
74 } else if (current_char == 'd') { // Divide R1 by R2 and put the quotient in R3
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
75 if (registrar[1] == 0) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
76 printf("Division by zero occured, Ending!");
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
77 break;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
78 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
79 registrar[2] = registrar[0] / registrar[1];
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
80 } else if (current_char == 'm') { // Multiply R1 by R2 and put the result in R3
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
81 registrar[2] = registrar[0] * registrar[1];
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
82 } else if (current_char == '*') { // Terminate
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
83 break;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
84 } else if (current_char == 'j') { // Jump forward n spaces
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
85
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
86 for (i2 = *ptr; i2 != 0; i2--) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
87 i++;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
88 current_char = input[i];
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
89 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
90 } else if (current_char == 'J') { // Jump backword n spaces
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
91 for (i2 = *ptr; i2 != 0; i2--) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
92 i--;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
93 current_char = input[i];
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
94 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
95 } else if (current_char == 'r') { //prints out the data in the source until it hits a ;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
96 i++;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
97
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
98 i3 = i;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
99 for (input[i3];input[i3] != ';';i3++){
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
100 putchar(input[i3]);
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
101 i++;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
102
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
103 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
104
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
105 } else if (current_char == 'R') {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
106 i++;
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
107
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
108 putchar(input[i]);
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
109 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
110 // More commands to come, the CIOL specs are not done
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
111 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
112 }
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
113
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
114
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
115 int main( int argc, char *argv[] ) {
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
116
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
117 interpret(argv[1]); // outputs input
b680a67063ff <oerjan> ` sed -i \'s/\\r//g\' src/ciol.c
HackBot
parents: 7896
diff changeset
118 return 0;
7586
a7f8873d0079 <Moon_> fetch http://pastebin.com/raw/BGTV9E93
HackBot
parents:
diff changeset
119 }