Pārlūkot izejas kodu

(adjust_value): New function.
(human_readable_inexact): Apply rounding style even when printing
approximate values.

Paul Eggert 25 gadi atpakaļ
vecāks
revīzija
c61d0787ce
1 mainītis faili ar 23 papildinājumiem un 3 dzēšanām
  1. 23 3
      lib/human.c

+ 23 - 3
lib/human.c

@@ -76,6 +76,23 @@ static const char suffixes[] =
   'Y'	/* Yotta */
 };
 
+/* If INEXACT_STYLE is not human_round_to_even, and if easily
+   possible, adjust VALUE according to the style.  */
+static double
+adjust_value (enum human_inexact_style inexact_style, double value)
+{
+  /* Do not use the floor or ceil functions, as that would mean
+     linking with the standard math library, which is a porting pain.
+     So leave the value alone if it is too large to easily round.  */
+  if (inexact_style != human_round_to_even && value < (uintmax_t) -1)
+    {
+      uintmax_t u = value;
+      value = u + (inexact_style == human_ceiling && u != value);
+    }
+
+  return value;
+}
+
 /* Like human_readable_inexact, except always round to even.  */
 char *
 human_readable (uintmax_t n, char *buf,
@@ -173,7 +190,7 @@ human_readable_inexact (uintmax_t n, char *buf,
 	double damt = n * (from_block_size / (double) to_block_size);
 
 	if (! base)
-	  sprintf (buf, "%.0f", damt);
+	  sprintf (buf, "%.0f", adjust_value (inexact_style, damt));
 	else
 	  {
 	    double e = 1;
@@ -188,9 +205,12 @@ human_readable_inexact (uintmax_t n, char *buf,
 
 	    damt /= e;
 
-	    sprintf (buf, "%.1f%c", damt, suffixes[power]);
+	    sprintf (buf, "%.1f%c", adjust_value (inexact_style, damt),
+		     suffixes[power]);
 	    if (4 < strlen (buf))
-	      sprintf (buf, "%.0f%c", damt, suffixes[power]);
+	      sprintf (buf, "%.0f%c",
+		       adjust_value (inexact_style, damt * 10) / 10,
+		       suffixes[power]);
 	  }
 
 	return buf;