diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2020-01-02 00:57:31 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2020-01-02 00:57:31 +0000 |
commit | 2b70275ee1b0de038324280276a9edebcaa93d90 (patch) | |
tree | a506e71b83bed14cc440edf8ef11d427af41d8c6 /libgfortran/io/write.c | |
parent | a7ff7c725076d1ad01f36404286e73d5069e9aab (diff) | |
download | gcc-2b70275ee1b0de038324280276a9edebcaa93d90.zip gcc-2b70275ee1b0de038324280276a9edebcaa93d90.tar.gz gcc-2b70275ee1b0de038324280276a9edebcaa93d90.tar.bz2 |
PR 90374 d0.d, e0.d, es0.d, en0.d, g0.d and ew.d edit descriptors.
PR libfortran/90274
* io/format.c (parse_format_list): Implement the E0 exponent
width to provide smallest possible width for exponent fields.
Refactor code for correct parsing and better readability of the
code.
* io/io.h (write_real_w0): Change interface to pass in pointer
to fnode.
* io/transfer.c: Update all calls to write_real_w0 to use the
new interface.
* io/write.c ((write_real_w0): Use the new interface with fnode
to access both the decimal precision and exponent widths used in
build_float_string.
* io/write_float.def (build_float_string): Use the passed in
exponent width to calculate the used width in the case of E0.
From-SVN: r279828
Diffstat (limited to 'libgfortran/io/write.c')
-rw-r--r-- | libgfortran/io/write.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 1387d5f..9f02683 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -1721,42 +1721,46 @@ write_real (st_parameter_dt *dtp, const char *source, int kind) void write_real_w0 (st_parameter_dt *dtp, const char *source, int kind, - format_token fmt, int d) + const fnode* f) { - fnode f; + fnode ff; char buf_stack[BUF_STACK_SZ]; char str_buf[BUF_STACK_SZ]; char *buffer, *result; size_t buf_size, res_len, flt_str_len; int comp_d = 0; - set_fnode_default (dtp, &f, kind); - if (d > 0) - f.u.real.d = d; - f.format = fmt; + set_fnode_default (dtp, &ff, kind); + + if (f->u.real.d > 0) + ff.u.real.d = f->u.real.d; + ff.format = f->format; /* For FMT_G, Compensate for extra digits when using scale factor, d is not specified, and the magnitude is such that E editing is used. */ - if (fmt == FMT_G) + if (f->format == FMT_G) { - if (dtp->u.p.scale_factor > 0 && d == 0) + if (dtp->u.p.scale_factor > 0 && f->u.real.d == 0) comp_d = 1; else comp_d = 0; } + if (f->u.real.e >= 0) + ff.u.real.e = f->u.real.e; + dtp->u.p.g0_no_blanks = 1; /* Precision for snprintf call. */ - int precision = get_precision (dtp, &f, source, kind); + int precision = get_precision (dtp, &ff, source, kind); /* String buffer to hold final result. */ - result = select_string (dtp, &f, str_buf, &res_len, kind); + result = select_string (dtp, &ff, str_buf, &res_len, kind); - buffer = select_buffer (dtp, &f, precision, buf_stack, &buf_size, kind); + buffer = select_buffer (dtp, &ff, precision, buf_stack, &buf_size, kind); - get_float_string (dtp, &f, source , kind, comp_d, buffer, + get_float_string (dtp, &ff, source , kind, comp_d, buffer, precision, buf_size, result, &flt_str_len); write_float_string (dtp, result, flt_str_len); |