re PR libfortran/47567 (Wrong output for small absolute values with F editing)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sat, 5 Feb 2011 17:58:48 +0000 (17:58 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sat, 5 Feb 2011 17:58:48 +0000 (17:58 +0000)
2011-02-05  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libgfortran/47567
* io/write_float.def (output_float): Eliminate some redundant code.
Adjust width for case of F0.X for values of zero and all other values.
Expand cases where '*' is set to give cleaner results.

From-SVN: r169853

libgfortran/ChangeLog
libgfortran/io/write_float.def

index fbeb87da55cc0002f10ae42c0f58c9439b028ca0..82f933874d55896b49d5f4476c80a8a33dfddee2 100644 (file)
@@ -1,3 +1,10 @@
+2011-02-05  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/47567
+       * io/write_float.def (output_float): Eliminate some redundant code.
+       Adjust width for case of F0.X for values of zero and all other values.
+       Expand cases where '*' is set to give cleaner results.
+
 2011-02-05  Janne Blomqvist  <jb@gcc.gnu.org>
 
        PR libfortran/47571
index a77b30427686344feee9616012f88b644cd7746d..21bbfbbf04e3d9fc59bc8b6d4ae34544c0a7be38 100644 (file)
@@ -111,14 +111,12 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
   if (zero_flag)
     {
       e = 0;
-      if (compile_options.sign_zero == 1)
-       sign = calculate_sign (dtp, sign_bit);
-      else
+      if (compile_options.sign_zero != 1)
        sign = calculate_sign (dtp, 0);
 
       /* Handle special cases.  */
       if (w == 0)
-       w = d + 2;
+       w = d + 1;
 
       /* For this one we choose to not output a decimal point.
         F95 10.5.1.2.1  */
@@ -138,7 +136,6 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
          *out = '0';
          return SUCCESS;
        }
-             
     }
 
   /* Normalize the fractional component.  */
@@ -417,7 +414,10 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
 
   /* Pick a field size if none was specified.  */
   if (w <= 0)
-    w = nbefore + nzero + nafter + (sign != S_NONE ? 2 : 1);
+    {
+      w = nbefore + nzero + nafter + (sign != S_NONE ? 2 : 1);
+      w = w == 1 ? 2 : w;
+    }
   
   /* Work out how much padding is needed.  */
   nblanks = w - (nbefore + nzero + nafter + edigits + 1);
@@ -436,7 +436,7 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
     return FAILURE;
 
   /* Check the value fits in the specified field width.  */
-  if (nblanks < 0 || edigits == -1)
+  if (nblanks < 0 || edigits == -1 || w == 1 || (w == 2 && sign != S_NONE))
     {
       if (unlikely (is_char4_unit (dtp)))
        {