From: Akim Demaille <akim@epita.fr>
Date: Fri, 17 Mar 2000 11:31:40 +0000 (+0000)
Subject: * reader.c (copy_string): New function, factored out from:
X-Git-Tag: BISON-1_28b~165
X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/ca36d2efbc8f3327b999f21f742b36ef02c597fd

* reader.c (copy_string): New function, factored out from:
(copy_action): Use it.
(copy_guard): Likewise.
---

diff --git a/ChangeLog b/ChangeLog
index a545983f..86f7a233 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
 	Change the handling of @s so that they behave exactly like $s.
diff --git a/src/reader.c b/src/reader.c
index d670310a..a156937c 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 '/':