[gfortran] Fix list directed reads of real number

Bud Davis bdavis9659@comcast.net
Wed Dec 15 05:22:00 GMT 2004


when reading 

"10,20,30"

as REAL values, list directed, we were not eating the comma, so the 
next value was seeing a comma as it's first character, so it was
unchanged. problem only occurred when parsing the first part of
a real without a decimal point, " 10.0,20.0,30.0 " was OK.


this patch handles this situation.  i added some more tests to the file,
including one for " 10,,20,30 " which handles the null value
list directed read.


both steve and myself were on the same line of code, just slightly
different fixes. 


No additional regressions, no changes in NIST F77 test results.
Tested i686/gnu/linux FC2.



--bud


2004-12-15  Bud Davis  <bdavis9659@comcast.net>
            Steven G. Kargl  <kargls@comcast.net>

	* io/list_read.c (read_real): do not push back a comma when
	it delimits a real value without a decimal point


 
Index: gcc/libgfortran/io/list_read.c
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/io/list_read.c,v
retrieving revision 1.11
diff -c -3 -p -r1.11 list_read.c
*** gcc/libgfortran/io/list_read.c	7 Dec 2004 00:00:59 -0000	1.11
--- gcc/libgfortran/io/list_read.c	15 Dec 2004 05:09:25 -0000
*************** read_real (int length)
*** 1043,1049 ****
  	  goto got_repeat;
  
  	CASE_SEPARATORS:
!           if (c != '\n')
              unget_char (c);    /* Real number that is just a digit-string.  */
  	  goto done;
  
--- 1043,1049 ----
  	  goto got_repeat;
  
  	CASE_SEPARATORS:
!           if (c != '\n' && c != ',')
              unget_char (c);    /* Real number that is just a digit-string.  */
  	  goto done;
  
! { dg-do run }
! Program to test reading in a list of integer values into REAL variables.
! The comma separator was not handled correctly.
!
program fg

  character(len=80) buff
  logical debug

  debug = .FALSE.
  a = 0
  b = 0
  c = 0
  d = 0
  write (buff,'(a)') '10,20,30,40'
  read(buff,*) a, b, c, d

  if (debug) then
    print*,buff
    print*,a, b, c, d
  end if

  if (abs(10. - a) > 1e-5) call abort
  if (abs(20. - b) > 1e-5) call abort
  if (abs(30. - c) > 1e-5) call abort
  if (abs(40. - d) > 1e-5) call abort

  a = 0
  b = 0
  c = 0
  d = 0
  write (buff,'(a)') '10.,20.,30.,40.'
  read(buff,*) a, b, c, d

  if (abs(10. - a) > 1e-5) call abort
  if (abs(20. - b) > 1e-5) call abort
  if (abs(30. - c) > 1e-5) call abort
  if (abs(40. - d) > 1e-5) call abort

  if (debug) then
    print*,buff
    print*,a, b, c, d
  end if 

  a = 0
  b = 0
  c = 0
  d = 0
  write (buff,'(a)') '10.0,20.0,30.0,40.0'
  read(buff,*) a, b, c, d
                                                                                
  if (abs(10. - a) > 1e-5) call abort
  if (abs(20. - b) > 1e-5) call abort
  if (abs(30. - c) > 1e-5) call abort
  if (abs(40. - d) > 1e-5) call abort

  if (debug) then 
    print*,buff
    print*,a, b, c, d
  end if
                                                                              

  a = 0
  b = -99 
  c = 0
  d = 0
  write (buff,'(a)') '10.0,,30.0,40.0'
  read(buff,*) a, b, c, d
                                                                                
  if (abs(10. - a) > 1e-5) call abort
  if (abs(-99. - b) > 1e-5) call abort
  if (abs(30. - c) > 1e-5) call abort
  if (abs(40. - d) > 1e-5) call abort

  if (debug) then
    print*,buff
    print*,a, b, c, d
  end if
                                                                                

   call abc

end program

subroutine abc

  character(len=80) buff

  a = 0
  b = 0
  c = 0
  d = 0
  write (buff,'(a)') '10,-20,30,-40'
  read(buff,*) a, b, c, d

  if (abs(10. - a) > 1e-5) call abort
  if (abs(-20. - b) > 1e-5) call abort
  if (abs(30. - c) > 1e-5) call abort
  if (abs(-40. - d) > 1e-5) call abort

end subroutine abc





More information about the Fortran mailing list