#include #include #include int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "Usage: %s file.bf\n", argv[0]); exit(EXIT_FAILURE); } FILE *fp = fopen(argv[1], "r"); fseek(fp, 0, SEEK_END); size_t program_size = ftell(fp); fseek(fp, 0, SEEK_SET); char program[program_size + 1]; program[program_size] = 0; fread(program, sizeof(uint8_t), program_size, fp); fclose(fp); size_t dp = 0; size_t pc = 0; uint8_t mem[3000] = { 0 }; while (pc < program_size) { switch (program[pc]) { case '>': { dp++; break; } case '<': { dp--; break; } case '+': { mem[dp]++; break; } case '-': { mem[dp]--; break; } case ',': { mem[dp] = getchar(); break; } case '.': { putchar(mem[dp]); break; } case '[': { if (mem[dp] == 0) { size_t l = 1; while (l) { switch (program[++pc]) { case '[': { l++; break; } case ']': { l--; break; } } } } break; } case ']': { if (mem[dp] != 0) { size_t l = 1; while (l) { switch (program[--pc]) { case ']': { l++; break; } case '[': { l--; break; } } } } break; } } pc++; } return EXIT_SUCCESS; }