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