[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