#include <stdio.h>
#include <string.h> // contient la déclaration de la fonction strlen()
#include <stdbool.h> //nécessite la compilation avec l'option -std=c99

// longueur maximale de la chaine saisie
#define LMAX 80

/* Déclaration de la fonction chiffrement_par_decalage() :
Fonction qui chiffre la chaine de caractères str passée en paramètre
Cette fonction renvoie 0 et chiffre la chaine si elle ne contient que des lettres minuscules ou majuscules et des espaces.
Dans le cas contraire, elle renvoie -1 et ne modifie pas la chaine.

On utilise ici la valeur de retour de la fonction pour indiquer si elle a réussit à faire correctement son "travail".
Il s'agit là d'une pratique courante. 
De plus, par convention, une fonction doit renvoyer : 
- zéro en cas de succès;
- une valeur négative en cas d'échec (sauf la fonction main() qui doit dans ce cas renvoyer une valeur strictement positive)
*/
int chiffrement_par_decalage(char *str);


int main()
{
	char tab [LMAX + 1];// LMAX caractères + le caractère '\0'
	size_t lo ;
	
	printf("Saisir une chaine (longueur max %d) :\n", LMAX);
	
	// dans cet exercice, on est obligé d'utiliser la fonction fgets() pour saisir la chaine
	// car on souhaite pouvoir saisir une chaine avec des espaces
	fgets(tab, LMAX+1, stdin);
	
	
	lo = strlen(tab);
	// pour supprimer le caractère '\n' ajouté par fgets() quand l'utilisateur saisit un nombre de caractères strictement inférieur à LMAX
	if (tab[lo -1] == '\n')
	{
		tab[lo -1] = '\0';
	}
	printf("\nChaine initiale :\n%s\n",tab);
	int r = chiffrement_par_decalage(tab);
	printf("\nr = %d, chaine chiffree :\n%s\n", r, tab);
	
	return 0;
}




// le type du paramètre (char *) autorise la fonction à modifier les caractères de la chaîne reçue en paramètre
// c'est ici nécessaire 
int chiffrement_par_decalage(char *str)
{
	size_t l = strlen(str);
	bool valide = true;
	size_t i ;
	// contrôle de la validité de la chaine à traiter
	i = 0;
	while ( valide && i < l)
	{
		if (!(str[i] == ' ' || (str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')))
		{
			valide = false;
		}
		++i;
	}
	
	if (!valide)
	{
		// >>>>>>>>>>>> FIN DE LA FONCTION >>>>>>>>>>>>>>
		return -1;
	}
	
	for (i = 0; i < l; ++i)
	{
		switch(str[i])
		{
			case 'y': 	str[i] = 'a';
						break;
			case 'z': 	str[i] = 'b';
						break;		
			case 'Y': 	str[i] = 'A';
						break;
			case 'Z': 	str[i] = 'B';
						break;	
			case ' ': 	break;
			default : str[i] += 2;
		}
	}
	return 0;
}