re PR libfortran/46800 (Handle CTRL-D correctly with STDIN)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Tue, 18 Mar 2014 01:20:02 +0000 (01:20 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Tue, 18 Mar 2014 01:20:02 +0000 (01:20 +0000)
2014-03-17  Jerry DeLisle  <jvdelisle@gcc.gnu>

PR libfortran/46800
* io/list_read.c (list_formatted_read_scalar): Do not use
eat_separator. Explicitly set the comma and end-of-line flags.
Check for END condition from finish_separator.

From-SVN: r208629

libgfortran/ChangeLog
libgfortran/io/list_read.c

index 358a31c..69d5627 100644 (file)
@@ -1,3 +1,10 @@
+2014-03-17  Jerry DeLisle  <jvdelisle@gcc.gnu>
+
+       PR libfortran/58324
+       * io/list_read.c (list_formatted_read_scalar): Do not use
+       eat_separator. Explicitly set the comma and end-of-line flags.
+       Check for END condition from finish_separator.
+
 2014-03-15  Jerry DeLisle  <jvdelisle@gcc.gnu>
 
        PR libfortran/58324
index caeb41b..625ba0c 100644 (file)
@@ -1923,17 +1923,31 @@ list_formatted_read_scalar (st_parameter_dt *dtp, bt type, void *p,
        }
       if (is_separator (c))
        {
-         /* Found a null value.  */
-         eat_separator (dtp);
+         /* Found a null value. Do not use eat_separator here otherwise
+            we will do an extra read from stdin.  */
          dtp->u.p.repeat_count = 0;
 
-         /* eat_separator sets this flag if the separator was a comma.  */
-         if (dtp->u.p.comma_flag)
-           goto cleanup;
+         /* Set comma_flag.  */
+         if ((c == ';' 
+             && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
+             ||
+             (c == ','
+             && dtp->u.p.current_unit->decimal_status == DECIMAL_POINT))
+           {
+             dtp->u.p.comma_flag = 1;
+             goto cleanup;
+           }
 
-         /* eat_separator sets this flag if the separator was a \n or \r.  */
-         if (dtp->u.p.at_eol)
-           finish_separator (dtp);
+         /* Set end-of-line flag.  */
+         if (c == '\n' || c == '\r')
+           {
+             dtp->u.p.at_eol = 1;
+             if (finish_separator (dtp) == LIBERROR_END)
+               {
+                 err = LIBERROR_END;
+                 goto cleanup;
+               }
+           }
          else
            goto cleanup;
        }