/*
    Fichier utf8-iso8859.c
    Auteur Bernard Chardonneau

    Logiciel libre, droits d'utilisation précisés en français
    dans le fichier : licence-fr.txt

    Traductions des droits d'utilisation dans les fichiers :
    licence-de.txt , licence-en.txt , licence-es.txt ,
    licence-it.txt , licence-nl.txt , licence-pt.txt ,
    licence-eo.txt , licence-eo-utf.txt

    Droits d'utilisation également sur la page web :
    http://libremail.tuxfamily.org/voir.php?page=droits


    Remplacement des caractères UTF8 par leur équivalent ASCII
    (pour les caractères correspondant à un code entre A0h et FFh)
*/


#include <stdio.h>


/* programme principal */

int main (int narg, char *varg[])
{
    int  car;  // caractère du fichier à convertir

    // tableau de conversion des caractères de la série E2809x
    char E2809x [16] = {'-',  '-',  '-',  '-',  '-',  '-',  '|',  '_',
                        '\'', '\'',  ',',  '`',  '"',  '"',  '"',  '"'};


    // utiliser fichiers passés en paramètre à la place du clavier et de l'écran
    if (narg > 1)
        freopen (varg [1], "r", stdin);

    if (narg > 2)
        freopen (varg [2], "w", stdout);

    // lire un caractère
    car = getchar ();

    // tantque non fin de fichier
    while (car != EOF)
    {
        // si caractère Ã
        if (car == 0xC3)
        {
            // lire le caractère suivant
            car = getchar ();

            // s'il est compris entre 80h et BFh
            if (car >= 0x80 && car < 0xC0)
                // le convertir dans l'encodage iso8859-1
                putchar (car | 0x40);
            // sinon
            else
            {
                // envoyer les 2 derniers caractères lus tels quels
                putchar (0xC3);
                putchar (car);
            }
        }

        // si caractère Â
        else if (car == 0xC2)
        {
            // lire le caractère suivant
            car = getchar ();

            // s'il n'est pas compris entre 80h et BFh
            if (car < 0x80 || car >= 0xC0)
                // on renvoie la séquence de 2 caractères
                putchar (0xC2);

            // sinon on ne renvoie que le 2ème caractère de la séquence
            putchar (car);
        }

        // le caractère Å suivi du caractère 93h sera remplacé par ½
        else if (car == 0xC5)
        {
            car = getchar ();

            if (car == 0x93)
                putchar ('½');
            else
            {
                putchar (0xC5);
                putchar (car);
            }
        }

        // si caractère â , suivi de 80h, suivi d'un caractère >= 80h
        // on convertira ce 3ème caractère
        else if (car == 0xE2)
        {
            car = getchar ();

            if (car == 0x80)
            {
                car = getchar ();

                if (car <= 0x8F)
                    ;  // caractère ignoré

                else if (0x90 <= car && car <= 0x9F)
                    putchar (E2809x [car & 0x0F]);

                else if (car == 0xA6)
                {
                    putchar ('.');
                    putchar ('.');
                    putchar ('.');
                }
                else
                {
                    putchar (0xE2);
                    putchar (0x80);
                    putchar (car);
                }
            }
            else
            {
                putchar (0xE2);
                putchar (car);
            }
        }

        // sinon, cas général
        else
            // on renvoie le caractère courant
            putchar (car);

        // lire le caractère suivant
        car = getchar ();
    }

    // pour faire plaisir à gcc qui veut une fonction main de type int
    return (0);
}