diff options
author | Wayne Davison <wayned@samba.org> | 2008-07-17 16:59:59 -0700 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2008-07-17 16:59:59 -0700 |
commit | 3a8fad78053e1fb9fdaa227a066bb62e814cb3c1 (patch) | |
tree | a25b56c68376ffde4f024e48855164e8f9aa97fd /lib | |
parent | 0c096e29aa0e89dd8b45ac1d898f142c2c2094de (diff) | |
download | rsync-3a8fad78053e1fb9fdaa227a066bb62e814cb3c1.tar.gz |
Moving big_num() into lib/compat.c so tls.c can use it.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/compat.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/compat.c b/lib/compat.c index e0cb9f95..494b64fc 100644 --- a/lib/compat.c +++ b/lib/compat.c @@ -151,3 +151,46 @@ int sys_gettimeofday(struct timeval *tv) return gettimeofday(tv); #endif } + +/* Return the int64 number as a string. If the human_flag arg is non-zero, + * we may output the number in K, M, or G units. We can return up to 4 + * buffers at a time. */ +char *big_num(int64 num, int human_flag) +{ + 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_flag) { + char units = '\0'; + int mult = human_flag == 1 ? 1000 : 1024; + 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) { + snprintf(bufs[n], sizeof bufs[0], "%.2f%c", dnum, units); + return bufs[n]; + } + } + + s = bufs[n] + sizeof bufs[0] - 1; + *s = '\0'; + + if (!num) + *--s = '0'; + while (num) { + *--s = (char)(num % 10) + '0'; + num /= 10; + } + return s; +} |