41
33
/* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero
43
static void time2str(char *r, long t)
35
static void time2str(char *r, curl_off_t seconds)
37
curl_off_t d, h, m, s;
47
39
strcpy(r, "--:--:--");
52
long m = (t-(h*3600))/60;
53
long s = (t-(h*3600)-(m*60));
54
snprintf(r, 9, "%2ld:%02ld:%02ld",h,m,s);
42
h = seconds / CURL_OFF_T_C(3600);
43
if(h <= CURL_OFF_T_C(99)) {
44
m = (seconds - (h*CURL_OFF_T_C(3600))) / CURL_OFF_T_C(60);
45
s = (seconds - (h*CURL_OFF_T_C(3600))) - (m*CURL_OFF_T_C(60));
46
snprintf(r, 9, "%2" FORMAT_OFF_T ":%02" FORMAT_OFF_T ":%02" FORMAT_OFF_T,
57
50
/* this equals to more than 99 hours, switch to a more suitable output
58
51
format to fit within the limits. */
60
snprintf(r, 9, "%3ldd %02ldh", h/24, h-(h/24)*24);
52
d = seconds / CURL_OFF_T_C(86400);
53
h = (seconds - (d*CURL_OFF_T_C(86400))) / CURL_OFF_T_C(3600);
54
if(d <= CURL_OFF_T_C(999))
55
snprintf(r, 9, "%3" FORMAT_OFF_T "d %02" FORMAT_OFF_T "h", d, h);
62
snprintf(r, 9, "%7ldd", h/24);
57
snprintf(r, 9, "%7" FORMAT_OFF_T "d", d);
68
63
Add suffix k, M, G when suitable... */
69
64
static char *max5data(curl_off_t bytes, char *max5)
71
#define ONE_KILOBYTE 1024
72
#define ONE_MEGABYTE (1024* ONE_KILOBYTE)
73
#define ONE_GIGABYTE (1024* ONE_MEGABYTE)
74
#define ONE_TERABYTE ((curl_off_t)1024* ONE_GIGABYTE)
75
#define ONE_PETABYTE ((curl_off_t)1024* ONE_TERABYTE)
66
#define ONE_KILOBYTE CURL_OFF_T_C(1024)
67
#define ONE_MEGABYTE (CURL_OFF_T_C(1024) * ONE_KILOBYTE)
68
#define ONE_GIGABYTE (CURL_OFF_T_C(1024) * ONE_MEGABYTE)
69
#define ONE_TERABYTE (CURL_OFF_T_C(1024) * ONE_GIGABYTE)
70
#define ONE_PETABYTE (CURL_OFF_T_C(1024) * ONE_TERABYTE)
72
if(bytes < CURL_OFF_T_C(100000))
78
73
snprintf(max5, 6, "%5" FORMAT_OFF_T, bytes);
80
else if(bytes < (10000*ONE_KILOBYTE)) {
81
snprintf(max5, 6, "%4" FORMAT_OFF_T "k", (curl_off_t)(bytes/ONE_KILOBYTE));
83
else if(bytes < (100*ONE_MEGABYTE)) {
75
else if(bytes < CURL_OFF_T_C(10000) * ONE_KILOBYTE)
76
snprintf(max5, 6, "%4" FORMAT_OFF_T "k", bytes/ONE_KILOBYTE);
78
else if(bytes < CURL_OFF_T_C(100) * ONE_MEGABYTE)
84
79
/* 'XX.XM' is good as long as we're less than 100 megs */
85
snprintf(max5, 6, "%2d.%0dM",
86
(int)(bytes/ONE_MEGABYTE),
87
(int)(bytes%ONE_MEGABYTE)/(ONE_MEGABYTE/10) );
89
#if SIZEOF_CURL_OFF_T > 4
90
else if(bytes < ( (curl_off_t)10000*ONE_MEGABYTE))
80
snprintf(max5, 6, "%2" FORMAT_OFF_T ".%0" FORMAT_OFF_T "M",
82
(bytes%ONE_MEGABYTE) / (ONE_MEGABYTE/CURL_OFF_T_C(10)) );
84
#if (CURL_SIZEOF_CURL_OFF_T > 4)
86
else if(bytes < CURL_OFF_T_C(10000) * ONE_MEGABYTE)
91
87
/* 'XXXXM' is good until we're at 10000MB or above */
92
snprintf(max5, 6, "%4" FORMAT_OFF_T "M", (curl_off_t)(bytes/ONE_MEGABYTE));
88
snprintf(max5, 6, "%4" FORMAT_OFF_T "M", bytes/ONE_MEGABYTE);
94
else if(bytes < (curl_off_t)100*ONE_GIGABYTE)
90
else if(bytes < CURL_OFF_T_C(100) * ONE_GIGABYTE)
95
91
/* 10000 MB - 100 GB, we show it as XX.XG */
96
snprintf(max5, 6, "%2d.%0dG",
97
(int)(bytes/ONE_GIGABYTE),
98
(int)(bytes%ONE_GIGABYTE)/(ONE_GIGABYTE/10) );
92
snprintf(max5, 6, "%2" FORMAT_OFF_T ".%0" FORMAT_OFF_T "G",
94
(bytes%ONE_GIGABYTE) / (ONE_GIGABYTE/CURL_OFF_T_C(10)) );
100
else if(bytes < (curl_off_t)10000 * ONE_GIGABYTE)
96
else if(bytes < CURL_OFF_T_C(10000) * ONE_GIGABYTE)
101
97
/* up to 10000GB, display without decimal: XXXXG */
102
snprintf(max5, 6, "%4dG", (int)(bytes/ONE_GIGABYTE));
98
snprintf(max5, 6, "%4" FORMAT_OFF_T "G", bytes/ONE_GIGABYTE);
104
else if(bytes < (curl_off_t)10000 * ONE_TERABYTE)
100
else if(bytes < CURL_OFF_T_C(10000) * ONE_TERABYTE)
105
101
/* up to 10000TB, display without decimal: XXXXT */
106
snprintf(max5, 6, "%4dT", (int)(bytes/ONE_TERABYTE));
102
snprintf(max5, 6, "%4" FORMAT_OFF_T "T", bytes/ONE_TERABYTE);
108
105
/* up to 10000PB, display without decimal: XXXXP */
109
snprintf(max5, 6, "%4dP", (int)(bytes/ONE_PETABYTE));
106
snprintf(max5, 6, "%4" FORMAT_OFF_T "P", bytes/ONE_PETABYTE);
111
/* 16384 petabytes (16 exabytes) is maximum a 64 bit number can hold,
112
but this type is signed so 8192PB will be max.*/
108
/* 16384 petabytes (16 exabytes) is the maximum a 64 bit unsigned number
109
can hold, but our data type is signed so 8192PB will be the maximum. */
117
snprintf(max5, 6, "%4" FORMAT_OFF_T "M", (curl_off_t)(bytes/ONE_MEGABYTE));
114
snprintf(max5, 6, "%4" FORMAT_OFF_T "M", bytes/ONE_MEGABYTE);
370
372
/* Figure out the estimated time of arrival for the upload */
371
373
if((data->progress.flags & PGRS_UL_SIZE_KNOWN) &&
372
(data->progress.ulspeed>0) &&
373
(data->progress.size_ul > 100) ) {
374
ulestimate = (long)(data->progress.size_ul / data->progress.ulspeed);
375
ulpercen = (int)(100*(data->progress.uploaded/100) /
376
(data->progress.size_ul/100) );
374
(data->progress.ulspeed > CURL_OFF_T_C(0)) &&
375
(data->progress.size_ul > CURL_OFF_T_C(100)) ) {
376
ulestimate = data->progress.size_ul / data->progress.ulspeed;
377
ulpercen = data->progress.uploaded /
378
(data->progress.size_ul/CURL_OFF_T_C(100));
379
381
/* ... and the download */
380
382
if((data->progress.flags & PGRS_DL_SIZE_KNOWN) &&
381
(data->progress.dlspeed>0) &&
382
(data->progress.size_dl>100)) {
383
dlestimate = (long)(data->progress.size_dl / data->progress.dlspeed);
384
dlpercen = (int)(100*(data->progress.downloaded/100) /
385
(data->progress.size_dl/100));
383
(data->progress.dlspeed > CURL_OFF_T_C(0)) &&
384
(data->progress.size_dl > CURL_OFF_T_C(100))) {
385
dlestimate = data->progress.size_dl / data->progress.dlspeed;
386
dlpercen = data->progress.downloaded /
387
(data->progress.size_dl/CURL_OFF_T_C(100));
388
390
/* Now figure out which of them is slower and use that one for the
405
407
total_transfer = data->progress.downloaded + data->progress.uploaded;
407
409
/* Get the percentage of data transfered so far */
408
if(total_expected_transfer > 100)
409
total_percen=(int)(100*(total_transfer/100) /
410
(total_expected_transfer/100) );
410
if(total_expected_transfer > CURL_OFF_T_C(100))
411
total_percen = total_transfer /
412
(total_expected_transfer/CURL_OFF_T_C(100));
412
414
fprintf(data->set.err,
413
"\r%3d %s %3d %s %3d %s %s %s %s %s %s %s",
416
"%3" FORMAT_OFF_T " %s "
417
"%3" FORMAT_OFF_T " %s "
418
"%3" FORMAT_OFF_T " %s %s %s %s %s %s %s",
414
419
total_percen, /* 3 letters */ /* total % */
415
420
max5data(total_expected_transfer, max5[2]), /* total size */
416
421
dlpercen, /* 3 letters */ /* rcvd % */