aboutsummaryrefslogtreecommitdiffstats
path: root/bfparse.c
diff options
context:
space:
mode:
authorEliteTK <tomasz.kramkowski@gmail.com>2015-01-11 22:26:45 +0000
committerEliteTK <tomasz.kramkowski@gmail.com>2015-01-11 22:26:45 +0000
commite430c05f5662e151688b41e6e03f5e17b1f40ed6 (patch)
treeb79b457934a0f0ab6951a03bb009c234e62e57c5 /bfparse.c
parentbdd0eb9035bc6cdf27c75e103b132575837c4753 (diff)
downloadc-stuff-e430c05f5662e151688b41e6e03f5e17b1f40ed6.tar.gz
c-stuff-e430c05f5662e151688b41e6e03f5e17b1f40ed6.tar.xz
c-stuff-e430c05f5662e151688b41e6e03f5e17b1f40ed6.zip
Added sanity to bfparse and brought up to style guidelines.
Diffstat (limited to 'bfparse.c')
-rw-r--r--bfparse.c145
1 files changed, 64 insertions, 81 deletions
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 <tk@the-tk.com>
*
* 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<stdio.h>
-#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<stdio.h>\n");
- printf("#include<stdlib.h>\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<stdio.h>\n");
+ printf("#include<stdlib.h>\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');
}