aboutsummaryrefslogtreecommitdiff
path: root/util-linux
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-11-18 05:36:50 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-11-18 05:36:50 +0000
commitfbe5f39f0fe0439678581fdad153f1df437f395d (patch)
treec7635188b580014e3fe416025bcaaa88e768c221 /util-linux
parent16aec39ebeb2246b0a0d335d5f02f6e1ebca67d1 (diff)
downloadbusybox-w32-fbe5f39f0fe0439678581fdad153f1df437f395d.tar.gz
busybox-w32-fbe5f39f0fe0439678581fdad153f1df437f395d.tar.bz2
busybox-w32-fbe5f39f0fe0439678581fdad153f1df437f395d.zip
hexdump: add hd alias, add -R option
Diffstat (limited to 'util-linux')
-rw-r--r--util-linux/Config.in16
-rw-r--r--util-linux/hexdump.c90
2 files changed, 87 insertions, 19 deletions
diff --git a/util-linux/Config.in b/util-linux/Config.in
index 107382f51..8b0bbd65d 100644
--- a/util-linux/Config.in
+++ b/util-linux/Config.in
@@ -210,6 +210,22 @@ config HEXDUMP
210 The hexdump utility is used to display binary data in a readable 210 The hexdump utility is used to display binary data in a readable
211 way that is comparable to the output from most hex editors. 211 way that is comparable to the output from most hex editors.
212 212
213config HD
214 bool "hd"
215 default n
216 help
217 hd is an alias to hexdump -C.
218
219config FEATURE_HEXDUMP_REVERSE
220 bool "Support -R, reverse of 'hexdump -Cv'"
221 default n
222 depends on HEXDUMP
223 help
224 The hexdump utility is used to display binary data in an ascii
225 readable way. This option creates binary data from an ascii input.
226 NB: this option is non-standard. It's unwise to use it in scripts
227 aimed to be portable.
228
213config HWCLOCK 229config HWCLOCK
214 bool "hwclock" 230 bool "hwclock"
215 default n 231 default n
diff --git a/util-linux/hexdump.c b/util-linux/hexdump.c
index e6820ae8d..670867054 100644
--- a/util-linux/hexdump.c
+++ b/util-linux/hexdump.c
@@ -45,7 +45,7 @@ static const char *const add_strings[] = {
45 45
46static const char add_first[] ALIGN1 = "\"%07.7_Ax\n\""; 46static const char add_first[] ALIGN1 = "\"%07.7_Ax\n\"";
47 47
48static const char hexdump_opts[] ALIGN1 = "bcdoxCe:f:n:s:v"; 48static const char hexdump_opts[] ALIGN1 = "bcdoxCe:f:n:s:v" USE_FEATURE_HEXDUMP_REVERSE("R");
49 49
50static const struct suffix_mult suffixes[] = { 50static const struct suffix_mult suffixes[] = {
51 { "b", 512 }, 51 { "b", 512 },
@@ -59,10 +59,21 @@ int hexdump_main(int argc, char **argv)
59{ 59{
60 const char *p; 60 const char *p;
61 int ch; 61 int ch;
62#if ENABLE_FEATURE_HEXDUMP_REVERSE
63 FILE *fp;
64 smallint rdump = 0;
65#endif
62 66
63 bb_dump_vflag = FIRST; 67 bb_dump_vflag = FIRST;
64 bb_dump_length = -1; 68 bb_dump_length = -1;
65 69
70 if (ENABLE_HD && !applet_name[2]) { /* we are "hd" */
71 ch = 'C';
72 goto hd_applet;
73 }
74
75 /* We cannot use getopt32: in hexdump options are cumulative.
76 * E.g. hexdump -C -C file should dump each line twice */
66 while ((ch = getopt(argc, argv, hexdump_opts)) > 0) { 77 while ((ch = getopt(argc, argv, hexdump_opts)) > 0) {
67 p = strchr(hexdump_opts, ch); 78 p = strchr(hexdump_opts, ch);
68 if (!p) 79 if (!p)
@@ -70,28 +81,34 @@ int hexdump_main(int argc, char **argv)
70 if ((p - hexdump_opts) < 5) { 81 if ((p - hexdump_opts) < 5) {
71 bb_dump_add(add_first); 82 bb_dump_add(add_first);
72 bb_dump_add(add_strings[(int)(p - hexdump_opts)]); 83 bb_dump_add(add_strings[(int)(p - hexdump_opts)]);
73 } else if (ch == 'C') { 84 }
85 /* Save a little bit of space below by omitting the 'else's. */
86 if (ch == 'C') {
87 hd_applet:
74 bb_dump_add("\"%08.8_Ax\n\""); 88 bb_dump_add("\"%08.8_Ax\n\"");
75 bb_dump_add("\"%08.8_ax \" 8/1 \"%02x \" \" \" 8/1 \"%02x \" "); 89 bb_dump_add("\"%08.8_ax \" 8/1 \"%02x \" \" \" 8/1 \"%02x \" ");
76 bb_dump_add("\" |\" 16/1 \"%_p\" \"|\\n\""); 90 bb_dump_add("\" |\" 16/1 \"%_p\" \"|\\n\"");
77 } else {
78 /* Save a little bit of space below by omitting the 'else's. */
79 if (ch == 'e') {
80 bb_dump_add(optarg);
81 } /* else */
82 if (ch == 'f') {
83 bb_dump_addfile(optarg);
84 } /* else */
85 if (ch == 'n') {
86 bb_dump_length = xatoi_u(optarg);
87 } /* else */
88 if (ch == 's') {
89 bb_dump_skip = xatoul_range_sfx(optarg, 0, LONG_MAX, suffixes);
90 } /* else */
91 if (ch == 'v') {
92 bb_dump_vflag = ALL;
93 }
94 } 91 }
92 if (ch == 'e') {
93 bb_dump_add(optarg);
94 } /* else */
95 if (ch == 'f') {
96 bb_dump_addfile(optarg);
97 } /* else */
98 if (ch == 'n') {
99 bb_dump_length = xatoi_u(optarg);
100 } /* else */
101 if (ch == 's') {
102 bb_dump_skip = xatoul_range_sfx(optarg, 0, LONG_MAX, suffixes);
103 } /* else */
104 if (ch == 'v') {
105 bb_dump_vflag = ALL;
106 }
107#if ENABLE_FEATURE_HEXDUMP_REVERSE
108 if (ch == 'R') {
109 rdump = 1;
110 }
111#endif
95 } 112 }
96 113
97 if (!bb_dump_fshead) { 114 if (!bb_dump_fshead) {
@@ -101,5 +118,40 @@ int hexdump_main(int argc, char **argv)
101 118
102 argv += optind; 119 argv += optind;
103 120
121#if !ENABLE_FEATURE_HEXDUMP_REVERSE
104 return bb_dump_dump(argv); 122 return bb_dump_dump(argv);
123#else
124 if (!rdump) {
125 return bb_dump_dump(argv);
126 }
127
128 /* -R: reverse of 'hexdump -Cv' */
129 fp = stdin;
130 if (!*argv) {
131 argv--;
132 goto jump_in;
133 }
134
135 do {
136 char *buf;
137 fp = xfopen(*argv, "r");
138 jump_in:
139 while ((buf = xmalloc_getline(fp)) != NULL) {
140 p = buf;
141 while (1) {
142 /* skip address or previous byte */
143 while (isxdigit(*p)) p++;
144 while (*p == ' ') p++;
145 /* '|' char will break the line */
146 if (!isxdigit(*p) || sscanf(p, "%x ", &ch) != 1)
147 break;
148 putchar(ch);
149 }
150 free(buf);
151 }
152 fclose(fp);
153 } while (*++argv);
154
155 fflush_stdout_and_exit(EXIT_SUCCESS);
156#endif
105} 157}