You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.4 KiB
C
103 lines
2.4 KiB
C
#include <stdio.h>
|
|
#define BUFSIZE 1000000
|
|
// Brainfuck interpreter in C
|
|
// Iteration 2
|
|
|
|
// The brainfuck interpreter now reads actual files.
|
|
// usage : bf [filename]
|
|
// I did that with my poor C skills.
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
if (argc != 2) return 1;
|
|
|
|
char buffer[BUFSIZE], data[BUFSIZE];
|
|
int i, c;
|
|
unsigned int b, j;
|
|
FILE* f;
|
|
j = 0;
|
|
|
|
f = fopen(argv[1], "r");
|
|
if (!f) return 1;
|
|
|
|
for (i = 0; i < BUFSIZE; ++i)
|
|
data[i] = 0;
|
|
for (i = 0; (c=fgetc(f)) != EOF && i < BUFSIZE; ++i)
|
|
{
|
|
switch (c)
|
|
{
|
|
case',':case '.':case '<':case '>':case '+':case '-':case '[':case ']':
|
|
buffer[j] = c;
|
|
++j;
|
|
break;
|
|
}
|
|
}
|
|
buffer[j] = '\0';
|
|
i = 0;
|
|
|
|
while ((c=buffer[i]) != '\0')
|
|
{
|
|
switch (c)
|
|
{
|
|
case '>':
|
|
++j;
|
|
break;
|
|
case '<':
|
|
--j;
|
|
break;
|
|
case '+':
|
|
++data[j];
|
|
break;
|
|
case '-':
|
|
--data[j];
|
|
break;
|
|
case '.':
|
|
putchar(data[j]);
|
|
break;
|
|
case ',':
|
|
data[j] = getchar();
|
|
break;
|
|
case '[':
|
|
if (data[j] == 0)
|
|
{
|
|
b = 1;
|
|
while (b!=0)
|
|
{
|
|
++i;
|
|
switch ((c=buffer[i]))
|
|
{
|
|
case '[':
|
|
++b;
|
|
break;
|
|
case ']':
|
|
--b;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case ']':
|
|
if (data[j] != 0)
|
|
{
|
|
b = 1;
|
|
while (b!=0)
|
|
{
|
|
--i;
|
|
switch ((c=buffer[i]))
|
|
{
|
|
case ']':
|
|
++b;
|
|
break;
|
|
case '[':
|
|
--b;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
++i;
|
|
}
|
|
}
|