summaryrefslogtreecommitdiff
path: root/src/progress.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/progress.c')
-rw-r--r--src/progress.c114
1 files changed, 52 insertions, 62 deletions
diff --git a/src/progress.c b/src/progress.c
index 61b635d..93f6246 100644
--- a/src/progress.c
+++ b/src/progress.c
@@ -594,7 +594,8 @@ bar_create (const char *f_download, wgint initial, wgint total)
bp->width = screen_width - 1;
/* + enough space for the terminating zero, and hopefully enough room
* for multibyte characters. */
- bp->buffer = xmalloc (bp->width + 100);
+#define BUF_LEN (bp->width + 100)
+ bp->buffer = xmalloc (BUF_LEN);
logputs (LOG_VERBOSE, "\n");
@@ -854,7 +855,7 @@ get_eta (int *bcd)
{
/* TRANSLATORS: "ETA" is English-centric, but this must
be short, ideally 3 chars. Abbreviate if necessary. */
- static const char eta_str[] = N_(" eta %s");
+ static const char eta_str[] = N_(" eta %s");
static const char *eta_trans;
static int bytes_cols_diff;
if (eta_trans == NULL)
@@ -903,11 +904,11 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
char *p = bp->buffer;
wgint size = bp->initial_length + bp->count;
- int size_grouped_pad; /* Used to pad the field width for size_grouped. */
-
struct bar_progress_hist *hist = &bp->hist;
int orig_filename_cols = count_cols (bp->f_download);
+ int padding;
+
/* The progress bar should look like this:
file xx% [=======> ] nnn.nnK 12.34KB/s eta 36m 51s
@@ -928,12 +929,16 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
"=====>..." - progress bar - the rest
*/
+ /* TODO: Ask the Turkish Translators to fix their translation for the "done"
+ * mode of progress bar. Use one less character. Once that is done, redice
+ * PROGRESS_ETA_LEN by 1.
+ */
#define PROGRESS_FILENAME_LEN MAX_FILENAME_COLS + 1
#define PROGRESS_PERCENT_LEN 4
#define PROGRESS_DECORAT_LEN 2
#define PROGRESS_FILESIZE_LEN 7 + 1
-#define PROGRESS_DWNLOAD_RATE 8 + 1
-#define PROGRESS_ETA_LEN 14
+#define PROGRESS_DWNLOAD_RATE 8 + 2
+#define PROGRESS_ETA_LEN 15
int progress_size = bp->width - (PROGRESS_FILENAME_LEN + PROGRESS_PERCENT_LEN +
PROGRESS_DECORAT_LEN + PROGRESS_FILESIZE_LEN +
@@ -945,23 +950,23 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
int cols_diff;
const char *down_size;
+ memset (bp->buffer, '\0', BUF_LEN);
+
if (progress_size < 5)
progress_size = 0;
if (orig_filename_cols <= MAX_FILENAME_COLS)
{
- int padding = MAX_FILENAME_COLS - orig_filename_cols;
- sprintf (p, "%s ", bp->f_download);
- p += orig_filename_cols + 1;
- for (;padding;padding--)
- *p++ = ' ';
+ padding = MAX_FILENAME_COLS - orig_filename_cols;
+ p += sprintf (p, "%s ", bp->f_download);
+ memset (p, ' ', padding);
+ p += padding;
}
else
{
int offset_cols;
int bytes_in_filename, offset_bytes, col;
int *cols_ret = &col;
- int padding;
#define MIN_SCROLL_TEXT 5
if ((orig_filename_cols > MAX_FILENAME_COLS + MIN_SCROLL_TEXT) &&
@@ -992,9 +997,8 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
memcpy (p, bp->f_download + offset_bytes, bytes_in_filename);
p += bytes_in_filename;
padding = MAX_FILENAME_COLS - (padding + *cols_ret);
- for (;padding;padding--)
- *p++ = ' ';
- *p++ = ' ';
+ memset (p, ' ', padding + 1);
+ p += padding + 1;
}
/* "xx% " */
@@ -1002,15 +1006,13 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
{
int percentage = 100.0 * size / bp->total_length;
assert (percentage <= 100);
-
- if (percentage < 100)
- sprintf (p, "%3d%%", percentage);
- else
- strcpy (p, "100%");
- p += 4;
+ p += sprintf (p, "%3d%%", percentage);
}
else
- APPEND_LITERAL (" ");
+ {
+ memset (p, ' ', PROGRESS_PERCENT_LEN);
+ p += PROGRESS_PERCENT_LEN;
+ }
/* The progress bar: "[====> ]" or "[++==> ]". */
if (progress_size && bp->total_length > 0)
@@ -1022,7 +1024,6 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
int dlsz = (double)size / bp->total_length * progress_size;
char *begin;
- int i;
assert (dlsz <= progress_size);
assert (insz <= dlsz);
@@ -1032,18 +1033,19 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
/* Print the initial portion of the download with '+' chars, the
rest with '=' and one '>'. */
- for (i = 0; i < insz; i++)
- *p++ = '+';
+ memset (p, '+', insz);
+ p += insz;
+
dlsz -= insz;
if (dlsz > 0)
{
- for (i = 0; i < dlsz - 1; i++)
- *p++ = '=';
+ memset (p, '=', dlsz-1);
+ p += dlsz - 1;
*p++ = '>';
}
- while (p - begin < progress_size)
- *p++ = ' ';
+ memset (p, ' ', (progress_size - (p - begin)));
+ p += (progress_size - (p - begin));
*p++ = ']';
}
else if (progress_size)
@@ -1071,27 +1073,14 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
*p++ = ']';
}
- ++bp->tick;
+ ++bp->tick;
/* " 234.56M" */
down_size = human_readable (size, 1000, 2);
- cols_diff = 7 - count_cols (down_size);
- while (cols_diff > 0)
- {
- *p++=' ';
- cols_diff--;
- }
- sprintf (p, " %s", down_size);
- move_to_end (p);
- /* Pad with spaces to 7 chars for the size_grouped field;
- * couldn't use the field width specifier in sprintf, because
- * it counts in bytes, not characters. */
- for (size_grouped_pad = PROGRESS_FILESIZE_LEN - 7;
- size_grouped_pad > 0;
- --size_grouped_pad)
- {
- *p++ = ' ';
- }
+ cols_diff = PROGRESS_FILESIZE_LEN - count_cols (down_size);
+ memset (p, ' ', cols_diff);
+ p += cols_diff;
+ p += sprintf (p, "%s", down_size);
/* " 12.52Kb/s or 12.52KB/s" */
if (hist->total_time > 0 && hist->total_bytes)
@@ -1104,12 +1093,11 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
wgint dlquant = hist->total_bytes + bp->recent_bytes;
double dltime = hist->total_time + (dl_total_time - bp->recent_start);
double dlspeed = calc_rate (dlquant, dltime, &units);
- sprintf (p, " %4.*f%s", dlspeed >= 99.95 ? 0 : dlspeed >= 9.995 ? 1 : 2,
+ p += sprintf (p, " %4.*f%s", dlspeed >= 99.95 ? 0 : dlspeed >= 9.995 ? 1 : 2,
dlspeed, !opt.report_bps ? short_units[units] : short_units_bits[units]);
- move_to_end (p);
}
else
- APPEND_LITERAL (" --.-KB/s");
+ APPEND_LITERAL (" --.-KB/s");
if (!done)
{
@@ -1144,14 +1132,14 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
bp->last_eta_time = dl_total_time;
}
- sprintf (p, get_eta(&bytes_cols_diff),
+ p += sprintf (p, get_eta(&bytes_cols_diff),
eta_to_human_short (eta, false));
- move_to_end (p);
}
else if (bp->total_length > 0)
{
skip_eta:
- APPEND_LITERAL (" ");
+ memset (p, ' ', PROGRESS_ETA_LEN);
+ p += PROGRESS_ETA_LEN;
}
}
else
@@ -1161,21 +1149,23 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
int ncols;
/* Note to translators: this should not take up more room than
- available here. Abbreviate if necessary. */
- strcpy (p, _(" in "));
+ available here (6 columns). Abbreviate if necessary. */
+ strcpy (p, _(" in "));
nbytes = strlen (p);
ncols = count_cols (p);
bytes_cols_diff = nbytes - ncols;
- p += nbytes;
if (dl_total_time >= 10)
- strcpy (p, eta_to_human_short ((int) (dl_total_time + 0.5), false));
+ ncols += sprintf (p + nbytes, "%s", eta_to_human_short ((int) (dl_total_time + 0.5), false));
else
- sprintf (p, "%ss", print_decimal (dl_total_time));
- move_to_end (p);
+ ncols += sprintf (p + nbytes, "%ss", print_decimal (dl_total_time));
+ p += ncols + bytes_cols_diff;
+ memset (p, ' ', PROGRESS_ETA_LEN - ncols);
+ p += PROGRESS_ETA_LEN - ncols;
}
- while (p - bp->buffer - bytes_cols_diff < bp->width)
- *p++ = ' ';
+ padding = bp->width - count_cols (bp->buffer);
+ memset (p, ' ', padding);
+ p += padding;
*p = '\0';
/* 2014-11-14 Darshit Shah <darnir@gmail.com>
@@ -1185,7 +1175,7 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
* assertion fails. Instead Wget should continue downloading and display a
* horrible and irritating progress bar that spams the screen with newlines.
*/
- assert (count_cols (bp->buffer) <= bp->width + 1);
+ assert (count_cols (bp->buffer) == bp->width);
}
/* Print the contents of the buffer as a one-line ASCII "image" so