Brainfuck Interpreter in C

bimdot

Grünschnabel
Hallo Leute,

ich muss ein interpreter in C schreibe aber ich brauche Hilfe, momentan weiss ich net wie ich ein datei laden kann und danach mit der commando run es ausfuhren soll, ich hab es bis hier geschafft:

C++:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

int i;
FILE *datei;
datei = fopen(argv[1], "r");

printf("esp> ");
scanf("%d", &i);

if(datei != NULL)
{
    while((i = fgetc(datei))!=EOF) {
            printf("%c", i);
        }
}else{
      printf("[ERR] no program loaded\n");
}
   return 0;
}


load <filename>
Lade den angegebenen Filenamen in den Programmspeicher. Sollte das angegebene File nicht existieren oder das lesen fehlschlagen, soll:

[ERR] reading the file failed\n
ausgegeben werden. Wenn das parsen des Brainfuck Codes nicht funktioniert (Fehlende Klammern), soll:

[ERR] parsing of input failed\n
ausgegeben werden. Bei einem load, sollen die Daten resetet werden.

run
Führe das geladene Programm aus. Wenn noch kein Programm im Speicher ist, soll:

[ERR] no program loaded\n
ausgegeben werden. Nach dem erfolgreichen Durchlaufen des Codes soll das Programm sich bei erneutem 'run' gleich verhalten, als wäre noch kein Code im Speicher. Die Daten sollen bis zu einem erneutem 'load' vorhanden bleiben.
 
Hi

das Programm macht aber was Anderes, als die Angabe verlangt,
hat einige Fehler, und ist natürlich noch sehr unvollständig.

Und wieso weißt du nicht, wie eine Datei geladen wird, wenn du
genau das schon im Code hast? (wenns auch nicht ganz richtig ist)

...
Besser noch einmal von vorn anfangen.
Idee zum Vorgehen:

a) Eine Endlosschleife, die immer Zeilen von der Tastatur einliest, bis exit eingegeben wird (dann Programm beenden). Benötigt zB. ein char-Array, while, fgets (Returnwert auch prüfen), if, strcmp, return.
b) Neben exit auch eine Zweite mögliche Eingabe machen, "load filename" mit beliebigen Filenamen. Vor dem strcmp müssen dafür zuerst die ersten 5 Zeichen aus der Eingabe rausgeschnitten werden, strcpy, und vor dem Rausschneiden auch prüfen ob es überhaupt 5 oder mehr Zeichen gibt, strlen. Außerdem den Rest der Eingabe, also den Dateinamen, in eine eigene Variable speichern.
c) Im load-Teil eine Datei öffnen (mit dem gespeicherten Namen, nicht argv), prüfen ob es in Ordnung ist.
Nein: Fehlermeldung.
Ja: Länge ermitteln (fseek, ftell, fseek) und in eine Variable speichern, dann wieder schließen (vorerst nur das)
d) Da wo die Datei offen ist mit malloc Speicher für einen char-Pointer reservieren, so lang wie die Datei, und die Datei mit fread einlesen. Den Pointer, der am main-Anfang schon gemacht wird, dort am Anfang auf NULL setzen. Außerdem eine Variable einführen, ob die Datei geladen ist, am Anfang auf 0, nach erfolgreichem Laden auf 1.
e) Bei exit, vor Programmende, den Pointer mit free freigeben, falls nicht NULL. Auch beim Load, vor dem Dateiöffnen, einen nicht-NULL-Pointer dort freigeben und auf NULL setzen (wenn man mehrmals load eingibt wo schon was geladen ist...)
f) Auch noch im Load, nach Dateischließen, das geladene Array in einer Schleife durchgehen und prüfen ob nur gültige Brainfuck-Zeichen drin sind. Wenn nicht: Ladestatus wieder auf 0, Pointer freigeben und auf NULL.
g) Eine dritte Eingabeoption "run" Einführen. Wenn der Ladestatus 0 ist dann Fehlermeldung. Sonst:
Vorerst nur das Array ausgeben (und den Ladestatus auf 0 setzen, den Pointer aber lassen, wie die Angabe verlangt)

Das wäre einmal das Grundgerüst, außer der eigentlichen Brainfuck-Verarbeitung.
 
Zurück