aplat

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

commit ac54a87353aeab79143c46232bb3b0a191617c11
parent d5f1507308684788ec19b34cc92167b0d60ca91d
Auteur: Selve <selve@asteride.xyz>
Date:   Tue, 21 Nov 2023 15:56:54 -0500

correction d'erreurs importantes

Elles concernent le traitement des guillemets.

Diffstat:
Maplat.c | 35+++++++++++++++++++++++------------
1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/aplat.c b/aplat.c @@ -187,31 +187,40 @@ prch_jeton(FILE *f, struct tampon *tp, int tp_type) for (npar = 1; (c = getc(f)) == '"'; npar++) if (c == EOF) return EOF; - while (c != '\n') /* ignorer le reste de la ligne */ - if ((c = getc(f)) == EOF) - return EOF; if (npar == NGUI) { + while (c != '\n') /* ignorer le reste de la ligne */ + if ((c = getc(f)) == EOF) + return EOF; if (bloc(f, tp) == EOF) return EOF; continue; - } else { - while (npar-- > 0) - tp_ecr('"', tp); } ungetc(c, f); - if (npar % 2 == 1) + if (npar % 2 == 1) { /* nombre impaire de guillemets */ if (guillemets(f, tp) == EOF) return EOF; + } continue; case ':': if (tp_type == TP_TYPE_ETQ) return JT_FCT; tp_ecr(':', tp); case '\\': - if ((c = getc(f)) == EOF) - return EOF; - if (c == '\\') + switch (c = getc(f)) { + case '\\': + tp_ecr('\\', tp); + break; + case '\t': + tp_ecr('\\', tp); + tp_ecr('t', tp); + continue; + case '\n': tp_ecr('\\', tp); + tp_ecr('n', tp); + continue; + case EOF: + return EOF; + } /* CASCADE */ default: tp_ecr(c, tp); @@ -273,6 +282,7 @@ guillemets(FILE *f, struct tampon *tp) assert(tp != NULL); while ((c = getc(f)) != '"' && c != EOF) { +en_haut: switch (c) { case '\n': tp_ecr('\\', tp); @@ -285,8 +295,9 @@ guillemets(FILE *f, struct tampon *tp) case '\\': if ((c = getc(f)) == EOF) return EOF; - if (c == '\\') - tp_ecr('\\', tp); + if (c != '\\') + goto en_haut; + tp_ecr('\\', tp); /* CASCADE */ default: tp_ecr(c, tp);