+2002-04-25 Robert Anisko <robert@lrde.epita.fr>
+
+ * src/scan-skel.l: Postprocess quadrigraphs.
+
+ * src/reader.c (copy_character): New function, used to output
+ single characters while replacing `[' and `]' with quadrigraphs, to
+ avoid troubles with M4 quotes.
+ (copy_comment): Output characters with copy_character.
+ (read_additionnal_code): Likewise.
+ (copy_string2): Likewise.
+ (copy_definition): Likewise.
+
+ * tests/calc.at: Exercise M4 quoting.
+
2002-04-25 Akim Demaille <akim@epita.fr>
* tests/sets.at (AT_EXTRACT_SETS): Sed portability issue: no space
return rp->sym->type_name;
}
\f
+/*------------------------------------------------------------------.
+| Copy the character C to OOUT, and insert quadigraphs when needed. |
+`------------------------------------------------------------------*/
+
+static inline void
+copy_character (struct obstack *oout, int c)
+{
+ switch (c)
+ {
+ case '[':
+ obstack_sgrow (oout, "@<:@");
+ break;
+
+ case ']':
+ obstack_sgrow (oout, "@:>@");
+ break;
+
+ default:
+ obstack_1grow (oout, c);
+ }
+}
+
/*------------------------------------------------------------.
| Dump the string from FIN to OOUT if non null. MATCH is the |
| delimiter of the string (either ' or "). |
continue;
}
- obstack_1grow (oout, c);
+ copy_character (oout, c);
if (c == '\\')
{
c = getc (fin);
if (c == EOF)
fatal (_("unterminated string at end of file"));
- obstack_1grow (oout, c);
+ copy_character (oout, c);
if (c == '\n')
++lineno;
fatal (_("unterminated comment"));
else
{
- obstack_1grow (oout, c);
+ copy_character (oout, c);
c = getc (fin);
}
}
fatal ("%s", _("unterminated `%{' definition"));
default:
- obstack_1grow (oout, c);
+ copy_character (oout, c);
}
c = getc (finput);
}
while ((c = getc (finput)) != EOF)
- obstack_1grow (&el_obstack, c);
+ copy_character (&el_obstack, c);
obstack_1grow (&el_obstack, 0);
muscle_insert ("epilogue", obstack_finish (&el_obstack));
yylineno = 1;
}
+"@<:@" fputc ('[', yyout);
+"@:>@" fputc (']', yyout);
+
"__oline__" fprintf (yyout, "%d", yylineno);
"__ofile__" fprintf (yyout, "%s", yyoutname);
-[^_\n]+ ECHO;
+[^@_\n]+ ECHO;
\n+ yylineno += yyleng; ECHO;
. ECHO;
%}
+/* Exercise M4 quoting: '@:>@@:>@', 0. */
+
/* Also exercise %union. */
%union
{
/* Exercise post-prologue dependency to %union. */
%{
static void id (YYSTYPE *lval);
+
+/* Exercise quotes in declarations. */
+char quote[] = "@:>@@:>@,";
%}
/* Bison Declarations */
%token <ival> NUM "number"
%type <ival> exp
+/* Exercise quotes in strings. */
+%token "fake @>:@@>:@,"
+
%nonassoc '=' /* comparison */
%left '-' '+'
%left '*' '/'
line:
'\n'
-| exp '\n' {}
+| exp '\n'
+ {
+ /* Exercise quotes in braces. */
+ char tmp[] = "@>:@@:>@,";
+ }
;
+/* Exercise M4 quoting: '@:>@@:>@', 1. */
exp:
NUM { $$ = $1; }
| exp '=' exp
/* The input. */
FILE *yyin;
+/* Exercise M4 quoting: '@:>@@:>@', 2. */
static void
yyerror (const char *s)
{