format.c (parse_format_list): Set repeat count for P descriptors.
authorPaul Brook <paul@codesourcery.com>
Thu, 2 Sep 2004 01:33:01 +0000 (01:33 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Thu, 2 Sep 2004 01:33:01 +0000 (01:33 +0000)
* io/format.c (parse_format_list): Set repeat count for P descriptors.
* write.c (output_float): Fix condition.  Correctly handle nonzero
scale factor.
testsuite/
* gfortran.dg/edit_real_1.f90: Add new tests.

From-SVN: r86952

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/edit_real_1.f90
libgfortran/ChangeLog
libgfortran/io/format.c
libgfortran/io/write.c

index da0463cacf477eab2639643d3cebf08620503079..d1915c175e72acd05b88c3fac988f79a2520b8c3 100644 (file)
@@ -1,3 +1,7 @@
+2004-09-02  Paul Brook  <paul@codesourcery.com>
+
+       * gfortran.dg/edit_real_1.f90: Add new tests.
+
 2004-09-01  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/15327
index 3ecd4ff1a3a1690c0376d10621407dc73b60ada5..dc8eee19d2fff3ba8c4346ceaad2a6f50e421a84 100644 (file)
@@ -62,5 +62,13 @@ program edit_real_1
   s = x
   write (s, '(EN15.3,A)') 999.9999, "z"
   if (s .ne. "      1.000E+03z") call abort
+  ! E format, positive scale factor
+  s = x
+  write (s, '(2PE10.4,A)') 1.2345, "z"
+  if (s .ne. '12.345E-01z') call abort
+  ! E format, negative scale factor
+  s = x
+  write (s, '(-2PE10.4,A)') 1.25, "z"
+  if (s .ne. '0.0013E+03z') call abort
 end
 
index c467b8c99594d58b73a61efce5311e413f4a707b..6bf52bbc7a96d31f8a9c61ffae4313855e64d362 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-02  Paul Brook  <paul@codesourcery.com>
+
+       * io/format.c (parse_format_list): Set repeat count for P descriptors.
+       * write.c (output_float): Fix condition.  Correctly handle nonzero
+       scale factor.
+
 2004-09-01  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * mk-sik-inc.sh: Use a temporary string instead of 'echo -n'.
index f886f7f718778cca003e908bf113296096a9fb91..23b8d5ebf1bea72477da1f895fea9705b89a730d 100644 (file)
@@ -501,6 +501,7 @@ format_item:
     p_descriptor:
       get_fnode (&head, &tail, FMT_P);
       tail->u.k = value;
+      tail->repeat = 1;
 
       t = format_lex ();
       if (t == FMT_F || t == FMT_EN || t == FMT_ES || t == FMT_D
index 152754f184feaeab9a185836e8de714bbe41573b..f4d888e50d246734b4e1fa25ee924dfccc42b8eb 100644 (file)
@@ -307,7 +307,8 @@ output_float (fnode *f, double value, int len)
        edigits = 2;
     }
   
-  if (FMT_F || FMT_ES)
+  if (ft == FMT_F || ft == FMT_EN
+      || ((ft == FMT_D || ft == FMT_E) && g.scale_factor != 0))
     {
       /* Always convert at full precision to avoid double rounding.  */
       ndigits = 27 - edigits;
@@ -368,18 +369,26 @@ output_float (fnode *f, double value, int len)
     case FMT_E:
     case FMT_D:
       i = g.scale_factor;
+      e -= i;
       if (i < 0)
        {
          nbefore = 0;
          nzero = -i;
          nafter = d + i;
        }
-      else
+      else if (i > 0)
        {
          nbefore = i;
          nzero = 0;
-         nafter = d - i;
+         nafter = (d - i) + 1;
        }
+      else /* i == 0 */
+       {
+         nbefore = 0;
+         nzero = 0;
+         nafter = d;
+       }
+
       if (ft = FMT_E)
        expchar = 'E';
       else