1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <stdlib.h>
#include <string.h>
#include "io.h"
/* fonctions privees ============================*/
/**
* Elimine le caractere de fin de ligne saisi par fgets(), et purge le tampon
* du flux d'entree si necessaire. Si la saisie a ete tronquee, une erreur
* IO_ERR_BUFSIZE est renvoyee.
*/
static int
fclean(char *buffer, FILE *fp)
{
int err = IO_OK;
/* -tc- on verifie la validite des arguments */
if (buffer != NULL && fp != NULL)
{
char *pc = strchr(buffer, '\n');
/* -tc- si on trouve le caractere de fin de ligne, la saisie est
complete: on elimine ce caractere du tampon */
if (pc != NULL)
{
*pc = 0;
}
else /* -tc- sinon la saisie a ete tronquee et on retourne une erreur */
{
int c;
/* -tc- si la saisie a ete tronquee, on purge le tampon du flux
d'entree */
while ((c = fgetc(fp)) != '\n' && c != EOF)
{}
err = IO_ERR_BUFSIZE;
}
}
else
{
err = IO_ERR_BAD_ARG;
}
return err;
}
/* points d'entree ============================*/
/**
* Permet la saisie securisee d'un entier.
*/
long
get_integer(int *error)
{
long n = 0;
char buffer[15] = "";
int err = IO_OK;
if (fgets(buffer, sizeof buffer, stdin) != NULL)
{
char *pend = NULL;
/* -tc- pour en savoir plus sur fclean(), voir les archives du forum */
err = fclean(buffer, stdin);
if (err != IO_ERR_BUFSIZE)
{
n = strtol(buffer, &pend, 0);
if (*pend != 0)
{
err = IO_ERR_BAD_ENTRY;
}
}
}
else
{
if (feof(stdin) == 1)
{
err = IO_ERR_EOF;
}
else
{
err = IO_ERR_UNKNOWN;
}
}
/* -tc- si l'utilisateur desire le code d'erreur, on le lui retourne */
if (error != NULL)
{
*error = err;
}
return n;
} |
Partager