diff options
| author | Miguel <m.i@gmx.at> | 2018-09-15 12:25:13 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-15 12:25:13 +0200 |
| commit | 0b010d22dbf845ad030e2e7320f9c5935b2604a4 (patch) | |
| tree | 6683b09a89b9e19630ef197343a8ace53a765c82 /userspace/brainfuck.c | |
| parent | fe7d0332267ef1e62153b685d2b5574ce624a4bc (diff) | |
brainfuck interpreter works!
Diffstat (limited to 'userspace/brainfuck.c')
| -rw-r--r-- | userspace/brainfuck.c | 89 |
1 files changed, 33 insertions, 56 deletions
diff --git a/userspace/brainfuck.c b/userspace/brainfuck.c index a1d5d53..eda0556 100644 --- a/userspace/brainfuck.c +++ b/userspace/brainfuck.c @@ -1,12 +1,4 @@ -// taken from: http://it-ride.blogspot.com/2009/11/brainfuck-interpreter.html - -/* comment - * TODO - * You have a bug. You don't check for EOF while looking for square brackets. - */ - /* - A brainfuck intepreter written in C, complete with error checking so you don't hurt yourself while, uh, brainfucking. Nothing really special about the implementation and it is probably very poor performance-wise. @@ -14,77 +6,64 @@ Author: Felix Oghină License: (brain)fuck licenses! + */ +// taken from: http://it-ride.blogspot.com/2009/11/brainfuck-interpreter.html +// and adapted for FoolOs by Miguel +// #include <stdio.h> #include <stdlib.h> #include <string.h> // by brainfuck standards (doesn't that sound funny?), the data pointer has // 3,000 bytes at its disposal, but I hate hard-coding such stuff. + // FOOLOS: decreased to 3000 (from 30.000) #define DATA_SIZE 3000 -void usage() { - puts( - "Usage: brainfuck FILE\n" - "If FILE is ommited or is '-', standard input is read" - ); +void usage(char *progname) +{ + printf("Usage: %s [FILE]\n",progname); } int main(int argc, char **argv) { + puts("\n\nbrainfuck: Welcome to the BRAINFUCK INTERPRETER by Felix Oghina"); + puts("brainfuck: Licensed under the (brain)fuck licenses!"); + puts("brainfuck: Adapted & Compiled for FoolOS by Miguel"); // used by the bf program unsigned char *dataptr = malloc(sizeof(char) * DATA_SIZE); // position of the data pointer unsigned int datapos = 0; + // input file FILE *input; + // level - deepness of brackets // i - uh, you need explanation for this one? unsigned int level, i; + // we will read chars from the input into r unsigned char r; - - /* uncommented by FOOLOS - // determine input - if (argc == 2) { - if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0) { - usage(); - return EXIT_SUCCESS; - } - else { - input = fopen(argv[1], "r"); - if (input == NULL) { - puts("Error opening input file"); - return EXIT_FAILURE; - } - } - } - else { - usage(); + // check argument count + if(argc!=2) + { + usage(argv[0]); return EXIT_FAILURE; } - */ - - // added by FOOLOS - input=fopen("input.txt","r"); - char *buf=malloc(256); - puts("\n\nbrainfuck: Welcome to the BRAINFUCK INTERPRETER by Felix Oghina"); - puts("brainfuck: Licensed under the (brain)fuck licenses!"); - puts("brainfuck: Adapted & Compiled for FoolOS"); -// printf("brainfuck: dataptr: 0x%08X\n",dataptr); -// printf("brainfuck: dataptr2: 0x%08X\n",buf); - rewind(input); - fgets(buf,255,input); -// printf("\nbrainfuck: loaded programm: %s\n\n",buf); - fseek(input, 0, SEEK_SET); - + // open brainfuck source + input = fopen(argv[1], "r"); + if (input == NULL) + { + puts("Error opening input file"); + return EXIT_FAILURE; + } // zero the data pointer for (i=0; i < DATA_SIZE; i++) { @@ -92,17 +71,18 @@ int main(int argc, char **argv) } // start interpreting + while (1) { - while (!feof(input)) { r = (unsigned char) fgetc(input); -// printf("%c",r); + switch(r) { + case 'X': + puts("END!"); + return 0; case '>': if (datapos < DATA_SIZE - 1) datapos++; else { puts("brainfuck error: pointer overflow"); - // replace with foolshell. - _execve(15,0,0); return EXIT_FAILURE; } break; @@ -110,8 +90,6 @@ int main(int argc, char **argv) if (datapos > 0) datapos--; else { puts("brainfuck error: pointer underflow"); - // replace with foolshell. - _execve(15,0,0); return EXIT_FAILURE; } break; @@ -141,7 +119,8 @@ int main(int argc, char **argv) if (dataptr[datapos] != 0) { level = 1; while (level != 0) { - fseek(input, -2, SEEK_CUR); + //fseek(input, -2, SEEK_CUR); + _lseek(3,-2,SEEK_CUR); r = (unsigned char) fgetc(input); if (r == ']') level ++; else if (r == '[') level --; @@ -150,8 +129,6 @@ int main(int argc, char **argv) break; } } - // replace with foolshell. - _execve(15,0,0); - return EXIT_SUCCESS; + return EXIT_SUCCESS; } |
