First finished version

This commit is contained in:
Debucquoy Anthony 2023-10-26 14:15:26 +02:00
commit b18854c74f
Signed by: tonitch
GPG Key ID: A78D6421F083D42E
4 changed files with 140 additions and 0 deletions

20
Makefile Normal file
View File

@ -0,0 +1,20 @@
.PHONY: clean, mrproper
CC = gcc
CFLAGS = -g -Wall
all: main
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
main: main.o
$(CC) $(CFLAGS) -o $@ $+
clean:
rm -f *.o core.*
mrproper: clean
rm -f main
run: main
./$< ./hello_world.bf

18
README.md Normal file
View File

@ -0,0 +1,18 @@
# BFF
BFF (BrainFuck Fucker) is a really simple [Brainfuck](https://en.wikipedia.org/wiki/Brainfuck#Language_design) interpreter in c
## Usage
```
$ make
$ ./bff <program.bf>
```
## TODO
- [ ] Faster loops by keeping the position of the previous '[' or ']'
## Resources
- The wikipedia's BrainFuck Design Language: [https://en.wikipedia.org/wiki/Brainfuck#Language_design](https://en.wikipedia.org/wiki/Brainfuck#Language_design)

28
hello_world.bf Normal file
View File

@ -0,0 +1,28 @@
+++++ +++
[
>++++
[
>++
>+++
>+++
>+
<<<<-
]
>+
>+
>-
>>+
[<]
<-
]
>>.
>---.
+++++ ++..+++.
>>.
<-.
<.
+++.----- -.----- ---.
>>+.
>++.

74
main.c Normal file
View File

@ -0,0 +1,74 @@
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define MEMORY_SIZE 30000
int main(int argc, char *argv[])
{
int c = 0;
argv++; // Program name
while(--argc){
const char *filename = *argv++;
char *memory = calloc(1, MEMORY_SIZE), *pointer = memory;
FILE *fd = fopen(filename, "r");
assert(fd);
fseek(fd, 0, SEEK_END);
int file_size = ftell(fd);
rewind(fd);
char* file_pointer = malloc(file_size+1), *file_cnt = file_pointer;
fread(file_pointer, 1, file_size, fd);
file_cnt[file_size] = 0;
fclose(fd);
for(;*file_cnt != '\0'; file_cnt++){
switch (*file_cnt) {
case '>': // Increment the data pointer by one (to point to the next cell to the right).
pointer++;
break;
case '<': // Decrement the data pointer by one (to point to the next cell to the left).
pointer--;
break;
case '+': // Increment the byte at the data pointer by one.
(*pointer)++;
break;
case '-': // Decrement the byte at the data pointer by one.
(*pointer)--;
break;
case '.': // Output the byte at the data pointer.
printf("%c", *pointer);
break;
case ',': // Accept one byte of input, storing its value in the byte at the data pointer.
scanf("%c", pointer);
break;
case '[': // If the byte at the data pointer is zero, then instead of moving the instruction pointer forward to the next command, jump it forward to the command after the matching ] command.
if(*pointer == 0)
while(*++file_cnt != ']' || c != 0){
if(*file_cnt == '[')
c++;
else if(*file_cnt == ']')
c--;
}
break;
case ']': // If the byte at the data pointer is nonzero, then instead of moving the instruction pointer forward to the next command, jump it back to the command after the matching [ command.
if(*pointer != 0)
while(*--file_cnt != '[' || c != 0){
if(*file_cnt == ']')
c++;
else if(*file_cnt == '[')
c--;
}
break;
default:
break;
}
}
free(memory);
free(file_pointer);
}
return 0;
}