I just made a BF interpreter one line. Beat that.
(not tested it, but let's say it works for the sake of argument - simply modified mads' interpreter in notepad during a boring class at school )
Code:
#include <stdio.h>; const int MAX_DEPTH = 100, MEM_SIZE = 30000; int main(int argc, char **argv){ if(argc <= 1) { printf("You have to specify a filename. Usage:\n<executable> <BF filename>\n"); return 0; }; char mem[MEM_SIZE]; int lindex[MAX_DEPTH]; int depth = 0, len = 0, ptr = 0; FILE *f = fopen(argv[1], "r"); if(f == 0) { printf("Invalid filename: %s\n", argv[1]); return 0; }; int curr; while((curr = fgetc(f)) != EOF){ switch((char) curr){ case '+': ++(mem[ptr]); break; case '-': --(mem[ptr]); break; case '<': if(ptr > 0) --ptr; break; case '>': if(ptr < MEM_SIZE) ++ptr; break; case '.': putchar(mem[ptr]); break; case ',': mem[ptr] = getchar();getchar(); break; case '[': if(mem[ptr] == 0) { int d = 0, i = ftell(f); char c = '\0'; while(!feof(f)) { ++i; c = fgetc(f); if(c == '[') { ++d; } else if(c == ']') { if(d == 0) { fseek(f, i, SEEK_SET); break; } else { --d; } } } } else { lindex[depth++] = ftell(f); break; case ']': if(depth > 0 && mem[ptr] == 0) {} else { fseek(f, lindex[depth - 1], SEEK_SET); } break; default: break; } if(feof(f)) break; } fclose(f); printf("\n");}
(not tested it, but let's say it works for the sake of argument - simply modified mads' interpreter in notepad during a boring class at school )