OSDN Git Service

Don't update the position flag for non-seekable files, check for stell() error.
authorjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Aug 2010 06:22:23 +0000 (06:22 +0000)
committerjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Aug 2010 06:22:23 +0000 (06:22 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162810 138bc75d-0d04-0410-961f-82ee72b054a4

libgfortran/ChangeLog
libgfortran/io/unit.c

index f11ede9..700cb60 100644 (file)
@@ -1,3 +1,8 @@
+2010-08-02  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       * io/unit.c (update_position): Don't update the position flag for
+       non-seekable files, check for stell() error.
+
 2010-08-01  Janne Blomqvist  <jb@gcc.gnu.org>
 
         * io/unix.c (file_exists): Use access(2) instead of stat(2) to
index a0018db..1d52217 100644 (file)
@@ -714,12 +714,19 @@ close_units (void)
 void
 update_position (gfc_unit *u)
 {
-  if (stell (u->s) == 0)
-    u->flags.position = POSITION_REWIND;
-  else if (file_length (u->s) == stell (u->s))
-    u->flags.position = POSITION_APPEND;
-  else
-    u->flags.position = POSITION_ASIS;
+  /* If unit is not seekable, this makes no sense (and the standard is
+     silent on this matter), and thus we don't change the position for
+     a non-seekable file.  */
+  if (is_seekable (u->s))
+    {
+      gfc_offset cur = stell (u->s);
+      if (cur == 0)
+       u->flags.position = POSITION_REWIND;
+      else if (cur != -1 && (file_length (u->s) == cur))
+       u->flags.position = POSITION_APPEND;
+      else
+       u->flags.position = POSITION_ASIS;
+    }
 }