diff options
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/dump.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/libbb/dump.c b/libbb/dump.c index cfb9d94f9..77d76611b 100644 --- a/libbb/dump.c +++ b/libbb/dump.c | |||
@@ -242,7 +242,7 @@ static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs) | |||
242 | pr->flags = F_P; | 242 | pr->flags = F_P; |
243 | *p1 = 'c'; | 243 | *p1 = 'c'; |
244 | goto DO_BYTE_COUNT_1; | 244 | goto DO_BYTE_COUNT_1; |
245 | case 'u': /* %_p: chars, 'nul', 'esc' etc for nonprintable */ | 245 | case 'u': /* %_u: chars, 'nul', 'esc' etc for nonprintable */ |
246 | pr->flags = F_U; | 246 | pr->flags = F_U; |
247 | /* *p1 = 'c'; set in conv_u */ | 247 | /* *p1 = 'c'; set in conv_u */ |
248 | goto DO_BYTE_COUNT_1; | 248 | goto DO_BYTE_COUNT_1; |
@@ -322,8 +322,7 @@ static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs) | |||
322 | p2 = NULL; | 322 | p2 = NULL; |
323 | for (p1 = pr->fmt; *p1; ++p1) | 323 | for (p1 = pr->fmt; *p1; ++p1) |
324 | p2 = isspace(*p1) ? p1 : NULL; | 324 | p2 = isspace(*p1) ? p1 : NULL; |
325 | if (p2) | 325 | pr->nospace = p2; |
326 | pr->nospace = p2; | ||
327 | } | 326 | } |
328 | } | 327 | } |
329 | } | 328 | } |
@@ -477,7 +476,7 @@ static void bpad(PR *pr) | |||
477 | 476 | ||
478 | static const char conv_str[] ALIGN1 = | 477 | static const char conv_str[] ALIGN1 = |
479 | "\0" "\\""0""\0" | 478 | "\0" "\\""0""\0" |
480 | "\007""\\""a""\0" /* \a */ | 479 | "\007""\\""a""\0" |
481 | "\b" "\\""b""\0" | 480 | "\b" "\\""b""\0" |
482 | "\f" "\\""f""\0" | 481 | "\f" "\\""f""\0" |
483 | "\n" "\\""n""\0" | 482 | "\n" "\\""n""\0" |
@@ -539,7 +538,6 @@ static void conv_u(PR *pr, unsigned char *p) | |||
539 | static NOINLINE void display(priv_dumper_t* dumper) | 538 | static NOINLINE void display(priv_dumper_t* dumper) |
540 | { | 539 | { |
541 | unsigned char *bp; | 540 | unsigned char *bp; |
542 | unsigned char savech = '\0'; | ||
543 | 541 | ||
544 | while ((bp = get(dumper)) != NULL) { | 542 | while ((bp = get(dumper)) != NULL) { |
545 | FS *fs; | 543 | FS *fs; |
@@ -560,6 +558,8 @@ static NOINLINE void display(priv_dumper_t* dumper) | |||
560 | PR *pr; | 558 | PR *pr; |
561 | for (pr = fu->nextpr; pr; dumper->pub.address += pr->bcnt, | 559 | for (pr = fu->nextpr; pr; dumper->pub.address += pr->bcnt, |
562 | bp += pr->bcnt, pr = pr->nextpr) { | 560 | bp += pr->bcnt, pr = pr->nextpr) { |
561 | unsigned char savech; | ||
562 | |||
563 | if (dumper->eaddress | 563 | if (dumper->eaddress |
564 | && dumper->pub.address >= dumper->eaddress | 564 | && dumper->pub.address >= dumper->eaddress |
565 | ) { | 565 | ) { |
@@ -568,9 +568,16 @@ static NOINLINE void display(priv_dumper_t* dumper) | |||
568 | fputs_stdout(dumper->pub.xxd_eofstring); | 568 | fputs_stdout(dumper->pub.xxd_eofstring); |
569 | return; | 569 | return; |
570 | } | 570 | } |
571 | if (dumper->pub.od_eofstring) { | ||
572 | /* od support: requested to not pad incomplete blocks */ | ||
573 | /* ... but do print final offset */ | ||
574 | fputs_stdout(dumper->pub.od_eofstring); | ||
575 | goto endfu; | ||
576 | } | ||
571 | if (!(pr->flags & (F_TEXT | F_BPAD))) | 577 | if (!(pr->flags & (F_TEXT | F_BPAD))) |
572 | bpad(pr); | 578 | bpad(pr); |
573 | } | 579 | } |
580 | savech = '\0'; | ||
574 | if (cnt == 1 && pr->nospace) { | 581 | if (cnt == 1 && pr->nospace) { |
575 | savech = *pr->nospace; | 582 | savech = *pr->nospace; |
576 | *pr->nospace = '\0'; | 583 | *pr->nospace = '\0'; |
@@ -665,7 +672,7 @@ static NOINLINE void display(priv_dumper_t* dumper) | |||
665 | break; | 672 | break; |
666 | } | 673 | } |
667 | } | 674 | } |
668 | if (cnt == 1 && pr->nospace) { | 675 | if (savech) { |
669 | *pr->nospace = savech; | 676 | *pr->nospace = savech; |
670 | } | 677 | } |
671 | } | 678 | } |
@@ -673,7 +680,7 @@ static NOINLINE void display(priv_dumper_t* dumper) | |||
673 | } | 680 | } |
674 | } | 681 | } |
675 | } | 682 | } |
676 | 683 | endfu: | |
677 | if (dumper->endfu) { | 684 | if (dumper->endfu) { |
678 | PR *pr; | 685 | PR *pr; |
679 | /* | 686 | /* |