bool
valid_progress_implementation_p (const char *name)
{
- int i;
+ size_t i;
struct progress_implementation *pi = implementations;
char *colon = strchr (name, ':');
- int namelen = colon ? colon - name : strlen (name);
+ size_t namelen = colon ? (size_t) (colon - name) : strlen (name);
for (i = 0; i < countof (implementations); i++, pi++)
if (!strncmp (pi->name, name, namelen))
void
set_progress_implementation (const char *name)
{
- int i, namelen;
+ size_t i, namelen;
struct progress_implementation *pi = implementations;
const char *colon;
name = DEFAULT_PROGRESS_IMPLEMENTATION;
colon = strchr (name, ':');
- namelen = colon ? colon - name : strlen (name);
+ namelen = colon ? (size_t) (colon - name) : strlen (name);
for (i = 0; i < countof (implementations); i++, pi++)
if (!strncmp (pi->name, name, namelen))
}
else
fprintf (stderr,
- _("Invalid dot style specification `%s'; leaving unchanged.\n"),
- params);
+ _("Invalid dot style specification %s; leaving unchanged.\n"),
+ quote (params));
}
\f
/* "Thermometer" (bar) progress. */
#endif
}
-#if ! HAVE_WCWIDTH
-#define wcwidth(wc) (1)
-#endif
-
+#if USE_NLS_PROGRESS_BAR
int
count_cols (const char *mbs)
{
int bytes;
int remaining = strlen(mbs);
int cols = 0;
+ int wccols;
while (*mbs != '\0')
{
bytes = mbtowc (&wc, mbs, remaining);
+ assert (bytes != 0); /* Only happens when *mbs == '\0' */
+ if (bytes == -1)
+ {
+ /* Invalid sequence. We'll just have to fudge it. */
+ return cols + remaining;
+ }
mbs += bytes;
remaining -= bytes;
- cols += wcwidth(wc);
+ wccols = wcwidth(wc);
+ cols += (wccols == -1? 1 : wccols);
}
return cols;
}
-
-/* Translation note: "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_trans;
-static int bytes_cols_diff;
+#else
+# define count_cols(mbs) ((int)(strlen(mbs)))
+#endif
const char *
-get_eta (void)
+get_eta (int *bcd)
{
+ /* Translation note: "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_trans;
+ static int bytes_cols_diff;
if (eta_trans == NULL)
{
int nbytes;
int ncols;
+#if USE_NLS_PROGRESS_BAR
eta_trans = _(eta_str);
+#else
+ eta_trans = eta_str;
+#endif
/* Determine the number of bytes used in the translated string,
* versus the number of columns used. This is to figure out how
bytes_cols_diff = nbytes - ncols;
}
+ if (bcd != NULL)
+ *bcd = bytes_cols_diff;
+
return eta_trans;
}
"[]" - progress bar decorations - 2 chars
" nnn,nnn,nnn" - downloaded bytes - 12 chars or very rarely more
" 12.5K/s" - download rate - 8 chars
- " eta 36m 51s" - ETA - 13 chars
+ " eta 36m 51s" - ETA - 14 chars
"=====>..." - progress bar - the rest
*/
int dlbytes_size = 1 + MAX (size_grouped_len, 11);
- int progress_size = bp->width - (4 + 2 + dlbytes_size + 8 + 13);
+ int progress_size = bp->width - (4 + 2 + dlbytes_size + 8 + 14);
+
+ /* The difference between the number of bytes used,
+ and the number of columns used. */
+ int bytes_cols_diff = 0;
if (progress_size < 5)
progress_size = 0;
bp->last_eta_time = dl_total_time;
}
- sprintf (p, get_eta(), eta_to_human_short (eta, false));
+ sprintf (p, get_eta(&bytes_cols_diff),
+ eta_to_human_short (eta, false));
move_to_end (p);
}
else if (bp->total_length > 0)
else
{
/* When the download is done, print the elapsed time. */
+ int nbytes;
+ int ncols;
/* Note to translators: this should not take up more room than
available here. Abbreviate if necessary. */
strcpy (p, _(" in "));
- move_to_end (p); /* not p+=6, think translations! */
+ 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));
else
move_to_end (p);
}
- assert (p - bp->buffer - bytes_cols_diff - size_grouped_diff <= bp->width);
-
while (p - bp->buffer - bytes_cols_diff - size_grouped_diff < bp->width)
*p++ = ' ';
*p = '\0';