This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch, libgfortran] PR55818 Reading a REAL from a file which doesn't end in a new line fails


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
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;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]