/* (c) 2002 Jeyasankar Kottalam
*
* Jeyasankar Kottalam's BrainF*** interpreter
*/
#include <stdio.h>
/* Sets the size of the address space
* Default: 65536
* Traditional: 30000
*/
#define MEMORY_SIZE 65536
/* Sets the size of the largest loadable sourcefile
* Default: 65536
*/
#define MAX_FILE_SIZE 65536
/* Sets the maximum nesting level of loops
* Default: 4096
*/
#define MAX_LOOPS 4096
int main(int a, char *b[])
{
FILE *c = a>1 ? fopen(1[b],"r") : stdin;
unsigned char d[MAX_FILE_SIZE]={0},
e[MEMORY_SIZE]={0},
*f=d,
*g=e+(MEMORY_SIZE/2),
*h[MAX_LOOPS],
**i=h;
unsigned j;
FILE *k=stdin;
FILE *l=stdout;
c && fread(d, 1, sizeof d, c);
c && c != k && fclose(c);
for(j=0, f=d; *f; ++f)
switch(*f)
{
case '+': ++*g; break;
case '-': --*g; break;
case '>': ++g; break;
case '<': --g; break;
case ',': *g=fgetc(k); break;
case '.': fputc(*g,l); fflush(l); break;
case '[':
if(*g) *i++ = f-1;
else while(*++f != ']' || j)
j += (*f == '[') - (*f == ']');
break;
case ']': f = *--i; break;
}
putchar('\n');
return !c;
}