1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
| #include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
// Definiere die Größe des Speichers, auf der wir arbeiten
#define MEMORY_SIZE 40000
// Definiere zwei Funktionen, die in Nasm aufgerufen werden können um ein
// Zeichen einzulesen bzw. auszugeben
extern void output(char c) {
putc(c, stdout);
fflush(stdout);
}
extern char input() {
return getc(stdin);
}
// Definition unserer Nasm-Funktion
extern void brainfuck(char[], char[]);
int main(int argc, char *argv[]) {
// Wir wollen genau einen Kommandozeilenparameter
if (argc != 2) {
printf("Usage: %s brainfuck-file.bf\n", argv[0]);
return 0;
}
// Wir gucken, wie groß die Datei ist, wie viel Speicher wir also für das
// Programm brauchen
struct stat st;
stat(argv[1], &st);
// Hole dir Speicher
char* program = malloc(st.st_size + 1);
if (program == NULL) {
fprintf(stderr, "Kann keinen Programmspeicher reservieren.\n");
return 1;
}
// Wir brauchen auch noch Speicher auf dem das Brainfuck-Programm arbeiten
// kann
char* memory = calloc(MEMORY_SIZE, 1);
if (memory == NULL) {
fprintf(stderr, "Kann keinen Datenspeicher reservieren.\n");
return 1;
}
// Jetzt lesen wir das Programm ein
FILE *f;
if (!(f = fopen(argv[1], "rb"))) {
fprintf(stderr, "Konnte Datei %s nicht zum Lesen öffnen.\n", argv[1]);
return 1;
}
if (fread(program, 1, st.st_size, f) != st.st_size) {
fprintf(stderr, "Konnte Datei %s nicht komplett einlesen.\n", argv[1]);
return 1;
}
fclose(f);
// Programm endet mit einem Nullbyte
program[st.st_size] = 0;
// Führe die Nasm-Funktion aus
brainfuck(program, memory);
return 0;
}
|