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:
M | bloquer.c | | | 12 | ++++++------ |
M | tampon.c | | | 66 | ++++++++++++++++++++++++++++++++++++++---------------------------- |
M | tampon.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