Mercurial > repo
view src/ciol.c @ 11468:ff752d36eb0e draft
<fizzie> sled bin/url//s,https://hackego.esolangs.org/,https://hack.esolangs.org/,
author | HackEso <hackeso@esolangs.org> |
---|---|
date | Sun, 08 Apr 2018 18:18:04 +0100 |
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; }