| 633 | } |
| 634 | |
| 635 | static void |
| 636 | print_ascii (idx_t fields, idx_t blank, void const *block, |
| 637 | MAYBE_UNUSED char const *unused_fmt_string, int width, |
| 638 | idx_t pad) |
| 639 | { |
| 640 | unsigned char const *p = block; |
| 641 | idx_t pad_remaining = pad; |
| 642 | for (idx_t i = fields; blank < i; i--) |
| 643 | { |
| 644 | unsigned char c = *p++; |
| 645 | char const *s; |
| 646 | char buf[4]; |
| 647 | |
| 648 | switch (c) |
| 649 | { |
| 650 | case '\0': |
| 651 | s = "\\0"; |
| 652 | break; |
| 653 | |
| 654 | case '\a': |
| 655 | s = "\\a"; |
| 656 | break; |
| 657 | |
| 658 | case '\b': |
| 659 | s = "\\b"; |
| 660 | break; |
| 661 | |
| 662 | case '\f': |
| 663 | s = "\\f"; |
| 664 | break; |
| 665 | |
| 666 | case '\n': |
| 667 | s = "\\n"; |
| 668 | break; |
| 669 | |
| 670 | case '\r': |
| 671 | s = "\\r"; |
| 672 | break; |
| 673 | |
| 674 | case '\t': |
| 675 | s = "\\t"; |
| 676 | break; |
| 677 | |
| 678 | case '\v': |
| 679 | s = "\\v"; |
| 680 | break; |
| 681 | |
| 682 | default: |
| 683 | sprintf (buf, (isprint (c) ? "%c" : "%03o"), c); |
| 684 | s = buf; |
| 685 | } |
| 686 | |
| 687 | idx_t next_pad = pad_at (fields, i - 1, pad); |
| 688 | int adjusted_width = pad_remaining - next_pad + width; |
| 689 | xprintf ("%*s", adjusted_width, s); |
| 690 | pad_remaining = next_pad; |
| 691 | } |
| 692 | } |