X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fcommon%2Futils.c;h=111c3296964724c71bb979541bb8348278dea847;hp=a069522f479afe6214735c6ae444262067bd4a82;hb=f409db7051a26c30cf7e49faa96ab97685963207;hpb=a8576b6fe029dd59075b7abda7e8ae949d2cbab1;ds=sidebyside diff --git a/src/common/utils.c b/src/common/utils.c index a069522f4..111c32969 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -334,20 +334,44 @@ gchar *itos(gint n) return itos_buf(nstr, n); } +#define divide(num,divisor,i,d) \ +{ \ + register int tmp; \ + i = num/divisor; \ + tmp = i*divisor; \ + d = num-tmp; \ + if (d > 1000) d /= 1000; \ + else if (d > 100) d /= 100; \ + else if (d > 10) d /= 10; \ +} + gchar *to_human_readable(off_t size) { static gchar str[14]; - - if (size < 1024) - g_snprintf(str, sizeof(str), _("%dB"), (gint)size); - else if (size >> 10 < 1024) - g_snprintf(str, sizeof(str), _("%.1fKB"), (gfloat)size / (1 << 10)); - else if (size >> 20 < 1024) - g_snprintf(str, sizeof(str), _("%.2fMB"), (gfloat)size / (1 << 20)); - else - g_snprintf(str, sizeof(str), _("%.2fGB"), (gfloat)size / (1 << 30)); - - return str; + static gchar *b_format = NULL, *kb_format = NULL, + *mb_format = NULL, *gb_format = NULL; + register int t = 0, r = 0; + if (b_format == NULL) { + b_format = _("%dB"); + kb_format = _("%d.%dKB"); + mb_format = _("%.2fMB"); + gb_format = _("%.2fGB"); + } + + if (size < 1024) { + g_snprintf(str, sizeof(str), b_format, (gint)size); + return str; + } else if (size >> 10 < 1024) { + divide(size, (1 << 10), t, r); + g_snprintf(str, sizeof(str), kb_format, t, r); + return str; + } else if (size >> 20 < 1024) { + g_snprintf(str, sizeof(str), mb_format, (gfloat)size / (1 << 20)); + return str; + } else { + g_snprintf(str, sizeof(str), gb_format, (gfloat)size / (1 << 30)); + return str; + } } /* strcmp with NULL-checking */