aplat

Documents structurés pour Unix
git clone git://git.asteride.xyz/~ldp/aplat.git
Journaux | Fichiers | Références | LISEZ-MOI | LICENCE

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:
Maplat.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;