begin process at 2012 05 27 14:44:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > COMPILATEUR ET DÉCOMPILATEUR DE SOURCES MALBOLGE [MLBC]

COMPILATEUR ET DÉCOMPILATEUR DE SOURCES MALBOLGE [MLBC]


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :Malbolge, Algorithme, Maths Niveau :Débutant Date de création :09/01/2008 Date de mise à jour :20/01/2008 16:29:52 Vu / téléchargé :3 566 / 66

Auteur : youscef

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Salut
Ce programme déchiffre une source Malbolge pour donner un fichier qui contient les instructions que comprend l'interpreteur, il peut aussi generer une source Malbolge à partire de ces instructions. Pour bien comprendre les algorithmes utiliés dans la source, vous avez la source de l'interpreteur original de Malbolge ici: http://www.lscheffer.com/malbolge_interp.html.

Source

  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <string.h>
  • #include <ctype.h>
  • #define HELP() printf("Commande invalide\n"); \
  • printf("Commandes possibles :\n"); \
  • printf(" -dec <options> decompiler un fichier\n"); \
  • printf(" -c <options> compiler un fichier\n"); \
  • printf(" <fichier source> imprimer la source en Malbolge du fichier sur l'ecran\n"); \
  • printf(" -o <fichier de sortie> <fichier source> Dirriger le flux de sortie vers un fichier\n"); \
  • printf(" -h Afficher ce message d'aide\n");
  • void compil(char *n_fichier, FILE *src, FILE *sortie);
  • void decompil(char *n_fichier, FILE *src, FILE *sortie);
  • int main(int argc, char **argv)
  • {
  • if(argc < 2 || argc > 5)
  • {
  • HELP()
  • return EXIT_FAILURE;
  • }
  • FILE *out = NULL; //La sortie de la soure
  • FILE *source = NULL; //Le fichier source
  • if(!strcmp(argv[1], "-h"))
  • {
  • HELP()
  • return 0;
  • }
  • else if(!strcmp(argv[1], "-c"))
  • {
  • if(!strcmp(argv[2], "-o"))
  • {
  • out = fopen(argv[3], "w");
  • if(out == NULL)
  • {
  • fprintf(stderr, "Impossible d'ouvrire le fichier %s en ecriture\n", argv[2]);
  • return EXIT_FAILURE;
  • }
  • source = fopen(argv[4], "r");
  • if(source == NULL)
  • {
  • fprintf(stderr, "Impossible d'ouvrire le fichier %s en lecture\n", argv[4]);
  • return EXIT_FAILURE;
  • }
  • compil(argv[4], source, out);
  • }
  • else
  • {
  • out = stdout;
  • source = fopen(argv[2], "r");
  • if(source == NULL)
  • {
  • fprintf(stderr, "Impossible d'ouvrire le fichier %s en lecture\n", argv[2]);
  • return EXIT_FAILURE;
  • }
  • compil(argv[2], source, out);
  • }
  • }
  • else if(!strcmp(argv[1], "-dec"))
  • {
  • if(!strcmp(argv[2], "-o"))
  • {
  • out = fopen(argv[3], "w");
  • if(out == NULL)
  • {
  • fprintf(stderr, "Impossible d'ouvrire le fichier %s en ecriture\n", argv[2]);
  • return EXIT_FAILURE;
  • }
  • source = fopen(argv[4], "r");
  • if(source == NULL)
  • {
  • fprintf(stderr, "Impossible d'ouvrire le fichier %s en lecture\n", argv[4]);
  • return EXIT_FAILURE;
  • }
  • decompil(argv[4], source, out);
  • }
  • else
  • {
  • out = stdout;
  • source = fopen(argv[2], "r");
  • if(source == NULL)
  • {
  • fprintf(stderr, "Impossible d'ouvrire le fichier %s en lecture\n", argv[2]);
  • return EXIT_FAILURE;
  • }
  • decompil(argv[2], source, out);
  • }
  • }
  • fclose(source);
  • fclose(out);
  • return 0;
  • }
  • void compil(char *n_fichier, FILE *src, FILE *sortie)
  • {
  • const char instructions[] =
  • "+b(29e*j1VMEKLyC})8&m#~W>qxdRp0wkrUo[D7,XTcA\"lI"
  • ".v%{gJh4G\\-=O@5`_3i<?Z';FNQuY]szf$!BS/|t:Pn6^Ha";
  • char c;
  • int i;
  • int j = 0;
  • int k = 33;
  • unsigned long ligne = 0, caractere = 0;
  • while((c = fgetc(src)) != EOF)
  • {
  • if(c == '\n')
  • {
  • ligne++;
  • caractere = 0;
  • continue;
  • }
  • else if(isspace(c)) //si c est un espace
  • {
  • caractere++;
  • continue;
  • }
  • else
  • {
  • if(strchr("ji*p</vo", c) == NULL ) //si le caractere actuel est incorrect
  • {
  • fprintf(stderr, "%s [%ld, %ld]\n\tCaratere invalide", n_fichier, ligne, caractere);
  • exit(EXIT_FAILURE);
  • }
  • for(i = 0;i < strlen(instructions); i++) //chercher le caractere dans le tableau des intructions
  • {
  • if(instructions[i] == c)
  • {
  • while(instructions[(k - 33 + j) %94] != c && k != 126) //tant que k est un cacactère ASCII et k n'est pas le bon caractère qu'on cherche
  • k++;
  • fprintf(sortie, "%c", k);
  • break;
  • }
  • }
  • }
  • k = 33;
  • j++;
  • caractere++;
  • }
  • fprintf(sortie, "\n");
  • }
  • void decompil(char *n_fichier, FILE *src, FILE *sortie)
  • {
  • const char instructions[] =
  • "+b(29e*j1VMEKLyC})8&m#~W>qxdRp0wkrUo[D7,XTcA\"lI"
  • ".v%{gJh4G\\-=O@5`_3i<?Z';FNQuY]szf$!BS/|t:Pn6^Ha";
  • int i = 0;
  • char c;
  • while((c = fgetc(src)) != EOF)
  • {
  • if(isspace(c) || c == '\n') //si le caractère actuel est un espace ou un saut de ligne on ne fait rien
  • continue;
  • fprintf(sortie, "%c", instructions[(c - 33 + i) % 94]); //regardez la source de Malbolge pour bien comprendre
  • i++;
  • }
  • fprintf(sortie, "\n");
  • }
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define HELP() printf("Commande invalide\n"); \
			printf("Commandes possibles :\n"); \
			printf("    -dec <options>                                decompiler un fichier\n"); \
			printf("    -c <options>                                  compiler un fichier\n"); \
			printf("    <fichier source>                              imprimer la source en Malbolge du fichier sur l'ecran\n"); \
			printf("    -o <fichier de sortie> <fichier source>       Dirriger le flux de sortie vers un fichier\n"); \
			printf("    -h                                            Afficher ce message d'aide\n");


