From ca36d2efbc8f3327b999f21f742b36ef02c597fd Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 17 Mar 2000 11:31:40 +0000 Subject: [PATCH] * reader.c (copy_string): New function, factored out from: (copy_action): Use it. (copy_guard): Likewise. --- ChangeLog | 6 ++++ src/reader.c | 107 ++++++++++++++++++++++++----------------------------------- 2 files changed, 49 insertions(+), 64 deletions(-) diff --git a/ChangeLog b/ChangeLog index a545983..86f7a23 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2000-03-17 Akim Demaille + * reader.c (copy_string): New function, factored out from: + (copy_action): Use it. + (copy_guard): Likewise. + +2000-03-17 Akim Demaille + Change the handling of @s so that they behave exactly like $s. There is now a pseudo variable @$ (readble and writable), location of the lhs of the rule (by default ranging from the location of diff --git a/src/reader.c b/src/reader.c index d670310..a156937 100644 --- a/src/reader.c +++ b/src/reader.c @@ -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 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 @@ -1047,38 +1088,7 @@ copy_guard (symbol_list *rule, int stack_offset) case '\'': case '"': - match = 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); + copy_string (finput, fguard, c); break; case '/': @@ -1277,38 +1287,7 @@ copy_action (symbol_list *rule, int stack_offset) case '\'': case '"': - match = 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); + copy_string (finput, faction, c); break; case '/': -- 2.7.4