* reader.c (copy_string): New function, factored out from:

(copy_action): Use it.
(copy_guard): Likewise.
This commit is contained in:
Akim Demaille
2000-03-17 11:31:40 +00:00
parent 6666f98f4f
commit ca36d2efbc
2 changed files with 49 additions and 64 deletions

View File

@@ -1,3 +1,9 @@
2000-03-17 Akim Demaille <akim@epita.fr>
* reader.c (copy_string): New function, factored out from:
(copy_action): Use it.
(copy_guard): Likewise.
2000-03-17 Akim Demaille <akim@epita.fr> 2000-03-17 Akim Demaille <akim@epita.fr>
Change the handling of @s so that they behave exactly like $s. Change the handling of @s so that they behave exactly like $s.

View File

@@ -989,6 +989,47 @@ get_type_name (int n, symbol_list *rule)
} }
/* Dump the string from FINPUT to FOUTPUT. MATCH is the delimiter of
the string (either ' or "). */
void
copy_string (FILE *finput, FILE *foutput, int match)
{
int c;
putc (match, foutput);
c = getc (finput);
while (c != match)
{
if (c == EOF)
fatal(_("unterminated string at end of file"));
if (c == '\n')
{
warn (_("unterminated string"));
ungetc (c, finput);
c = match; /* invent terminator */
continue;
}
putc(c, foutput);
if (c == '\\')
{
c = getc (finput);
if (c == EOF)
fatal (_("unterminated string"));
putc (c, foutput);
if (c == '\n')
lineno++;
}
c = getc(finput);
}
putc(c, foutput);
}
/* After `%guard' is seen in the input file, copy the actual guard /* After `%guard' is seen in the input file, copy the actual guard
into the guards file. If the guard is followed by an action, copy into the guards file. If the guard is followed by an action, copy
that into the actions file. STACK_OFFSET is the number of values that into the actions file. STACK_OFFSET is the number of values
@@ -1047,38 +1088,7 @@ copy_guard (symbol_list *rule, int stack_offset)
case '\'': case '\'':
case '"': case '"':
match = c; copy_string (finput, fguard, c);
putc(c, fguard);
c = getc(finput);
while (c != match)
{
if (c == EOF)
fatal(_("unterminated string at end of file"));
if (c == '\n')
{
warn(_("unterminated string"));
ungetc(c, finput);
c = match; /* invent terminator */
continue;
}
putc(c, fguard);
if (c == '\\')
{
c = getc(finput);
if (c == EOF)
fatal(_("unterminated string"));
putc(c, fguard);
if (c == '\n')
lineno++;
}
c = getc(finput);
}
putc(c, fguard);
break; break;
case '/': case '/':
@@ -1277,38 +1287,7 @@ copy_action (symbol_list *rule, int stack_offset)
case '\'': case '\'':
case '"': case '"':
match = c; copy_string (finput, faction, c);
putc(c, faction);
c = getc(finput);
while (c != match)
{
if (c == '\n')
{
warn(_("unterminated string"));
ungetc(c, finput);
c = match;
continue;
}
else if (c == EOF)
fatal(_("unterminated string at end of file"));
putc(c, faction);
if (c == '\\')
{
c = getc(finput);
if (c == EOF)
fatal(_("unterminated string"));
putc(c, faction);
if (c == '\n')
lineno++;
}
c = getc(finput);
}
putc(c, faction);
break; break;
case '/': case '/':