From d809264e863ffbf312af0e23bd30799ffa999096 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Thu, 2 Sep 2004 01:33:01 +0000 Subject: [PATCH] format.c (parse_format_list): Set repeat count for P descriptors. * 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 | 4 ++++ gcc/testsuite/gfortran.dg/edit_real_1.f90 | 8 ++++++++ libgfortran/ChangeLog | 6 ++++++ libgfortran/io/format.c | 1 + libgfortran/io/write.c | 15 ++++++++++++--- 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index da0463cacf4..d1915c175e7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-09-02 Paul Brook + + * gfortran.dg/edit_real_1.f90: Add new tests. + 2004-09-01 Tobias Schlueter PR fortran/15327 diff --git a/gcc/testsuite/gfortran.dg/edit_real_1.f90 b/gcc/testsuite/gfortran.dg/edit_real_1.f90 index 3ecd4ff1a3a..dc8eee19d2f 100644 --- a/gcc/testsuite/gfortran.dg/edit_real_1.f90 +++ b/gcc/testsuite/gfortran.dg/edit_real_1.f90 @@ -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 diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index c467b8c9959..6bf52bbc7a9 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2004-09-02 Paul Brook + + * 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 * mk-sik-inc.sh: Use a temporary string instead of 'echo -n'. diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c index f886f7f7187..23b8d5ebf1b 100644 --- a/libgfortran/io/format.c +++ b/libgfortran/io/format.c @@ -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 diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 152754f184f..f4d888e50d2 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -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 -- 2.30.2