re PR libfortran/16436 (gfortran TL edit descriptor failure - test f77-edit-t-in.f)
authorFrancois-Xavier Coudert <coudert@clipper.ens.fr>
Thu, 16 Jun 2005 22:13:26 +0000 (00:13 +0200)
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Thu, 16 Jun 2005 22:13:26 +0000 (22:13 +0000)
PR libfortran/16436
* io/transfer.c (read_sf): Correct updating of bytes_left field.
(formatted_transfer): Correct updating of bytes_left field and
reformatting code (comments and whitespace).
* io/unix.c (move_pos_offset): "active" field should not be
changed here. Whitespace corrections.
* gfortran.dg/g77/f77-edit-t-in.f: Not XFAIL-ed any more.

From-SVN: r101100

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/g77/f77-edit-t-in.f
libgfortran/ChangeLog
libgfortran/io/transfer.c
libgfortran/io/unix.c

index 09f9d7186605e87c9b73b83fb1d12a4e074cd32e..f03b329f56da6c67265a8aeacc3b690a43e1189d 100644 (file)
@@ -1,3 +1,8 @@
+2005-06-17  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+       PR libfortran/16436
+       * gfortran.dg/g77/f77-edit-t-in.f: Not XFAIL-ed any more.
+
 2005-06-16  Richard Guenther  <rguenth@gcc.gnu.org>
 
        * gcc.target/i386/attributes-error.c: New testcase.
index 6abd1967b897db06021aa51080fbc21371b65c24..2314080d70862847d0566cf430f893b6dadb14b0 100644 (file)
@@ -3,7 +3,7 @@ C      (ANSI X3.9-1978 Section 13.5.3.2)
 C
 C Origin: David Billinghurst <David.Billinghurst@riotinto.com>
 C
-C { dg-do run {xfail *-*-*} } gfortran PR 16436
+C { dg-do run }
       integer i,j
       real a,b,c,d,e
       character*32 in
index 64197060beeaf5f75afce62ebd3f7d41265e7d57..0467cb118cbce7684e1ef0cee8814544868e4fae 100644 (file)
@@ -1,3 +1,12 @@
+2005-06-17  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+       PR libfortran/16436
+       * io/transfer.c (read_sf): Correct updating of bytes_left field.
+       (formatted_transfer): Correct updating of bytes_left field and
+       reformatting code (comments and whitespace).
+       * io/unix.c (move_pos_offset): "active" field should not be
+       changed here. Whitespace corrections.
+
 2005-06-15  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        PR libfortran/21950
index 46bec834a274f68d7f6268df9c955e6658370dce..c81cb47eaa30a7ec7c876e178892cf411e279e72 100644 (file)
@@ -160,7 +160,6 @@ read_sf (int *length)
       return base;
     }
 
-  current_unit->bytes_left = options.default_recl;
   readlen = 1;
   n = 0;
 
@@ -214,6 +213,7 @@ read_sf (int *length)
       sf_seen_eor = 0;
     }
   while (n < *length);
+  current_unit->bytes_left -= *length;
 
   if (ioparm.size != NULL)
     *ioparm.size += *length;
@@ -675,22 +675,19 @@ formatted_transfer (bt type, void *p, int len)
 
         case FMT_TL:
         case FMT_T:
-           if (f->format==FMT_TL)
-             {
-                pos = f->u.n ;
-                pos= current_unit->recl - current_unit->bytes_left - pos;
-             }
-           else // FMT==T
+           if (f->format == FMT_TL)
+             pos = current_unit->recl - current_unit->bytes_left - f->u.n;
+           else /* FMT_T */
              {
-                consume_data_flag = 0 ;
-                pos = f->u.n - 1;
+               consume_data_flag = 0;
+               pos = f->u.n - 1;
              }
 
            if (pos < 0 || pos >= current_unit->recl )
-           {
-             generate_error (ERROR_EOR, "T Or TL edit position error");
-             break ;
-            }
+             {
+               generate_error (ERROR_EOR, "T Or TL edit position error");
+               break ;
+             }
             m = pos - (current_unit->recl - current_unit->bytes_left);
 
             if (m == 0)
@@ -707,6 +704,7 @@ formatted_transfer (bt type, void *p, int len)
             if (m < 0)
              {
                move_pos_offset (current_unit->s,m);
+              current_unit->bytes_left -= m;
              }
 
          break;
index f82ffa7304178766a5f4700af60fea8439982731..f4ee889cdda62687829ecac59277a4a49765c9ac 100644 (file)
@@ -154,26 +154,22 @@ move_pos_offset (stream* st, int pos_off)
   unix_stream * str = (unix_stream*)st;
   if (pos_off < 0)
     {
-      str->active  += pos_off;
-      if (str->active < 0)
-         str->active = 0;
+      str->logical_offset += pos_off;
 
-      str->logical_offset  += pos_off;
-
-      if (str->dirty_offset+str->ndirty > str->logical_offset)
+      if (str->dirty_offset + str->ndirty > str->logical_offset)
         {
-          if (str->ndirty +  pos_off > 0)
-            str->ndirty += pos_off ;
+          if (str->ndirty + pos_off > 0)
+            str->ndirty += pos_off;
           else
             {
               str->dirty_offset +=  pos_off + pos_off;
-              str->ndirty = 0 ;
+              str->ndirty = 0;
             }
         }
 
-    return pos_off ;
+    return pos_off;
   }
-  return 0 ;
+  return 0;
 }