diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2017-12-29 19:25:31 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2017-12-29 19:25:31 +0000 |
commit | a97de3ccdce3bac856c2b10b57a49a15c94e6ef2 (patch) | |
tree | ebc23eb7b1f0bba3d667758b205b94effcac8d84 /libgfortran | |
parent | 459e77b859a96bc4dd3cfd53895c8dccfa0de679 (diff) | |
download | gcc-a97de3ccdce3bac856c2b10b57a49a15c94e6ef2.zip gcc-a97de3ccdce3bac856c2b10b57a49a15c94e6ef2.tar.gz gcc-a97de3ccdce3bac856c2b10b57a49a15c94e6ef2.tar.bz2 |
re PR fortran/83560 (list-directed formatting of INTEGER is missing plus on output when output open with SIGN='PLUS')
2017-12-29 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/83560
* io/write.c (write_integer): Modify to use write_decimal.
For namelist mode, suppress leading blanks and emit them as
trailing blanks. Change parameter from len to kind for better
readability. (nml_write_obj): Fix comment style.
From-SVN: r256034
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 8 | ||||
-rw-r--r-- | libgfortran/io/write.c | 77 |
2 files changed, 37 insertions, 48 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index aa2a0f7..e94df2c 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +2017-12-29 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR libgfortran/83560 + * io/write.c (write_integer): Modify to use write_decimal. + For namelist mode, suppress leading blanks and emit them as + trailing blanks. Change parameter from len to kind for better + readability. (nml_write_obj): Fix comment style. + 2017-12-16 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/81937 diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 926d510..19e53eb 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -870,8 +870,11 @@ write_decimal (st_parameter_dt *dtp, const fnode *f, const char *source, goto done; } - memset4 (p4, ' ', nblank); - p4 += nblank; + if (!dtp->u.p.namelist_mode) + { + memset4 (p4, ' ', nblank); + p4 += nblank; + } switch (sign) { @@ -890,6 +893,12 @@ write_decimal (st_parameter_dt *dtp, const fnode *f, const char *source, memcpy4 (p4, q, digits); return; + + if (dtp->u.p.namelist_mode) + { + p4 += digits; + memset4 (p4, ' ', nblank); + } } if (nblank < 0) @@ -898,8 +907,11 @@ write_decimal (st_parameter_dt *dtp, const fnode *f, const char *source, goto done; } - memset (p, ' ', nblank); - p += nblank; + if (!dtp->u.p.namelist_mode) + { + memset (p, ' ', nblank); + p += nblank; + } switch (sign) { @@ -918,6 +930,12 @@ write_decimal (st_parameter_dt *dtp, const fnode *f, const char *source, memcpy (p, q, digits); + if (dtp->u.p.namelist_mode) + { + p += digits; + memset (p, ' ', nblank); + } + done: return; } @@ -1300,17 +1318,12 @@ write_logical (st_parameter_dt *dtp, const char *source, int length) /* Write a list-directed integer value. */ static void -write_integer (st_parameter_dt *dtp, const char *source, int length) +write_integer (st_parameter_dt *dtp, const char *source, int kind) { - char *p; - const char *q; - int digits; int width; - char itoa_buf[GFC_ITOA_BUF_SIZE]; - - q = gfc_itoa (extract_int (source, length), itoa_buf, sizeof (itoa_buf)); + fnode f; - switch (length) + switch (kind) { case 1: width = 4; @@ -1332,41 +1345,9 @@ write_integer (st_parameter_dt *dtp, const char *source, int length) width = 0; break; } - - digits = strlen (q); - - if (width < digits) - width = digits; - p = write_block (dtp, width); - if (p == NULL) - return; - - if (unlikely (is_char4_unit (dtp))) - { - gfc_char4_t *p4 = (gfc_char4_t *) p; - if (dtp->u.p.no_leading_blank) - { - memcpy4 (p4, q, digits); - memset4 (p4 + digits, ' ', width - digits); - } - else - { - memset4 (p4, ' ', width - digits); - memcpy4 (p4 + width - digits, q, digits); - } - return; - } - - if (dtp->u.p.no_leading_blank) - { - memcpy (p, q, digits); - memset (p + digits, ' ', width - digits); - } - else - { - memset (p, ' ', width - digits); - memcpy (p + width - digits, q, digits); - } + f.u.integer.w = width; + f.u.integer.m = -1; + write_decimal (dtp, &f, source, kind, (void *) gfc_itoa); } @@ -2254,7 +2235,7 @@ nml_write_obj (st_parameter_dt *dtp, namelist_info *obj, index_type offset, dtp->u.p.current_unit->child_dtio++; if (obj->type == BT_DERIVED) { - // build a class container + /* Build a class container. */ gfc_class list_obj; list_obj.data = p; list_obj.vptr = obj->vtable; |