aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-08-28 19:35:34 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-08-28 19:35:34 +0000
commitb308d81e927d28cb0223378049defc133787727d (patch)
treecfbf133ee5fd42014250d233a7e4e3f0a76bf9ac /libbb
parent7d8de4d55dbc140ea0dc0131bb0647f9632cc7e9 (diff)
downloadbusybox-w32-b308d81e927d28cb0223378049defc133787727d.tar.gz
busybox-w32-b308d81e927d28cb0223378049defc133787727d.tar.bz2
busybox-w32-b308d81e927d28cb0223378049defc133787727d.zip
top: use poll instead of select for waiting on one descriptor
smart_ulltoa5: make it more cryptic. -50 bytes. function old new delta passwd_main 1095 1103 +8 getNum 557 565 +8 buffer_fill_and_print 73 76 +3 udhcpc_main 2393 2395 +2 mkfs_minix_main 3071 3070 -1 dname_enc 377 373 -4 expmeta 480 472 -8 smart_ulltoa5 334 283 -51 top_main 911 815 -96 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 4/5 up/down: 21/-160) Total: -139 bytes text data bss dec hex filename 770872 1063 10788 782723 bf183 busybox_old 770732 1063 10788 782583 bf0f7 busybox_unstripped
Diffstat (limited to 'libbb')
-rw-r--r--libbb/xfuncs.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
index fa9fc10d6..140c7bb6f 100644
--- a/libbb/xfuncs.c
+++ b/libbb/xfuncs.c
@@ -284,35 +284,44 @@ void smart_ulltoa5(unsigned long long ul, char buf[5])
284{ 284{
285 const char *fmt; 285 const char *fmt;
286 char c; 286 char c;
287 unsigned v,idx = 0; 287 unsigned v, u, idx = 0;
288 ul *= 10; 288
289 if (ul > 9999*10) { // do not scale if 9999 or less 289 if (ul > 9999) { // do not scale if 9999 or less
290 while (ul >= 10000) { 290 ul *= 10;
291 do {
291 ul /= 1024; 292 ul /= 1024;
292 idx++; 293 idx++;
293 } 294 } while (ul >= 10000);
294 } 295 }
295 v = ul; // ullong divisions are expensive, avoid them 296 v = ul; // ullong divisions are expensive, avoid them
296 297
297 fmt = " 123456789"; 298 fmt = " 123456789";
298 if (!idx) { // 9999 or less: use 1234 format 299 u = v / 10;
299 c = buf[0] = " 123456789"[v/10000]; 300 v = v % 10;
301 if (!idx) {
302 // 9999 or less: use "1234" format
303 // u is value/10, v is last digit
304 c = buf[0] = " 123456789"[u/100];
300 if (c != ' ') fmt = "0123456789"; 305 if (c != ' ') fmt = "0123456789";
301 c = buf[1] = fmt[v/1000%10]; 306 c = buf[1] = fmt[u/10%10];
302 if (c != ' ') fmt = "0123456789"; 307 if (c != ' ') fmt = "0123456789";
303 buf[2] = fmt[v/100%10]; 308 buf[2] = fmt[u%10];
304 buf[3] = "0123456789"[v/10%10]; 309 buf[3] = "0123456789"[v];
305 } else { 310 } else {
306 if (v >= 10*10) { // scaled value is >=10: use 123M format 311 // u is value, v is 1/10ths (allows for 9.2M format)
307 c = buf[0] = " 123456789"[v/1000]; 312 if (u >= 10) {
313 // value is >= 10: use "123M', " 12M" formats
314 c = buf[0] = " 123456789"[u/100];
308 if (c != ' ') fmt = "0123456789"; 315 if (c != ' ') fmt = "0123456789";
309 buf[1] = fmt[v/100%10]; 316 v = u % 10;
310 buf[2] = "0123456789"[v/10%10]; 317 u = u / 10;
311 } else { // scaled value is <10: use 1.2M format 318 buf[1] = fmt[u%10];
312 buf[0] = "0123456789"[v/10]; 319 } else {
320 // value is < 10: use "9.2M" format
321 buf[0] = "0123456789"[u];
313 buf[1] = '.'; 322 buf[1] = '.';
314 buf[2] = "0123456789"[v%10];
315 } 323 }
324 buf[2] = "0123456789"[v];
316 // see http://en.wikipedia.org/wiki/Tera 325 // see http://en.wikipedia.org/wiki/Tera
317 buf[3] = " kMGTPEZY"[idx]; 326 buf[3] = " kMGTPEZY"[idx];
318 } 327 }
@@ -470,7 +479,8 @@ char *xasprintf(const char *format, ...)
470 va_end(p); 479 va_end(p);
471#endif 480#endif
472 481
473 if (r < 0) bb_error_msg_and_die(bb_msg_memory_exhausted); 482 if (r < 0)
483 bb_error_msg_and_die(bb_msg_memory_exhausted);
474 return string_ptr; 484 return string_ptr;
475} 485}
476 486