void compil(char *n_fichier, FILE *src, FILE *sortie);
void decompil(char *n_fichier, FILE *src, FILE *sortie);

int main(int argc, char **argv)
{
	if(argc < 2 || argc > 5)
	{
		HELP()
		return EXIT_FAILURE;
	}
	
	FILE *out = NULL; //La sortie de la soure
	FILE *source = NULL; //Le fichier source
	
	if(!strcmp(argv[1], "-h"))
	{
		HELP()
		return 0;
	}
	
	else if(!strcmp(argv[1], "-c"))
	{
		if(!strcmp(argv[2], "-o"))
		{
			out = fopen(argv[3], "w");
			if(out == NULL)
			{
				fprintf(stderr, "Impossible d'ouvrire le fichier %s en ecriture\n", argv[2]);
				return EXIT_FAILURE;
			}
			
			source = fopen(argv[4], "r");
			if(source == NULL)
			{
				fprintf(stderr, "Impossible d'ouvrire le fichier %s en lecture\n", argv[4]);
				return EXIT_FAILURE;
			}
			
			compil(argv[4], source, out);
		}
		
		else
		{
			out = stdout;
			source = fopen(argv[2], "r");
			if(source == NULL)
			{
				fprintf(stderr, "Impossible d'ouvrire le fichier %s en lecture\n", argv[2]);
				return EXIT_FAILURE;
			}
			
			compil(argv[2], source, out);
		}
	}
	
	else if(!strcmp(argv[1], "-dec"))
	{
		if(!strcmp(argv[2], "-o"))
		{
			out = fopen(argv[3], "w");
			if(out == NULL)
			{
				fprintf(stderr, "Impossible d'ouvrire le fichier %s en ecriture\n", argv[2]);
				return EXIT_FAILURE;
			}
			
			source = fopen(argv[4], "r");
			if(source == NULL)
			{
				fprintf(stderr, "Impossible d'ouvrire le fichier %s en lecture\n", argv[4]);
				return EXIT_FAILURE;
			}
			
			decompil(argv[4], source, out);
		}
		
		else
		{
			out = stdout;
			source = fopen(argv[2], "r");
			if(source == NULL)
			{
				fprintf(stderr, "Impossible d'ouvrire le fichier %s en lecture\n", argv[2]);
				return EXIT_FAILURE;
			}
			
			decompil(argv[2], source, out);
		}
	}

	fclose(source);
	fclose(out);
	
	return 0;
}

