/*
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;
}