
brainfuck.c
By: a guest on
Sep 12th, 2015 | syntax:
C | size: 2.84 KB | views:
86 | expires: Never
#include <stdio.h>
#include <stdlib.h>
#define BLOCK 64
char* readFile(char *name) {
int index = 0;
int blocks = 1;
char *data = malloc(blocks * BLOCK);
FILE *f = fopen(name, "r");
for(;(data[index] = fgetc(f)) != EOF; index++)
if(index == blocks * BLOCK) data = realloc(data, ++blocks * BLOCK);
fclose(f);
data[index] = 0;
return data;
}
char *seekBracket(char target, char opposite, char *begin, char *ptr,
char *(*movePtr)(char*)) {
int count = 1;
ptr = (*movePtr)(ptr);
for(;count && ptr > begin; ptr = (*movePtr)(ptr)) {
if(*ptr == EOF) {
ptr--;
break;
}
else if (*ptr == target) count--;
else if (*ptr == opposite) count++;
}
return ptr;
}
char *inc(char *ptr) {
return ++ptr;
}
char *dec(char *ptr) {
return --ptr;
}
int main(int argc, char **argv) {
for (int i = 1; i < argc; i++) {
char *code = readFile(argv[i]);
char *codePtr = code;
size_t blocks = 1;
char *data = malloc(BLOCK);
char *dataPtr = data;
for(int j = 0; j < BLOCK; j++) {
dataPtr[j] = 0;
}
for(;*codePtr != EOF; codePtr++) {
switch(*codePtr) {
case '+':
(*dataPtr)++;
break;
case '-':
(*dataPtr)--;
break;
case '.':
printf("%c", *dataPtr);
break;
case ',':
*dataPtr = getchar();
break;
case '<':
dataPtr--;
if(dataPtr < data) {
printf("Error: Pointer moved outside of byte array!\n");
goto end;
}
break;
case '>':
dataPtr++;
if(dataPtr == data + blocks * BLOCK) {
data = realloc(data, ++blocks * BLOCK);
dataPtr = data + (blocks - 1) * BLOCK;
for(int j = 0; j < BLOCK; j++) {
dataPtr[j] = 0;
}
}
break;
case '[':
if(!*dataPtr)
codePtr = seekBracket(']', '[', code, codePtr, inc);
break;
case ']':
if(*dataPtr)
codePtr = seekBracket('[', ']', code, codePtr, dec);
break;
case 0:
goto end;
}
}
end: free(code);
free(data);
printf("\n");
}
}