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:
M | aplat.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);