summaryrefslogtreecommitdiff
path: root/userspace/brainfuck.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-15 12:25:13 +0200
committerMiguel <m.i@gmx.at>2018-09-15 12:25:13 +0200
commit0b010d22dbf845ad030e2e7320f9c5935b2604a4 (patch)
tree6683b09a89b9e19630ef197343a8ace53a765c82 /userspace/brainfuck.c
parentfe7d0332267ef1e62153b685d2b5574ce624a4bc (diff)
brainfuck interpreter works!
Diffstat (limited to 'userspace/brainfuck.c')
-rw-r--r--userspace/brainfuck.c89
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;
}