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 }