void compil(char *n_fichier, FILE *src, FILE *sortie) 
{
	const char instructions[] =
    "+b(29e*j1VMEKLyC})8&m#~W>qxdRp0wkrUo[D7,XTcA\"lI"
    ".v%{gJh4G\\-=O@5`_3i<?Z';FNQuY]szf$!BS/|t:Pn6^Ha"; 
	
	char c;
	int i;
	int j = 0;
	int k = 33;
	unsigned long ligne = 0, caractere = 0;
	
	while((c = fgetc(src)) != EOF)
	{
		if(c == '\n')
		{
			ligne++;
			caractere = 0;
			continue;
		}
		else if(isspace(c)) //si c est un espace
		{
			caractere++;
			continue;
		}
		else
		{
			if(strchr("ji*p</vo", c) == NULL ) //si le caractere actuel est incorrect
			{
				fprintf(stderr, "%s [%ld, %ld]\n\tCaratere invalide", n_fichier, ligne, caractere);
				exit(EXIT_FAILURE);
			}
		
			for(i = 0;i < strlen(instructions); i++) //chercher le caractere dans le tableau des intructions
			{
				if(instructions[i] == c) 
				{
					while(instructions[(k - 33 + j) %94] != c && k != 126) //tant que k est un cacactère ASCII et k n'est pas le bon caractère qu'on cherche
						k++;
						
					fprintf(sortie, "%c", k);
					break;
				}
			}
		}
		
		k = 33;
		j++;
		caractere++;
	}
	fprintf(sortie, "\n");
}

void decompil(char *n_fichier, FILE *src, FILE *sortie)
{
	const char instructions[] =
    "+b(29e*j1VMEKLyC})8&m#~W>qxdRp0wkrUo[D7,XTcA\"lI"
    ".v%{gJh4G\\-=O@5`_3i<?Z';FNQuY]szf$!BS/|t:Pn6^Ha";
	
	int i = 0;
	char c;
	while((c = fgetc(src)) != EOF)
	{
		if(isspace(c) || c == '\n') //si le caractère actuel est un espace ou un saut de ligne on ne fait rien
			continue;
		
		fprintf(sortie, "%c", instructions[(c - 33 + i) % 94]); //regardez la source de Malbolge pour bien comprendre
		i++;
	}
	
	fprintf(sortie, "\n");
}

 Conclusion

