This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

[gfortran] Patch for list directed input problems


Below is a patch that is a joint work by Paul Thomas and myself.
{ i confess, most of the work was paul !! }

It corrects some errors in list directed reads; detecting a separator
properly when a null item or a repeat count exists.

No additional failures on i686/gnu/linux. The test suite file
provided fails before and passes after the application of this
patch.

No change to the NIST test suite.


--bud


2004-02-07  Paul Thomas <paulthomas2@wannado.fr>
	    Bud Davis  <bdavis@gfortran.org>

	* io/list_read.c (read_real): Handle separators properly
	in list directed read.



C { dg-do run }
C Test of gfortran list directed read> check delimiters are correctly
C treated.  Written in f77 so that g77 will run for comparison.
C
C f , e and i edit reads are terminated separately by read_real.c
C
C PThomas                                                   Jan 2005
C BDavis        
      program list_read_4
      integer i(10),l(10),k,j 
      real x(10),y(10)
C expected results
      data y / 1.0,2.0,3.0,-1.0,-1.0,-1.0,4.0,4.0,99.0,99.0 /
      data l /1,2,3,-1,-1,-1,4,4,99,99/
C put them in a file
      open (10,status="scratch")
      write (10,*) " 1.0, 2.0 , 3.0,, 2* , 2*4.0 , 5*99.0"
      write (10,*) " 1.0e0, 2.0e0 , 3.0e0,, 2* , 2*4.0e0 , 5*99.0e0"
      write (10,*) " 1,   2 ,   3,,   2* , 2*4 ,   5*99"
      write (10,*) " 1,   2 ,   3,,   2* , 2*4 ,   5*99"
      rewind (10)
C
      do k = 1,10
        x(k) = -1.0
      enddo
      read (10,*,iostat=ier) x
      if (ier.ne.0) call abort
      do k = 1,10
         if (x(k).ne.y(k)) call abort
         x(k) = -1
      end do
      READ(10,*,iostat=ier) x
      if (ier.ne.0) call abort
      do k = 1,10
         if (x(k).ne.y(k)) call abort
         x(k) = -1
      end do
      READ(10,*,iostat=ier) x
      if (ier.ne.0) call abort
      do k = 1,10
         if (x(k).ne.y(k)) call abort
         x(k) = -1
      end do
C integer
      do k = 1,10
        i(k) = -1
      end do 
      READ(10,*,iostat=ier) (i(j),j=1,10)
      if (ier.ne.0) call abort
      do k = 1,10
         if (i(k).ne.y(k)) call abort
         i(k) = -1
      end do
      end
Index: gcc/libgfortran/io/list_read.c
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/io/list_read.c,v
retrieving revision 1.13
diff -c -3 -p -r1.13 list_read.c
*** gcc/libgfortran/io/list_read.c	12 Jan 2005 21:27:31 -0000	1.13
--- gcc/libgfortran/io/list_read.c	8 Feb 2005 01:53:46 -0000
*************** read_real (int length)
*** 1052,1059 ****
  	  goto got_repeat;
  
  	CASE_SEPARATORS:
-           if (c != '\n' &&  c != ',')
-             unget_char (c);    /* Real number that is just a digit-string.  */
  	  goto done;
  
  	default:
--- 1052,1057 ----
*************** read_real (int length)
*** 1164,1171 ****
  	  break;
  
  	CASE_SEPARATORS:
- 	  unget_char (c);
- 	  eat_separator ();
  	  goto done;
  
  	default:
--- 1162,1167 ----
*************** read_real (int length)
*** 1174,1179 ****
--- 1170,1177 ----
      }
  
   done:
+   unget_char (c);
+   eat_separator ();
    push_char ('\0');
    if (convert_real (value, saved_string, length))
      return;



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