aroplat

Utilitaire pour manipuler le format aroplat (métaformat de plat)
git clone git://git.asteride.xyz/~ldp/aroplat.git
Journaux | Fichiers | Références | LICENCE

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 }