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
This commit is contained in:
Daniel Stenberg 2025-11-10 00:46:53 +01:00
parent 0dacc07969
commit 28380bb9fd
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2

View file

@ -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