428
|
1 /* Synched up with: FSF 19.28. */
|
|
2
|
438
|
3 #include <config.h>
|
428
|
4
|
|
5 #include <stdio.h>
|
|
6 #include <ctype.h>
|
442
|
7 #ifdef WIN32_NATIVE
|
440
|
8 #include <io.h>
|
428
|
9 #include <fcntl.h>
|
|
10 #endif
|
|
11
|
|
12 #if __STDC__ || defined(STDC_HEADERS)
|
|
13 #include <stdlib.h>
|
442
|
14 #ifdef HAVE_UNISTD_H
|
428
|
15 #include <unistd.h>
|
442
|
16 #endif
|
428
|
17 #include <string.h>
|
|
18 #endif
|
|
19
|
|
20 #define DEFAULT_GROUPING 0x01
|
|
21 #define DEFAULT_BASE 16
|
|
22
|
|
23 #undef TRUE
|
|
24 #undef FALSE
|
|
25 #define TRUE (1)
|
|
26 #define FALSE (0)
|
|
27
|
|
28 int base = DEFAULT_BASE, un_flag = FALSE, iso_flag = FALSE, endian = 1;
|
|
29 int group_by = DEFAULT_GROUPING;
|
|
30 char *progname;
|
|
31
|
|
32 void usage (void);
|
|
33
|
|
34 int
|
|
35 main (int argc, char *argv[])
|
|
36 {
|
|
37 register long address;
|
|
38 char string[18];
|
|
39 FILE *fp;
|
|
40
|
|
41 progname = *argv++; --argc;
|
|
42
|
|
43 /*
|
|
44 ** -hex hex dump
|
|
45 ** -oct Octal dump
|
|
46 ** -group-by-8-bits
|
|
47 ** -group-by-16-bits
|
|
48 ** -group-by-32-bits
|
|
49 ** -group-by-64-bits
|
|
50 ** -iso iso character set.
|
|
51 ** -big-endian Big Endian
|
|
52 ** -little-endian Little Endian
|
|
53 ** -un || -de from hexl format to binary.
|
|
54 ** -- End switch list.
|
|
55 ** <filename> dump filename
|
|
56 ** - (as filename == stdin)
|
|
57 */
|
|
58
|
|
59 while (*argv && *argv[0] == '-' && (*argv)[1])
|
|
60 {
|
|
61 /* A switch! */
|
|
62 if (!strcmp (*argv, "--"))
|
|
63 {
|
|
64 --argc; argv++;
|
|
65 break;
|
|
66 }
|
|
67 else if (!strcmp (*argv, "-un") || !strcmp (*argv, "-de"))
|
|
68 {
|
|
69 un_flag = TRUE;
|
|
70 --argc; argv++;
|
|
71 }
|
|
72 else if (!strcmp (*argv, "-hex"))
|
|
73 {
|
|
74 base = 16;
|
|
75 --argc; argv++;
|
|
76 }
|
|
77 else if (!strcmp (*argv, "-iso"))
|
|
78 {
|
|
79 iso_flag = TRUE;
|
|
80 --argc; argv++;
|
|
81 }
|
|
82 else if (!strcmp (*argv, "-oct"))
|
|
83 {
|
|
84 base = 8;
|
|
85 --argc; argv++;
|
|
86 }
|
|
87 else if (!strcmp (*argv, "-big-endian"))
|
|
88 {
|
|
89 endian = 1;
|
|
90 --argc; argv++;
|
|
91 }
|
|
92 else if (!strcmp (*argv, "-little-endian"))
|
|
93 {
|
|
94 endian = 0;
|
|
95 --argc; argv++;
|
|
96 }
|
|
97 else if (!strcmp (*argv, "-group-by-8-bits"))
|
|
98 {
|
|
99 group_by = 0x00;
|
|
100 --argc; argv++;
|
|
101 }
|
|
102 else if (!strcmp (*argv, "-group-by-16-bits"))
|
|
103 {
|
|
104 group_by = 0x01;
|
|
105 --argc; argv++;
|
|
106 }
|
|
107 else if (!strcmp (*argv, "-group-by-32-bits"))
|
|
108 {
|
|
109 group_by = 0x03;
|
|
110 --argc; argv++;
|
|
111 }
|
|
112 else if (!strcmp (*argv, "-group-by-64-bits"))
|
|
113 {
|
|
114 group_by = 0x07;
|
|
115 endian = 0;
|
|
116 --argc; argv++;
|
|
117 }
|
|
118 else
|
|
119 {
|
|
120 (void) fprintf (stderr, "%s: invalid switch: \"%s\".\n", progname,
|
|
121 *argv);
|
|
122 usage ();
|
|
123 }
|
|
124 }
|
|
125
|
|
126 do
|
|
127 {
|
|
128 if (*argv == NULL)
|
|
129 fp = stdin;
|
|
130 else
|
|
131 {
|
|
132 char *filename = *argv++;
|
|
133
|
|
134 if (!strcmp (filename, "-"))
|
|
135 fp = stdin;
|
|
136 else if ((fp = fopen (filename, "r")) == NULL)
|
|
137 {
|
|
138 perror (filename);
|
|
139 continue;
|
|
140 }
|
|
141 }
|
|
142
|
|
143 if (un_flag)
|
|
144 {
|
|
145 char buf[18];
|
|
146
|
442
|
147 #ifdef WIN32_NATIVE
|
440
|
148 _setmode (_fileno (stdout), O_BINARY);
|
428
|
149 #endif
|
|
150 for (;;)
|
|
151 {
|
442
|
152 register int i, c = 0, d;
|
428
|
153
|
|
154 #define hexchar(x) (isdigit (x) ? x - '0' : x - 'a' + 10)
|
|
155
|
|
156 fread (buf, 1, 10, fp); /* skip 10 bytes */
|
|
157
|
|
158 for (i=0; i < 16; ++i)
|
|
159 {
|
|
160 if ((c = getc (fp)) == ' ' || c == EOF)
|
|
161 break;
|
|
162
|
|
163 d = getc (fp);
|
|
164 c = hexchar (c) * 0x10 + hexchar (d);
|
|
165 putchar (c);
|
|
166
|
|
167 if ((i&group_by) == group_by)
|
|
168 getc (fp);
|
|
169 }
|
|
170
|
|
171 if (c == ' ')
|
|
172 {
|
|
173 while ((c = getc (fp)) != '\n' && c != EOF)
|
|
174 ;
|
|
175
|
|
176 if (c == EOF)
|
|
177 break;
|
|
178 }
|
|
179 else
|
|
180 {
|
|
181 if (i < 16)
|
|
182 break;
|
|
183
|
|
184 fread (buf, 1, 18, fp); /* skip 18 bytes */
|
|
185 }
|
|
186 }
|
|
187 }
|
|
188 else
|
|
189 {
|
442
|
190 #ifdef WIN32_NATIVE
|
440
|
191 _setmode (_fileno (fp), O_BINARY);
|
428
|
192 #endif
|
|
193 address = 0;
|
|
194 string[0] = ' ';
|
|
195 string[17] = '\0';
|
|
196 for (;;)
|
|
197 {
|
442
|
198 register int i, c = 0;
|
428
|
199
|
|
200 for (i=0; i < 16; ++i)
|
|
201 {
|
|
202 if ((c = getc (fp)) == EOF)
|
|
203 {
|
|
204 if (!i)
|
|
205 break;
|
|
206
|
|
207 fputs (" ", stdout);
|
|
208 string[i+1] = '\0';
|
|
209 }
|
|
210 else
|
|
211 {
|
|
212 if (!i)
|
|
213 (void) printf ("%08lx: ", address);
|
|
214
|
|
215 if (iso_flag)
|
|
216 string[i+1] =
|
|
217 (c < 0x20 || (c >= 0x7F && c < 0xa0)) ? '.' :c;
|
|
218 else
|
|
219 string[i+1] = (c < 0x20 || c >= 0x7F) ? '.' : c;
|
|
220
|
|
221 (void) printf ("%02x", c);
|
|
222 }
|
|
223
|
|
224 if ((i&group_by) == group_by)
|
|
225 putchar (' ');
|
|
226 }
|
|
227
|
|
228 if (i)
|
|
229 puts (string);
|
|
230
|
|
231 if (c == EOF)
|
|
232 break;
|
|
233
|
|
234 address += 0x10;
|
|
235
|
|
236 }
|
|
237 }
|
|
238
|
|
239 if (fp != stdin)
|
|
240 (void) fclose (fp);
|
|
241
|
|
242 } while (*argv != NULL);
|
|
243 return 0;
|
|
244 }
|
|
245
|
|
246 void
|
442
|
247 usage (void)
|
428
|
248 {
|
442
|
249 fprintf (stderr, "Usage: %s [-de] [-iso]\n", progname);
|
428
|
250 exit (1);
|
|
251 }
|