1. // Brainfuck Interpreter by Charles Ray Shisler III                                        
  2. #include <iostream>
  3. #include <fstream>
  4. #define y int&s,char*v,int*a,std::istream&f,int&p,char&c
  5. void x(y){v[s]=((v[s]<255)?v[s]+1:0);}                          // +
  6. void t(y){s=((s<99998)?s+1:0);}                                 // >
  7. void q(y){v[s]=((v[s]>0)?v[s]-1:255);}                          // -
  8. void k(y){s=((s>0)?s-1:99998);}                                 // <
  9. void e(y){std::cout<<v[s];}                                     // .
  10. void h(y){char e=(char)std::cin.get();                          // ,
  11. v[s]=(e==10)?0:e;}
  12. void o(y){if(v[s])a[p++]=f.tellg();                             // [
  13. else for(int d=0;c!=93&&d>0;d=c==91?d+1:c==93?d-1:d)f.get(c);}
  14. void i(y){if(v[s])f.seekg(a[--p]-1);}                           // ]
  15. void w(y){return;}                                              // NOP
  16. int main(int g,char**r){
  17. if(g<2)return 1;
  18. std::ifstream f(r[1]);
  19. if(!f)return 1;
  20. char c=0,v[99999]={0};
  21. void (*n)(int&,char*,int*,std::istream&,int&,char&)=&w;
  22. for(int s=0,p=0,a[1000]={0};f.peek()!=-1;f.get(c),n=(c==43?&x:c==45?&\
  23. q:c==62?&t:c==60?&k:c==46?&e:c==44?&h:c==91?&o:c==93?&i:&w))(*n)(s,v,a,f,p,c);
  24. f.close();
  25. return 0;}