commit 8afbe10c4d74ae00afd207dba1697a205d92efbc
parent 0a28b5b2687fd6ebd2016fff15a2def976f0801e
Auteur: Selve <selve@asteride.xyz>
Date: Sat, 18 Nov 2023 14:15:16 -0500
refactorisation
Les lignes de sortie ne sont plus affichées p'tit bout par p'tit bout mais une
fonction permet d'afficher chaque ligne d'un coup.
Diffstat:
M | aplat.c | | | 65 | ++++++++++++++++++++++++++++++++++++++++++----------------------- |
1 file changed, 42 insertions(+), 23 deletions(-)
diff --git a/aplat.c b/aplat.c
@@ -9,8 +9,12 @@
#define TLL_ETQ 4096 /* taille initiale du tampon à étiquettes */
#define TLL_TXT 4096 /* taille initiale du tampon à texte */
+#define DRAP_PARG 01
+#define DRAP_PARD 02
+
void utilisation(void);
int transformer(FILE *);
+int afficher_ligne(struct tampon *, struct tampon *, int *);
int manger_espaces(FILE *);
int guillemets(FILE *, struct tampon *);
@@ -51,10 +55,12 @@ transformer(FILE *f)
{
int c;
int prfd; /* profondeur */
+ int draps; /* drapeaux */
assert(f != NULL);
- prfd = 0;
+ prfd = 0;
+ draps = 0;
if ((c = manger_espaces(f)) == EOF)
return 0;
@@ -76,16 +82,15 @@ ouv:
do {
switch (c) {
case ' ': case '\t': case '\n':
- tp_etq_aff(&etq);
- fputs("\t(", stdout);
+ draps |= DRAP_PARG;
goto val;
case '(':
- tp_etq_aff(&etq);
- fputs("\t(\t\n", stdout);
+ draps |= DRAP_PARG;
+ afficher_ligne(&etq, &txt, &draps);
goto ouv;
case ')':
- tp_etq_aff(&etq);
- fputs("\t()\t\n", stdout);
+ draps |= DRAP_PARG | DRAP_PARD;
+ afficher_ligne(&etq, &txt, &draps);
goto ferm;
case '"':
if (guillemets(f, &etq) == EOF)
@@ -99,8 +104,8 @@ ouv:
tp_ecr(c, &etq);
continue;
case ':':
- tp_etq_aff(&etq);
- fputs("\t(\t\n", stdout);
+ draps |= DRAP_PARG;
+ afficher_ligne(&etq, &txt, &draps);
prfd++;
tp_ecr('\\', &etq);
default:
@@ -114,16 +119,11 @@ val:
case ' ': case '\t': case '\n':
continue;
case '(':
- putc('\t', stdout);
- tp_txt_aff(&txt);
- tp_eff(&txt);
- putc('\n', stdout);
+ afficher_ligne(&etq, &txt, &draps);
goto ouv;
case ')':
- fputs(")\t", stdout);
- tp_txt_aff(&txt);
- tp_eff(&txt);
- putc('\n', stdout);
+ draps |= DRAP_PARD;
+ afficher_ligne(&etq, &txt, &draps);
goto ferm;
case '"':
if (guillemets(f, &txt) == EOF)
@@ -147,8 +147,8 @@ ferm:
assert(prfd > 0);
while (tp_etq_rec(&etq) != ETQ_SEP_REEL) {
- tp_etq_aff(&etq);
- fputs("\t)\t\n", stdout);
+ draps |= DRAP_PARD;
+ afficher_ligne(&etq, &txt, &draps);
if (--prfd == 0)
goto fin;
}
@@ -159,12 +159,10 @@ ferm:
case '(':
goto ouv;
case ')':
- tp_etq_aff(&etq);
- fputs("\t)\t\n", stdout);
+ draps |= DRAP_PARD;
+ afficher_ligne(&etq, &txt, &draps);
goto ferm;
default:
- tp_etq_aff(&etq);
- putc('\t', stdout);
goto val;
}
@@ -189,6 +187,27 @@ deseq:
}
int
+afficher_ligne(struct tampon *etq, struct tampon *txt, int *draps)
+{
+ assert(etq != NULL);
+ assert(txt != NULL);
+ assert(draps != NULL);
+
+ tp_etq_aff(etq);
+ putc('\t', stdout);
+ if (*draps & DRAP_PARG)
+ putc('(', stdout);
+ if (*draps & DRAP_PARD)
+ putc(')', stdout);
+ *draps = 0;
+ putc('\t', stdout);
+ tp_txt_aff(txt);
+ tp_eff(txt);
+ putc('\n', stdout);
+ return 0;
+}
+
+int
manger_espaces(FILE *f)
{
int c;