# HG changeset patch # User Rob Landley # Date 1399375888 18000 # Node ID d48bdc1cb017bfb3e257a36f242d858c3323470d # Parent 6f18a0845db30f8837c1857aa68808a40e4eb60d Switch human_readable() to just outputing decimal kilo/mega/gigabytes, make du use it, move it from lib/pending.c to lib.c. diff -r 6f18a0845db3 -r d48bdc1cb017 lib/lib.c --- a/lib/lib.c Tue May 06 06:14:20 2014 -0500 +++ b/lib/lib.c Tue May 06 06:31:28 2014 -0500 @@ -783,3 +783,26 @@ } closedir(dp); } + +// display first few digits of number with power of two units, except we're +// actually just counting decimal digits and showing mil/bil/trillions. +int human_readable(char *buf, unsigned long long num) +{ + int end, len; + + len = sprintf(buf, "%lld", num); + end = ((len-1)%3)+1; + len /= 3; + + if (len && end == 1) { + buf[2] = buf[1]; + buf[1] = '.'; + end = 3; + } + buf[end++] = ' '; + if (len) buf[end++] = " KMGTPE"[len]; + buf[end++] = 'B'; + buf[end++] = 0; + + return end; +} diff -r 6f18a0845db3 -r d48bdc1cb017 lib/lib.h --- a/lib/lib.h Tue May 06 06:14:20 2014 -0500 +++ b/lib/lib.h Tue May 06 06:31:28 2014 -0500 @@ -153,6 +153,7 @@ void crc_init(unsigned int *crc_table, int little_endian); int terminal_size(unsigned *x, unsigned *y); int yesno(char *prompt, int def); +int human_readable(char *buf, unsigned long long num); // net.c int xsocket(int domain, int type, int protocol); diff -r 6f18a0845db3 -r d48bdc1cb017 lib/pending.c --- a/lib/pending.c Tue May 06 06:14:20 2014 -0500 +++ b/lib/pending.c Tue May 06 06:31:28 2014 -0500 @@ -20,19 +20,3 @@ dup2(fd, 2); if (fd > 2) close(fd); } - -char *human_readable(unsigned long long size) -{ - static char buf[32]; - char *tmp = (buf+4); //unsigned long long can come in 20byte string. - int index, sz; - - for (index = 0; 1024 < size>>(10*index); index++); - sz = size>>(10*index); - if (sz < 10 && index) { - sprintf(tmp, "%llu", size>>(10*(index-1))); - sprintf(buf, "%c.%c", tmp[0], tmp[1]); - } else sprintf(buf, "%u", sz); - sprintf(buf, "%s%c", buf, " KMGTPE"[index]); - return buf; -} diff -r 6f18a0845db3 -r d48bdc1cb017 lib/pending.h --- a/lib/pending.h Tue May 06 06:14:20 2014 -0500 +++ b/lib/pending.h Tue May 06 06:31:28 2014 -0500 @@ -11,4 +11,3 @@ // cut helper functions void daemonize(void); -char *human_readable(unsigned long long size); diff -r 6f18a0845db3 -r d48bdc1cb017 toys/pending/dd.c --- a/toys/pending/dd.c Tue May 06 06:14:20 2014 -0500 +++ b/toys/pending/dd.c Tue May 06 06:31:28 2014 -0500 @@ -133,8 +133,10 @@ //out to STDERR fprintf(stderr,"%llu+%llu records in\n%llu+%llu records out\n", st.in_full, st.in_part, st.out_full, st.out_part); - fprintf(stderr, "%llu bytes (%sB) copied,",st.bytes, human_readable(st.bytes)); - fprintf(stderr, "%f seconds, %sB/s\n", seconds, human_readable(st.bytes/seconds)); + human_readable(toybuf, st.bytes); + fprintf(stderr, "%llu bytes (%s) copied,",st.bytes, toybuf); + human_readable(toybuf, st.bytes/seconds); + fprintf(stderr, "%f seconds, %s/s\n", seconds, toybuf); } static void sig_handler(int sig) diff -r 6f18a0845db3 -r d48bdc1cb017 toys/posix/du.c --- a/toys/posix/du.c Tue May 06 06:14:20 2014 -0500 +++ b/toys/posix/du.c Tue May 06 06:31:28 2014 -0500 @@ -55,16 +55,8 @@ if (TT.maxdepth && TT.depth > TT.maxdepth) return; if (toys.optflags & FLAG_h) { - char buf[32]; - int index, sz; - - for (index = 0; 1024 < size>>(10*index); index++); - sz = size>>(10*index); - if (sz < 10) { - sprintf(buf, "%llu", size>>(10*(index-1))); - printf("%c.%c", buf[0], buf[1]); - } else printf("%d", sz); - if (index) printf("%c", " KMGTPE"[index]); + human_readable(toybuf, size); + printf("%s", toybuf); } else { int bits = 10;