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