re PR libfortran/19678 (DOS files don't work for list directed input)
authorFrancois-Xavier Coudert <coudert@clipper.ens.fr>
Fri, 25 Mar 2005 13:35:29 +0000 (14:35 +0100)
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Fri, 25 Mar 2005 13:35:29 +0000 (13:35 +0000)
        PR libfortran/19678
        PR libfortran/19679
        * gfortran.dg/dos_eol.f: New test.

        PR libfortran/19678
        * list_read.c (next_char, eat_separator, finish_separator, read_real)
        (namelist_read): Add support for '\r' as well as '\n' as EOL
        character.

        PR libfortran/19679
        * list_read.c (read_sf): Add a '\r' in a test to support DOS
        line-endings when line length is exceeded.

From-SVN: r97041

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dos_eol.f [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/io/list_read.c
libgfortran/io/transfer.c

index ce9e6236fbb99112a8df2c3b291ce0b8e1d0b5c1..77095caab4aaa6e13b481d78c4573f7355710e53 100644 (file)
@@ -1,3 +1,9 @@
+2005-03-25  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+       PR libfortran/19678
+       PR libfortran/19679
+       * gfortran.dg/dos_eol.f: New test.
+
 2005-03-25  Zdenek Dvorak  <dvorakz@suse.cz>
 
        PR rtl-optimization/20249
diff --git a/gcc/testsuite/gfortran.dg/dos_eol.f b/gcc/testsuite/gfortran.dg/dos_eol.f
new file mode 100644 (file)
index 0000000..3a22a14
--- /dev/null
@@ -0,0 +1,19 @@
+! PR libfortran/19678 and PR libfortran/19679
+! { dg-do run }
+      integer i, j
+      
+      open (10,status='scratch')
+      write (10,'(2A)') '1', achar(13)
+      rewind (10)
+      read (10,*) i
+      if (i .ne. 1) call abort
+      close (10)
+
+      open (10,status='scratch')
+      write (10,'(2A)') '   1', achar(13)
+      write (10,'(2A)') '   2', achar(13)
+      rewind (10)
+      read (10,'(I4)') i
+      read (10,'(I5)') j
+      if ((i .ne. 1) .or. (j .ne. 2)) call abort
+      end
index 6517e03de1394cf75199fd13b64e9507cb415a61..32b5454827bfef62696ec44c36e4936851740b4a 100644 (file)
@@ -1,3 +1,14 @@
+2005-03-25  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+       PR libfortran/19678
+       * list_read.c (next_char, eat_separator, finish_separator, read_real)
+       (namelist_read): Add support for '\r' as well as '\n' as EOL
+       character.
+
+       PR libfortran/19679
+       * list_read.c (read_sf): Add a '\r' in a test to support DOS
+       line-endings when line length is exceeded.
+
 2005-03-25  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        PR libfortran/15332
index 74a6688b0148c68bcafdf73040efa0aabf43fd6f..384df36f6c42f16d384956d444ac238f7a2f97bf 100644 (file)
@@ -66,12 +66,13 @@ static char value[20];
 #define CASE_DIGITS   case '0': case '1': case '2': case '3': case '4': \
                       case '5': case '6': case '7': case '8': case '9'
 
-#define CASE_SEPARATORS  case ' ': case ',': case '/': case '\n': case '\t'
+#define CASE_SEPARATORS  case ' ': case ',': case '/': case '\n': case '\t': \
+                         case '\r'
 
 /* This macro assumes that we're operating on a variable.  */
 
 #define is_separator(c) (c == '/' ||  c == ',' || c == '\n' || c == ' ' \
-                         || c == '\t')
+                         || c == '\t' || c == '\r')
 
 /* Maximum repeat count.  Less than ten times the maximum signed int32.  */
 
@@ -163,7 +164,7 @@ next_char (void)
     c = *p;
 
 done:
-  at_eol = (c == '\n');
+  at_eol = (c == '\n' || c == '\r');
   return c;
 }
 
@@ -230,6 +231,7 @@ eat_separator (void)
       break;
 
     case '\n':
+    case '\r':
       break;
 
     case '!':
@@ -284,6 +286,7 @@ finish_separator (void)
       break;
 
     case '\n':
+    case '\r':
       goto restart;
 
     case '!':
@@ -1052,6 +1055,8 @@ read_real (int length)
          goto got_repeat;
 
        CASE_SEPARATORS:
+          if (c != '\n' &&  c != ',' && c != '\r')
+            unget_char (c);
          goto done;
 
        default:
@@ -1483,6 +1488,7 @@ namelist_read (void)
           return;
         case ' ':
         case '\n':
+       case '\r':
         case '\t':
           break;
         case ',':
index 0e4c619dc9897d436ddbc11f5c89b882ff60fbab..aed0aa90dbc8a4f9e4d20a9aa9346ea1c0be21f5 100644 (file)
@@ -177,7 +177,7 @@ read_sf (int *length)
          return NULL;
        }
 
-      if (readlen < 1 || *q == '\n')
+      if (readlen < 1 || *q == '\n' || *q == '\r')
        {
          /* ??? What is this for?  */
           if (current_unit->unit_number == options.stdin_unit)