aboutsummaryrefslogtreecommitdiffstats
path: root/bfparse.c
diff options
context:
space:
mode:
authorEliteTK <tomasz.kramkowski@gmail.com>2014-02-24 21:28:46 +0000
committerEliteTK <tomasz.kramkowski@gmail.com>2014-02-24 21:28:46 +0000
commit1e4bf42350a2145081224e4610312bc65566ad5c (patch)
tree311cebff7fe1a2fb2f330b09da023e0ce7186045 /bfparse.c
parentcd48e9a226481f9e22cae580386049b6fd9d9c4b (diff)
downloadc-stuff-1e4bf42350a2145081224e4610312bc65566ad5c.tar.gz
c-stuff-1e4bf42350a2145081224e4610312bc65566ad5c.tar.xz
c-stuff-1e4bf42350a2145081224e4610312bc65566ad5c.zip
More cleanup
Diffstat (limited to 'bfparse.c')
-rw-r--r--bfparse.c85
1 files changed, 85 insertions, 0 deletions
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<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 autoIndent(int);
+
+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");
+
+ 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);
+}