// bfi.c 1.2 #include #include #define BW 65535 int p, r, q; char a[BW], f[BW], b, o, *s=f; void interpret(char *c) { char *d; r++; while( *c ) { //if(strchr("<>+-,.[]\n",*c))printf("%c",*c); switch(o=1,*c++) { case '<': p--; if (p<0) p=BW-1; break; case '>': p++; if (p>=BW) p=0; break; case '+': a[p]++; break; case '-': a[p]--; break; case '.': putchar(a[p]); fflush(stdout); break; case ',': a[p]=getchar();fflush(stdout); break; case '[': for( b=1,d=c; b && *c; c++ ) b+=*c=='[', b-=*c==']'; if(!b) { c[-1]=0; while( a[p] ) interpret(d); c[-1]=']'; break; } case ']': fprintf(stderr, "ERROR: UNBALANCED BRACKETS"), exit(1); case '#': if(q>2) printf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d\n%*s\n", *a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^"); break; default: o=0; } } r--; } main(int argc,char *argv[]) { FILE *z; q=argc; if(z=fopen(argv[1],"r")) { while( ((b=getc(z))>0) && (!feof(z)) ) *s++=b; *s=0; interpret(f); } else fprintf(stderr, "ERROR: CANNOT OPEN FILE '%s'!", argv[1]), exit(1); }