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:
M | bloquer.c | | | 18 | +++++++++--------- |
M | meta.c | | | 55 | +++++++++++++------------------------------------------ |
M | meta.h | | | 15 | ++++----------- |
M | tampon.c | | | 22 | ++++++++++++++++++++-- |
M | tampon.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