home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_2.iso / files / 768b.lha / Brainfuck / bfi.c < prev    next >
C/C++ Source or Header  |  1993-06-01  |  1KB  |  60 lines

  1. #include <stdio.h>
  2.  
  3. int  a[100],p, r, q;
  4. char f[5000], b, o, *s=f;
  5.  
  6. void interpret(char *c)
  7. {
  8.     char *d;
  9.  
  10.     r++;
  11.     while( *c ) {
  12.         //if(strchr("<>+-,.[]\n",*c))printf("%c",*c);
  13.         switch(o=1,*c++) {
  14.         case '<': p--;        break;
  15.         case '>': p++;        break;
  16.         case '+': a[p]++;     break;
  17.         case '-': a[p]--;     break;
  18.         case '.': putchar(a[p]); fflush(stdout); break;
  19.         case ',': a[p]=getchar();fflush(stdout); break;
  20.         case '[':
  21.             for( b=1,d=c; b && *c; c++ )
  22.                 b+=*c=='[', b-=*c==']';
  23.             if(!b) {
  24.                 c[-1]=0;
  25.                 while( a[p] )
  26.                     interpret(d);
  27.                 c[-1]=']';
  28.                 break;
  29.             }
  30.         case ']':
  31.             puts("UNBALANCED BRACKETS"), exit(0);
  32.         case '#':
  33.             if(q>2)
  34.                 printf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d\n%*s\n",
  35.                        *a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^");
  36.             break;
  37.         default: o=0;
  38.         }
  39.         if( p<0 || p>100)
  40.             puts("RANGE ERROR"), exit(0);
  41.     }
  42.     r--;
  43.     chkabort();
  44. }
  45.  
  46. main(int argc,char *argv[])
  47. {
  48.     FILE *z;
  49.  
  50.     q=argc;
  51.  
  52.     if(z=fopen(argv[1],"r")) {
  53.         while( (b=getc(z))>0 )
  54.             *s++=b;
  55.         *s=0;
  56.         interpret(f);
  57.     }
  58. }
  59.  
  60.