shithub: sox

Download patch

ref: 9b289c9628ef765bf756ca7bab6eee46ae9c324c
parent: 8dd76de3403b5b463f120575bb6b2e5c92a07e6e
author: robs <robs>
date: Sun Feb 18 08:13:49 EST 2007

fixed sigfigs3

--- a/src/sox.c
+++ b/src/sox.c
@@ -1642,18 +1642,18 @@
 
 static char const * sigfigs3(st_size_t number)
 {
-  if (!number)
-    return "0 ";
-  else {
-    static char const unit[] = " kMGTPE";
-    static char string[16][10];
-    static int i;
-    int unit_no = log10((double)number) / 3;
-    double d = (double)number / pow(10., 3. * unit_no);
-    int decimals = unit_no? 2 - min((int)log10(floor(d)), 2) : 0;
-    sprintf(string[i = (i+1) & 15], "%.*f%c", decimals, d, unit[unit_no]);
-    return string[i];
+  static char string[16][10];
+  static unsigned n;
+  unsigned a, b, c = 2;
+  sprintf(string[n = (n+1) & 15], "%#.3g", (double)number);
+  if (sscanf(string[n], "%u.%ue%u", &a, &b, &c) == 3)
+    a = 100*a + b;
+  switch (c%3) {
+    case 0: sprintf(string[n], "%u.%02u%c", a/100,a%100, " kMGTPE"[c/3]); break;
+    case 1: sprintf(string[n], "%u.%u%c"  , a/10 ,a%10 , " kMGTPE"[c/3]); break;
+    case 2: sprintf(string[n], "%u%c"     , a          , " kMGTPE"[c/3]); break;
   }
+  return string[n];
 }
 
 static char const * sigfigs3p(double percentage)