Initial commit
This commit is contained in:
commit
7ed58a61b2
6
Makefile
Normal file
6
Makefile
Normal file
@ -0,0 +1,6 @@
|
||||
SRC_Files=$(wildcard src/*.c)
|
||||
CC=clang
|
||||
CF=-Wall -g
|
||||
|
||||
install:
|
||||
$(CC) $(CF) $(SRC_Files) -o brainfuck
|
1
examples/helloworld.bf
Normal file
1
examples/helloworld.bf
Normal file
@ -0,0 +1 @@
|
||||
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
|
57
src/main.c
Normal file
57
src/main.c
Normal file
@ -0,0 +1,57 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
unsigned char cells[1024];
|
||||
unsigned char *ptr = cells;
|
||||
|
||||
void error(char c) {
|
||||
fprintf(stderr, "ERROR: Unexpected token, %c\n", c);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char *parse(char *src) {
|
||||
|
||||
char *start = src;
|
||||
|
||||
while (*src != '\0') {
|
||||
switch (*src) {
|
||||
case 0: return NULL;
|
||||
case '.': printf("%c", (*ptr)); break;
|
||||
case ',': *ptr = getc(stdin); break;
|
||||
case '+': (*ptr)++; break;
|
||||
case '-': (*ptr)--; break;
|
||||
case '>': ptr++; break;
|
||||
case '<': ptr--; break;
|
||||
case '[': src = parse(++src); break;
|
||||
case ']':
|
||||
if (*ptr == 0) return src;
|
||||
src = start;
|
||||
continue;
|
||||
}
|
||||
|
||||
src++;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
if (argc != 2) return 1;
|
||||
|
||||
FILE *file = fopen(argv[1], "r");
|
||||
if (!file) return 1;
|
||||
|
||||
fseek(file, 0, SEEK_END);
|
||||
size_t size = ftell(file);
|
||||
rewind(file);
|
||||
|
||||
char *src = malloc(size);
|
||||
fread(src, 1, size, file);
|
||||
|
||||
if (parse(src) != NULL) {
|
||||
error('[');
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user