/*
    Fichier dialogue.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-en.txt , licence-es.txt , licence-pt.txt ,
    licence-eo.txt , licence-eo-utf.txt

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


    Bibliothèque de fonctions utilisée par le progranne cylcree
    pour récupérer les choix de l'utilisateur.
*/


#include <stdio.h>
#include <stdarg.h>
#include "messages.h"
#include "dialogue.h"


// saisie d'une réponse sur un caractère au clavier
// évite les problèmes de fonctionnent de scanf

char lirep ()
{
    int  caract;
    char reponse;

    // on récupère 1 caractère
    caract = getchar ();

    // on le passe en minuscules
    reponse = caract | 0x20;

    // on saute tous les autres caractères de la ligne
    while (caract != '\n')
        caract = getchar ();

    // et on retourne le caractère mémorisé
    return (reponse);
}



// saisie d'un chiffre au clavier

int lecchiffre ()
{
    char valeur;

    // on récupère 1 caractère
    valeur = lirep ();

    // si c'est un chiffre, on retourne sa valeur
    if ('0' < valeur && valeur <= '9')
        return (valeur & 0x0F);
    else
        // sinon, on retourne 0
        return (0);
}



// saisie d'un entier au clavier sans utiliser scanf

int lirentier ()
{
    int  valeur;
    char caract;

    // initialisation
    valeur = 0;
    caract = getchar ();

    // tant que des chiffres sont saisis au clavier
    while ('0' <= caract && caract <= '9')
    {
        // prendre en compte le dernier chiffre lu
        valeur = (valeur * 10) + caract - '0';

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

    // sauter tous les autres caractères de la ligne
    while (caract != '\n')
        caract = getchar ();

    // et retourner la valeur saisie
    return (valeur);
}



// saisie et traitement du coefficient de pondération

int liponder ()
{
    float valeur;
    float puis10;
    int   diviseur;
    char  caract;

    // initialisation
    valeur = 0;
    caract = getchar ();

    // tant que des chiffres sont saisis au clavier
    while ('0' <= caract && caract <= '9')
    {
        // prendre en compte le dernier chiffre lu
        valeur = (valeur * 10) + caract - '0';

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

    // si partie décimale
    if (caract == '.' || caract == ',')
    {
        puis10 = 0.1;
        caract = getchar ();

        while ('0' <= caract && caract <= '9')
        {
            // prendre en compte le dernier chiffre lu
            valeur = valeur + (caract - '0') * puis10;

            // et lire le caractère suivant
            caract = getchar ();
            puis10 = puis10 / 10;
        }
    }

    // sauter les blancs éventuels après le nombre
    while (caract == ' ')
        caract = getchar ();

    if (caract == '%')
        valeur = valeur * 2.56;
    else if (caract == '/')
    {
        do
            caract = getchar ();
        while (caract == ' ');

        diviseur = 0;

        while ('0' <= caract && caract <= '9')
        {
            // prendre en compte le dernier chiffre lu
            diviseur = (diviseur * 10) + caract - '0';

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

        if (diviseur != 256 && diviseur != 0)
            valeur = valeur * 256 / diviseur;
    }
    else if (caract == '-')
        valeur = -1;  // ce qui sera détecté comme une erreur
    else
        valeur = valeur * 256;

    // sauter tous les autres caractères de la ligne
    while (caract != '\n')
        caract = getchar ();

    // et retourner la valeur saisie
    return ((int) (valeur + 0.5));
}



// saisie d'un choix parmi une liste de propositions

int lecchoix (char *chaine1, ...)
{
    char *listechaines [10];
    char reponse [4];
    va_list ap;
    int  nb_choix;
    int  choix;
    int  i;

    // mémorisation du libellé du premier choix
    listechaines [0] = chaine1;

    // initialisation boucle de récupération des libellés des choix
    va_start (ap, chaine1);
    nb_choix = 0;

    // mémorisation et comptage des libellés des différents choix
    do
        listechaines [++nb_choix] = va_arg (ap, char *);
    while (nb_choix < 9 && listechaines [nb_choix]);

    // récupération terminée
    va_end (ap);

    if (listechaines [nb_choix])
        // "Fonction lecchoix : liste de choix mal terminée"
        err_fatale ("ERR_LECCHOIX");

    // boucle d'affichage et de saisie des choix, jusqu'à un choix correct
    do
    {
        // affichage des différents choix
        for (i = 0; i < nb_choix; i++)
            printf ("%d : %s\n", i + 1, message (listechaines [i]));

        // "\nVotre choix ? "
        affiche_msg ("VOTRE_CHOIX");

        // saisie du choix par l'opérateur
        choix = lecchiffre ();

        // vérification du choix saisi
        if (choix < 1 || choix > nb_choix)
            // "Choix incorrect !\n"
            affiche_err ("MAUV_CHOIX");
    }
    // on recommence si le choix était incorrect
    while (choix < 1 || choix > nb_choix);

    // choix validé
    return choix;
}