]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libfortran/20179 (cannot mix C and Fortran I/O)
authorFrancois-Xavier Coudert <coudert@clipper.ens.fr>
Sun, 11 Sep 2005 13:34:57 +0000 (15:34 +0200)
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Sun, 11 Sep 2005 13:34:57 +0000 (13:34 +0000)
PR libfortran/20179
* io/unix.c (is_preconnected): Add function to test if a stream
corresponds to a preconnected unit.
* io/io.h: Add prototype for is_preconnected.
* io/transfer.c (data_transfer_init): Do not truncate
preconnected units.

From-SVN: r104141

libgfortran/ChangeLog
libgfortran/io/io.h
libgfortran/io/transfer.c
libgfortran/io/unix.c

index 5dd311ad589035c8cfac3a9711f1dce0fd417501..d36e500ddca48a3c424a03a44428b7487785fa86 100644 (file)
@@ -1,3 +1,12 @@
+2005-09-11  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+       PR libfortran/20179
+       * io/unix.c (is_preconnected): Add function to test if a stream
+       corresponds to a preconnected unit.
+       * io/io.h: Add prototype for is_preconnected.
+       * io/transfer.c (data_transfer_init): Do not truncate
+       preconnected units.
+
 2005-09-10  Janne Blomqvist  <jblomqvi@cc.hut.fi>
 
        * io/unix.c: Remove mmap code.
index 6f4023b9e33d79d424e673bb96f2cb1e44b4ffb6..fc8b8873d8a11071c2692ad2785d86ed82f06387 100644 (file)
@@ -493,6 +493,9 @@ internal_proto(file_position);
 extern int is_seekable (stream *);
 internal_proto(is_seekable);
 
+extern int is_preconnected (stream *);
+internal_proto(is_preconnected);
+
 extern void empty_internal_buffer(stream *);
 internal_proto(empty_internal_buffer);
 
index 9251cf8f24f3f69dd3d4c9beabbcbc3d9b25d065..cb06a79fba51bf495d8f20ef54091853ff6abee0 100644 (file)
@@ -1183,7 +1183,7 @@ data_transfer_init (int read_flag)
      it is always safe to truncate the file on the first write */
   if (g.mode == WRITING
       && current_unit->flags.access == ACCESS_SEQUENTIAL
-      && current_unit->last_record == 0)
+      && current_unit->last_record == 0 && !is_preconnected(current_unit->s))
        struncate(current_unit->s);
 
   current_unit->mode = g.mode;
index 1a4beddfc06734e81c8d2d86d0fa7dacf83731ff..ca96c229b48c8ffb683aebcb0fa1b6b41fd574bb 100644 (file)
@@ -218,6 +218,17 @@ fix_fd (int fd)
   return fd;
 }
 
+int
+is_preconnected (stream * s)
+{
+  int fd;
+
+  fd = ((unix_stream *) s)->fd;
+  if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO)
+    return 1;
+  else
+    return 0;
+}
 
 /* write()-- Write a buffer to a descriptor, allowing for short writes */