Patchwork [libgfortran] PR55818 Reading a REAL from a file which doesn't end in a new line fails

login
register
mail settings
Submitter jerry DeLisle
Date Dec. 28, 2012, 6:29 p.m.
Message ID <50DDE51B.5080902@charter.net>
Download mbox | patch
Permalink /patch/208514/
State New
Headers show

Comments

jerry DeLisle - Dec. 28, 2012, 6:29 p.m.
On 12/27/2012 05:51 PM, Jerry DeLisle wrote:
> Hi,
>
> The attached patch fixes this problem by not calling hit_eof if EOF can be a
> valid separator.
>
> Regression tested on x86-64.
>
> OK for trunk with test case from PR?
>
> Regards,
>
> Jerry
>
> 2012-12-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
>
>      PR libfortran/55818
>      * io/list_read.c (read_real): Do not call hit_eof when EOF can be
>      treated as a value separator

Attached updated patch addresses the similar problem with complex and character 
variables (mentioned in subsequent PR comments). Regression tested on x86-64 linux.

OK for trunk with updated ChangeLog and test cases from PR?

Regards,

Jerry

Patch

Index: list_read.c
===================================================================
--- list_read.c	(revision 194731)
+++ list_read.c	(working copy)
@@ -951,6 +951,7 @@  read_character (st_parameter_dt *dtp, int length _
       break;
 
     CASE_SEPARATORS:
+    case EOF:
       unget_char (dtp, c);		/* NULL value.  */
       eat_separator (dtp);
       return;
@@ -975,8 +976,7 @@  read_character (st_parameter_dt *dtp, int length _
 
   for (;;)
     {
-      if ((c = next_char (dtp)) == EOF)
-	goto eof;
+      c = next_char (dtp);
       switch (c)
 	{
 	CASE_DIGITS:
@@ -984,6 +984,7 @@  read_character (st_parameter_dt *dtp, int length _
 	  break;
 
 	CASE_SEPARATORS:
+	case EOF:
 	  unget_char (dtp, c);
 	  goto done;		/* String was only digits!  */
 
@@ -1005,6 +1006,7 @@  read_character (st_parameter_dt *dtp, int length _
 
   if ((c = next_char (dtp)) == EOF)
     goto eof;
+
   switch (c)
     {
     CASE_SEPARATORS:
@@ -1041,7 +1043,7 @@  read_character (st_parameter_dt *dtp, int length _
 	     the string.  */
 
 	  if ((c = next_char (dtp)) == EOF)
-	    goto eof;
+	    goto done_eof;
 	  if (c == quote)
 	    {
 	      push_char (dtp, quote);
@@ -1315,6 +1317,7 @@  read_complex (st_parameter_dt *dtp, void * dest, i
       break;
 
     CASE_SEPARATORS:
+    case EOF:
       unget_char (dtp, c);
       eat_separator (dtp);
       return;
@@ -1369,7 +1372,7 @@  eol_4:
     goto bad_complex;
 
   c = next_char (dtp);
-  if (!is_separator (c))
+  if (!is_separator (c) && (c != EOF))
     goto bad_complex;
 
   unget_char (dtp, c);
@@ -1429,6 +1432,7 @@  read_real (st_parameter_dt *dtp, void * dest, int
       goto got_sign;
 
     CASE_SEPARATORS:
+    case EOF:
       unget_char (dtp, c);		/* Single null.  */
       eat_separator (dtp);
       return;
@@ -1484,6 +1488,7 @@  read_real (st_parameter_dt *dtp, void * dest, int
 	  goto got_repeat;
 
 	CASE_SEPARATORS:
+	case EOF:
           if (c != '\n' && c != ',' && c != '\r' && c != ';')
 	    unget_char (dtp, c);
 	  goto done;