aboutsummaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2005-11-12 19:53:23 +0000
committerWayne Davison <wayned@samba.org>2005-11-12 19:53:23 +0000
commite175fb07f7fac17f3f269d1d52557f69feb07882 (patch)
tree1b63f76dde2cbb617de82066f3afe32b1a13706a /util.c
parent4a70af6f813c13d97f7a9106123ac62a755e1655 (diff)
downloadandroid_external_rsync-e175fb07f7fac17f3f269d1d52557f69feb07882.tar.gz
android_external_rsync-e175fb07f7fac17f3f269d1d52557f69feb07882.tar.bz2
android_external_rsync-e175fb07f7fac17f3f269d1d52557f69feb07882.zip
Added two new functions: human_num() and human_dnum(), which
output numbers in human-readable units if the --human-readable option was specified.
Diffstat (limited to 'util.c')
-rw-r--r--util.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/util.c b/util.c
index 5864b5dc..876b9269 100644
--- a/util.c
+++ b/util.c
@@ -32,6 +32,7 @@ extern int dry_run;
extern int module_id;
extern int modify_window;
extern int relative_paths;
+extern int human_readable;
extern char *partial_dir;
extern struct filter_list_struct server_filter_list;
@@ -1118,6 +1119,63 @@ int unsafe_symlink(const char *dest, const char *src)
return (depth < 0);
}
+/* Return the int64 number as a string. If the --human-readable option was
+ * specified, we may output the number in K, M, or G units. We can return
+ * up to 4 buffers at a time. */
+char *human_num(int64 num)
+{
+ static char bufs[4][128]; /* more than enough room */
+ static unsigned int n;
+ char *s;
+
+ n = (n + 1) % (sizeof bufs / sizeof bufs[0]);
+
+ if (human_readable) {
+ char units = '\0';
+ int mult = human_readable == 1 ? 1024 : 1000;
+ double dnum = 0;
+ if (num > mult*mult*mult) {
+ dnum = (double)num / (mult*mult*mult);
+ units = 'G';
+ } else if (num > mult*mult) {
+ dnum = (double)num / (mult*mult);
+ units = 'M';
+ } else if (num > mult) {
+ dnum = (double)num / mult;
+ units = 'K';
+ }
+ if (units) {
+ sprintf(bufs[n], "%.2f%c", dnum, units);
+ return bufs[n];
+ }
+ }
+
+ s = bufs[n] + sizeof bufs[0] - 1;
+ *s = '\0';
+
+ if (!num)
+ *--s = '0';
+ while (num) {
+ *--s = (num % 10) + '0';
+ num /= 10;
+ }
+ return s;
+}
+
+/* Return the double number as a string. If the --human-readable option was
+ * specified, we may output the number in K, M, or G units. We use a buffer
+ * from human_num() to return our result. */
+char *human_dnum(double dnum, int decimal_digits)
+{
+ char *buf = human_num(dnum);
+ int len = strlen(buf);
+ if (isdigit(*(uchar*)(buf+len-1))) {
+ /* There's extra room in buf prior to the start of the num. */
+ buf -= decimal_digits + 1;
+ snprintf(buf, len + decimal_digits + 2, "%.*f", decimal_digits, dnum);
+ }
+ return buf;
+}
/**
* Return the date and time as a string