From: Daniel Stenberg Date: Sun, 9 Nov 2025 23:46:53 +0000 (+0100) Subject: progress: show fewer digits X-Git-Tag: rc-8_18_0-1~355 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=28380bb9fd1d6eb25344220d569df3f80ded7363;p=thirdparty%2Fcurl.git progress: show fewer digits Without unit, show up to 99999 "raw" (5 digits). After that, prefer to show the number as less than 1000 per unit and use single decimal fraction. Like '123.4M' (spending 6 characters). This now makes the largest possible size to show 8.0E (exabytes). Probably makes the output easier to read. Fixes #19431 Reported-by: Fd929c2CE5fA on github Closes #19433 --- diff --git a/lib/progress.c b/lib/progress.c index 928461043a..211212d4ed 100644 --- a/lib/progress.c +++ b/lib/progress.c @@ -67,33 +67,27 @@ static void time2str(char *r, curl_off_t seconds) Add suffix k, M, G when suitable... */ static char *max6data(curl_off_t bytes, char *max6) { - /* a signed 64-bit value is 8192 petabytes maximum */ - const char unit[] = { 'k', 'M', 'G', 'T', 'P', 0 }; - int k = 0; - if(bytes < 1000000) { - curl_msnprintf(max6, 7, "%5" CURL_FORMAT_CURL_OFF_T, bytes); - return max6; + /* a signed 64-bit value is 8192 petabytes maximum, shown as + 8.0E (exabytes)*/ + if(bytes < 100000) + curl_msnprintf(max6, 7, "%6" CURL_FORMAT_CURL_OFF_T, bytes); + else { + const char unit[] = { 'k', 'M', 'G', 'T', 'P', 'E', 0 }; + int k = 0; + curl_off_t nbytes; + do { + nbytes = bytes / 1024; + if(nbytes < 1000) + break; + bytes = nbytes; + k++; + DEBUGASSERT(unit[k]); + } while(unit[k]); + /* xxx.yU */ + curl_msnprintf(max6, 7, "%3" CURL_FORMAT_CURL_OFF_T + ".%" CURL_FORMAT_CURL_OFF_T "%c", nbytes, + (bytes%1024) / (1024/10), unit[k]); } - - do { - curl_off_t nbytes = bytes / 1024; - if(nbytes < 1000) { - /* xxx.yU */ - curl_msnprintf(max6, 7, "%3" CURL_FORMAT_CURL_OFF_T - ".%" CURL_FORMAT_CURL_OFF_T "%c", nbytes, - (bytes%1024) / (1024/10), unit[k]); - break; - } - else if(nbytes < 100000) { - /* xxxxxU */ - curl_msnprintf(max6, 7, "%5" CURL_FORMAT_CURL_OFF_T "%c", - nbytes, unit[k]); - break; - } - bytes = nbytes; - k++; - DEBUGASSERT(unit[k]); - } while(unit[k]); return max6; } #endif