Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <unistd.h>
- // initialize the tape with 30,000 zeroes
- unsigned long long int tape[30000] = {0};
- unsigned long long int registrar[3] = {0}; // R1, R2, and R3
- // set the pointer to point at the left-most cell of the tape
- unsigned long long int* ptr = tape;
- void interpret(char* input) {
- char current_char;
- size_t i;
- size_t i2;
- size_t i3;
- size_t loop;
- char i4;
- for (i = 0; input[i] != 0; i++) {
- current_char = input[i];
- if (current_char == 'p') {
- ++ptr;
- } else if (current_char == 'P') {
- --ptr;
- } else if (current_char == '+') {
- ++*ptr;
- } else if (current_char == '-') {
- --*ptr;
- } else if (current_char == 'o' ) {
- putchar(*ptr);
- } else if (current_char == 'i') {
- *ptr = getchar();
- } else if (current_char == '[') {
- continue;
- } else if (current_char == ']' && *ptr) {
- loop = 1;
- while (loop > 0) {
- current_char = input[--i];
- if (current_char == '[') {
- loop--;
- } else if (current_char == ']') {
- loop++;
- }
- }
- } else if (current_char == '/') { //push the value under the pointer to the register specified by the next value under the pointer
- ++ptr;
- if (*ptr > 2) {
- --ptr;
- } else {
- char temp1 = *ptr;
- --ptr;
- registrar[temp1] = *ptr;
- }
- } else if (current_char == '\\') { //Same as /, except popped, also, i used an excapecode here to get past \
- ++ptr;
- if (*ptr > 2) {
- --ptr;
- } else {
- char temp1 = *ptr;
- --ptr;
- *ptr = registrar[temp1];
- }
- } else if (current_char == 'a') { //Add R1 to R2 and put the sum in R3
- registrar[2] = registrar[0] + registrar[1];
- } else if (current_char == 's') { //Subtract R1 from R2 and put the diffrence in R3
- registrar[2] = registrar[0] - registrar[1];
- } else if (current_char == 'd') { // Divide R1 by R2 and put the quotient in R3
- if (registrar[1] == 0) {
- printf("Division by zero occured, Ending!");
- break;
- }
- registrar[2] = registrar[0] / registrar[1];
- } else if (current_char == 'm') { // Multiply R1 by R2 and put the result in R3
- registrar[2] = registrar[0] * registrar[1];
- } else if (current_char == '*') { // Terminate
- break;
- } else if (current_char == 'j') { // Jump forward n spaces
- for (i2 = *ptr; i2 != 0; i2--) {
- i++;
- current_char = input[i];
- }
- } else if (current_char == 'J') { // Jump backword n spaces
- for (i2 = *ptr; i2 != 0; i2--) {
- i--;
- current_char = input[i];
- }
- } else if (current_char == 'r') { //prints out the data in the source until it hits a ;
- i++;
- i3 = i;
- for (input[i3];input[i3] != ';';i3++){
- putchar(input[i3]);
- i++;
- }
- } else if (current_char == 'R') {
- i++;
- putchar(input[i]);
- }
- // More commands to come, the CIOL specs are not done
- }
- }
- int main( int argc, char *argv[] ) {
- interpret(argv[1]); // outputs input
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement