Rewrite of format so it behaves itself

-Erik
This commit is contained in:
Eric Andersen 2001-03-07 03:50:57 +00:00
parent 5986f8d1c6
commit 7850f1e2ac

View File

@ -1797,43 +1797,23 @@ ssize_t safe_read(int fd, void *buf, size_t count)
#ifdef BB_FEATURE_HUMAN_READABLE #ifdef BB_FEATURE_HUMAN_READABLE
const char *format(unsigned long val, unsigned long hr) const char *format(unsigned long val, unsigned long hr)
{ {
static const char strings[] = { '0', 0, 'k', 0, 'M', 0, 'G', 0 }; int i=0;
static const char fmt[] = "%lu"; static char str[10] = "\0";
static const char fmt_u[] = "%lu.%lu%s"; static const char strings[] = { 'k', 'M', 'G', 'T', 0 };
unsigned long divisor = 1;
static char str[10]; if(val == 0)
return("0");
unsigned long frac __attribute__ ((unused)); /* 'may be uninitialized' warning is ok */ if(hr)
const char *u; snprintf(str, 9, "%ld", val/hr);
const char *f; else {
while(val >= divisor && i <= 4) {
#if 1 divisor=divisor<<10, i++;
if(val == 0) { /* This may be omitted to reduce size */ }
return strings; /* at the cost of speed. */ divisor=divisor>>10, i--;
snprintf(str, 9, "%.1Lf%c", (long double)(val)/divisor, strings[i]);
} }
#endif return(str);
u = strings;
f = fmt;
if (hr) {
val /= hr;
} else {
while ((val >= KILOBYTE) && (*u != 'G')) {
f = fmt_u;
u += 2;
frac = (((val % KILOBYTE) * 10) + (KILOBYTE/2)) / KILOBYTE;
val /= KILOBYTE;
if (frac >= 10) { /* We need to round up here. */
++val;
frac = 0;
}
}
}
/* If f==fmt then 'frac' and 'u' are ignored and need not be set. */
snprintf(str, sizeof(str), f, val, frac, u);
return str;
} }
#endif #endif