Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

curl: progress bar refresh #2242

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
108 changes: 86 additions & 22 deletions src/tool_cb_prg.c
Expand Up @@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2014, 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 1998 - 2018, 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
Expand All @@ -21,6 +21,10 @@
***************************************************************************/
#include "tool_setup.h"

#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif

#define ENABLE_CURLX_PRINTF
/* use our own printf() functions */
#include "curlx.h"
Expand All @@ -31,6 +35,56 @@

#include "memdebug.h" /* keep this as LAST include */

/* 200 values */
const static unsigned int sinus[] = {
5157, 5313, 5470, 5626, 5782, 5936, 6090, 6243, 6394, 6545, 6693, 6840, 6985,
7128, 7269, 7408, 7545, 7679, 7810, 7938, 8064, 8187, 8306, 8422, 8535, 8644,
8750, 8852, 8950, 9045, 9135, 9221, 9303, 9381, 9454, 9524, 9588, 9648, 9704,
9755, 9801, 9842, 9879, 9911, 9938, 9960, 9977, 9990, 9997, 9999, 9997, 9990,
9977, 9960, 9938, 9911, 9879, 9842, 9801, 9755, 9704, 9648, 9588, 9524, 9455,
9381, 9303, 9221, 9135, 9045, 8950, 8852, 8750, 8645, 8535, 8422, 8306, 8187,
8064, 7939, 7810, 7679, 7545, 7409, 7270, 7129, 6986, 6841, 6694, 6545, 6395,
6243, 6091, 5937, 5782, 5627, 5470, 5314, 5157, 5000, 4843, 4686, 4529, 4373,
4218, 4063, 3909, 3757, 3605, 3455, 3306, 3159, 3014, 2871, 2730, 2591, 2455,
2321, 2190, 2061, 1935, 1813, 1693, 1577, 1464, 1355, 1249, 1147, 1049, 955,
864, 778, 696, 618, 545, 476, 411, 351, 295, 244, 198, 157, 120, 88, 61, 39,
22, 9, 2, 0, 2, 9, 22, 39, 61, 88, 120, 156, 198, 244, 295, 350, 410, 475,
544, 618, 695, 777, 864, 954, 1048, 1146, 1248, 1354, 1463, 1576, 1692, 1812,
1934, 2060, 2188, 2320, 2454, 2590, 2729, 2870, 3013, 3158, 3305, 3454, 3604,
3755, 3908, 4062, 4216, 4372, 4528, 4685, 4842, 4999
};

static void fly(struct ProgressData *bar, bool moved)
{
char buf[256];
int pos;
int check = bar->width - 2;

snprintf(buf, sizeof(buf), "%*s\r", bar->width-1, " ");
memcpy(&buf[bar->bar], "-=O=-", 5);

pos = sinus[bar->tick%200] / (10000 / check);
buf[pos] = '#';
pos = sinus[(bar->tick + 5)%200] / (10000 / check);
buf[pos] = '#';
pos = sinus[(bar->tick + 10)%200] / (10000 / check);
buf[pos] = '#';
pos = sinus[(bar->tick + 15)%200] / (10000 / check);
buf[pos] = '#';

fputs(buf, stderr);
bar->tick += 2;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

where is the check on tick it seems like this could result in signed overflow

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, I'll add a:

  if(bar->tick >= 200)
    bar->tick -= 200;

bar->bar += (moved?bar->barmove:0);
if(bar->bar >= (bar->width - 6)) {
bar->barmove = -1;
bar->bar = bar->width - 6;
}
else if(bar->bar < 0) {
bar->barmove = 1;
bar->bar = 0;
}
}

/*
** callback for CURLOPT_XFERINFOFUNCTION
*/
Expand Down Expand Up @@ -74,27 +128,17 @@ int tool_progress_cb(void *clientp,
}
else {
/* total is unknown */
if(bar->prev/1024 == point/1024)
/* the same kilobyte level as last invoke */
return 0;
else if(tvdiff(now, bar->prevtime) < 100L)
if(tvdiff(now, bar->prevtime) < 100L)
/* limit progress-bar updating to 10 Hz */
return 0;
fly(bar, point != bar->prev);
}
}

/* simply count invokes */
bar->calls++;

if(total < 1) {
curl_off_t prevblock = bar->prev / 1024;
curl_off_t thisblock = point / 1024;
while(thisblock > prevblock) {
fprintf(bar->out, "#");
prevblock++;
}
}
else if(point != bar->prev) {
if((total > 0) && (point != bar->prev)) {
if(point > total)
/* we have got more than the expected total! */
total = point;
Expand All @@ -121,6 +165,17 @@ void progressbarinit(struct ProgressData *bar,
struct OperationConfig *config)
{
char *colp;
int cols = 0;

#ifdef TIOCGSIZE
struct ttysize ts;
ioctl(STDIN_FILENO, TIOCGSIZE, &ts);
cols = ts.ts_cols;
#elif defined(TIOCGWINSZ)
struct winsize ts;
ioctl(STDIN_FILENO, TIOCGWINSZ, &ts);
cols = ts.ws_col;
#endif /* TIOCGSIZE */

memset(bar, 0, sizeof(struct ProgressData));

Expand All @@ -130,18 +185,27 @@ void progressbarinit(struct ProgressData *bar,
if(config->use_resume)
bar->initial_size = config->resume_from;

colp = curlx_getenv("COLUMNS");
if(colp) {
char *endptr;
long num = strtol(colp, &endptr, 10);
if((endptr != colp) && (endptr == colp + strlen(colp)) && (num > 0))
bar->width = (int)num;
if(!cols) {
colp = curlx_getenv("COLUMNS");
if(colp) {
char *endptr;
long num = strtol(colp, &endptr, 10);
if((endptr != colp) && (endptr == colp + strlen(colp)) && (num > 0))
bar->width = (int)num;
else
bar->width = 79;
curl_free(colp);
}
else
bar->width = 79;
curl_free(colp);
}
else
bar->width = 79;
bar->width = cols;

if(bar->width > MAX_BARLENGTH)
bar->width = MAX_BARLENGTH;

bar->out = config->global->errors;
bar->tick = 150;
bar->barmove = 1;
}
5 changes: 4 additions & 1 deletion src/tool_cb_prg.h
Expand Up @@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 1998 - 2018, 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
Expand All @@ -33,6 +33,9 @@ struct ProgressData {
int width;
FILE *out; /* where to write everything to */
curl_off_t initial_size;
int tick;
int bar;
int barmove;
};

void progressbarinit(struct ProgressData *bar,
Expand Down