aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/lib.c23
-rw-r--r--lib/lib.h1
-rw-r--r--lib/pending.c16
-rw-r--r--lib/pending.h1
-rw-r--r--toys/pending/dd.c6
-rw-r--r--toys/posix/du.c12
6 files changed, 30 insertions, 29 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 670f6a71..1ab80351 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -783,3 +783,26 @@ void names_to_pid(char **names, int (*callback)(pid_t pid, char *name))
}
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 --git a/lib/lib.h b/lib/lib.h
index d5b3d3ce..715e78d9 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -153,6 +153,7 @@ 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);
// net.c
int xsocket(int domain, int type, int protocol);
diff --git a/lib/pending.c b/lib/pending.c
index 741c5cc1..639c82f5 100644
--- a/lib/pending.c
+++ b/lib/pending.c
@@ -20,19 +20,3 @@ void daemonize(void)
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 --git a/lib/pending.h b/lib/pending.h
index 5e3b309f..aa31ea9e 100644
--- a/lib/pending.h
+++ b/lib/pending.h
@@ -11,4 +11,3 @@ int update_password(char *filename, char* username, char* encrypted);
// cut helper functions
void daemonize(void);
-char *human_readable(unsigned long long size);
diff --git a/toys/pending/dd.c b/toys/pending/dd.c
index 2c3ca654..a5c2452e 100644
--- a/toys/pending/dd.c
+++ b/toys/pending/dd.c
@@ -133,8 +133,10 @@ 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);
- 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 --git a/toys/posix/du.c b/toys/posix/du.c
index 96922bca..2bfa7e41 100644
--- a/toys/posix/du.c
+++ b/toys/posix/du.c
@@ -55,16 +55,8 @@ static void print(long long size, struct dirtree *node)
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;