changeset 1276:d48bdc1cb017 draft

Switch human_readable() to just outputing decimal kilo/mega/gigabytes, make du use it, move it from lib/pending.c to lib.c.
author Rob Landley <rob@landley.net>
date Tue, 06 May 2014 06:31:28 -0500
parents 6f18a0845db3
children 23817e1675f2
files lib/lib.c lib/lib.h lib/pending.c lib/pending.h toys/pending/dd.c toys/posix/du.c
diffstat 6 files changed, 30 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- 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;
+}
--- 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);
--- 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;
-}
--- 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);
--- 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)
--- 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;