From 16b833c16dcb64a5c2b508abf69856adb3f99e11 Mon Sep 17 00:00:00 2001 From: Micah Cowan Date: Wed, 30 Apr 2008 13:48:30 -0700 Subject: [PATCH] Fix too-many-spaces problem for multibyte progress bars, when ETA string not displayed. --- src/ChangeLog | 6 ++++++ src/progress.c | 30 +++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 3f73d2b2..d618697b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2008-04-30 Micah Cowan + + * progress.c (create_image): Fix glitch where too many spaces are + printed on lines that don't display the ETA, in multibyte + locales. + 2008-04-27 Rabin Vincent * http.c (http_loop): Fix return for the case where we don't diff --git a/src/progress.c b/src/progress.c index 9ea74b03..9e009993 100644 --- a/src/progress.c +++ b/src/progress.c @@ -797,15 +797,14 @@ count_cols (const char *mbs) # define count_cols(mbs) ((int)(strlen(mbs))) #endif -/* 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; - 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; @@ -829,6 +828,9 @@ get_eta (void) bytes_cols_diff = nbytes - ncols; } + if (bcd != NULL) + *bcd = bytes_cols_diff; + return eta_trans; } @@ -881,6 +883,10 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done) int dlbytes_size = 1 + MAX (size_grouped_len, 11); 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; @@ -1023,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) @@ -1035,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 -- 2.39.2