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 4453a7f29c4c8c57be47d899a659f194904edce2
parent 7f5ab67ddd9c17c709bd7c491ea4a922d144c387
Auteur: Selve <selve@asteride.xyz>
Date:   Wed, 24 Jan 2024 20:35:55 -0500

simplification de meta.c

Plutôt que réimplémenter une bonne partie des fonctions de tampon.c, meta.c les
réutilise maintenant.

Deux nouvelles fonctions ont été crées dans tampon.c : tp_ncar() et tp_deb().
Elles sont utiles à meta.c et à bloquer.c.

Diffstat:
Mbloquer.c | 18+++++++++---------
Mmeta.c | 55+++++++++++++------------------------------------------
Mmeta.h | 15++++-----------
Mtampon.c | 22++++++++++++++++++++--
Mtampon.h | 10++++++----
5 files changed, 52 insertions(+), 68 deletions(-)

diff --git a/bloquer.c b/bloquer.c @@ -3,8 +3,8 @@ #include <stdlib.h> #include <string.h> -#include "meta.h" #include "tampon.h" +#include "meta.h" #define MAX_VARS 32 /* nombre maximal de variables */ #define TLL_VAR 32 /* taille initiale du tampon à variable */ @@ -166,7 +166,7 @@ filtrer(void) ign_bloc(stdin); break; } - pc = tamp_meta.draps-2; + pc = tp_deb(&tamp_meta.tp) + tamp_meta.draps - 2; while (*--pc != '#') ; if (evaluer(pc+1)) { @@ -193,7 +193,7 @@ afficher: int valider_etqs(struct meta *m) { - if (*(m->etqs) != ':') { + if (*tp_deb(&m->tp) != ':') { fprintf(stderr, "%s: fichier corrompu; le premier champ ne " "commence pas par «:»\n", nom_prog); return -1; @@ -206,9 +206,9 @@ valider_etqs(struct meta *m) int trv_base(struct meta *m) { - char *c = m->draps-2; + char *c = tp_deb(&m->tp) + m->draps - 2; int n = 0; - if (c == m->etqs) + if (c == tp_deb(&m->tp)) return 0; while (*--c != ':') ; @@ -217,7 +217,7 @@ trv_base(struct meta *m) c -= 2; n++; } - if (c - m->etqs < 4) + if (c - tp_deb(&m->tp) < 4) return 0; if (*c == '@') { c -= 3; @@ -235,7 +235,7 @@ ana_draps(struct meta *m) { char *c; int draps; - for (draps = 0, c = m->draps; *c != '\0'; c++) { + for (draps = 0, c = tp_deb(&m->tp) + m->draps; *c != '\0'; c++) { switch (*c) { case '(': draps |= DRAP_DEB; @@ -253,7 +253,7 @@ aff_etq(struct meta *m) { char *c; int fini = 0; - for (c = m->etqs; *c != '\0'; c++) { + for (c = tp_deb(&m->tp); *c != '\0'; c++) { fini = 0; if (*c == ':') { if (strncmp(c+1, "si:", 3) == 0) { @@ -277,7 +277,7 @@ aff_etq(struct meta *m) if (fini) { putc('\t', stdout); } else { - printf("\t%s", m->draps); + printf("\t%s", tp_deb(&m->tp) + m->draps); } } diff --git a/meta.c b/meta.c @@ -1,22 +1,18 @@ #include <stdio.h> -#include <stdlib.h> +#include "tampon.h" #include "meta.h" -static int m_ecr(char, struct meta *); -static int m_plein(char, struct meta *); static void m_reinit(struct meta *); /* initialiser un tampon m de taille tll */ int m_init(struct meta *m, size_t tll) { - if ((m->etqs = malloc(tll)) == NULL) + if (tp_init(&m->tp, tll) < 0) return -1; - m->draps = m->etqs; - m->pcar = m->etqs; - m->ncar = 0; - m->tll = tll; + m->draps = 0; + return 0; } @@ -34,56 +30,31 @@ m_lire(FILE *f, struct meta *m) while ((c = getc(f)) != '\t' && c != '\n') { if (c == EOF) return 0; - if (m_ecr(c, m) < 0) + if (tp_ecr(c, &m->tp) < 0) return -1; } - m_ecr(':', m); - m_ecr('\0', m); + tp_ecr(':', &m->tp); + tp_ecr('\0', &m->tp); /* lire les drapeaux */ - m->draps = m->pcar; + m->draps = tp_ncar(&m->tp); if (c != '\n') { while ((c = getc(f)) != '\t' && c != '\n') { if (c == EOF) return 0; - if (m_ecr(c, m) < 0) + if (tp_ecr(c, &m->tp) < 0) return -1; } } - m_ecr('\0', m); + tp_ecr('\0', &m->tp); ungetc(c, stdin); return 1; } -/* écrire un caractère dans le tampon */ -static int -m_ecr(char c, struct meta *m) -{ - return ((++m->ncar > m->tll) ? m_plein(c, m) : - (*m->pcar++ = c, (unsigned char) c)); -} - -/* agrandir le tampon et écrire un caractère */ -int -m_plein(char c, struct meta *m) -{ - char *tmp; - if ((tmp = realloc(m->etqs, m->tll * M_FACT_AGR)) == NULL) - return -1; - m->tll *= M_FACT_AGR; - if (tmp != m->etqs) { - m->draps = tmp + (m->draps - m->etqs); - m->pcar = tmp + m->ncar - 1; - m->etqs = tmp; - } - *m->pcar++ = c; - return (unsigned char) c; -} - /* réinitaliser un tampon méta */ -void +static void m_reinit(struct meta *m) { - m->pcar = m->etqs; - m->ncar = 0; + tp_eff(&m->tp); + m->draps = 0; } diff --git a/meta.h b/meta.h @@ -1,19 +1,12 @@ #ifndef META_H #define META_H -#include <stdio.h> - -#define M_FACT_AGR 2 /* facteur d'agrandissement d'un tampon */ - struct meta { - char *etqs; - char *draps; - char *pcar; - size_t ncar; - size_t tll; + struct tampon tp; + size_t draps; }; -int m_init(struct meta *, size_t); -int m_lire(FILE *, struct meta *); +int m_init(struct meta *, size_t); +int m_lire(FILE *, struct meta *); #endif diff --git a/tampon.c b/tampon.c @@ -67,7 +67,7 @@ tp_plein(char c, struct tampon *tp) return (unsigned char) c; } -/* afficher le contenu du tampon t */ +/* afficher le contenu du tampon tp */ void tp_aff(struct tampon *tp) { @@ -90,7 +90,7 @@ tp_aff(struct tampon *tp) INVARIANTS_TP(tp); } -/* effacer le contenu du tampon t */ +/* effacer le contenu du tampon tp */ void tp_eff(struct tampon *tp) { @@ -100,3 +100,21 @@ tp_eff(struct tampon *tp) INVARIANTS_TP(tp); } + +/* obtenir le nombre de caractères dans le tampon tp */ +size_t +tp_ncar(struct tampon *tp) +{ + INVARIANTS_TP(tp); + + return tp->pc - tp->tp; +} + +/* obtenir un pointeur vers le début du tampon tp */ +char * +tp_deb(struct tampon *tp) +{ + INVARIANTS_TP(tp); + + return tp->tp; +} diff --git a/tampon.h b/tampon.h @@ -9,9 +9,11 @@ struct tampon { char *pc; /* ptr vers le prochain caractère */ }; -int tp_init(struct tampon *, size_t); -int tp_ecr(char, struct tampon *); -void tp_aff(struct tampon *); -void tp_eff(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 *); +size_t tp_ncar(struct tampon *); +char *tp_deb(struct tampon *); #endif