/* * Brainfuck interpreter. */ #include #include #include #include #include #include int main(int argc, char **argv) { char program[10000]; int fd = open(argv[1], O_RDONLY); if (fd < 0) { perror(argv[1]); return 1; } int progsize = read(fd, program, sizeof(program)); close(fd); unsigned char memory[30001]; int pc = 0, mp = 0; while (pc < progsize) { /* printf("[%d]", pc); */ /* fflush(stdout); */ switch (program[pc]) { case '>': mp++; pc++; break; case '<': mp--; pc++; break; case '+': memory[mp]++; pc++; break; case '-': memory[mp]--; pc++; break; case ',': read(0, &memory[mp], 1); pc++; break; case '.': write(1, &memory[mp], 1); pc++; break; case '[': if (memory[mp]) { pc++; break; } int bc = 0; do { if (program[pc] == '[') bc++; if (program[pc] == ']') bc--; pc++; if (pc >= progsize) { fprintf(stderr, "unmatched [\n"); return 1; } } while (bc); break; case ']': if (!memory[mp]) { pc++; break; } int bbc = 0; do { if (program[pc] == ']') bbc++; if (program[pc] == '[') bbc--; pc--; if (pc < 0) { fprintf(stderr, "unmatched ]\n"); return 1; } } while (bbc); pc++; pc++; break; default: /* comment! */ pc++; break; } } return 0; }