]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/55818 (Reading a REAL from a file which doesn't end in a new line fails)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Wed, 2 Jan 2013 17:09:09 +0000 (17:09 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Wed, 2 Jan 2013 17:09:09 +0000 (17:09 +0000)
2013-01-02  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.
(parse_real): Likewise.
(read_logical): Likewise.
(read_character): Likewise.
(read_complex): Likewise.

From-SVN: r194809

libgfortran/ChangeLog
libgfortran/io/list_read.c

index fa651f9264c4c3c3c07fcaf71dae125510efc29e..2c4dcbb7e465dd54ea4adf285ff1810e3c0ad555 100644 (file)
@@ -1,3 +1,13 @@
+2013-01-02  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.
+       (parse_real): Likewise.
+       (read_logical): Likewise.
+       (read_character): Likewise.
+       (read_complex): Likewise.
+
 2012-12-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libfortran/48976
index 403e7190a1234ed5f010c534f0258821cd0a9e55..acc27e449b1bc941db15b160bec9c1a671800c42 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012
+                2013
    Free Software Foundation, Inc.
    Contributed by Andy Vaught
    Namelist input contributed by Paul Thomas
@@ -697,6 +698,7 @@ read_logical (st_parameter_dt *dtp, int length)
       break;
 
     CASE_SEPARATORS:
+    case EOF:
       unget_char (dtp, c);
       eat_separator (dtp);
       return;                  /* Null value.  */
@@ -951,6 +953,7 @@ read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
       break;
 
     CASE_SEPARATORS:
+    case EOF:
       unget_char (dtp, c);             /* NULL value.  */
       eat_separator (dtp);
       return;
@@ -975,8 +978,7 @@ read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
 
   for (;;)
     {
-      if ((c = next_char (dtp)) == EOF)
-       goto eof;
+      c = next_char (dtp);
       switch (c)
        {
        CASE_DIGITS:
@@ -984,6 +986,7 @@ read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
          break;
 
        CASE_SEPARATORS:
+       case EOF:
          unget_char (dtp, c);
          goto done;            /* String was only digits!  */
 
@@ -1041,7 +1044,7 @@ read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
             the string.  */
 
          if ((c = next_char (dtp)) == EOF)
-           goto eof;
+           goto done_eof;
          if (c == quote)
            {
              push_char (dtp, quote);
@@ -1167,6 +1170,7 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length)
          goto exp2;
 
        CASE_SEPARATORS:
+       case EOF:
          goto done;
 
        default:
@@ -1202,6 +1206,7 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length)
          break;
 
        CASE_SEPARATORS:
+       case EOF:
          unget_char (dtp, c);
          goto done;
 
@@ -1243,7 +1248,7 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length)
                && ((c = next_char (dtp)) == 'y' || c == 'Y')
                && (c = next_char (dtp))))
          {
-            if (is_separator (c))
+            if (is_separator (c) || (c == EOF))
               unget_char (dtp, c);
             push_char (dtp, 'i');
             push_char (dtp, 'n');
@@ -1255,7 +1260,7 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length)
           && ((c = next_char (dtp)) == 'n' || c == 'N')
           && (c = next_char (dtp)))
     {
-      if (is_separator (c))
+      if (is_separator (c) || (c == EOF))
        unget_char (dtp, c);
       push_char (dtp, 'n');
       push_char (dtp, 'a');
@@ -1269,7 +1274,7 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length)
              goto bad;
 
          c = next_char (dtp);
-         if (is_separator (c))
+         if (is_separator (c) || (c == EOF))
            unget_char (dtp, c);
        }
       goto done_infnan;
@@ -1315,6 +1320,7 @@ read_complex (st_parameter_dt *dtp, void * dest, int kind, size_t size)
       break;
 
     CASE_SEPARATORS:
+    case EOF:
       unget_char (dtp, c);
       eat_separator (dtp);
       return;
@@ -1369,7 +1375,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 +1435,7 @@ read_real (st_parameter_dt *dtp, void * dest, int length)
       goto got_sign;
 
     CASE_SEPARATORS:
+    case EOF:
       unget_char (dtp, c);             /* Single null.  */
       eat_separator (dtp);
       return;
@@ -1484,6 +1491,7 @@ read_real (st_parameter_dt *dtp, void * dest, int length)
          goto got_repeat;
 
        CASE_SEPARATORS:
+       case EOF:
           if (c != '\n' && c != ',' && c != '\r' && c != ';')
            unget_char (dtp, c);
          goto done;
@@ -1612,6 +1620,7 @@ read_real (st_parameter_dt *dtp, void * dest, int length)
          break;
 
        CASE_SEPARATORS:
+       case EOF:
          goto done;
 
        default:
@@ -1647,7 +1656,7 @@ read_real (st_parameter_dt *dtp, void * dest, int length)
        goto unwind;
       c = next_char (dtp);
       l_push_char (dtp, c);
-      if (!is_separator (c))
+      if (!is_separator (c) && (c != EOF))
        {
          if (c != 'i' && c != 'I')
            goto unwind;
@@ -1700,7 +1709,7 @@ read_real (st_parameter_dt *dtp, void * dest, int length)
        }
     }
 
-  if (!is_separator (c))
+  if (!is_separator (c) && (c != EOF))
     goto unwind;
 
   if (dtp->u.p.namelist_mode)
@@ -2537,16 +2546,16 @@ nml_read_obj (st_parameter_dt *dtp, namelist_info * nl, index_type offset,
           switch (nl->type)
          {
          case BT_INTEGER:
-             read_integer (dtp, len);
-              break;
+           read_integer (dtp, len);
+            break;
 
          case BT_LOGICAL:
-             read_logical (dtp, len);
-              break;
+           read_logical (dtp, len);
+           break;
 
          case BT_CHARACTER:
-             read_character (dtp, len);
-              break;
+           read_character (dtp, len);
+           break;
 
          case BT_REAL:
            /* Need to copy data back from the real location to the temp in order