#include #include const char * header = "" "#include \n" "#include \n" "#include \n" "int main(int argc, char ** argv) {\n" " char tape[0x10000];\n" " char * head = tape;\n" " memset(tape, 0, sizeof(tape));\n"; const char * footer = "" " return 0;\n" "}\n"; int main(int argc, char ** argv) { if(argc > 3) { fprintf(stderr, "Usage: brainfuck_compiler [ifile.bf [ofile.c]]\n"); return 1; } char * ifname = argc > 1 ? argv[1] : "/dev/stdin"; char * ofname = argc > 2 ? argv[2] : "/dev/stdout"; FILE * ifile = fopen(ifname, "r"); FILE * ofile = fopen(ofname, "w"); // Write the overall setup fputs(header, ofile); int c; while((c=fgetc(ifile)) != EOF) { switch(c) { case '>': fputs(" ++head;\n", ofile); break; case '<': fputs(" --head;\n", ofile); break; case '+': fputs(" ++*head;\n",ofile); break; case '-': fputs(" --*head;\n",ofile); break; case '.': fputs(" putchar(*head);\n",ofile); break; case ',': fputs(" *head = getchar();\n",ofile); break; case '[': fputs(" while(*head) {\n", ofile); break; case ']': fputs(" }\n", ofile); break; } } fputs(footer, ofile); return 0; }