#define _GNU_SOURCE

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <error.h>
#include <stdlib.h>

/* Copyright 2006 Lugrin Laurie & Riquer Vincent */
/* preambule GPL */

/* retourne le code de la lettre c, ou c si c n'est pas une lettre */
char code (char c, char new_abc[])
{
	if (islower (c))
		return (new_abc[c-'a']);
	else if (isupper (c))
		return (new_abc[c-'A']);
	else
		return c;
}

/* on suppose que passe ne contient que des lettres */
void create_abc (char *passe, char *new_abc)
{
	int i;
	char c_cour;
	for (i = 0 ; i < strlen (passe) ; i++)
	{
		passe[i] = tolower (passe[i]); /* pour n'avoir que des minuscules */

		for (int j = 0 ; j < i ; j++)
		{
			/* pour ne pas avoir de doublons dans le nouvel alphabet */
			if (passe[j] == passe[i])
			{
				i++;
				break;
			}
		}
		new_abc[i] = passe[i];
	}
	/* entre 0 et i, new_abc contient passe sans doublons */
	for (int l = i ; l < 26 ; l++) /* parcours de la fin de new_abc pour le remplir*/
	{
		c_cour = 'a';
		if (strchr(passe, c_cour) == NULL)
		{
			new_abc[l] = c_cour;
		}
	}
}

int main (int argc, char **argv)
{
	char *passe;
	char *new_abc;
	size_t n;
	
	if (argc == 1)
	{
		error (EXIT_FAILURE, 0, "%s", "Entrez en parametre la chaine a coder");
	}
	else
	{
		printf ("Passe (lettres minuscules non-accentuees seulement) ? ");
		getline (&passe, &n, stdin);
		create_abc (passe,new_abc);
		
		for (int i = 1 ; i < argc; i++)
		{
			for (int j = 0 ; argv[i][j] != '\0' ; j++)
			{
				printf ("%c", code (argv[i][j], new_abc));
			}
		}
		printf ("\n");
	}
	return EXIT_SUCCESS;
}

