|
|
| version 1.1.1.1, 2012/02/17 15:09:30 | version 1.1.1.2, 2013/10/14 07:51:14 |
|---|---|
| Line 20 | Line 20 |
| */ | */ |
| #include "rsync.h" | #include "rsync.h" |
| #include "itypes.h" | |
| static char number_separator; | |
| #ifndef HAVE_STRDUP | #ifndef HAVE_STRDUP |
| char *strdup(char *s) | char *strdup(char *s) |
| { | { |
| Line 149 int sys_gettimeofday(struct timeval *tv) | Line 152 int sys_gettimeofday(struct timeval *tv) |
| return gettimeofday(tv, NULL); | return gettimeofday(tv, NULL); |
| #else | #else |
| return gettimeofday(tv); | return gettimeofday(tv); |
| #endif | |
| } | |
| #define HUMANIFY(mult) \ | |
| do { \ | |
| if (num >= mult || num <= -mult) { \ | |
| double dnum = (double)num / mult; \ | |
| char units; \ | |
| if (num < 0) \ | |
| dnum = -dnum; \ | |
| if (dnum < mult) \ | |
| units = 'K'; \ | |
| else if ((dnum /= mult) < mult) \ | |
| units = 'M'; \ | |
| else if ((dnum /= mult) < mult) \ | |
| units = 'G'; \ | |
| else { \ | |
| dnum /= mult; \ | |
| units = 'T'; \ | |
| } \ | |
| if (num < 0) \ | |
| dnum = -dnum; \ | |
| snprintf(bufs[n], sizeof bufs[0], "%.2f%c", dnum, units); \ | |
| return bufs[n]; \ | |
| } \ | |
| } while (0) | |
| /* Return the int64 number as a string. If the human_flag arg is non-zero, | |
| * we may output the number in K, M, G, or T units. If we don't add a unit | |
| * suffix, we will append the fract string, if it is non-NULL. We can | |
| * return up to 4 buffers at a time. */ | |
| char *do_big_num(int64 num, int human_flag, const char *fract) | |
| { | |
| static char bufs[4][128]; /* more than enough room */ | |
| static unsigned int n; | |
| char *s; | |
| int len, negated; | |
| if (human_flag && !number_separator) { | |
| char buf[32]; | |
| snprintf(buf, sizeof buf, "%f", 3.14); | |
| if (strchr(buf, '.') != NULL) | |
| number_separator = ','; | |
| else | |
| number_separator = '.'; | |
| } | |
| n = (n + 1) % (sizeof bufs / sizeof bufs[0]); | |
| if (human_flag > 1) { | |
| if (human_flag == 2) | |
| HUMANIFY(1000); | |
| else | |
| HUMANIFY(1024); | |
| } | |
| s = bufs[n] + sizeof bufs[0] - 1; | |
| if (fract) { | |
| len = strlen(fract); | |
| s -= len; | |
| strlcpy(s, fract, len + 1); | |
| } else | |
| *s = '\0'; | |
| len = 0; | |
| if (!num) | |
| *--s = '0'; | |
| if (num < 0) { | |
| /* A maximum-size negated number can't fit as a positive, | |
| * so do one digit in negated form to start us off. */ | |
| *--s = (char)(-(num % 10)) + '0'; | |
| num = -(num / 10); | |
| len++; | |
| negated = 1; | |
| } else | |
| negated = 0; | |
| while (num) { | |
| if (human_flag) { | |
| if (len == 3) { | |
| *--s = number_separator; | |
| len = 1; | |
| } else | |
| len++; | |
| } | |
| *--s = (char)(num % 10) + '0'; | |
| num /= 10; | |
| } | |
| if (negated) | |
| *--s = '-'; | |
| return s; | |
| } | |
| /* Return the double number as a string. If the human_flag option is > 1, | |
| * we may output the number in K, M, G, or T units. The buffer we use for | |
| * our result is either a single static buffer defined here, or a buffer | |
| * we get from do_big_num(). */ | |
| char *do_big_dnum(double dnum, int human_flag, int decimal_digits) | |
| { | |
| static char tmp_buf[128]; | |
| #if SIZEOF_INT64 >= 8 | |
| char *fract; | |
| snprintf(tmp_buf, sizeof tmp_buf, "%.*f", decimal_digits, dnum); | |
| if (!human_flag || (dnum < 1000.0 && dnum > -1000.0)) | |
| return tmp_buf; | |
| for (fract = tmp_buf+1; isDigit(fract); fract++) {} | |
| return do_big_num((int64)dnum, human_flag, fract); | |
| #else | |
| /* A big number might lose digits converting to a too-short int64, | |
| * so let's just return the raw double conversion. */ | |
| snprintf(tmp_buf, sizeof tmp_buf, "%.*f", decimal_digits, dnum); | |
| return tmp_buf; | |
| #endif | #endif |
| } | } |