diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-03-26 20:06:24 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-03-26 20:06:24 +0000 |
commit | 11b9f266104bf1c1bd21ec64cff22dbb5d0983a6 (patch) | |
tree | cc0dd985ed6e44150443bc3177e6245e42f14cee | |
parent | 8ee649a02e97e9d4e770a8138ba94c0f3ddd8055 (diff) | |
download | busybox-w32-11b9f266104bf1c1bd21ec64cff22dbb5d0983a6.tar.gz busybox-w32-11b9f266104bf1c1bd21ec64cff22dbb5d0983a6.tar.bz2 busybox-w32-11b9f266104bf1c1bd21ec64cff22dbb5d0983a6.zip |
fbsplash: fix broken handling of buffered case:
"{echo 45; echo 33; } | { sleep 1; fbsplash -f - ...; }"
function old new delta
fb_drawprogressbar - 413 +413
xmalloc_fgetline - 46 +46
xmalloc_reads 184 183 -1
xmalloc_getline 46 - -46
fbsplash_main 1472 1030 -442
------------------------------------------------------------------------------
(add/remove: 2/1 grow/shrink: 0/2 up/down: 459/-489) Total: -30 bytes
text data bss dec hex filename
801181 641 7380 809202 c58f2 busybox_old
801151 641 7380 809172 c58d4 busybox_unstripped
-rw-r--r-- | miscutils/fbsplash.c | 61 |
1 files changed, 24 insertions, 37 deletions
diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c index a40c585a0..2fc3fae13 100644 --- a/miscutils/fbsplash.c +++ b/miscutils/fbsplash.c | |||
@@ -97,7 +97,7 @@ static void fb_open(const char *strfb_device) | |||
97 | * Draw hollow rectangle on framebuffer | 97 | * Draw hollow rectangle on framebuffer |
98 | * \param nx1pos,ny1pos upper left position | 98 | * \param nx1pos,ny1pos upper left position |
99 | * \param nx2pos,ny2pos down right position | 99 | * \param nx2pos,ny2pos down right position |
100 | * \param nred24,ngreen24,nblue24 rgb color | 100 | * \param nred,ngreen,nblue rgb color |
101 | */ | 101 | */ |
102 | static void fb_drawrectangle(int nx1pos, int ny1pos, int nx2pos, int ny2pos, | 102 | static void fb_drawrectangle(int nx1pos, int ny1pos, int nx2pos, int ny2pos, |
103 | unsigned char nred, unsigned char ngreen, unsigned char nblue) | 103 | unsigned char nred, unsigned char ngreen, unsigned char nblue) |
@@ -135,7 +135,7 @@ static void fb_drawrectangle(int nx1pos, int ny1pos, int nx2pos, int ny2pos, | |||
135 | * Draw filled rectangle on framebuffer | 135 | * Draw filled rectangle on framebuffer |
136 | * \param nx1pos,ny1pos upper left position | 136 | * \param nx1pos,ny1pos upper left position |
137 | * \param nx2pos,ny2pos down right position | 137 | * \param nx2pos,ny2pos down right position |
138 | * \param nred24,ngreen24,nblue24 rgb color | 138 | * \param nred,ngreen,nblue rgb color |
139 | */ | 139 | */ |
140 | static void fb_drawfullrectangle(int nx1pos, int ny1pos, int nx2pos, int ny2pos, | 140 | static void fb_drawfullrectangle(int nx1pos, int ny1pos, int nx2pos, int ny2pos, |
141 | unsigned char nred, unsigned char ngreen, unsigned char nblue) | 141 | unsigned char nred, unsigned char ngreen, unsigned char nblue) |
@@ -165,11 +165,12 @@ static void fb_drawfullrectangle(int nx1pos, int ny1pos, int nx2pos, int ny2pos, | |||
165 | 165 | ||
166 | /** | 166 | /** |
167 | * Draw a progress bar on framebuffer | 167 | * Draw a progress bar on framebuffer |
168 | * \param nPercent percentage of loading | 168 | * \param percent percentage of loading |
169 | */ | 169 | */ |
170 | static void fb_drawprogressbar(unsigned nPercent) | 170 | static void fb_drawprogressbar(unsigned percent) |
171 | { | 171 | { |
172 | int i, left_x, top_y, width, height; | 172 | int i, left_x, top_y, width, height; |
173 | |||
173 | // outer box | 174 | // outer box |
174 | left_x = G.nbar_posx; | 175 | left_x = G.nbar_posx; |
175 | top_y = G.nbar_posy; | 176 | top_y = G.nbar_posy; |
@@ -195,9 +196,9 @@ static void fb_drawprogressbar(unsigned nPercent) | |||
195 | left_x + width, top_y + height, | 196 | left_x + width, top_y + height, |
196 | G.nbar_colr, G.nbar_colg, G.nbar_colb); | 197 | G.nbar_colr, G.nbar_colg, G.nbar_colb); |
197 | 198 | ||
198 | if (nPercent > 0) { | 199 | if (percent > 0) { |
199 | // actual progress bar | 200 | // actual progress bar |
200 | width = width*nPercent/100; | 201 | width = width * percent / 100; |
201 | i = height; | 202 | i = height; |
202 | if (height == 0) | 203 | if (height == 0) |
203 | height++; // divide by 0 is bad | 204 | height++; // divide by 0 is bad |
@@ -294,9 +295,9 @@ static void init(const char *ini_filename) | |||
294 | FILE *inifile; | 295 | FILE *inifile; |
295 | char *buf; | 296 | char *buf; |
296 | 297 | ||
297 | inifile = xfopen(ini_filename, "r"); | 298 | inifile = xfopen_stdin(ini_filename); |
298 | 299 | ||
299 | while ((buf = xmalloc_getline(inifile)) != NULL) { | 300 | while ((buf = xmalloc_fgetline(inifile)) != NULL) { |
300 | char *value_str; | 301 | char *value_str; |
301 | int val; | 302 | int val; |
302 | 303 | ||
@@ -360,10 +361,8 @@ static void init(const char *ini_filename) | |||
360 | int fbsplash_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 361 | int fbsplash_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
361 | int fbsplash_main(int argc ATTRIBUTE_UNUSED, char **argv) | 362 | int fbsplash_main(int argc ATTRIBUTE_UNUSED, char **argv) |
362 | { | 363 | { |
363 | char num_buf[16]; | ||
364 | const char *fb_device, *ini_filename, *fifo_filename; | 364 | const char *fb_device, *ini_filename, *fifo_filename; |
365 | int fd = fd; // for compiler | 365 | FILE *fp = fp; // for compiler |
366 | int len, num; | ||
367 | bool bCursorOff; | 366 | bool bCursorOff; |
368 | 367 | ||
369 | INIT_G(); | 368 | INIT_G(); |
@@ -383,13 +382,8 @@ int fbsplash_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
383 | if (!G.image_filename) | 382 | if (!G.image_filename) |
384 | bb_show_usage(); | 383 | bb_show_usage(); |
385 | 384 | ||
386 | if (fifo_filename) { | 385 | if (fifo_filename) |
387 | fd = STDIN_FILENO; | 386 | fp = xfopen_stdin(fifo_filename); |
388 | if (NOT_LONE_DASH(fifo_filename)) { | ||
389 | // open command fifo/pipe | ||
390 | fd = xopen(fifo_filename, O_RDONLY | O_NOCTTY); | ||
391 | } | ||
392 | } | ||
393 | 387 | ||
394 | fb_open(fb_device); | 388 | fb_open(fb_device); |
395 | 389 | ||
@@ -401,44 +395,37 @@ int fbsplash_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
401 | fb_drawimage(); | 395 | fb_drawimage(); |
402 | 396 | ||
403 | if (fifo_filename) { | 397 | if (fifo_filename) { |
404 | num = 0; | 398 | unsigned num; |
405 | goto draw_bar; | 399 | char *num_buf; |
406 | 400 | ||
407 | while (1) { | 401 | fb_drawprogressbar(0); |
408 | // block on read, waiting for some input | 402 | // Block on read, waiting for some input. |
409 | len = safe_read(fd, num_buf, sizeof(num_buf) - 1); | 403 | // Use of <stdio.h> style I/O allows to correctly |
410 | if (len <= 0) // EOF/error | 404 | // handle a case when we have many buffered lines |
411 | break; | 405 | // already in the pipe. |
412 | num_buf[len] = '\0'; | 406 | while ((num_buf = xmalloc_fgetline(fp)) != NULL) { |
413 | // parse command | ||
414 | if (strncmp(num_buf, "exit", 4) == 0) { | 407 | if (strncmp(num_buf, "exit", 4) == 0) { |
415 | DEBUG_MESSAGE("exit"); | 408 | DEBUG_MESSAGE("exit"); |
416 | break; | 409 | break; |
417 | } | 410 | } |
418 | num = atoi(num_buf); | 411 | num = atoi(num_buf); |
419 | if (isdigit(num_buf[0]) && (num >= 0) && (num <= 100)) { | 412 | if (isdigit(num_buf[0]) && (num <= 100)) { |
420 | #if DEBUG | 413 | #if DEBUG |
421 | char strVal[10]; | 414 | char strVal[10]; |
422 | sprintf(strVal, "%d", num); | 415 | sprintf(strVal, "%d", num); |
423 | DEBUG_MESSAGE(strVal); | 416 | DEBUG_MESSAGE(strVal); |
424 | #endif | 417 | #endif |
425 | draw_bar: | ||
426 | fb_drawprogressbar(num); | 418 | fb_drawprogressbar(num); |
427 | } | 419 | } |
420 | free(num_buf); | ||
428 | } | 421 | } |
429 | if (bCursorOff) { | 422 | if (bCursorOff) { |
430 | // restore cursor | 423 | // restore cursor |
431 | full_write(STDOUT_FILENO, "\x1b" "[?25h", 6); | 424 | full_write(STDOUT_FILENO, "\x1b" "[?25h", 6); |
432 | } | 425 | } |
433 | if (ENABLE_FEATURE_CLEAN_UP) | 426 | if (ENABLE_FEATURE_CLEAN_UP) |
434 | close(fd); | 427 | fclose(fp); |
435 | } | 428 | } |
436 | 429 | ||
437 | #if DEBUG | ||
438 | if (ENABLE_FEATURE_CLEAN_UP) | ||
439 | if (G.bdebug_messages) | ||
440 | fclose(G.logfile_fd); | ||
441 | #endif | ||
442 | |||
443 | return EXIT_SUCCESS; | 430 | return EXIT_SUCCESS; |
444 | } | 431 | } |