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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
| #include <stdio.h>
#define TEST_DETAIL 0
static void purge (FILE *fp)
{
int caractereLu;
while ((caractereLu = fgetc (fp)) != '\n' && caractereLu != EOF)
{
#if TEST_DETAIL
printf ("DUT.purge : c = %d\n", caractereLu);
#endif
}
}
int lireLigne (FILE *fp, char *chaine, size_t taille)
{
int ret = EOF;
size_t i = 0; // Pour les boucles
int caractereLu; // Boucle infinie, à revoir si problèmes
for (;;)
{
// On lit le caractère le plus ancien de stdin
caractereLu = fgetc (fp);
/* Si le caractère lu est un retour à la ligne,
on considère que la ligne est complètement lue.
On ajoute alors le caractère NULL à la chaîne et on renvoie 1
*/
#if TEST_DETAIL
printf ("DUT.fgetc : c = %d\n", caractereLu);
#endif
if (caractereLu == '\n' || caractereLu == EOF)
{
if (taille > 0)
{
chaine[i] = '\0';
if (caractereLu != EOF)
{
ret = 1;
}
break;
}
else
{
purge (fp);
ret = 0;
break;
}
}
/* Si le caractère n'est pas le retour à la ligne,
on vérifie que son ajout est possible (pas de débordement) e
t on l'ajoute à la suite de la chaîne cible
*/
else if (taille > 0 && i < taille - 1)
{
chaine[i] = caractereLu;
i++;
}
/* Sinon, c'est que l'on déborde, on n'ajoute pas,
on purge les caractères de stdin et on retourne 0
*/
else
{
/* manquait */
chaine[i] = '\0';
purge (fp);
ret = 0;
break;
}
}
#if TEST_DETAIL
printf ("DUT : chaine = '%s' ret=%d\n", chaine, ret);
#endif
return ret;
}
#ifdef TEST
#include <string.h>
#define BREAK 1
int main (void)
{
#define FIC "lirechaine.txt"
FILE *fp = fopen (FIC, "r");
if (fp != NULL)
{
static struct test
{
int t;
size_t sz;
char const *s;
int ret;
}
const a[] = {
/* *INDENT-OFF* */
/* test
| size
| | text
| | | ret */
{10, 0, NULL , 0}, /* "\n" */
{11, 0, NULL , 0}, /* "a\n" */
{20, 1, "" , 0},
{21, 2, "a" , 0},
{22, 3, "ab" , 0},
{30, 4, "abc", 1},
{31, 5, "abc", 1},
{32, 6, "abc", 1},
{33, 7, "abc", 1},
/* *INDENT-ON* */
};
size_t i;
for (i = 0; i < sizeof a / sizeof *a; i++)
{
struct test const *const p = a + i;
/* D.U.T */
char line[4] = "???";
int ret = lireLigne (fp, line, p->sz);
if (ret == EOF)
{
break;
}
if (ret != p->ret)
{
printf ("ERR at test %d : ret = %d (expected %d)\n", p->t, ret,
p->ret);
#if BREAK
break;
#endif
}
if (p->sz > 0 && strcmp (line, p->s) != 0)
{
printf ("ERR at test %d : line = '%s' (expected '%s')\n", p->t,
line, p->s);
#if BREAK
break;
#endif
}
}
if (i == sizeof a / sizeof *a)
{
puts ("PASSED");
}
fclose (fp);
}
else
{
perror (FIC);
}
return 0;
}
#endif |
Partager