]> sjero.net Git - wget/blobdiff - src/utils.c
[svn] Include ETA information in dot progress.
[wget] / src / utils.c
index d1b7d0b45b3d06b9178b261013f20f697184b20c..9c8beb10f5e05062dd43896fa48ba5183ef5ff70 100644 (file)
@@ -1191,11 +1191,11 @@ get_grouping_data (const char **sep, const char **grouping)
             grouping, which we still want to use it for legibility.
             In those locales set the sep char to ',', unless that
             character is used for decimal point, in which case set it
-            to " ".  */
+            to ".".  */
          if (*lconv->decimal_point != ',')
            cached_sep = ",";
          else
-           cached_sep = " ";
+           cached_sep = ".";
          cached_grouping = "\x03";
        }
       initialized = true;
@@ -1317,10 +1317,7 @@ human_readable (HR_NUMTYPE n)
         *this* power.  */
       if ((n / 1024) < 1024 || i == countof (powers) - 1)
        {
-         /* Must cast to long first because MS VC can't directly cast
-            __int64 to double.  (This is safe because N is known to
-            be < 1024^2, so always fits into long.)  */
-         double val = (double) (long) n / 1024.0;
+         double val = n / 1024.0;
          /* Print values smaller than 10 with one decimal digits, and
             others without any decimals.  */
          snprintf (buf, sizeof (buf), "%.*f%c",
@@ -1480,6 +1477,7 @@ number_to_string (char *buffer, wgint number)
 
 #undef PR
 #undef W
+#undef SPRINTF_WGINT
 #undef DIGITS_1
 #undef DIGITS_2
 #undef DIGITS_3
@@ -1624,13 +1622,13 @@ random_number (int max)
 /* Return a random uniformly distributed floating point number in the
    [0, 1) range.  The precision of returned numbers is 9 digits.
 
-   Modify this to use erand48() where available!  */
+   Modify this to use drand48() where available!  */
 
 double
 random_float (void)
 {
-  /* We can't rely on any specific value of RAND_MAX, but I'm pretty
-     sure it's greater than 1000.  */
+  /* We can't rely on any specific value of RAND_MAX, but it must
+     always be greater than 1000.  */
   int rnd1 = random_number (1000);
   int rnd2 = random_number (1000);
   int rnd3 = random_number (1000);
@@ -2041,3 +2039,38 @@ stable_sort (void *base, size_t nmemb, size_t size,
       mergesort_internal (base, temp, size, 0, nmemb - 1, cmpfun);
     }
 }
+\f
+/* Print a decimal number.  If it is equal to or larger than ten, the
+   number is rounded.  Otherwise it is printed with one significant
+   digit without trailing zeros and with no more than three fractional
+   digits total.  For example, 0.1 is printed as "0.1", 0.035 is
+   printed as "0.04", 0.0091 as "0.009", and 0.0003 as simply "0".
+
+   This is useful for displaying durations because it provides
+   order-of-magnitude information without unnecessary clutter --
+   long-running downloads are shown without the fractional part, and
+   short ones still retain one significant digit.  */
+
+const char *
+print_decimal (double number)
+{
+  static char buf[32];
+  double n = number >= 0 ? number : -number;
+
+  if (n >= 9.95)
+    /* Cut off at 9.95 because the below %.1f would round 9.96 to
+       "10.0" instead of "10".  OTOH 9.94 will print as "9.9".  */
+    snprintf (buf, sizeof buf, "%.0f", number);
+  else if (n >= 0.95)
+    snprintf (buf, sizeof buf, "%.1f", number);
+  else if (n >= 0.001)
+    snprintf (buf, sizeof buf, "%.1g", number);
+  else if (n >= 0.0005)
+    /* round [0.0005, 0.001) to 0.001 */
+    snprintf (buf, sizeof buf, "%.3f", number);
+  else
+    /* print numbers close to 0 as 0, not 0.000 */
+    strcpy (buf, "0");
+
+  return buf;
+}