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

tampon.c (2115B)


      1 #include <assert.h>
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 
      5 #include "tampon.h"
      6 
      7 /* invariants de la structure tampon */
      8 #define INVARIANTS_TP(t) \
      9 	(assert((t)     != NULL), \
     10 	 assert((t)->tp != NULL), \
     11 	 assert((t)->pc != NULL), \
     12 	 assert((t)->tll >= 1), \
     13 	 assert((t)->pc - (t)->tp >= 0), \
     14 	 assert((size_t) ((t)->pc - (t)->tp) <= (t)->tll), \
     15 	 assert((t)->tll * TP_FACT_AGR > (t)->tll))
     16 
     17 static int tp_plein(char, struct tampon *);
     18 
     19 /* initialiser un tampon tp de taille tll */
     20 int
     21 tp_init(struct tampon *tp, size_t tll)
     22 {
     23 	assert(tll >= 1);
     24 	assert(tp  != NULL);
     25 
     26 	if ((tp->pc = tp->tp = realloc(tp->tp, tll)) == NULL)
     27 		return -1;
     28 	tp->tll = tll;
     29 
     30 	INVARIANTS_TP(tp);
     31 
     32 	return 0;
     33 }
     34 
     35 /* ajouter un caractère c au tampon tp */
     36 int
     37 tp_ecr(char c, struct tampon *tp)
     38 {
     39 	INVARIANTS_TP(tp);
     40 
     41 	if ((size_t) (tp->pc - tp->tp) == tp->tll) /* le tampon est-il plein? */
     42 		return tp_plein(c, tp);
     43 	*tp->pc++ = c;
     44 
     45 	INVARIANTS_TP(tp);
     46 
     47 	return (unsigned char) c;
     48 }
     49 
     50 /* agrandir le tampon tp et y ajouter le caractère c */
     51 static int
     52 tp_plein(char c, struct tampon *tp)
     53 {
     54 	size_t diff;
     55 
     56 	INVARIANTS_TP(tp);
     57 
     58 	diff = tp->pc - tp->tp;
     59 	if ((tp->tp = realloc(tp->tp, tp->tll * TP_FACT_AGR)) == NULL)
     60 		return -1;
     61 	tp->tll *= TP_FACT_AGR;
     62 	tp->pc = tp->tp + diff; /* tp->tp pourrait avoir changé */
     63 	*tp->pc++ = c;
     64 
     65 	INVARIANTS_TP(tp);
     66 
     67 	return (unsigned char) c;
     68 }
     69 
     70 /* afficher le contenu du tampon tp */
     71 void
     72 tp_aff(struct tampon *tp)
     73 {
     74 	char *pc;
     75 	int   nc; /* nombre de caractères dans le tampons */
     76 
     77 	INVARIANTS_TP(tp);
     78 
     79 	pc = tp->tp;
     80 	nc = tp->pc - tp->tp;
     81 	while (nc-- > 0) {
     82 		if (*pc == '\\') {
     83 			nc--;
     84 			if (*++pc != ':')
     85 				putc('\\', stdout);
     86 		}
     87 		putc(*pc++, stdout);
     88 	}
     89 
     90 	INVARIANTS_TP(tp);
     91 }
     92 
     93 /* effacer le contenu du tampon tp */
     94 void
     95 tp_eff(struct tampon *tp)
     96 {
     97 	INVARIANTS_TP(tp);
     98 
     99 	tp->pc = tp->tp;
    100 
    101 	INVARIANTS_TP(tp);
    102 }
    103 
    104 /* obtenir le nombre de caractères dans le tampon tp */
    105 size_t
    106 tp_ncar(struct tampon *tp)
    107 {
    108 	INVARIANTS_TP(tp);
    109 
    110 	return tp->pc - tp->tp;
    111 }
    112 
    113 /* obtenir un pointeur vers le début du tampon tp */
    114 char *
    115 tp_deb(struct tampon *tp)
    116 {
    117 	INVARIANTS_TP(tp);
    118 
    119 	return tp->tp;
    120 }