annotate src/ciol.c @ 12254:616be78bd12e draft

<oerjan> revert
author HackEso <hackeso@esolangs.org>
date Fri, 06 Dec 2019 07:54:58 +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 }