[Toybox] [PATCH] fix human_readable output for du

enh enh at google.com
Wed Nov 26 12:48:59 PST 2014


Different tools have different ideas about what human-readable output
looks like. dd uses "7 MB" where du uses "7M", for example. this patch
adds flags, similar to the BSD humanize_number. most callers will pass
0.

diff --git a/lib/lib.c b/lib/lib.c
index 5923176..578f99a 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -831,7 +831,7 @@ void names_to_pid(char **names, int
(*callback)(pid_t pid, char *name))

 // 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 human_readable(char *buf, unsigned long long num, int style)
 {
   int end, len;

@@ -844,9 +844,9 @@ int human_readable(char *buf, unsigned long long num)
     buf[1] = '.';
     end = 3;
   }
-  buf[end++] = ' ';
+  if (style & HR_SPACE) buf[end++] = ' ';
   if (len) buf[end++] = " KMGTPE"[len];
-  buf[end++] = 'B';
+  if (style & HR_B) buf[end++] = 'B';
   buf[end++] = 0;

   return end;
diff --git a/lib/lib.h b/lib/lib.h
index 49b02bb..e3baec4 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -168,7 +168,9 @@ void replace_tempfile(int fdin, int fdout, char **tempname);
 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);
+#define HR_SPACE 1
+#define HR_B 2
+int human_readable(char *buf, unsigned long long num, int style);

 // net.c
 int xsocket(int domain, int type, int protocol);
diff --git a/toys/pending/dd.c b/toys/pending/dd.c
index a5c2452..202fb4b 100644
--- a/toys/pending/dd.c
+++ b/toys/pending/dd.c
@@ -133,9 +133,9 @@ static void summary()
   //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);
-  human_readable(toybuf, st.bytes);
+  human_readable(toybuf, st.bytes, HR_SPACE|HR_B);
   fprintf(stderr, "%llu bytes (%s) copied,",st.bytes, toybuf);
-  human_readable(toybuf, st.bytes/seconds);
+  human_readable(toybuf, st.bytes/seconds, HR_SPACE|HR_B);
   fprintf(stderr, "%f seconds, %s/s\n", seconds, toybuf);
 }

diff --git a/toys/posix/du.c b/toys/posix/du.c
index 22a26d3..9d537a1 100644
--- a/toys/posix/du.c
+++ b/toys/posix/du.c
@@ -55,7 +55,7 @@ static void print(long long size, struct dirtree *node)
   if (TT.maxdepth && TT.depth > TT.maxdepth) return;

   if (toys.optflags & FLAG_h) {
-    human_readable(toybuf, size);
+    human_readable(toybuf, size, 0);
     printf("%s", toybuf);
   } else {
     int bits = 10;

 1417034939.0


More information about the Toybox mailing list