#define MIN_RATE_LIMIT_PERIOD 3000
#ifndef CURL_DISABLE_PROGRESS_METER
-/* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero
- byte) */
-static void time2str(char *r, size_t rsize, curl_off_t seconds)
+/* Provide a string that is 7 letters long (plus the zero byte).
+
+ Unit test 1636.
+*/
+UNITTEST void time2str(char *r, size_t rsize, curl_off_t seconds);
+UNITTEST void time2str(char *r, size_t rsize, curl_off_t seconds)
{
curl_off_t h;
if(seconds <= 0) {
- curlx_strcopy(r, rsize, "--:--:--", 8);
+ curlx_strcopy(r, rsize, " ", 7);
return;
}
h = seconds / 3600;
if(h <= 99) {
curl_off_t m = (seconds - (h * 3600)) / 60;
- curl_off_t s = (seconds - (h * 3600)) - (m * 60);
- curl_msnprintf(r, rsize, "%2" FMT_OFF_T ":%02" FMT_OFF_T ":%02" FMT_OFF_T,
- h, m, s);
+ if(h <= 9) {
+ curl_off_t s = (seconds - (h * 3600)) - (m * 60);
+ if(h)
+ curl_msnprintf(r, rsize, "%" FMT_OFF_T ":%02" FMT_OFF_T ":"
+ "%02" FMT_OFF_T, h, m, s);
+ else
+ curl_msnprintf(r, rsize, " %02" FMT_OFF_T ":%02" FMT_OFF_T, m, s);
+ }
+ else
+ curl_msnprintf(r, rsize, "%" FMT_OFF_T "h %02" FMT_OFF_T "m", h, m);
}
else {
- /* this equals to more than 99 hours, switch to a more suitable output
- format to fit within the limits. */
curl_off_t d = seconds / 86400;
h = (seconds - (d * 86400)) / 3600;
- if(d <= 999)
- curl_msnprintf(r, rsize, "%3" FMT_OFF_T "d %02" FMT_OFF_T "h", d, h);
- else
- curl_msnprintf(r, rsize, "%7" FMT_OFF_T "d", d);
+ if(d <= 99)
+ curl_msnprintf(r, rsize, "%2" FMT_OFF_T "d %02" FMT_OFF_T "h", d, h);
+ else if(d <= 999)
+ curl_msnprintf(r, rsize, "%6" FMT_OFF_T "d", d);
+ else { /* more than 999 days */
+ curl_off_t m = d / 30;
+ if(m <= 999)
+ curl_msnprintf(r, rsize, "%6" FMT_OFF_T "m", m);
+ else { /* more than 999 months */
+ curl_off_t y = d / 365;
+ if(y <= 99999)
+ curl_msnprintf(r, rsize, "%6" FMT_OFF_T "y", y);
+ else
+ curlx_strcopy(r, rsize, ">99999y", 7);
+ }
+ }
}
}
/* The point of this function would be to return a string of the input data,
but never longer than 6 columns (+ one zero byte).
- Add suffix k, M, G when suitable... */
-static char *max6out(curl_off_t bytes, char *max6, size_t mlen)
+ Add suffix k, M, G when suitable...
+
+ Unit test 1636
+*/
+UNITTEST char *max6out(curl_off_t bytes, char *max6, size_t mlen);
+UNITTEST char *max6out(curl_off_t bytes, char *max6, size_t mlen)
{
/* a signed 64-bit value is 8192 petabytes maximum, shown as
8.0E (exabytes)*/
const char unit[] = { 'k', 'M', 'G', 'T', 'P', 'E', 0 };
int k = 0;
curl_off_t nbytes;
+ curl_off_t rest;
do {
nbytes = bytes / 1024;
if(nbytes < 1000)
k++;
DEBUGASSERT(unit[k]);
} while(unit[k]);
- /* xxx.yU */
- curl_msnprintf(max6, mlen, "%3" CURL_FORMAT_CURL_OFF_T
- ".%" CURL_FORMAT_CURL_OFF_T "%c", nbytes,
- (bytes % 1024) / (1024 / 10), unit[k]);
+ rest = bytes % 1024;
+ if(nbytes <= 99)
+ /* xx.yyU */
+ curl_msnprintf(max6, mlen, "%2" CURL_FORMAT_CURL_OFF_T
+ ".%02" CURL_FORMAT_CURL_OFF_T "%c", nbytes,
+ rest * 100 / 1024, unit[k]);
+ else
+ /* xxx.yU */
+ curl_msnprintf(max6, mlen, "%3" CURL_FORMAT_CURL_OFF_T
+ ".%" CURL_FORMAT_CURL_OFF_T "%c", nbytes,
+ rest * 10 / 1024, unit[k]);
}
return max6;
}
curl_off_t total_cur_size;
curl_off_t total_expected_size;
curl_off_t dl_size;
- char time_left[10];
- char time_total[10];
- char time_spent[10];
+ char time_left[8];
+ char time_total[8];
+ char time_spent[8];
curl_off_t cur_secs = (curl_off_t)p->timespent / 1000000; /* seconds */
if(!p->headers_out) {
}
curl_mfprintf(data->set.err,
" %% Total %% Received %% Xferd Average Speed "
- "Time Time Time Current\n"
+ "Time Time Time Current\n"
" Dload Upload "
- "Total Spent Left Speed\n");
+ "Total Spent Left Speed\n");
p->headers_out = TRUE; /* headers are shown */
}
sizeof(max6[3])), /* avrg dl speed */
max6out(p->ul.speed, max6[4],
sizeof(max6[4])), /* avrg ul speed */
- time_total, /* 8 letters */ /* total time */
- time_spent, /* 8 letters */ /* time spent */
- time_left, /* 8 letters */ /* time left */
+ time_total, /* 7 letters */ /* total time */
+ time_spent, /* 7 letters */ /* time spent */
+ time_left, /* 7 letters */ /* time left */
max6out(p->current_speed, max6[5],
sizeof(max6[5])) /* current speed */
);
--- /dev/null
+<?xml version="1.0" encoding="US-ASCII"?>
+<testcase>
+<info>
+<keywords>
+unittest
+time2str
+max6out
+</keywords>
+</info>
+
+<client>
+<features>
+unittest
+</features>
+
+<name>
+time2str and max6out
+</name>
+<command>
+%LOGDIR/%TESTNUMBER
+</command>
+</client>
+<verify>
+<stdout mode="text">
+time2str
+ 0 - %SP%SP%SP%SP%SP%SP%SP
+ 1 - 00:01
+ 3 - 00:03
+ 7 - 00:07
+ 15 - 00:15
+ 31 - 00:31
+ 63 - 01:03
+ 127 - 02:07
+ 255 - 04:15
+ 511 - 08:31
+ 1023 - 17:03
+ 2047 - 34:07
+ 4095 - 1:08:15
+ 8191 - 2:16:31
+ 16383 - 4:33:03
+ 32767 - 9:06:07
+ 65535 - 18h 12m
+ 131071 - 36h 24m
+ 262143 - 72h 49m
+ 524287 - 6d 01h
+ 1048575 - 12d 03h
+ 2097151 - 24d 06h
+ 4194303 - 48d 13h
+ 8388607 - 97d 02h
+ 16777215 - 194d
+ 33554431 - 388d
+ 67108863 - 776d
+ 134217727 - 51m
+ 268435455 - 103m
+ 536870911 - 207m
+ 1073741823 - 414m
+ 2147483647 - 828m
+ 4294967295 - 136y
+ 8589934591 - 272y
+ 17179869183 - 544y
+ 34359738367 - 1089y
+ 68719476735 - 2179y
+ 137438953471 - 4358y
+ 274877906943 - 8716y
+ 549755813887 - 17432y
+ 1099511627775 - 34865y
+ 2199023255551 - 69730y
+ 4398046511103 - >99999y
+ 8796093022207 - >99999y
+ 17592186044415 - >99999y
+ 35184372088831 - >99999y
+ 70368744177663 - >99999y
+ 140737488355327 - >99999y
+ 281474976710655 - >99999y
+ 562949953421311 - >99999y
+ 1125899906842623 - >99999y
+ 2251799813685247 - >99999y
+ 4503599627370495 - >99999y
+ 9007199254740991 - >99999y
+ 18014398509481983 - >99999y
+ 36028797018963967 - >99999y
+ 72057594037927935 - >99999y
+ 144115188075855871 - >99999y
+ 288230376151711743 - >99999y
+ 576460752303423487 - >99999y
+ 1152921504606846975 - >99999y
+ 2305843009213693951 - >99999y
+ 4611686018427387903 - >99999y
+max6out
+ 0 - 0
+ 1 - 1
+ 3 - 3
+ 7 - 7
+ 15 - 15
+ 31 - 31
+ 63 - 63
+ 127 - 127
+ 255 - 255
+ 511 - 511
+ 1023 - 1023
+ 2047 - 2047
+ 4095 - 4095
+ 8191 - 8191
+ 16383 - 16383
+ 32767 - 32767
+ 65535 - 65535
+ 131071 - 127.9k
+ 262143 - 255.9k
+ 524287 - 511.9k
+ 1048575 - 0.99M
+ 2097151 - 1.99M
+ 4194303 - 3.99M
+ 8388607 - 7.99M
+ 16777215 - 15.99M
+ 33554431 - 31.99M
+ 67108863 - 63.99M
+ 134217727 - 127.9M
+ 268435455 - 255.9M
+ 536870911 - 511.9M
+ 1073741823 - 0.99G
+ 2147483647 - 1.99G
+ 4294967295 - 3.99G
+ 8589934591 - 7.99G
+ 17179869183 - 15.99G
+ 34359738367 - 31.99G
+ 68719476735 - 63.99G
+ 137438953471 - 127.9G
+ 274877906943 - 255.9G
+ 549755813887 - 511.9G
+ 1099511627775 - 0.99T
+ 2199023255551 - 1.99T
+ 4398046511103 - 3.99T
+ 8796093022207 - 7.99T
+ 17592186044415 - 15.99T
+ 35184372088831 - 31.99T
+ 70368744177663 - 63.99T
+ 140737488355327 - 127.9T
+ 281474976710655 - 255.9T
+ 562949953421311 - 511.9T
+ 1125899906842623 - 0.99P
+ 2251799813685247 - 1.99P
+ 4503599627370495 - 3.99P
+ 9007199254740991 - 7.99P
+ 18014398509481983 - 15.99P
+ 36028797018963967 - 31.99P
+ 72057594037927935 - 63.99P
+ 144115188075855871 - 127.9P
+ 288230376151711743 - 255.9P
+ 576460752303423487 - 511.9P
+ 1152921504606846975 - 0.99E
+ 2305843009213693951 - 1.99E
+ 4611686018427387903 - 3.99E
+ 131072 - 128.0k
+ 12645826 - 12.05M
+ 1073741824 - 1.00G
+ 12938588979 - 12.04G
+ 1099445657078333 - 999.9T
+</stdout>
+</verify>
+
+</testcase>
--- /dev/null
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ * SPDX-License-Identifier: curl
+ *
+ ***************************************************************************/
+#include "unitcheck.h"
+#include "unitprotos.h"
+
+static CURLcode test_unit1636(const char *arg)
+{
+ UNITTEST_BEGIN_SIMPLE
+ {
+ char buffer[9];
+ curl_off_t secs;
+ int i;
+ static const curl_off_t check[] = {
+ /* bytes to check */
+ 131072,
+ 12645826,
+ 1073741824,
+ 12938588979,
+ 1099445657078333,
+ 0 /* end of list */
+ };
+
+ puts("time2str");
+ for(i = 0, secs = 0; i < 63; i++) {
+ time2str(buffer, sizeof(buffer), secs);
+ curl_mprintf("%20" FMT_OFF_T " - %s\n", secs, buffer);
+ if(strlen(buffer) != 7) {
+ curl_mprintf("^^ was too long!\n");
+ }
+ secs *= 2;
+ secs++;
+ }
+ puts("max6out");
+ for(i = 0, secs = 0; i < 63; i++) {
+ max6out(secs, buffer, sizeof(buffer));
+ curl_mprintf("%20" FMT_OFF_T " - %s\n", secs, buffer);
+ if(strlen(buffer) != 6) {
+ curl_mprintf("^^ was too long!\n");
+ }
+ secs *= 2;
+ secs++;
+ }
+ for(i = 0; check[i]; i++) {
+ secs = check[i];
+ max6out(secs, buffer, sizeof(buffer));
+ curl_mprintf("%20" FMT_OFF_T " - %s\n", secs, buffer);
+ if(strlen(buffer) != 6) {
+ curl_mprintf("^^ was too long!\n");
+ }
+ }
+ }
+ UNITTEST_END(curl_global_cleanup())
+}