Rewrite of format so it behaves itself
-Erik
This commit is contained in:
parent
5986f8d1c6
commit
7850f1e2ac
50
utility.c
50
utility.c
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user