diff options
Diffstat (limited to 'libbb/xfuncs.c')
-rw-r--r-- | libbb/xfuncs.c | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c index fa9fc10..140c7bb 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c @@ -284,35 +284,44 @@ void smart_ulltoa5(unsigned long long ul, char buf[5]) { const char *fmt; char c; - unsigned v,idx = 0; - ul *= 10; - if (ul > 9999*10) { // do not scale if 9999 or less - while (ul >= 10000) { + unsigned v, u, idx = 0; + + if (ul > 9999) { // do not scale if 9999 or less + ul *= 10; + do { ul /= 1024; idx++; - } + } while (ul >= 10000); } v = ul; // ullong divisions are expensive, avoid them fmt = " 123456789"; - if (!idx) { // 9999 or less: use 1234 format - c = buf[0] = " 123456789"[v/10000]; + u = v / 10; + v = v % 10; + if (!idx) { + // 9999 or less: use "1234" format + // u is value/10, v is last digit + c = buf[0] = " 123456789"[u/100]; if (c != ' ') fmt = "0123456789"; - c = buf[1] = fmt[v/1000%10]; + c = buf[1] = fmt[u/10%10]; if (c != ' ') fmt = "0123456789"; - buf[2] = fmt[v/100%10]; - buf[3] = "0123456789"[v/10%10]; + buf[2] = fmt[u%10]; + buf[3] = "0123456789"[v]; } else { - if (v >= 10*10) { // scaled value is >=10: use 123M format - c = buf[0] = " 123456789"[v/1000]; + // u is value, v is 1/10ths (allows for 9.2M format) + if (u >= 10) { + // value is >= 10: use "123M', " 12M" formats + c = buf[0] = " 123456789"[u/100]; if (c != ' ') fmt = "0123456789"; - buf[1] = fmt[v/100%10]; - buf[2] = "0123456789"[v/10%10]; - } else { // scaled value is <10: use 1.2M format - buf[0] = "0123456789"[v/10]; + v = u % 10; + u = u / 10; + buf[1] = fmt[u%10]; + } else { + // value is < 10: use "9.2M" format + buf[0] = "0123456789"[u]; buf[1] = '.'; - buf[2] = "0123456789"[v%10]; } + buf[2] = "0123456789"[v]; // see http://en.wikipedia.org/wiki/Tera buf[3] = " kMGTPEZY"[idx]; } @@ -470,7 +479,8 @@ char *xasprintf(const char *format, ...) va_end(p); #endif - if (r < 0) bb_error_msg_and_die(bb_msg_memory_exhausted); + if (r < 0) + bb_error_msg_and_die(bb_msg_memory_exhausted); return string_ptr; } |