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

commit 1482e00fea74962b337138777c54021dc066943b
parent e2d9cd1673e9418171f9e8747bdffa4361a5f297
Auteur: Selve <selve@asteride.xyz>
Date:   Wed, 24 Jan 2024 17:30:36 -0500

refonte des tampons

La structure a une variable en moins.

Diffstat:
Mbloquer.c | 12++++++------
Mtampon.c | 66++++++++++++++++++++++++++++++++++++++----------------------------
Mtampon.h | 18++++++++----------
3 files changed, 52 insertions(+), 44 deletions(-)

diff --git a/bloquer.c b/bloquer.c @@ -66,7 +66,7 @@ main(int argc, char **argv) int c; if (m_init(&tamp_meta, TLL_META) < 0 || - t_init(&tamp_var, TLL_VAR) < 0) + tp_init(&tamp_var, TLL_VAR) < 0) return 1; nom_prog = *argv; @@ -348,24 +348,24 @@ val_var(char **ps) { int i, j; char *s = *ps; - t_eff(&tamp_var); + tp_eff(&tamp_var); for (i = 0; *s != '\0'; i++, s++) { switch (*s) { case '!': case '&': case '|': case ':': case '(': case ')': goto trouver; } - t_ecr(*s, &tamp_var); + tp_ecr(*s, &tamp_var); } fprintf(stdin, "%s: le premier champ ne se termine pas par «:»\n", nom_prog); return -1; trouver: - t_ecr('\0', &tamp_var); + tp_ecr('\0', &tamp_var); *ps = --s; for (i = 0; i < pl_vars.prch; i++) { - for (j = 0; pl_vars.vars[i][j] == tamp_var.t[j]; j++) - if (tamp_var.t[j] == '\0') + for (j = 0; pl_vars.vars[i][j] == tamp_var.tp[j]; j++) + if (tamp_var.tp[j] == '\0') return 1; } return 0; diff --git a/tampon.c b/tampon.c @@ -3,58 +3,68 @@ #include "tampon.h" -/* initialiser un tampon t de taille taille */ +static int tp_plein(char, struct tampon *); + +/* initialiser un tampon tp de taille tll */ int -t_init(struct tampon *t, size_t taille) +tp_init(struct tampon *tp, size_t tll) { - if ((t->t = realloc(t->t, taille)) == NULL) + if ((tp->pc = tp->tp = realloc(tp->tp, tll)) == NULL) return -1; - t->taille = taille; - t->pcar = t->t; - t->ncar = 0; + tp->tll = tll; + return 0; } -/* ajouter un caractère au tampon t */ +/* ajouter un caractère c au tampon tp */ int -t_ecr(char c, struct tampon *t) +tp_ecr(char c, struct tampon *tp) { - return ((++t->ncar > t->taille) ? t_plein(c, t) : - (*t->pcar++ = c, (unsigned char) c)); + if ((size_t) (tp->pc - tp->tp) == tp->tll) /* le tampon est-il plein? */ + return tp_plein(c, tp); + *tp->pc++ = c; + + return (unsigned char) c; } -/* agrandir le tampon t par T_FACT_AGR */ -int -t_plein(char c, struct tampon *t) +/* agrandir le tampon tp et y ajouter le caractère c */ +static int +tp_plein(char c, struct tampon *tp) { - if ((t->t = realloc(t->t, t->taille * T_FACT_AGR)) == NULL) + size_t diff; + + diff = tp->pc - tp->tp; + if ((tp->tp = realloc(tp->tp, tp->tll * TP_FACT_AGR)) == NULL) return -1; - t->taille *= T_FACT_AGR; - t->pcar = t->t + t->ncar - 1; - *t->pcar++ = c; + tp->tll *= TP_FACT_AGR; + tp->pc = tp->tp + diff; /* tp->tp pourrait avoir changé */ + *tp->pc++ = c; + return (unsigned char) c; } /* afficher le contenu du tampon t */ void -t_aff(struct tampon *t) +tp_aff(struct tampon *tp) { - char *pcar = t->t; - int ncar = t->ncar; - while (ncar-- > 0) { - if (*pcar == '\\') { - ncar--; - if (*++pcar != ':') + char *pc; + int nc; /* nombre de caractères dans le tampons */ + + pc = tp->tp; + nc = tp->pc - tp->tp; + while (nc-- > 0) { + if (*pc == '\\') { + nc--; + if (*++pc != ':') putc('\\', stdout); } - putc(*pcar++, stdout); + putc(*pc++, stdout); } } /* effacer le contenu du tampon t */ void -t_eff(struct tampon *t) +tp_eff(struct tampon *tp) { - t->pcar = t->t; - t->ncar = 0; + tp->pc = tp->tp; } diff --git a/tampon.h b/tampon.h @@ -1,19 +1,17 @@ #ifndef TAMPON_H #define TAMPON_H -#define T_FACT_AGR 2 /* facteur d'agrandissement d'un tampon */ +#define TP_FACT_AGR 2 /* facteur d'agrandissement d'un tampon */ struct tampon { - char *t; /* le tampon lui-même */ - size_t taille; /* taille du tampon */ - size_t ncar; /* nombre de caractères écrits */ - char *pcar; /* ptr vers le prochain caractère */ + char *tp; /* le tampon lui-même */ + size_t tll; /* taille du tampon */ + char *pc; /* ptr vers le prochain caractère */ }; -int t_init(struct tampon *, size_t taille); -int t_ecr(char c, struct tampon *); -void t_aff(struct tampon *); -void t_eff(struct tampon *); -int t_plein(char c, struct tampon *); +int tp_init(struct tampon *, size_t); +int tp_ecr(char, struct tampon *); +void tp_aff(struct tampon *); +void tp_eff(struct tampon *); #endif