First finished version
This commit is contained in:
		
							
								
								
									
										20
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Makefile
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										18
									
								
								README.md
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										28
									
								
								hello_world.bf
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
+++++ +++
 | 
			
		||||
[
 | 
			
		||||
    >++++
 | 
			
		||||
    [
 | 
			
		||||
        >++
 | 
			
		||||
        >+++
 | 
			
		||||
        >+++
 | 
			
		||||
        >+
 | 
			
		||||
        <<<<-
 | 
			
		||||
    ]
 | 
			
		||||
    >+
 | 
			
		||||
    >+
 | 
			
		||||
    >-
 | 
			
		||||
    >>+
 | 
			
		||||
    [<]
 | 
			
		||||
 | 
			
		||||
    <-
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
>>.
 | 
			
		||||
>---.
 | 
			
		||||
+++++ ++..+++.
 | 
			
		||||
>>.
 | 
			
		||||
<-.
 | 
			
		||||
<.
 | 
			
		||||
+++.----- -.----- ---.
 | 
			
		||||
>>+.
 | 
			
		||||
>++.
 | 
			
		||||
							
								
								
									
										74
									
								
								main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								main.c
									
									
									
									
									
										Normal 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;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user