From 1e4bf42350a2145081224e4610312bc65566ad5c Mon Sep 17 00:00:00 2001 From: EliteTK Date: Mon, 24 Feb 2014 21:28:46 +0000 Subject: More cleanup --- bfparse.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 bfparse.c (limited to 'bfparse.c') diff --git a/bfparse.c b/bfparse.c new file mode 100644 index 0000000..2ea57b5 --- /dev/null +++ b/bfparse.c @@ -0,0 +1,85 @@ +// WARNING: THIS PROGRAM PRODUCES CODE THAT ALLOWS UNRESTRICTED MEMORY ACCESS. +// USE AT YOUR OWN RISK!!!!!!!!!!!! +// This program takes input from stdin and outputs on stdout and stderr (for errors) + +#include + +#define rightAngle "++ptr;\n" // right angle bracket +#define leftAngle "--ptr;\n" // left angle bracket +#define plus "++*ptr;\n" // plus +#define minus "--*ptr;\n" // minus +#define period "putchar(*ptr);\n" // period +#define comma "*ptr = getchar();\n" // comma +#define leftSquare "while (*ptr) {\n" // left square bracket +#define rightSquare "}\n" // right square bracket + +#define indent " " + +void autoIndent(int); + +int main( int argc, char *argv[] ) { + int indentLevel = 1; + printf("// Generated with TK's \"fuck\" brainfuck to C parser.\n"); + printf("#include\n"); + printf("#include\n"); + printf("\n"); + printf("int main() {\n"); + printf(" char *ptrt;\n"); + printf(" ptrt = calloc(1000, sizeof(char));\n"); + printf(" char *ptr;\n"); + printf(" ptr = ptrt;\n"); + printf(" // The following is directly parsed\n"); + + char c; + while ( ( c = getchar() ) != EOF ) { + switch (c) { + case 62: + autoIndent(indentLevel); + printf(rightAngle); + break; + case 60: + autoIndent(indentLevel); + printf(leftAngle); + break; + case 43: + autoIndent(indentLevel); + printf(plus); + break; + case 45: + autoIndent(indentLevel); + printf(minus); + break; + case 46: + autoIndent(indentLevel); + printf(period); + break; + case 44: + autoIndent(indentLevel); + printf(comma); + break; + case 91: + autoIndent(indentLevel); + indentLevel++; + printf(leftSquare); + break; + case 93: + indentLevel--; + autoIndent(indentLevel); + printf(rightSquare); + break; + } + } + printf(" // Closing cleanup\n"); + printf(" free(ptrt);\n"); + printf(" putchar('\\n');\n"); + printf(" return 0;\n}\n"); + if (--indentLevel) + fprintf( stderr, "Incorrect number of brackets. - Error parsing file.\n"); + return 0; +} + +void autoIndent(int levels) { + int i; + for (i = 0; i < levels; i++) + printf(indent); +} -- cgit v1.2.3-54-g00ecf