X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fprogress.c;h=2f1c22259dd1800579a5e94edb704436ac570a6f;hp=d77f99b6951d12b7c63360704c86a21e2ac2f413;hb=123f5c39669abc055987d69a311785c861494c87;hpb=35b72cc941175a2c13989c7d1e5a77a948d5c432 diff --git a/src/progress.c b/src/progress.c index d77f99b6..2f1c2225 100644 --- a/src/progress.c +++ b/src/progress.c @@ -93,10 +93,10 @@ static int current_impl_locked; 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)) @@ -109,7 +109,7 @@ valid_progress_implementation_p (const char *name) void set_progress_implementation (const char *name) { - int i, namelen; + size_t i, namelen; struct progress_implementation *pi = implementations; const char *colon; @@ -117,7 +117,7 @@ set_progress_implementation (const char *name) 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)) @@ -453,8 +453,8 @@ dot_set_params (const char *params) } else fprintf (stderr, - _("Invalid dot style specification `%s'; leaving unchanged.\n"), - params); + _("Invalid dot style specification %s; leaving unchanged.\n"), + quote (params)); } /* "Thermometer" (bar) progress. */ @@ -767,10 +767,7 @@ update_speed_ring (struct bar_progress *bp, wgint howmuch, double dltime) #endif } -#if ! HAVE_WCWIDTH -#define wcwidth(wc) (1) -#endif - +#if USE_NLS_PROGRESS_BAR int count_cols (const char *mbs) { @@ -778,32 +775,46 @@ 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 @@ -817,6 +828,9 @@ get_eta (void) bytes_cols_diff = nbytes - ncols; } + if (bcd != NULL) + *bcd = bytes_cols_diff; + return eta_trans; } @@ -862,12 +876,16 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done) "[]" - 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; @@ -1011,7 +1029,8 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done) 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) @@ -1023,11 +1042,16 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done) 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 @@ -1035,8 +1059,6 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done) 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';