diff options
author | Magnus Damm <magnus.damm@gmail.com> | 2009-11-08 16:34:43 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-11-08 16:34:43 +0100 |
commit | f5914992f316f8a628505067e108e7ba5a9590ba (patch) | |
tree | e7e34807bf4b5fab00303064c0aab5df1bd8b543 /libbb | |
parent | f5c2f72917e5f75634665f67a6105e1e82ece875 (diff) | |
download | busybox-w32-f5914992f316f8a628505067e108e7ba5a9590ba.tar.gz busybox-w32-f5914992f316f8a628505067e108e7ba5a9590ba.tar.bz2 busybox-w32-f5914992f316f8a628505067e108e7ba5a9590ba.zip |
wget: factor out progress bar code
Signed-off-by: Magnus Damm <magnus.damm@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/Kbuild | 1 | ||||
-rw-r--r-- | libbb/progress.c | 152 |
2 files changed, 153 insertions, 0 deletions
diff --git a/libbb/Kbuild b/libbb/Kbuild index c3c02b33e..d9d5ad793 100644 --- a/libbb/Kbuild +++ b/libbb/Kbuild | |||
@@ -76,6 +76,7 @@ lib-y += printable.o | |||
76 | lib-y += print_flags.o | 76 | lib-y += print_flags.o |
77 | lib-y += process_escape_sequence.o | 77 | lib-y += process_escape_sequence.o |
78 | lib-y += procps.o | 78 | lib-y += procps.o |
79 | lib-y += progress.o | ||
79 | lib-y += ptr_to_globals.o | 80 | lib-y += ptr_to_globals.o |
80 | lib-y += read.o | 81 | lib-y += read.o |
81 | lib-y += read_key.o | 82 | lib-y += read_key.o |
diff --git a/libbb/progress.c b/libbb/progress.c new file mode 100644 index 000000000..f6f26922c --- /dev/null +++ b/libbb/progress.c | |||
@@ -0,0 +1,152 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Progress bar code. | ||
4 | */ | ||
5 | /* Original copyright notice which applies to the CONFIG_FEATURE_WGET_STATUSBAR stuff, | ||
6 | * much of which was blatantly stolen from openssh. | ||
7 | */ | ||
8 | /*- | ||
9 | * Copyright (c) 1992, 1993 | ||
10 | * The Regents of the University of California. All rights reserved. | ||
11 | * | ||
12 | * Redistribution and use in source and binary forms, with or without | ||
13 | * modification, are permitted provided that the following conditions | ||
14 | * are met: | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions and the following disclaimer. | ||
17 | * 2. Redistributions in binary form must reproduce the above copyright | ||
18 | * notice, this list of conditions and the following disclaimer in the | ||
19 | * documentation and/or other materials provided with the distribution. | ||
20 | * | ||
21 | * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change | ||
22 | * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change> | ||
23 | * | ||
24 | * 4. Neither the name of the University nor the names of its contributors | ||
25 | * may be used to endorse or promote products derived from this software | ||
26 | * without specific prior written permission. | ||
27 | * | ||
28 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||
29 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
30 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
31 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||
32 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
33 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
34 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
35 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
36 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
37 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
38 | * SUCH DAMAGE. | ||
39 | */ | ||
40 | #include "libbb.h" | ||
41 | #include "unicode.h" | ||
42 | |||
43 | enum { | ||
44 | /* Seconds when xfer considered "stalled" */ | ||
45 | STALLTIME = 5 | ||
46 | }; | ||
47 | |||
48 | static unsigned int get_tty2_width(void) | ||
49 | { | ||
50 | unsigned width; | ||
51 | get_terminal_width_height(2, &width, NULL); | ||
52 | return width; | ||
53 | } | ||
54 | |||
55 | void FAST_FUNC bb_progress_init(bb_progress_t *p) | ||
56 | { | ||
57 | p->start_sec = monotonic_sec(); | ||
58 | p->lastupdate_sec = p->start_sec; | ||
59 | p->lastsize = 0; | ||
60 | } | ||
61 | |||
62 | void FAST_FUNC bb_progress_update(bb_progress_t *p, | ||
63 | const char *curfile, | ||
64 | off_t beg_range, | ||
65 | off_t transferred, | ||
66 | off_t totalsize) | ||
67 | { | ||
68 | off_t abbrevsize; | ||
69 | unsigned since_last_update, elapsed; | ||
70 | unsigned ratio; | ||
71 | int barlength, i; | ||
72 | |||
73 | ratio = 100; | ||
74 | if (totalsize) { | ||
75 | /* long long helps to have it working even if !LFS */ | ||
76 | ratio = (unsigned) (100ULL * (transferred+beg_range) / totalsize); | ||
77 | if (ratio > 100) ratio = 100; | ||
78 | } | ||
79 | |||
80 | #if ENABLE_FEATURE_ASSUME_UNICODE | ||
81 | check_unicode_in_env(); | ||
82 | /* libbb candidate? */ | ||
83 | { | ||
84 | wchar_t wbuf21[21]; | ||
85 | char *buf = xstrdup(curfile); | ||
86 | unsigned len; | ||
87 | |||
88 | /* trim to 20 wide chars max (sets wbuf21[20] to 0) | ||
89 | * also, in case mbstowcs fails, we at least | ||
90 | * dont get garbage */ | ||
91 | memset(wbuf21, 0, sizeof(wbuf21)); | ||
92 | /* convert to wide chars, no more than 20 */ | ||
93 | len = mbstowcs(wbuf21, curfile, 20); /* NB: may return -1 */ | ||
94 | /* back to multibyte; cant overflow */ | ||
95 | wcstombs(buf, wbuf21, INT_MAX); | ||
96 | len = (len > 20) ? 0 : 20 - len; | ||
97 | fprintf(stderr, "\r%s%*s%4d%% ", buf, len, "", ratio); | ||
98 | free(buf); | ||
99 | } | ||
100 | #else | ||
101 | fprintf(stderr, "\r%-20.20s%4d%% ", curfile, ratio); | ||
102 | #endif | ||
103 | |||
104 | barlength = get_tty2_width() - 49; | ||
105 | if (barlength > 0) { | ||
106 | /* god bless gcc for variable arrays :) */ | ||
107 | i = barlength * ratio / 100; | ||
108 | { | ||
109 | char buf[i+1]; | ||
110 | memset(buf, '*', i); | ||
111 | buf[i] = '\0'; | ||
112 | fprintf(stderr, "|%s%*s|", buf, barlength - i, ""); | ||
113 | } | ||
114 | } | ||
115 | i = 0; | ||
116 | abbrevsize = transferred + beg_range; | ||
117 | while (abbrevsize >= 100000) { | ||
118 | i++; | ||
119 | abbrevsize >>= 10; | ||
120 | } | ||
121 | /* see http://en.wikipedia.org/wiki/Tera */ | ||
122 | fprintf(stderr, "%6d%c ", (int)abbrevsize, " kMGTPEZY"[i]); | ||
123 | |||
124 | elapsed = monotonic_sec(); | ||
125 | since_last_update = elapsed - p->lastupdate_sec; | ||
126 | if (transferred > p->lastsize) { | ||
127 | p->lastupdate_sec = elapsed; | ||
128 | p->lastsize = transferred; | ||
129 | if (since_last_update >= STALLTIME) { | ||
130 | /* We "cut off" these seconds from elapsed time | ||
131 | * by adjusting start time */ | ||
132 | p->start_sec += since_last_update; | ||
133 | } | ||
134 | since_last_update = 0; /* we are un-stalled now */ | ||
135 | } | ||
136 | elapsed -= p->start_sec; /* now it's "elapsed since start" */ | ||
137 | |||
138 | if (since_last_update >= STALLTIME) { | ||
139 | fprintf(stderr, " - stalled -"); | ||
140 | } else { | ||
141 | off_t to_download = totalsize - beg_range; | ||
142 | if (!totalsize || transferred <= 0 || (int)elapsed <= 0 || transferred > to_download) { | ||
143 | fprintf(stderr, "--:--:-- ETA"); | ||
144 | } else { | ||
145 | /* to_download / (transferred/elapsed) - elapsed: */ | ||
146 | int eta = (int) ((unsigned long long)to_download*elapsed/transferred - elapsed); | ||
147 | /* (long long helps to have working ETA even if !LFS) */ | ||
148 | i = eta % 3600; | ||
149 | fprintf(stderr, "%02d:%02d:%02d ETA", eta / 3600, i / 60, i % 60); | ||
150 | } | ||
151 | } | ||
152 | } | ||