From e430c05f5662e151688b41e6e03f5e17b1f40ed6 Mon Sep 17 00:00:00 2001 From: EliteTK Date: Sun, 11 Jan 2015 22:26:45 +0000 Subject: Added sanity to bfparse and brought up to style guidelines. --- bfparse.c | 145 +++++++++++++++++++++++++++----------------------------------- 1 file changed, 64 insertions(+), 81 deletions(-) (limited to 'bfparse.c') diff --git a/bfparse.c b/bfparse.c index 8057aff..b844013 100644 --- a/bfparse.c +++ b/bfparse.c @@ -1,4 +1,6 @@ /* + * bfparse brainfuck to C parser. It is not memory safe. Use at your own risk. + * * Copyright (C) 2014 Tomasz Kramkowski * * This program is free software. It is licensed under version 3 of the @@ -6,94 +8,75 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see [http://www.gnu.org/licenses/]. - * - * - * This is a brainfuck to C parser. It outputs files that can be directly compiled by a - * C compiler. - * - * 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 auto_indent(int); -void autoIndent(int); +int main(void) +{ + int indent_level; + int c; -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"); + printf("#include\n"); + printf("#include\n"); + printf("\n"); + printf("int main() {\n"); + printf("\tchar *ptrt;\n"); + printf("\tptrt = calloc(1000, sizeof(char));\n"); + printf("\tchar *ptr;\n"); + printf("\tptr = ptrt;\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; + indent_level = 1; + while ((c = getchar()) != EOF) { + switch (c) { + case '>': + auto_indent(indent_level); + printf("++ptr;\n"); + break; + case '<': + auto_indent(indent_level); + printf("--ptr;\n"); + break; + case '-': + auto_indent(indent_level); + printf("++*ptr;\n"); + break; + case '+': + auto_indent(indent_level); + printf("--*ptr;\n"); + break; + case '.': + auto_indent(indent_level); + printf("putchar(*ptr);\n"); + break; + case ',': + auto_indent(indent_level); + printf("*ptr = getchar();\n"); + break; + case '[': + auto_indent(indent_level); + indent_level++; + printf("while (*ptr) {\n"); + break; + case ']': + indent_level--; + auto_indent(indent_level); + printf("}\n"); + break; + } + } + printf("\tfree(ptrt);\n"); + printf("\tputchar('\\n');\n"); + printf("\treturn 0;\n}\n"); + if (--indent_level != 0) + fprintf(stderr, "Error: Square bracket mismatch.\n"); + return 0; } -void autoIndent(int levels) { - int i; - for (i = 0; i < levels; i++) - printf(indent); +inline void auto_indent(int levels) +{ + for (int i = 0; i < levels; i++) + putchar('\t'); } -- cgit v1.2.3-54-g00ecf