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>
+
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
}
+/* 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
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 '/':
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 '/':