diff options
author | Denys Vlasenko | 2017-01-25 16:50:30 +0100 |
---|---|---|
committer | Denys Vlasenko | 2017-01-25 16:50:30 +0100 |
commit | 62a9b18547462a657ffb18cf03d5cfdcf774c905 (patch) | |
tree | 5c6a660cd8066b1ed5944a4b9cb2717e89573be7 /util-linux/hexdump_xxd.c | |
parent | cb8e84e65a254dcba4939e237b93d03c46ae56aa (diff) | |
download | busybox-62a9b18547462a657ffb18cf03d5cfdcf774c905.zip busybox-62a9b18547462a657ffb18cf03d5cfdcf774c905.tar.gz |
xxd: implement -p
While at it, tweaked hexdump --help
function old new delta
xxd_main 364 414 +50
packed_usage 31097 31114 +17
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'util-linux/hexdump_xxd.c')
-rw-r--r-- | util-linux/hexdump_xxd.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/util-linux/hexdump_xxd.c b/util-linux/hexdump_xxd.c index 813e7fe..cc34ea6 100644 --- a/util-linux/hexdump_xxd.c +++ b/util-linux/hexdump_xxd.c @@ -46,9 +46,11 @@ //usage: "Hex dump FILE (or stdin)\n" //usage: "\n -g N Bytes per group" //usage: "\n -c N Bytes per line" +//usage: "\n -p Show only hex bytes, assumes -c30" // exactly the same help text lines in hexdump and xxd: -//usage: "\n -l LENGTH Interpret only LENGTH bytes of input" +//usage: "\n -l LENGTH Show only first LENGTH bytes" //usage: "\n -s OFFSET Skip OFFSET bytes" +// TODO: implement -r (see hexdump -R) #include "libbb.h" #include "dump.h" @@ -70,11 +72,12 @@ int xxd_main(int argc UNUSED_PARAM, char **argv) #define OPT_l (1 << 0) #define OPT_s (1 << 1) #define OPT_a (1 << 2) +#define OPT_p (1 << 3) opt_complementary = "?1"; /* 1 argument max */ - opt = getopt32(argv, "l:s:ag:+c:+", &opt_l, &opt_s, &bytes, &cols); + opt = getopt32(argv, "l:s:apg:+c:+", &opt_l, &opt_s, &bytes, &cols); argv += optind; -// dumper->dump_vflag = ALL; // default + dumper->dump_vflag = ALL; // if (opt & OPT_a) // dumper->dump_vflag = SKIPNUL; ..does not exist if (opt & OPT_l) { @@ -93,9 +96,16 @@ int xxd_main(int argc UNUSED_PARAM, char **argv) //BUGGY for /proc/version (unseekable?) } - bb_dump_add(dumper, "\"%08.8_ax: \""); // "address: " - if (cols == 0) - cols = 16; + if (opt & OPT_p) { + if (cols == 0) + cols = 30; + bytes = cols; /* -p ignores -gN */ + } else { + if (cols == 0) + cols = 16; + bb_dump_add(dumper, "\"%08.8_ax: \""); // "address: " + } + if (bytes < 1 || bytes >= cols) { sprintf(buf, "%u/1 \"%%02x\"", cols); // cols * "xx" bb_dump_add(dumper, buf); @@ -109,7 +119,7 @@ int xxd_main(int argc UNUSED_PARAM, char **argv) #define BS "/1 \"%02x \"" #define B "/1 \"%02x\"" unsigned i; - char *bigbuf = xmalloc(1 + cols * (sizeof(BS)-1)); + char *bigbuf = xmalloc(cols * (sizeof(BS)-1)); char *p = bigbuf; for (i = 1; i <= cols; i++) { if (i == cols || i % bytes) @@ -125,8 +135,10 @@ int xxd_main(int argc UNUSED_PARAM, char **argv) free(bigbuf); } - sprintf(buf, "\" \"%u/1 \"%%_p\"\"\n\"", cols); // " ASCII\n" - bb_dump_add(dumper, buf); + if (!(opt & OPT_p)) { + sprintf(buf, "\" \"%u/1 \"%%_p\"\"\n\"", cols); // " ASCII\n" + bb_dump_add(dumper, buf); + } return bb_dump_dump(dumper, argv); } |