Mercurial > repo
view src/ciol.c @ 8427:1fc808cd5b1f
<b_jonas> learn can\'t is the most frequent word whose pronunciation varies between /\xc9\x91\xcb\x90/ and /\xc3\xa6/ depending on dialect. The list is: advance after answer ask aunt brass can\'t cast castle chance class command dance demand draft enhance example fast father glass graph grass half last laugh mask master nasty pass past path plant rather sample shan\'t staff task vast
author | HackBot |
---|---|
date | Thu, 09 Jun 2016 21:28:47 +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; }