view src/ciol.c @ 9554:23f43464694e

<Zarutian> le/rn Frams\xc3\xb3knarflokkurinn/A, now defunct, political party in Iceland. Like its sister party Sj\xc3\xa1lfst\xc3\xa6\xc3\xb0isflokkurinn it is named by the antonym of what it is. (The name means the Progressive Party but they have nearly always been highly regressive). Think dumb Hill-Billies in ill fitting suits and you get their constiuents.
author HackBot
date Sun, 30 Oct 2016 14:33:24 +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;
}