diff options
author | EliteTK <tomasz.kramkowski@gmail.com> | 2014-02-24 21:28:46 +0000 |
---|---|---|
committer | EliteTK <tomasz.kramkowski@gmail.com> | 2014-02-24 21:28:46 +0000 |
commit | 1e4bf42350a2145081224e4610312bc65566ad5c (patch) | |
tree | 311cebff7fe1a2fb2f330b09da023e0ce7186045 /bfparse.c | |
parent | cd48e9a226481f9e22cae580386049b6fd9d9c4b (diff) | |
download | c-stuff-1e4bf42350a2145081224e4610312bc65566ad5c.tar.gz c-stuff-1e4bf42350a2145081224e4610312bc65566ad5c.tar.xz c-stuff-1e4bf42350a2145081224e4610312bc65566ad5c.zip |
More cleanup
Diffstat (limited to 'bfparse.c')
-rw-r--r-- | bfparse.c | 85 |
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); +} |