/* BrainFuck compiler C v2.1.1. Copyright 1997 Ben Olmstead, 2007 Xenius. /* This program is governed by the GNU General Public License. See the file COPYING for details. /* /* This compiler generates native machine code for whatever processor. /* It is currently configured to generate an MS-DOS .COM file, but it /* should be relatively easy to alter. /************************************************************************/ #include /************************************************************************/ #define NEXT "\x46" #define PREV "\x4e" #define INCR "\xfe\x04" #define DECR "\xfe\x0c" #define PUTC "\xb4\x40\xbb\x01\x00\x89\xd9\x89\xf2\xcd\x21" #define GETC "\xb4\x01\xcd\x21\x3c\x0d\x75\x07\xb8\x0a\x02\xb2\x0a\xcd\x21\x88\x04" #define J_FW "\x80\x3c\x00\x75\x03\xe9\x00\x00" #define J_BW "\x80\x3c\x00\x74\x03\xe9" #define PREF "\xbe\x00\x00\x31\xc0\xb9\x00\x00\x89\xf7\xf3\xaa" #define PSFX "\xb8\x00\x4c\xcd\x21" /************************************************************************/ void compile(); /************************************************************************/ unsigned short location=12; FILE *z, *Z; char b, *filename="a.com"; int n; /************************************************************************/ main(int argc, char *argv[]) { if (argc==3) filename=argv[2]; if (z=fopen(argv[1],"r")) { if (Z=fopen(filename, "wb")) { fwrite(PREF, 1, 12, Z); compile(); fwrite(PSFX, 1, 5, Z); location += 261; fseek(Z, 1, SEEK_SET); fwrite(&location, 1, 2, Z); fseek(Z, 6, SEEK_SET); location=-location; fwrite(&location, 1, 2, Z); fclose(Z); } fclose(z); } } /************************************************************************/ void compile() { unsigned short m; while((b=getc(z))!=EOF) { switch(b) { case '<': fwrite(PREV, 1, 1, Z); location++; break; case '>': fwrite(NEXT, 1, 1, Z); location++; break; case '+': fwrite(INCR, 1, 2, Z); location+=2; break; case '-': fwrite(DECR, 1, 2, Z); location+=2; break; case '.': fwrite(PUTC, 1, 11,Z); location+=11; break; case ',': fwrite(GETC, 1, 17,Z); location+=17; break; case '[': fwrite(J_FW, 1, 8, Z); location+=8; m=location; compile(); fwrite(J_BW, 1, 6, Z); location+=8; n=m-location; fwrite(&n, 1, 2, Z); fseek(Z, m-2, SEEK_SET); n=-n; fwrite(&n, 1, 2, Z); fseek(Z, 0, SEEK_END); break; case ']': return; } } }