/****************************************
* Sebastien Leriche, Antoine Jacquet *
* Programme principal - Interpreteur *
* Niveau 4 *
****************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "memoire.h"
#define TAILLELIGNE 512
#define DELIMITEUR " \t\n"
struct memoire *p_memoire;
FILE *fprimitives;
void afficher_log(char *ligne, struct memoire *p_memoire)
/* Ecriture du fichier pour l'interface graphique Perl/Tk */
{
static FILE *ficlog=NULL;
struct liste_tas *p_liste_tas;
if (ficlog==NULL) ficlog=fopen("log.txt","wt");
fprintf(ficlog,"%s",ligne);
if (p_memoire!=NULL)
{
p_liste_tas=p_memoire->p_liste_tas;
fprintf(ficlog,"taille_memoire %d\n",p_memoire->taille_memoire);
while (p_liste_tas!=NULL)
{
fprintf(ficlog,"tas %s %d %d %d\n",p_liste_tas->tas.ident,p_liste_tas->tas.adresse,p_liste_tas->tas.taille,p_liste_tas->tas.compteur_references);
p_liste_tas=p_liste_tas->p_suivant;
}
}
fprintf(ficlog,"\n");
if (strcmp(ligne,"terminer")==0) fclose(ficlog);
return;
}
void quitte(int erreur, char *message)
/* Quitte proprement l'interpreteur */
{
fprintf(fhistorique,message);
terminer(&p_memoire);
fclose(fprimitives);
fclose(fhistorique);
exit(erreur);
}
void interprete(char *ligne)
/* Interprete la ligne passee en parametre */
{
char *mot,*mot2,ligne2[TAILLELIGNE];
int entier,code;
strcpy(ligne2,ligne);
mot=strtok(ligne2,DELIMITEUR);
if (mot==NULL) return;
if (mot[0]=='#') return;
fprintf(fhistorique,"Interpretation de : %s",ligne);
if (strcmp(mot,"initialiser")==0)
{
mot=strtok(NULL,DELIMITEUR);
if (mot==NULL) quitte(1,"Taille memoire invalide !\n");
entier=atoi(mot);
if (entier==0) quitte(1,"Taille memoire invalide !\n");
code=initialiser(entier,&p_memoire);
}
else if (p_memoire==NULL)
{
fprintf(fhistorique,"La memoire n'a pas ete initialisee !\n");
fclose(fprimitives);
fclose(fhistorique);
exit(1);
}
else if (strcmp(mot,"allouer_tas")==0)
{
mot=strtok(NULL,DELIMITEUR);
if ((mot==NULL) || (strlen(mot)>=TAILLE_IDENT)) quitte(1,"Nom de tas invalide !\n");
mot2=strtok(NULL,DELIMITEUR);
if (mot2==NULL) quitte(1,"Taille de tas invalide !\n");
entier=atoi(mot2);
if (entier==0) quitte(1,"Taille de tas invalide !\n");
code=allouer_tas(mot,entier,p_memoire);
}
else if (strcmp(mot,"liberer_tas")==0)
{
mot=strtok(NULL,DELIMITEUR);
if (mot==NULL) quitte(1,"Nom de tas invalide !\n");
code=liberer_tas(mot,p_memoire);
}
else if (strcmp(mot,"terminer")==0)
{
code=terminer(&p_memoire);
}
else if (strcmp(mot,"ajouter_programme")==0)
{
mot=strtok(NULL,DELIMITEUR);
if (mot==NULL) quitte(1,"Nom de programme invalide !\n");
code=ajouter_programme(mot,p_memoire);
}
else if (strcmp(mot,"supprimer_programme")==0)
{
mot=strtok(NULL,DELIMITEUR);
if (mot==NULL) quitte(1,"Nom de programme invalide !\n");
code=supprimer_programme(mot,p_memoire);
}
else if (strcmp(mot,"ajouter_lien")==0)
{
mot=strtok(NULL,DELIMITEUR);
mot2=strtok(NULL,DELIMITEUR);
if ((mot==NULL) || (mot2==NULL)) quitte(1,"Nom de tas invalide !\n");
code=ajouter_lien(mot,mot2,p_memoire);
}
else if (strcmp(mot,"supprimer_lien")==0)
{
mot=strtok(NULL,DELIMITEUR);
mot2=strtok(NULL,DELIMITEUR);
if ((mot==NULL) || (mot2==NULL)) quitte(1,"Nom de tas invalide !\n");
code=supprimer_lien(mot,mot2,p_memoire);
}
else if (strcmp(mot,"politique")==0)
{
mot=strtok(NULL,DELIMITEUR);
if ((mot==NULL) || ((strcmp(mot,"first_fit")!=0) && (strcmp(mot,"best_fit")!=0) && (strcmp(mot,"worst_fit")!=0)) ) quitte(1,"Nom de politique invalide !\n");
fprintf(fhistorique,"Nouvelle politique : %s\n",mot);
politique=mot[0];
code=0;
}
else quitte(1,"Primitive invalide !\n");
afficher_log(ligne,p_memoire);
fprintf(fhistorique,"Code de retour : %d\n",code);
fprintf(fhistorique,"Fin de l'interpretation de : %s\n",ligne);
return;
}
int main(int argc, char **argv)
/* Programme principal
parametre optionnel : fichier de primitives */
{
char ligne[TAILLELIGNE];
if (argc==1) fprimitives=fopen("primitives.txt","rt");
else fprimitives=fopen(argv[1],"rt");
if (fprimitives==NULL)
{
fprintf(stderr,"Erreur d'ouverture du fichier de primitives !\n");
return(1);
}
if ((fhistorique=fopen("historique.txt","wt"))==NULL)
{
fprintf(stderr,"Erreur d'ouvertude du fichier d'historique !\n");
fclose(fprimitives);
return(2);
}
while (1)
{
if (fgets(ligne,TAILLELIGNE,fprimitives)==NULL) break;
if (strlen(ligne)==TAILLELIGNE-1)
{
fprintf(stderr,"Ligne trop longue dans le fichier de primitives !\n");
fclose(fprimitives);
fclose(fhistorique);
return(3);
}
interprete(ligne);
}
fprintf(fhistorique,"Fin de l'interpretation des primitives\n");
fclose(fprimitives);
fclose(fhistorique);
return(0);
}