diff options
author | pbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-02 01:33:01 +0000 |
---|---|---|
committer | pbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-02 01:33:01 +0000 |
commit | 75744229068bfdbe4bb8bc803002bd0e54fc5dde (patch) | |
tree | f174d83e96b96dfdc5e9932f24caad92c63d9fe1 | |
parent | 417eae69747e6171adb932960d3a6c6bd2c3b3df (diff) | |
download | gcc-75744229068bfdbe4bb8bc803002bd0e54fc5dde.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86952 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/edit_real_1.f90 | 8 | ||||
-rw-r--r-- | libgfortran/ChangeLog | 6 | ||||
-rw-r--r-- | libgfortran/io/format.c | 1 | ||||
-rw-r--r-- | 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 <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 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 <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'. 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 |