/*
----------------------------------------------------------------
Y. CIURLIK & A. DUCHENE - Projet Compil - M1GMI
-------------------------------------------------------------------
*/
#include "matrice.h"

trans **matrice = NULL;
char* alphabet = NULL;
int nombre_etat = 0;

/*Ajoute une lettre a l alphabet*/
void addLetterInAlphabet(char lettre) {
    if(lettre != '\0') 
		printf("Ajout de la lettre %c dans l'alphabet\n",lettre);
	if (alphabet == NULL) {
		alphabet = (char*) malloc(sizeof(char));
		alphabet[0] = lettre;
	} else {
		alphabet = (char*) realloc(alphabet, sizeof(char) * (taille_alphabet+1));
        if (alphabet == NULL) {
            printf("erreur de realloc dans fixe_alphabet, strlen : %d taille alphabet : %d\n",taille_alphabet,sizeof(alphabet));
        }
   		alphabet[taille_alphabet] = lettre;
	}
	if(lettre!='\0')
		taille_alphabet++;
	
}

/*ajoute les lettres d'un mot dans l'alphabet si elles n'y sont pas*/
void addWordInAlphabet(char* mot) {
	int i;
	//printf("Ajout du mot %s dans l'alphabet\n",mot);
	if(alphabet==NULL) {
		addLetterInAlphabet(mot[0]);
		for(i=1;i<strlen(mot);i++){
			if(!isInAlphabet(mot[i]))
				addLetterInAlphabet(mot[i]);
		}
	} else {
		for(i=0;i<strlen(mot);i++){
			if(!isInAlphabet(mot[i]))
				addLetterInAlphabet(mot[i]);
		}
	}
}

/*permet de savoir si une lettre se trouve dans l'alphabet*/
boolean isInAlphabet(char lettre) {
	int i;
	for(i=0;i<taille_alphabet;i++){
		if(alphabet[i]==lettre)
			return TRUE;
	}
	return FALSE;
}

/*Cree un automate avec aucun etat*/
void createMatrix() {
	int i;
	//printf("je suis dans creer\n");
	matrice = (trans**) malloc(sizeof(trans*)*(taille_alphabet+300));
	for (i = 0; i < taille_alphabet; i++) {
		matrice[i] = NULL;
	}
}

/*Ajoute une transition entre etat_depart et etat_arr par la lettre donnee*/
trans* addTransition(int etat_depart, int etat_arr, char lettre) {
    trans *listeTemp;   //Contient tous les etats qui suivent etat_depart
    
    //On alloue une case en plus
	//matrice = realloc(matrice, sizeof(trans*) * (nombre_etat+1));
	if (matrice == NULL) {
		printf("ERROR realloc : Allocation impossible\n");
		printf("Dans la fonction 'ajouter_transition'\n");
		exit(-1);
	}
    if (etat_depart >= nombre_etat) {
        //On lui ajoute une premiere transition
        listeTemp = matrice[nombre_etat];
        listeTemp = NULL;
        listeTemp = add(listeTemp, etat_arr, lettre);
    } else {
        matrice[nombre_etat] = NULL;
        //On ajoute une transition aux transitions deja existantes
        listeTemp = matrice[etat_depart];
        listeTemp = add(listeTemp, etat_arr, lettre);
    }
    nombre_etat++;
    return listeTemp;
}

/*Affichage de la matrice ligne par ligne*/
void postMatrix() {
	int i;
	
	printf("---------- MATRICE -----------\n\n");
	for (i = 0; i < nombre_etat; i++) {
        if (matrice[i] != NULL) {
            printf("Transition depuis l'etat %d\n", i);
            postList(matrice[i]);
        }
    }
}

/*Indique si une transition existe dans l'automate*/
int isDefinedTransition(int etat_dep, char lettre) {
    trans *pCourant;		//definition d'un pointeur courant
    
    //printf("etat depart : %d et nombre d etats : %d\n", etat_dep, nombre_etat);
    if (etat_dep < nombre_etat) {
        pCourant = matrice[etat_dep];
        if (pCourant != NULL) {
	       while(pCourant->suivant != NULL) {
                //On compare la lettre
                if (pCourant->lettre == lettre) {
                    return pCourant->etat_arr;
                }
                pCourant = pCourant->suivant;
            }
            if (pCourant->lettre == lettre) {
                return pCourant->etat_arr;
            }
        }
    }
    return -1;
}

/*Creer le tableau qui represente les suppleants.Initialise chaque case par 0*/
void createSubstitute() {
	int i;
	suppleant = (int*) malloc(sizeof(int)*nombre_etat);
	for (i = 0; i < nombre_etat; i++) {
		suppleant[i] = 0;
	}
}

void setSubstitute(int etat_dep, int etat_arr) {
	suppleant[etat_dep] = etat_arr;
}

void postSubstitute() {
	int i;
	for (i = 0; i < nombre_etat; i++) {
		printf("suppleant[%d] = %d \n",i,suppleant[i]);
	}
}
