From d4646ea4b0e94ebb1309dedd679793ce78039d03 Mon Sep 17 00:00:00 2001 From: Ondrej Oprala Date: Fri, 8 Nov 2013 17:13:07 +0100 Subject: hexdump: Merge hexsyntax.c into hexdump.c Signed-off-by: Ondrej Oprala --- text-utils/hexdump.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) (limited to 'text-utils/hexdump.c') diff --git a/text-utils/hexdump.c b/text-utils/hexdump.c index 8c9b119b9..989088e5e 100644 --- a/text-utils/hexdump.c +++ b/text-utils/hexdump.c @@ -36,14 +36,20 @@ */ #include +#include #include #include #include +#include +#include +#include +#include #include "hexdump.h" #include "list.h" #include "nls.h" #include "c.h" +#include "strutils.h" #include "closestream.h" struct list_head fshead; /* head of format strings */ @@ -52,6 +58,115 @@ int exitval; /* final exit value */ ssize_t length = -1; /* max bytes to read */ void hex_free(void); +off_t skip; /* bytes to skip */ + +int +parse_args(int argc, char **argv) +{ + int ch; + char *hex_offt = "\"%07.7_Ax\n\""; + + static const struct option longopts[] = { + {"one-byte-octal", no_argument, NULL, 'b'}, + {"one-byte-char", required_argument, NULL, 'c'}, + {"canonical", required_argument, NULL, 'C'}, + {"two-bytes-decimal", no_argument, NULL, 'd'}, + {"two-bytes-octal", required_argument, NULL, 'o'}, + {"two-bytes-hex", no_argument, NULL, 'x'}, + {"format", required_argument, NULL, 'e'}, + {"format-file", required_argument, NULL, 'f'}, + {"length", required_argument, NULL, 'n'}, + {"skip", required_argument, NULL, 's'}, + {"no-squeezing", no_argument, NULL, 'v'}, + {"help", no_argument, NULL, 'h'}, + {"version", no_argument, NULL, 'V'}, + {NULL, no_argument, NULL, 0} + }; + + while ((ch = getopt_long(argc, argv, "bcCde:f:L::n:os:vxhV", longopts, NULL)) != -1) { + switch (ch) { + case 'b': + add(hex_offt); + add("\"%07.7_ax \" 16/1 \"%03o \" \"\\n\""); + break; + case 'c': + add(hex_offt); + add("\"%07.7_ax \" 16/1 \"%3_c \" \"\\n\""); + break; + case 'C': + add("\"%08.8_Ax\n\""); + add("\"%08.8_ax \" 8/1 \"%02x \" \" \" 8/1 \"%02x \" "); + add("\" |\" 16/1 \"%_p\" \"|\\n\""); + break; + case 'd': + add(hex_offt); + add("\"%07.7_ax \" 8/2 \" %05u \" \"\\n\""); + break; + case 'e': + add(optarg); + break; + case 'f': + addfile(optarg); + break; + case 'n': + length = strtosize_or_err(optarg, _("failed to parse length")); + break; + case 'o': + add(hex_offt); + add("\"%07.7_ax \" 8/2 \" %06o \" \"\\n\""); + break; + case 's': + skip = strtosize_or_err(optarg, _("failed to parse offset")); + break; + case 'v': + vflag = ALL; + break; + case 'x': + add(hex_offt); + add("\"%07.7_ax \" 8/2 \" %04x \" \"\\n\""); + break; + case 'h': + usage(stdout); + case 'V': + printf(UTIL_LINUX_VERSION); + exit(EXIT_SUCCESS); + break; + default: + usage(stderr); + } + } + + if (list_empty(&fshead)) { + add(hex_offt); + add("\"%07.7_ax \" 8/2 \"%04x \" \"\\n\""); + } + return optind; +} + +void __attribute__((__noreturn__)) usage(FILE *out) +{ + fputs(USAGE_HEADER, out); + fprintf(out, _(" %s [options] ...\n"), program_invocation_short_name); + fputs(USAGE_OPTIONS, out); + fputs(_(" -b, --one-byte-octal one-byte octal display\n"), out); + fputs(_(" -c, --one-byte-char one-byte character display\n"), out); + fputs(_(" -C, --canonical canonical hex+ASCII display\n"), out); + fputs(_(" -d, --two-bytes-decimal two-byte decimal display\n"), out); + fputs(_(" -o, --two-bytes-octal two-byte octal display\n"), out); + fputs(_(" -x, --two-bytes-hex two-byte hexadecimal display\n"), out); + fputs(_(" -e, --format format string to be used for displaying data\n"), out); + fputs(_(" -f, --format-file file that contains format strings\n"), out); + fputs(_(" -n, --length interpret only length bytes of input\n"), out); + fputs(_(" -s, --skip skip offset bytes from the beginning\n"), out); + fputs(_(" -v, --no-squeezing output identical lines\n"), out); + fputs(USAGE_SEPARATOR, out); + fputs(USAGE_HELP, out); + fputs(USAGE_VERSION, out); + fprintf(out, USAGE_MAN_TAIL("hexdump(1)")); + + exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS); +} + int main(int argc, char **argv) { struct list_head *p; @@ -65,7 +180,7 @@ int main(int argc, char **argv) atexit(close_stdout); if (!(c = strrchr(argv[0], 'o')) || strcmp(c, "od")) { - argv += newsyntax(argc, argv); + argv += parse_args(argc, argv); } else errx(EXIT_FAILURE, _("calling hexdump as od has been deprecated " "in favour to GNU coreutils od.")); -- cgit v1.2.3-55-g7522