/*************************************************** * brainfark.c by rattle (awarenetwork.org) * brainfuck interpreter. very naughty recursive implementation of [] loops. If AWKz was here, * he'd hit me with a giant lambda expression. * ***************************************************/ #include #include #include typedef unsigned char word; typedef signed long schlong; FILE *f = NULL; word *p = NULL; schlong s = 0x800, j=0; void die(char* err) { printf("\nCRITICAL ERROR: %s\n",err); if (f) fclose(f); if (p) free(p); exit(1); } void blow(int lo) { register int ss = s << 1; if (p = realloc(p,ss*sizeof(word))) { memset(&p[s],0,s*sizeof(word)); if (lo) { j += s; memcpy(&p[s],p,s*sizeof(word)); } s = ss; } else die("insufficient memory"); } void inc() { if (++j>s) blow(0); } void dec() { if (--j<0) blow(1); } schlong item() { schlong step; schlong skip = 0; for(step=1;;step++) { if (skip) { switch (fgetc(f)) { case '[': skip++; break; case ']': skip--; break; case EOF: die("unexpected EOF"); default: break; } continue; } else switch (fgetc(f)) { case '>': inc(); break; case '<': dec(); break; case '+': p[j]++; break; case '-': p[j]--; break; case '.': putchar(p[j]); break; case ',': p[j]=getchar(); break; case '[': while (p[j]) fseek(f,-item(),SEEK_CUR); skip++; break; case ']': case EOF: return step; default: break; } } } int main(int argc, char** argv) { if (!(p=calloc(s,sizeof(word)))) return 1; if (argc==1) { die("need an input filename"); } else { if (f = fopen(argv[1],"rb")) { item(); fclose(f); } else die("unable to open file"); } free(p); return 0; }