Mercurial > repo
view moonlang.c @ 7568:841495157e58
<Moon_> fetch http://pastebin.com/download/18qQz2t6
author | HackBot |
---|---|
date | Wed, 27 Apr 2016 23:27:35 +0000 |
parents | 802d670e44d8 |
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, also, i used an excapecode here to get past \ ++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[]) { FILE *fp; char input[100]; printf("The program requires a file in this location: C:/, The file should be named CIOL.txt and should contain the code of your CIOL program, does this file exist? hit enter to continue"); scanf("%s",input); fp = fopen("/CIOL.txt","r+"); char input2[10000]; fgets(input2, 10000, (FILE*)fp); interpret(input2); // outputs input fclose(fp); return 0; }