meta.c (1363B)
1 #include <assert.h> 2 #include <stdio.h> 3 4 #include "tampon.h" 5 #include "meta.h" 6 7 static void m_reinit(struct meta *); 8 9 /* initialiser un tampon m de taille tll */ 10 int 11 m_init(struct meta *m, size_t tll) 12 { 13 assert(m != NULL); 14 assert(tll >= 1); 15 16 if (tp_init(&m->tp, tll) < 0) 17 return -1; 18 m->draps = 0; 19 20 return 0; 21 } 22 23 /* lire les champs étiquette et drapeaux d'une ligne et les placer dans une 24 * structure meta 25 * prend pour acquis que le premier caractère lu est le premier caractère de la 26 * ligne 27 * retourne à l'entrée standard le dernier blanc lu (\t ou \n) 28 * - une valeur positive indique le succès 29 * - une valeur négative indique une erreur 30 * - une valeur de zéro indique EOF */ 31 int 32 m_lire(FILE *f, struct meta *m) 33 { 34 char c; 35 36 assert(f != NULL); 37 assert(m != NULL); 38 39 m_reinit(m); 40 41 /* lire les étiquettes */ 42 while ((c = getc(f)) != '\t' && c != '\n') { 43 if (c == EOF) 44 return 0; 45 if (tp_ecr(c, &m->tp) < 0) 46 return -1; 47 } 48 tp_ecr('\0', &m->tp); 49 50 /* lire les drapeaux */ 51 m->draps = tp_ncar(&m->tp); 52 if (c != '\n') { 53 while ((c = getc(f)) != '\t' && c != '\n') { 54 if (c == EOF) 55 return 0; 56 if (tp_ecr(c, &m->tp) < 0) 57 return -1; 58 } 59 } 60 tp_ecr('\0', &m->tp); 61 ungetc(c, stdin); 62 return 1; 63 } 64 65 /* réinitaliser un tampon méta */ 66 static void 67 m_reinit(struct meta *m) 68 { 69 assert(m != NULL); 70 71 tp_eff(&m->tp); 72 m->draps = 0; 73 }