Entry 966

Brainfuck (no errors manager)

   

Submitted by Raphaël Gaudy on Aug. 26, 2008 at 11:01 p.m.
Language: C++. Code size: 2.3 KB.

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

int main (int argc, char * const argv[]) {
    for (size_t i = 1; i < argc; i++) { //Ouverture des fichiers passés en arguments lors du lancement du programme
		ifstream fichier(argv[i], ios::in);
		if (fichier) {
			cout << "Démarrage de l'interpréteur pour \"" << argv[i] << "\"..." << endl;

			vector<char> tab(3000);
			char* elemTab = &tab.front();
			unsigned int boucle;

			string code, ligne;
			while(getline(fichier, ligne)) code += ligne;

			for (size_t j = 0, L = code.length(); j < L; j++) {
				switch(code[j]) {
					case '>': //Avancement d'un octet
						if (elemTab == &tab.back()) elemTab = &tab.front(); //Si c'est le dernier élément, on revient au début
						else elemTab++;
						break;
					case '<': //Retour en arrière d'un octet
						if (elemTab == &tab.front()) elemTab = &tab.back(); //Si c'est le premier élément, on revient à la fin
						else elemTab--;
						break;
					case '+':
						++*elemTab; //Incrémentation de l'octet pointé
						break;
					case '-':
						--*elemTab; //Décrementation "      "      "
						break;
					case '.':
						cout << *elemTab; //Affichage de l'octet pointé
						break;
					case ',':
						cin >> *elemTab; //Récupération du caractère dans la console et plaçage dans l'octet pointé
						break;

					case ']':
						boucle = 1;
						while (boucle) {
							j--; //On cherche en arriere
							if (code[j] == ']') boucle++; //Si on rencontre un ], alors on attend un [ de plus
							else if (code[j] == '[') boucle--; //Si on trouve un [. alors on en attend un de moins
						} j--; //On "jump" devant le [ correspondant.
						break;
					case'[':
						if (*elemTab == 0) {
							boucle = 1; // on doit monter $n ] en avant
							while (boucle) {
								j++;
								if (code[j] == '[') boucle++; // si on rencontre un [, alors on attend un ] de plus
								else if (code[j] == ']') boucle--; // si on trouve un ]. alors on en attend un de moins
							} // ici, on a pas de $i-- parce-qu'on jump apres le ]
						}
						break;
					default:
						break;
				}
			}
			fichier.close();
			cout << endl << "Fin de l'interprétation" << endl;
		}
		else cerr << "Le fichier n'a pas pu être ouvert." << endl;
	}

	return 0;
}

This snippet took 0.02 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).