X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fprogress.c;h=219b5beaef7a0dba92213648e03e397c9db490e5;hp=d77f99b6951d12b7c63360704c86a21e2ac2f413;hb=2f6aa1d7417df1dfc58597777686fbd77179b9fd;hpb=35b72cc941175a2c13989c7d1e5a77a948d5c432 diff --git a/src/progress.c b/src/progress.c index d77f99b6..219b5bea 100644 --- a/src/progress.c +++ b/src/progress.c @@ -1,6 +1,6 @@ /* Download progress. - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, - 2008 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, + 2010, 2011 Free Software Foundation, Inc. This file is part of GNU Wget. @@ -34,9 +34,7 @@ as that of the covered work. */ #include #include #include -#ifdef HAVE_UNISTD_H -# include -#endif +#include #include #ifdef HAVE_WCHAR_H # include @@ -93,10 +91,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 +107,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 +115,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 +451,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. */ @@ -715,7 +713,7 @@ update_speed_ring (struct bar_progress *bp, wgint howmuch, double dltime) if (bp->stalled) { bp->stalled = false; - /* "recent_age" includes the the entired stalled period, which + /* "recent_age" includes the entired stalled period, which could be very long. Don't update the speed ring with that value because the current bandwidth would start too small. Start with an arbitrary (but more reasonable) time value and @@ -767,10 +765,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 +773,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) { + /* 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_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 +826,9 @@ get_eta (void) bytes_cols_diff = nbytes - ncols; } + if (bcd != NULL) + *bcd = bytes_cols_diff; + return eta_trans; } @@ -862,12 +874,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 +1027,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 +1040,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 +1057,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'; @@ -1135,7 +1155,7 @@ eta_to_human_short (int secs, bool condensed) else if (secs < 48 * 3600) sprintf (buf, "%dh%s%dm", secs / 3600, space, (secs / 60) % 60); else if (secs < 100 * 86400) - sprintf (buf, "%dd%s%dh", secs / 86400, space, (secs / 3600) % 60); + sprintf (buf, "%dd%s%dh", secs / 86400, space, (secs / 3600) % 24); else /* even (2^31-1)/86400 doesn't overflow BUF. */ sprintf (buf, "%dd", secs / 86400);