diff options
author | Ondrej Oprala | 2013-11-08 17:13:07 +0100 |
---|---|---|
committer | Karel Zak | 2013-12-02 13:44:19 +0100 |
commit | d4646ea4b0e94ebb1309dedd679793ce78039d03 (patch) | |
tree | f6c55fd5e8504c6befa1edd52088a3369f28d8cd /text-utils/hexdump.c | |
parent | hexdump: add the prefix 'hexdump-' to {conv,display,parse}.c (diff) | |
download | kernel-qcow2-util-linux-d4646ea4b0e94ebb1309dedd679793ce78039d03.tar.gz kernel-qcow2-util-linux-d4646ea4b0e94ebb1309dedd679793ce78039d03.tar.xz kernel-qcow2-util-linux-d4646ea4b0e94ebb1309dedd679793ce78039d03.zip |
hexdump: Merge hexsyntax.c into hexdump.c
Signed-off-by: Ondrej Oprala <ooprala@redhat.com>
Diffstat (limited to 'text-utils/hexdump.c')
-rw-r--r-- | text-utils/hexdump.c | 117 |
1 files changed, 116 insertions, 1 deletions
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 <sys/types.h> +#include <unistd.h> #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <errno.h> +#include <err.h> +#include <limits.h> +#include <getopt.h> #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] <file>...\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> format string to be used for displaying data\n"), out); + fputs(_(" -f, --format-file <file> file that contains format strings\n"), out); + fputs(_(" -n, --length <length> interpret only length bytes of input\n"), out); + fputs(_(" -s, --skip <offset> 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.")); |