J'ai besoin de vos remarques car je ne suis pas sur à 100% du bon fonctionnement de ce programme.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   MLBC
    •   Exemples
      • getchar.embTélécharger ce fichier [Réservé aux membres club]4 octets
      • getchar.smbTélécharger ce fichier [Réservé aux membres club]4 octets
      • hello.embTélécharger ce fichier [Réservé aux membres club]119 octets
      • hello.smbTélécharger ce fichier [Réservé aux membres club]117 octets
    • mlbc.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 111 octets

Télécharger le zip


 Historique

09 janvier 2008 21:06:55 :
Ajoute du commentaire sur les paramètres de la fonction compil
09 janvier 2008 21:40:00 :
Changement du nom du programme (l'ancien nom était mbc (nom d'une chaine TV))
20 janvier 2008 16:29:52 :
.

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture RÉSOLUTION SUDOKU (9X9) PAR BACKTRACKING RÉCURSIF INTELLIGEN... par Gallien69
GÉRER UN COMBAT DANS UN JEU 2D / ALGORITHME PRIMAIRE D'UNE I... par Chiheb2010
Source avec Zip BELLMAN:LA VALEUR DU PLUS COURT CHEMIN ET LE PLUS COURT CHEM... par Perace
Source avec Zip Source avec une capture RESOLUTION DE SYSTEME LINEAIRE PAR LA METHODE DU GRADIENT CO... par zangul

Commentaires et avis

Commentaire de acx01b le 09/01/2008 22:30:45

salut

il faut que tu nous expliques pourquoi tu t'es intéressé à ce truc !!!
c'est comme un casse tête en fait le langage malbolge ?

Commentaire de youscef le 09/01/2008 22:37:56

Avant de créer ce programme, je voulais créer un interpréteur de Malbolge, mais le problème est que je n'ai pas compris la fonction op de l'interpréteur, alors je me suis dit qu'il me faut créer des programme Malbolge pour bien comprendre le fonctionnement de l'interpréteur. Pour Malbolge, tu peux lire ça pour savoir ce que c'est http://fr.wikipedia.org/wiki/Malbolge.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

je cherche quelqu'un fort en maths et qui est en 1ere ES !! [ par GEO ] je cherche quelqu'un qui aurais le livre orange declic maths de 1 ES merci d'avance Algorithme de compression STAR amélioré [ par hi_vivie2 ] Bonjour à tous,Je dois réaliser de manière urgente l'implémentation en java de l'algorithme de compression STAR amélioré appliqué aux images en mouvem Algorithme de compression STAR amélioré [ par hi_vivie2 ] Bonjour à tous,Je dois réaliser de manière urgente l'implémentation en java de l'algorithme de compression STAR amélioré appliqué aux images en mouvem un programme à creer [ par yoyo ] je dois creer un programme permettant d trouver les nombres premiers.l'algorithme est donné, et il utilise des tableaux dont les cases sont remplies p Qui sait l'algorithme pour calculer les racines? [ par TMT ] Aidez-moi! conversion de la partie fractionnaire en base n [ par Alucard ] J'ai vu qu'il y avait beaucoup d'algorithme de la partie entière (int) d'un nombre en n'importe quel base mais je voulais savoir si quelqu'un avait un Algorithme de mélange [ par C2S ] bonjour, j'aimerais connaitre un algorithme de mélange d'un tableau... (aléatoire) ... c'est pour simuler une fonction "mélanger" relative a un paquet aide sur l'algorithme AMR [ par semecurbep ] Votre texte iciVotre texte ICIVotre texte ICI map basic?????? [ par Sfoued2003 ] slt tout le monde,je me demande si je peux faire implémenter un algorithme de Electre1 sur map basic, pour pouvoir l'utiliser aprés sur map info? et ç algorithme de gauss et decomposition LU [ par speedamine ] bonjour a tous.je voudrai avoir des algorithmes ,ecrits en borland pascal,suivants:methode de gauss ordinaire pour la resolution d'un systeme .la deco


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,591 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales