/* * Harmful Brainfuck interpreter. * * Author: Bertram Felgenhauer * License: CC0 * * 2014-12-25 Initial version. */ #include #include #include #define SIZE (1<<20) char code[SIZE]; int size; int data[SIZE]; void interpret() { int ip; int p = 0; for (ip = 0; ip >= 0 && ip < size; ip++) { switch (code[ip]) { case '+': data[p]++; if (data[p] >= 256) { fprintf(stderr, "\nOverflow at %d (tape: %d)\n", ip, p); exit(1); } break; case '-': data[p]--; if (data[p] < -256) { fprintf(stderr, "\nUnderflow at %d (tape: %d)\n", ip, p); exit(1); } break; case '<': p--; if (p < 0) { fprintf(stderr, "\nFell off tape at %d\n", ip); exit(1); } break; case '>': p++; if (p >= SIZE) { fprintf(stderr, "\nRan out of tape at %d\n", ip); exit(1); } break; case '*': ip += data[p] - 1; break; case '.': putchar(data[p]); fflush(stdout); break; case ',': { int c = getchar(); if (c < 0) c = 0; data[p] = c; break; } } } } int main(int argc, char **argv) { FILE *f; if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } f = fopen(argv[1], "r"); if (!f) { fprintf(stderr, "Error opening `%s'\n", argv[1]); exit(1); } size = fread(code, 1, SIZE, f); fclose(f); interpret(); exit(0); }