aplat

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

commit 01eb104228e89e63e769b5287fe5d0831b09e576
parent 5dee3ad9b40724dab4825ff66378cd53d242d980
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date:   Fri,  7 Jun 2024 20:24:04 -0400

implémentation de l'échappement des blocs

Diffstat:
Maplat.c | 87++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
1 file changed, 53 insertions(+), 34 deletions(-)

diff --git a/aplat.c b/aplat.c @@ -13,7 +13,7 @@ #define _(c) gettext(c) #define TP_ETQ_TLL 128 -#define TP_CTN_TLL 256 +#define TP_CTN_TLL 1 #define JT_RIEN (-1) #define JT_OUV 0 @@ -159,8 +159,8 @@ aplatir(FILE *f) case JT_FRG: if (jtp == JT_OUV) { fprintf(stderr, _("%s: la longueur d'une " - "étiquette ne peut excéder la limite " - "de %d octets\n"), + "étiquette ne peut excéder les %d " + "octets\n"), nom_prog, TP_ETQ_TLL); return -1; } @@ -183,7 +183,7 @@ fin: static int obt_jeton(FILE *f, struct tampon *tp) { - int d; + static int d; static int c; cr_variable; @@ -211,6 +211,11 @@ obt_jeton(FILE *f, struct tampon *tp) cr_sortir(0, JT_FRM); case '=': if (d == '\n') { + if ((c = getc(f)) == '!') { + c = '='; + break; + } + ungetc(c, f); cr_entrer(3) switch (echapper_bloc(f, tp)) { case EOF: @@ -269,7 +274,7 @@ obt_jeton(FILE *f, struct tampon *tp) } } - /*cr_sortir(0, EOF);*/ + assert(0); } static int @@ -294,16 +299,20 @@ echapper(FILE *f, struct tampon *tp) cr_entrer(0); switch (c = getc(f)) { case '\n': - if ((c = getc(f)) == '=') { - cr_entrer(1) - switch (echapper_bloc(f, tp)) { - case EOF: - cr_sortir(0, EOF); - case 0: - break; - case 1: - cr_sortir(1, 1); + if ((c = getc(f)) == '=' ) { + if ((c = getc(f)) != '!') { + ungetc(c, f); + cr_entrer(1) + switch (echapper_bloc(f, tp)) { + case EOF: + cr_sortir(0, EOF); + case 0: + cr_sortir(0, 0); + case 1: + cr_sortir(1, 1); + } } + c = '='; } ungetc(c, f); break; @@ -363,15 +372,19 @@ echapper_guillemets(FILE *f, struct tampon *tp) cr_sortir(0, 0); case '\n': if ((c = getc(f)) == '=') { - cr_entrer(1); - switch (echapper_bloc(f, tp)) { - case EOF: - cr_sortir(0, EOF); - case 0: - continue; - case 1: - cr_sortir(1, 1); + if ((c = getc(f)) != '!') { + ungetc(c, f); + cr_entrer(1) + switch (echapper_bloc(f, tp)) { + case EOF: + cr_sortir(0, EOF); + case 0: + continue; + case 1: + cr_sortir(1, 1); + } } + c = '='; } ungetc(c, f); cr_entrer(2); @@ -421,6 +434,7 @@ static int echapper_bloc(FILE *f, struct tampon *tp) { static int c; + static int pf; cr_variable; assert(f); @@ -438,23 +452,30 @@ echapper_bloc(FILE *f, struct tampon *tp) assert(0); cr_entrer(0); + pf = 1; /* ignorer le reste de la ligne */ while ((c = getc(f)) != '\n') if (c == EOF) cr_sortir(0, EOF); - for (;;){ - switch (c = getc(f)) { + do { + switch (c) { case '\n': if ((c = getc(f)) == '=') { - /* ignorer le reste de la ligne */ - while (c != '\n') - if ((c = getc(f)) == EOF) - break; - ungetc(c, f); - cr_sortir(0, 0); + if ((c = getc(f)) != '!') { + /* ignorer le reste de la ligne */ + while (c != '\n') + if ((c = getc(f)) == EOF) + break; + cr_sortir(0, 0); + } + c = '='; } ungetc(c, f); + if (pf) { + pf = 0; + continue; + } cr_entrer(1); if (tp_ecr(tp, '\\') < 0) cr_sortir(1, 1); @@ -470,8 +491,6 @@ echapper_bloc(FILE *f, struct tampon *tp) if (tp_ecr(tp, 't') < 0) cr_sortir(4, 1); continue; - case EOF: - cr_sortir(0, EOF); case ':': c = 'd'; /* CASCADE */ @@ -485,8 +504,8 @@ echapper_bloc(FILE *f, struct tampon *tp) if (tp_ecr(tp, c) < 0) cr_sortir(6, 1); } - } - assert(0); + } while ((c = getc(f)) != EOF); + cr_sortir(0, EOF); } static void