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