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