view src/ciol.c @ 12518:2d8fe55c6e65 draft default tip

<int-e> learn The password of the month is release incident pilot.
author HackEso <hackeso@esolangs.org>
date Sun, 03 Nov 2024 00:31:02 +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;
}