summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2011-02-11 18:56:13 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2011-02-11 18:56:13 +0100
commitd55e13964916af6a083be881bffdb493af287c1d (patch)
tree399af6f19989d3efedb0a66f0e7b99184b245bb9
parente52e67cb512e775fd83ca399cc807c363ba59dcc (diff)
progress meter: move file name to bb_progress_t. +20 bytes
We were doing expensive unicode conversion on every update Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--include/libbb.h12
-rw-r--r--libbb/progress.c24
-rw-r--r--networking/tftp.c10
-rw-r--r--networking/wget.c4
4 files changed, 27 insertions, 23 deletions
diff --git a/include/libbb.h b/include/libbb.h
index c0178801f..7581cd4c4 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1587,15 +1587,21 @@ typedef struct bb_progress_t {
off_t lastsize;
unsigned lastupdate_sec;
unsigned start_sec;
- smallint inited;
+ const char *curfile;
} bb_progress_t;
-void bb_progress_init(bb_progress_t *p) FAST_FUNC;
-void bb_progress_update(bb_progress_t *p, const char *curfile,
+#define is_bb_progress_inited(p) ((p)->curfile != NULL)
+#define bb_progress_free(p) do { \
+ if (ENABLE_UNICODE_SUPPORT) free((char*)((p)->curfile)); \
+ (p)->curfile = NULL; \
+} while (0)
+void bb_progress_init(bb_progress_t *p, const char *curfile) FAST_FUNC;
+void bb_progress_update(bb_progress_t *p,
uoff_t beg_range,
uoff_t transferred,
uoff_t totalsize) FAST_FUNC;
+
extern const char *applet_name;
/* Some older linkers don't perform string merging, we used to have common strings
diff --git a/libbb/progress.c b/libbb/progress.c
index 1062e9a0d..1d260dd08 100644
--- a/libbb/progress.c
+++ b/libbb/progress.c
@@ -52,12 +52,17 @@ static unsigned int get_tty2_width(void)
return width;
}
-void FAST_FUNC bb_progress_init(bb_progress_t *p)
+void FAST_FUNC bb_progress_init(bb_progress_t *p, const char *curfile)
{
+#if ENABLE_UNICODE_SUPPORT
+ init_unicode();
+ p->curfile = unicode_conv_to_printable_fixedwidth(/*NULL,*/ curfile, 20);
+#else
+ p->curfile = curfile;
+#endif
p->start_sec = monotonic_sec();
p->lastupdate_sec = p->start_sec;
p->lastsize = 0;
- p->inited = 1;
}
/* File already had beg_size bytes.
@@ -68,7 +73,6 @@ void FAST_FUNC bb_progress_init(bb_progress_t *p)
* If totalsize == 0, then it is unknown.
*/
void FAST_FUNC bb_progress_update(bb_progress_t *p,
- const char *curfile,
uoff_t beg_size,
uoff_t transferred,
uoff_t totalsize)
@@ -130,16 +134,10 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p,
beg_and_transferred = beg_size + transferred;
ratio = 100 * beg_and_transferred / totalsize;
-#if ENABLE_UNICODE_SUPPORT
- init_unicode();
- {
- char *buf = unicode_conv_to_printable_fixedwidth(/*NULL,*/ curfile, 20);
- fprintf(stderr, "\r%s%4u%% ", buf, ratio);
- free(buf);
- }
-#else
- fprintf(stderr, "\r%-20.20s%4u%% ", curfile, ratio);
-#endif
+ if (ENABLE_UNICODE_SUPPORT)
+ fprintf(stderr, "\r%s%4u%% ", p->curfile, ratio);
+ else
+ fprintf(stderr, "\r%-20.20s%4u%% ", p->curfile, ratio);
barlength = get_tty2_width() - 49;
if (barlength > 0) {
diff --git a/networking/tftp.c b/networking/tftp.c
index fcd933f6a..2a3991755 100644
--- a/networking/tftp.c
+++ b/networking/tftp.c
@@ -107,19 +107,19 @@ struct BUG_G_too_big {
#if ENABLE_FEATURE_TFTP_PROGRESS_BAR
static void tftp_progress_update(void)
{
- bb_progress_update(&G.pmt, G.file, 0, G.pos, G.size);
+ bb_progress_update(&G.pmt, 0, G.pos, G.size);
}
static void tftp_progress_init(void)
{
- bb_progress_init(&G.pmt);
+ bb_progress_init(&G.pmt, G.file);
tftp_progress_update();
}
static void tftp_progress_done(void)
{
- if (G.pmt.inited) {
+ if (is_bb_progress_inited(&G.pmt)) {
tftp_progress_update();
bb_putchar_stderr('\n');
- G.pmt.inited = 0;
+ bb_progress_free(p);
}
}
#else
@@ -445,7 +445,7 @@ static int tftp_protocol(
#if ENABLE_FEATURE_TFTP_PROGRESS_BAR
if (ENABLE_TFTP && remote_file) /* tftp */
G.pos = (block_nr - 1) * (uoff_t)blksize;
- if (G.pmt.inited)
+ if (is_bb_progress_inited(&G.pmt))
tftp_progress_update();
#endif
/* Was it final ACK? then exit */
diff --git a/networking/wget.c b/networking/wget.c
index d81426e8d..f2d7daf2f 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -81,9 +81,9 @@ static void progress_meter(int flag)
return;
if (flag == PROGRESS_START)
- bb_progress_init(&G.pmt);
+ bb_progress_init(&G.pmt, G.curfile);
- bb_progress_update(&G.pmt, G.curfile, G.beg_range, G.transferred,
+ bb_progress_update(&G.pmt, G.beg_range, G.transferred,
G.chunked ? 0 : G.beg_range + G.transferred + G.content_len);
if (flag == PROGRESS_END) {