Mercurial > repo
view src/ciol.c @ 11293:a7899ef2d7b6
<wob_jonas> learn Aristotle said that every illness can be cured by balancing the four vitreous humors, and everyone believed him for two thousand years, even though people still died of illnesses. It wasn\'t until the 20th century that Szent-Gy\xc3\xb6rgyi Albert realized that Aristotle didn\'t find fifth kind of vitreous humor, vitamin C, because the Greek alphabet
author | HackBot |
---|---|
date | Mon, 01 Jan 2018 17:57:43 +0000 |
parents | b680a67063ff |
children |
line wrap: on
line source
#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 ++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; }