[Bug libfortran/20661] End of record not detected
--- Additional Comments From tkoenig at gcc dot gnu dot org 2005-04-10 08:44 --- Fixed in 4.1.0, waiting for 4.0 to reopen. -- What|Removed |Added Keywords||patch Known to work||4.1.0 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20661
[Bug libfortran/20661] End of record not detected
--- Additional Comments From cvs-commit at gcc dot gnu dot org 2005-04-10 08:36 --- Subject: Bug 20661 CVSROOT:/cvs/gcc Module name:gcc Changes by: [EMAIL PROTECTED] 2005-04-10 08:35:40 Modified files: libgfortran: ChangeLog libgfortran/io : transfer.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/gfortran.dg: eor_handling_1.f90 eor_handling_2.f90 eor_handling_3.f90 eor_handling_4.f90 eor_handling_5.f90 noadv_size.f90 pad_no.f90 Log message: 2005-04-10 Thomas Koenig <[EMAIL PROTECTED]> PR libfortran/17992 PR libfortran/19568 PR libfortran/19595 PR libfortran/20005 PR libfortran/20092 PR libfortran/20131 PR libfortran/20138 PR libfortran/20661 PR libfortran/20744 * io/transfer.c (top level): eor_condition: New static variable. (read_sf): Remove unnecessary zeroing of buffer (there is enough information in its length). Return a string of length 0 (to be padded by caller) if EOR was seen previously. Remove erroneous special casing of EOR for standard input. Set eor_condition for non-advancing I/O if an end of line was detected. Increment ioparm.size if necessary. (formatted_transfer): Skip the function if there is an EOR condition. (data_transfer_init): Initialize eor_condition to zero (false). (next_record_r): Clear sf_seen_eor if a \n has been seen already. (finalize_transfer): If there is an EOR condition, raise the error. 2005-04-10 Thomas Koenig <[EMAIL PROTECTED]> * eor_handling_1.f90: New test case. * eor_handling_2.f90: New test case. * eor_handling_3.f90: New test case. * eor_handling_4.f90: New test case. * eor_handling_5.f90: New test case. * noadv_size.f90: New test case. * pad_no.f90: New test case. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/ChangeLog.diff?cvsroot=gcc&r1=1.188&r2=1.189 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/io/transfer.c.diff?cvsroot=gcc&r1=1.35&r2=1.36 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.5320&r2=1.5321 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/eor_handling_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/eor_handling_2.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/eor_handling_3.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/eor_handling_4.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/eor_handling_5.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/noadv_size.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/pad_no.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1 -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20661
[Bug libfortran/20661] End of record not detected
--- Additional Comments From Thomas dot Koenig at online dot de 2005-04-01 13:34 --- This patch fixes the test case. It also includes my EOR patch for advancing I/O. This is regression-tested on mainline. I'll submit a proper patch when I have finished regression-testing it on 4.0. --- transfer.c.orig 2005-03-25 14:35:29.0 +0100 +++ transfer.c 2005-04-01 15:34:19.0 +0200 @@ -150,7 +150,12 @@ read_sf (int *length) else p = base = data; - memset(base,'\0',*length); + memset(base,' ',*length); + + /* If we have seen an eor previously, return blanks. */ + + if (sf_seen_eor) +return base; current_unit->bytes_left = options.default_recl; readlen = 1; @@ -179,12 +184,6 @@ read_sf (int *length) if (readlen < 1 || *q == '\n' || *q == '\r') { - /* ??? What is this for? */ - if (current_unit->unit_number == options.stdin_unit) -{ - if (n <= 0) -continue; -} /* Unexpected end of line. */ if (current_unit->flags.pad == PAD_NO) { @@ -193,8 +192,13 @@ read_sf (int *length) } current_unit->bytes_left = 0; - *length = n; sf_seen_eor = 1; + + if (advance_status == ADVANCE_NO) + ioparm.library_return = LIBRARY_EOR; + else + *length = n; + break; } @@ -748,6 +752,9 @@ formatted_transfer (bt type, void *p, in internal_error ("Bad format node"); } + if (ioparm.library_return == LIBRARY_EOR) + generate_error (ERROR_EOR, NULL); + /* Free a buffer that we had to allocate during a sequential formatted read of a block that was larger than the static buffer. */ @@ -1223,7 +1230,10 @@ next_record_r (int done) length = 1; /* sf_read has already terminated input because of an '\n' */ if (sf_seen_eor) - break; + { + sf_seen_eor=0; + break; + } do { -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20661
[Bug libfortran/20661] End of record not detected
--- Additional Comments From Thomas dot Koenig at online dot de 2005-03-29 15:11 --- I'll try and have a look. Hopefully, my copyright papers that I sent off on 2005-03-19 will come through sometime soon, because the end-of-record patch at http://gcc.gnu.org/ml/gcc-patches/2005-03/msg00729.html (or something that does the same job) needs to be applied before going into this one. Thomas -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20661
[Bug libfortran/20661] End of record not detected
--- Additional Comments From tobi at gcc dot gnu dot org 2005-03-28 17:48 --- To clarify this: ! End of record is not detected !on second READ ! iostats should be 0, 0, -2, -1 The standard says: "Execution of an input/output statement containing the IOSTAT= specifier causes the variable specified in the IOSTAT= specifier to become defined (1) With a zero value if neither an error condition, and end-of-file condition, nor an end-of-record condition occurs, (2) With a processor-dependent positive integer value if an error condition occurs, (3) With a processor-dependent negative integer value if an end-of-ile condition occurs and no error condition occurs, or (4) With a processor-dependent negative integer value different from the end-of-file value if and end-of-record condition occurs and no error condition or end-of-file condition occurs. Current output from gfortran: iostat 0 iostat 0 x iostat 0 iostat -1 -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20661
[Bug libfortran/20661] End of record not detected
--- Additional Comments From pinskia at gcc dot gnu dot org 2005-03-27 22:02 --- Confirmed. -- What|Removed |Added Status|UNCONFIRMED |NEW Component|fortran |libfortran Ever Confirmed||1 Last reconfirmed|-00-00 00:00:00 |2005-03-27 22:02:41 date|| http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20661