Commit 159840cb by Francois-Xavier Coudert Committed by François-Xavier Coudert

re PR libfortran/20179 (cannot mix C and Fortran I/O)

	PR libfortran/20179
	* io/unix.c (flush_if_preconnected): New function.
	* io/io.h: Add prototype for flush_if_preconnected.
	* io/transfer.c (data_transfer_init): Use flush_if_preconnected
	to workaround buggy mixed C-Fortran code.

	* gfortran.dg/mixed_io_1.f90: New test.
	* gfortran.dg/mixed_io_1.c: New file.

From-SVN: r106017
parent 0d519038
2005-10-30 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR libfortran/20179
* gfortran.dg/mixed_io_1.f90: New test.
* gfortran.dg/mixed_io_1.c: New file.
2005-10-30 Francois-Xavier Coudert <coudert@clipper.ens.fr>
* gfortran.dg/malloc_free_1.f90: New test.
2005-10-29 Hans-Peter Nilsson <hp@axis.com> 2005-10-29 Hans-Peter Nilsson <hp@axis.com>
* gcc.dg/nested-func-4.c: Require profiling -pg. * gcc.dg/nested-func-4.c: Require profiling -pg.
#include <stdio.h>
void cio_(void){
printf("12345");
}
! { dg-do run }
! { dg-additional-sources mixed_io_1.c }
call cio
write(*,"(A)") '6789' ! { dg-output "123456789" }
end
2005-10-30 Francois-Xavier Coudert <coudert@clipper.ens.fr> 2005-10-30 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR libfortran/20179
* io/unix.c (flush_if_preconnected): New function.
* io/io.h: Add prototype for flush_if_preconnected.
* io/transfer.c (data_transfer_init): Use flush_if_preconnected
to workaround buggy mixed C-Fortran code.
2005-10-30 Francois-Xavier Coudert <coudert@clipper.ens.fr>
* Makefile.am: Add intrinsics/malloc.c file. * Makefile.am: Add intrinsics/malloc.c file.
* Makefile.in: Regenerate. * Makefile.in: Regenerate.
* intrinsics/malloc.c: New file, with implementations for free * intrinsics/malloc.c: New file, with implementations for free
......
...@@ -505,6 +505,9 @@ internal_proto(is_seekable); ...@@ -505,6 +505,9 @@ internal_proto(is_seekable);
extern int is_preconnected (stream *); extern int is_preconnected (stream *);
internal_proto(is_preconnected); internal_proto(is_preconnected);
extern void flush_if_preconnected (stream *);
internal_proto(flush_if_preconnected);
extern void empty_internal_buffer(stream *); extern void empty_internal_buffer(stream *);
internal_proto(empty_internal_buffer); internal_proto(empty_internal_buffer);
......
...@@ -1379,6 +1379,9 @@ data_transfer_init (int read_flag) ...@@ -1379,6 +1379,9 @@ data_transfer_init (int read_flag)
&& current_unit->last_record == 0 && !is_preconnected(current_unit->s)) && current_unit->last_record == 0 && !is_preconnected(current_unit->s))
struncate(current_unit->s); struncate(current_unit->s);
/* Bugware for badly written mixed C-Fortran I/O. */
flush_if_preconnected(current_unit->s);
current_unit->mode = g.mode; current_unit->mode = g.mode;
/* Set the initial value of flags. */ /* Set the initial value of flags. */
......
...@@ -228,6 +228,23 @@ is_preconnected (stream * s) ...@@ -228,6 +228,23 @@ is_preconnected (stream * s)
return 0; return 0;
} }
/* If the stream corresponds to a preconnected unit, we flush the
corresponding C stream. This is bugware for mixed C-Fortran codes
where the C code doesn't flush I/O before returning. */
void
flush_if_preconnected (stream * s)
{
int fd;
fd = ((unix_stream *) s)->fd;
if (fd == STDIN_FILENO)
fflush (stdin);
else if (fd == STDOUT_FILENO)
fflush (stdout);
else if (fd == STDERR_FILENO)
fflush (stderr);
}
/* Reset a stream after reading/writing. Assumes that the buffers have /* Reset a stream after reading/writing. Assumes that the buffers have
been flushed. */ been flushed. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment