use xfreopen in place of unchecked freopen
[platform/upstream/coreutils.git] / src / od.c
1 /* od -- dump files in octal and other formats
2    Copyright (C) 92, 1995-2008 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 /* Written by Jim Meyering.  */
18
19 #include <config.h>
20
21 #include <stdio.h>
22 #include <assert.h>
23 #include <getopt.h>
24 #include <sys/types.h>
25 #include "system.h"
26 #include "error.h"
27 #include "quote.h"
28 #include "xfreopen.h"
29 #include "xprintf.h"
30 #include "xstrtol.h"
31
32 /* The official name of this program (e.g., no `g' prefix).  */
33 #define PROGRAM_NAME "od"
34
35 #define AUTHORS proper_name ("Jim Meyering")
36
37 #include <float.h>
38
39 /* The default number of input bytes per output line.  */
40 #define DEFAULT_BYTES_PER_BLOCK 16
41
42 /* The number of decimal digits of precision in a float.  */
43 #ifndef FLT_DIG
44 # define FLT_DIG 7
45 #endif
46
47 /* The number of decimal digits of precision in a double.  */
48 #ifndef DBL_DIG
49 # define DBL_DIG 15
50 #endif
51
52 #if HAVE_UNSIGNED_LONG_LONG_INT
53 typedef unsigned long long int unsigned_long_long_int;
54 #else
55 /* This is just a place-holder to avoid a few `#if' directives.
56    In this case, the type isn't actually used.  */
57 typedef unsigned long int unsigned_long_long_int;
58 #endif
59
60 enum size_spec
61   {
62     NO_SIZE,
63     CHAR,
64     SHORT,
65     INT,
66     LONG,
67     LONG_LONG,
68     /* FIXME: add INTMAX support, too */
69     FLOAT_SINGLE,
70     FLOAT_DOUBLE,
71     FLOAT_LONG_DOUBLE,
72     N_SIZE_SPECS
73   };
74
75 enum output_format
76   {
77     SIGNED_DECIMAL,
78     UNSIGNED_DECIMAL,
79     OCTAL,
80     HEXADECIMAL,
81     FLOATING_POINT,
82     NAMED_CHARACTER,
83     CHARACTER
84   };
85
86 #define MAX_INTEGRAL_TYPE_SIZE sizeof (unsigned_long_long_int)
87
88 /* The maximum number of bytes needed for a format string, including
89    the trailing nul.  Each format string expects a variable amount of
90    padding (guaranteed to be at least 1 plus the field width), then an
91    element that will be formatted in the field.  */
92 enum
93   {
94     FMT_BYTES_ALLOCATED =
95       MAX ((sizeof "%*.99" - 1
96             + MAX (sizeof "ld",
97                    MAX (sizeof PRIdMAX,
98                         MAX (sizeof PRIoMAX,
99                              MAX (sizeof PRIuMAX,
100                                   sizeof PRIxMAX))))),
101            sizeof "%*.99Le")
102   };
103
104 /* Ensure that our choice for FMT_BYTES_ALLOCATED is reasonable.  */
105 verify (LDBL_DIG <= 99);
106 verify (MAX_INTEGRAL_TYPE_SIZE * CHAR_BIT / 3 <= 99);
107
108 /* Each output format specification (from `-t spec' or from
109    old-style options) is represented by one of these structures.  */
110 struct tspec
111   {
112     enum output_format fmt;
113     enum size_spec size; /* Type of input object.  */
114     /* FIELDS is the number of fields per line, BLANK is the number of
115        fields to leave blank.  WIDTH is width of one field, excluding
116        leading space, and PAD is total pad to divide among FIELDS.
117        PAD is at least as large as FIELDS.  */
118     void (*print_function) (size_t fields, size_t blank, void const *data,
119                             char const *fmt, int width, int pad);
120     char fmt_string[FMT_BYTES_ALLOCATED]; /* Of the style "%*d".  */
121     bool hexl_mode_trailer;
122     int field_width; /* Minimum width of a field, excluding leading space.  */
123     int pad_width; /* Total padding to be divided among fields.  */
124   };
125
126 /* Convert the number of 8-bit bytes of a binary representation to
127    the number of characters (digits + sign if the type is signed)
128    required to represent the same quantity in the specified base/type.
129    For example, a 32-bit (4-byte) quantity may require a field width
130    as wide as the following for these types:
131    11   unsigned octal
132    11   signed decimal
133    10   unsigned decimal
134    8    unsigned hexadecimal  */
135
136 static unsigned int const bytes_to_oct_digits[] =
137 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
138
139 static unsigned int const bytes_to_signed_dec_digits[] =
140 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
141
142 static unsigned int const bytes_to_unsigned_dec_digits[] =
143 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
144
145 static unsigned int const bytes_to_hex_digits[] =
146 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
147
148 /* It'll be a while before we see integral types wider than 16 bytes,
149    but if/when it happens, this check will catch it.  Without this check,
150    a wider type would provoke a buffer overrun.  */
151 verify (MAX_INTEGRAL_TYPE_SIZE
152         < sizeof bytes_to_hex_digits / sizeof *bytes_to_hex_digits);
153
154 /* Make sure the other arrays have the same length.  */
155 verify (sizeof bytes_to_oct_digits == sizeof bytes_to_signed_dec_digits);
156 verify (sizeof bytes_to_oct_digits == sizeof bytes_to_unsigned_dec_digits);
157 verify (sizeof bytes_to_oct_digits == sizeof bytes_to_hex_digits);
158
159 /* Convert enum size_spec to the size of the named type.  */
160 static const int width_bytes[] =
161 {
162   -1,
163   sizeof (char),
164   sizeof (short int),
165   sizeof (int),
166   sizeof (long int),
167   sizeof (unsigned_long_long_int),
168   sizeof (float),
169   sizeof (double),
170   sizeof (long double)
171 };
172
173 /* Ensure that for each member of `enum size_spec' there is an
174    initializer in the width_bytes array.  */
175 verify (sizeof width_bytes / sizeof width_bytes[0] == N_SIZE_SPECS);
176
177 /* Names for some non-printing characters.  */
178 static char const charname[33][4] =
179 {
180   "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
181   "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
182   "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
183   "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
184   "sp"
185 };
186
187 /* Address base (8, 10 or 16).  */
188 static int address_base;
189
190 /* The number of octal digits required to represent the largest
191    address value.  */
192 #define MAX_ADDRESS_LENGTH \
193   ((sizeof (uintmax_t) * CHAR_BIT + CHAR_BIT - 1) / 3)
194
195 /* Width of a normal address.  */
196 static int address_pad_len;
197
198 /* Minimum length when detecting --strings.  */
199 static size_t string_min;
200
201 /* True when in --strings mode.  */
202 static bool flag_dump_strings;
203
204 /* True if we should recognize the older non-option arguments
205    that specified at most one file and optional arguments specifying
206    offset and pseudo-start address.  */
207 static bool traditional;
208
209 /* True if an old-style `pseudo-address' was specified.  */
210 static bool flag_pseudo_start;
211
212 /* The difference between the old-style pseudo starting address and
213    the number of bytes to skip.  */
214 static uintmax_t pseudo_offset;
215
216 /* Function that accepts an address and an optional following char,
217    and prints the address and char to stdout.  */
218 static void (*format_address) (uintmax_t, char);
219
220 /* The number of input bytes to skip before formatting and writing.  */
221 static uintmax_t n_bytes_to_skip = 0;
222
223 /* When false, MAX_BYTES_TO_FORMAT and END_OFFSET are ignored, and all
224    input is formatted.  */
225 static bool limit_bytes_to_format = false;
226
227 /* The maximum number of bytes that will be formatted.  */
228 static uintmax_t max_bytes_to_format;
229
230 /* The offset of the first byte after the last byte to be formatted.  */
231 static uintmax_t end_offset;
232
233 /* When true and two or more consecutive blocks are equal, format
234    only the first block and output an asterisk alone on the following
235    line to indicate that identical blocks have been elided.  */
236 static bool abbreviate_duplicate_blocks = true;
237
238 /* An array of specs describing how to format each input block.  */
239 static struct tspec *spec;
240
241 /* The number of format specs.  */
242 static size_t n_specs;
243
244 /* The allocated length of SPEC.  */
245 static size_t n_specs_allocated;
246
247 /* The number of input bytes formatted per output line.  It must be
248    a multiple of the least common multiple of the sizes associated with
249    the specified output types.  It should be as large as possible, but
250    no larger than 16 -- unless specified with the -w option.  */
251 static size_t bytes_per_block;
252
253 /* Human-readable representation of *file_list (for error messages).
254    It differs from file_list[-1] only when file_list[-1] is "-".  */
255 static char const *input_filename;
256
257 /* A NULL-terminated list of the file-arguments from the command line.  */
258 static char const *const *file_list;
259
260 /* Initializer for file_list if no file-arguments
261    were specified on the command line.  */
262 static char const *const default_file_list[] = {"-", NULL};
263
264 /* The input stream associated with the current file.  */
265 static FILE *in_stream;
266
267 /* If true, at least one of the files we read was standard input.  */
268 static bool have_read_stdin;
269
270 /* Map the size in bytes to a type identifier.  */
271 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
272
273 #define MAX_FP_TYPE_SIZE sizeof (long double)
274 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
275
276 static char const short_options[] = "A:aBbcDdeFfHhIij:LlN:OoS:st:vw::Xx";
277
278 /* For long options that have no equivalent short option, use a
279    non-character as a pseudo short option, starting with CHAR_MAX + 1.  */
280 enum
281 {
282   TRADITIONAL_OPTION = CHAR_MAX + 1
283 };
284
285 static struct option const long_options[] =
286 {
287   {"skip-bytes", required_argument, NULL, 'j'},
288   {"address-radix", required_argument, NULL, 'A'},
289   {"read-bytes", required_argument, NULL, 'N'},
290   {"format", required_argument, NULL, 't'},
291   {"output-duplicates", no_argument, NULL, 'v'},
292   {"strings", optional_argument, NULL, 'S'},
293   {"traditional", no_argument, NULL, TRADITIONAL_OPTION},
294   {"width", optional_argument, NULL, 'w'},
295
296   {GETOPT_HELP_OPTION_DECL},
297   {GETOPT_VERSION_OPTION_DECL},
298   {NULL, 0, NULL, 0}
299 };
300
301 void
302 usage (int status)
303 {
304   if (status != EXIT_SUCCESS)
305     fprintf (stderr, _("Try `%s --help' for more information.\n"),
306              program_name);
307   else
308     {
309       printf (_("\
310 Usage: %s [OPTION]... [FILE]...\n\
311   or:  %s [-abcdfilosx]... [FILE] [[+]OFFSET[.][b]]\n\
312   or:  %s --traditional [OPTION]... [FILE] [[+]OFFSET[.][b] [+][LABEL][.][b]]\n\
313 "),
314               program_name, program_name, program_name);
315       fputs (_("\n\
316 Write an unambiguous representation, octal bytes by default,\n\
317 of FILE to standard output.  With more than one FILE argument,\n\
318 concatenate them in the listed order to form the input.\n\
319 With no FILE, or when FILE is -, read standard input.\n\
320 \n\
321 "), stdout);
322       fputs (_("\
323 All arguments to long options are mandatory for short options.\n\
324 "), stdout);
325       fputs (_("\
326   -A, --address-radix=RADIX   decide how file offsets are printed\n\
327   -j, --skip-bytes=BYTES      skip BYTES input bytes first\n\
328 "), stdout);
329       fputs (_("\
330   -N, --read-bytes=BYTES      limit dump to BYTES input bytes\n\
331   -S, --strings[=BYTES]       output strings of at least BYTES graphic chars\n\
332   -t, --format=TYPE           select output format or formats\n\
333   -v, --output-duplicates     do not use * to mark line suppression\n\
334   -w, --width[=BYTES]         output BYTES bytes per output line\n\
335       --traditional           accept arguments in traditional form\n\
336 "), stdout);
337       fputs (HELP_OPTION_DESCRIPTION, stdout);
338       fputs (VERSION_OPTION_DESCRIPTION, stdout);
339       fputs (_("\
340 \n\
341 Traditional format specifications may be intermixed; they accumulate:\n\
342   -a   same as -t a,  select named characters, ignoring high-order bit\n\
343   -b   same as -t o1, select octal bytes\n\
344   -c   same as -t c,  select ASCII characters or backslash escapes\n\
345   -d   same as -t u2, select unsigned decimal 2-byte units\n\
346 "), stdout);
347       fputs (_("\
348   -f   same as -t fF, select floats\n\
349   -i   same as -t dI, select decimal ints\n\
350   -l   same as -t dL, select decimal longs\n\
351   -o   same as -t o2, select octal 2-byte units\n\
352   -s   same as -t d2, select decimal 2-byte units\n\
353   -x   same as -t x2, select hexadecimal 2-byte units\n\
354 "), stdout);
355       fputs (_("\
356 \n\
357 If first and second call formats both apply, the second format is assumed\n\
358 if the last operand begins with + or (if there are 2 operands) a digit.\n\
359 An OFFSET operand means -j OFFSET.  LABEL is the pseudo-address\n\
360 at first byte printed, incremented when dump is progressing.\n\
361 For OFFSET and LABEL, a 0x or 0X prefix indicates hexadecimal;\n\
362 suffixes may be . for octal and b for multiply by 512.\n\
363 "), stdout);
364       fputs (_("\
365 \n\
366 TYPE is made up of one or more of these specifications:\n\
367 \n\
368   a          named character, ignoring high-order bit\n\
369   c          ASCII character or backslash escape\n\
370 "), stdout);
371       fputs (_("\
372   d[SIZE]    signed decimal, SIZE bytes per integer\n\
373   f[SIZE]    floating point, SIZE bytes per integer\n\
374   o[SIZE]    octal, SIZE bytes per integer\n\
375   u[SIZE]    unsigned decimal, SIZE bytes per integer\n\
376   x[SIZE]    hexadecimal, SIZE bytes per integer\n\
377 "), stdout);
378       fputs (_("\
379 \n\
380 SIZE is a number.  For TYPE in doux, SIZE may also be C for\n\
381 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
382 sizeof(long).  If TYPE is f, SIZE may also be F for sizeof(float), D\n\
383 for sizeof(double) or L for sizeof(long double).\n\
384 "), stdout);
385       fputs (_("\
386 \n\
387 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
388 BYTES is hexadecimal with 0x or 0X prefix, and may have a multiplier suffix:\n\
389 b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,\n\
390 GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.\n\
391 Adding a z suffix to any type displays printable characters at the end of each\n\
392 output line.\n\
393 "), stdout);
394       fputs (_("\
395 Option --string without a number implies 3; option --width without a number\n\
396 implies 32.  By default, od uses -A o -t oS -w16.\n\
397 "), stdout);
398       emit_bug_reporting_address ();
399     }
400   exit (status);
401 }
402
403 /* Define the print functions.  */
404
405 #define PRINT_TYPE(N, T)                                                \
406 static void                                                             \
407 N (size_t fields, size_t blank, void const *block,                      \
408    char const *fmt_string, int width, int pad)                          \
409 {                                                                       \
410   T const *p = block;                                                   \
411   size_t i;                                                             \
412   int pad_remaining = pad;                                              \
413   for (i = fields; blank < i; i--)                                      \
414     {                                                                   \
415       int next_pad = pad * (i - 1) / fields;                            \
416       xprintf (fmt_string, pad_remaining - next_pad + width, *p++);     \
417       pad_remaining = next_pad;                                         \
418     }                                                                   \
419 }
420
421 PRINT_TYPE (print_s_char, signed char)
422 PRINT_TYPE (print_char, unsigned char)
423 PRINT_TYPE (print_s_short, short int)
424 PRINT_TYPE (print_short, unsigned short int)
425 PRINT_TYPE (print_int, unsigned int)
426 PRINT_TYPE (print_long, unsigned long int)
427 PRINT_TYPE (print_long_long, unsigned_long_long_int)
428 PRINT_TYPE (print_float, float)
429 PRINT_TYPE (print_double, double)
430 PRINT_TYPE (print_long_double, long double)
431
432 #undef PRINT_TYPE
433
434 static void
435 dump_hexl_mode_trailer (size_t n_bytes, const char *block)
436 {
437   size_t i;
438   fputs ("  >", stdout);
439   for (i = n_bytes; i > 0; i--)
440     {
441       unsigned char c = *block++;
442       unsigned char c2 = (isprint (c) ? c : '.');
443       putchar (c2);
444     }
445   putchar ('<');
446 }
447
448 static void
449 print_named_ascii (size_t fields, size_t blank, void const *block,
450                    const char *unused_fmt_string ATTRIBUTE_UNUSED,
451                    int width, int pad)
452 {
453   unsigned char const *p = block;
454   size_t i;
455   int pad_remaining = pad;
456   for (i = fields; blank < i; i--)
457     {
458       int next_pad = pad * (i - 1) / fields;
459       int masked_c = *p++ & 0x7f;
460       const char *s;
461       char buf[2];
462
463       if (masked_c == 127)
464         s = "del";
465       else if (masked_c <= 040)
466         s = charname[masked_c];
467       else
468         {
469           buf[0] = masked_c;
470           buf[1] = 0;
471           s = buf;
472         }
473
474       xprintf ("%*s", pad_remaining - next_pad + width, s);
475       pad_remaining = next_pad;
476     }
477 }
478
479 static void
480 print_ascii (size_t fields, size_t blank, void const *block,
481              const char *unused_fmt_string ATTRIBUTE_UNUSED, int width,
482              int pad)
483 {
484   unsigned char const *p = block;
485   size_t i;
486   int pad_remaining = pad;
487   for (i = fields; blank < i; i--)
488     {
489       int next_pad = pad * (i - 1) / fields;
490       unsigned char c = *p++;
491       const char *s;
492       char buf[4];
493
494       switch (c)
495         {
496         case '\0':
497           s = "\\0";
498           break;
499
500         case '\a':
501           s = "\\a";
502           break;
503
504         case '\b':
505           s = "\\b";
506           break;
507
508         case '\f':
509           s = "\\f";
510           break;
511
512         case '\n':
513           s = "\\n";
514           break;
515
516         case '\r':
517           s = "\\r";
518           break;
519
520         case '\t':
521           s = "\\t";
522           break;
523
524         case '\v':
525           s = "\\v";
526           break;
527
528         default:
529           sprintf (buf, (isprint (c) ? "%c" : "%03o"), c);
530           s = buf;
531         }
532
533       xprintf ("%*s", pad_remaining - next_pad + width, s);
534       pad_remaining = next_pad;
535     }
536 }
537
538 /* Convert a null-terminated (possibly zero-length) string S to an
539    unsigned long integer value.  If S points to a non-digit set *P to S,
540    *VAL to 0, and return true.  Otherwise, accumulate the integer value of
541    the string of digits.  If the string of digits represents a value
542    larger than ULONG_MAX, don't modify *VAL or *P and return false.
543    Otherwise, advance *P to the first non-digit after S, set *VAL to
544    the result of the conversion and return true.  */
545
546 static bool
547 simple_strtoul (const char *s, const char **p, unsigned long int *val)
548 {
549   unsigned long int sum;
550
551   sum = 0;
552   while (ISDIGIT (*s))
553     {
554       int c = *s++ - '0';
555       if (sum > (ULONG_MAX - c) / 10)
556         return false;
557       sum = sum * 10 + c;
558     }
559   *p = s;
560   *val = sum;
561   return true;
562 }
563
564 /* If S points to a single valid modern od format string, put
565    a description of that format in *TSPEC, make *NEXT point at the
566    character following the just-decoded format (if *NEXT is non-NULL),
567    and return true.  If S is not valid, don't modify *NEXT or *TSPEC,
568    give a diagnostic, and return false.  For example, if S were
569    "d4afL" *NEXT would be set to "afL" and *TSPEC would be
570      {
571        fmt = SIGNED_DECIMAL;
572        size = INT or LONG; (whichever integral_type_size[4] resolves to)
573        print_function = print_int; (assuming size == INT)
574        field_width = 11;
575        fmt_string = "%*d";
576       }
577    pad_width is determined later, but is at least as large as the
578    number of fields printed per row.
579    S_ORIG is solely for reporting errors.  It should be the full format
580    string argument.
581    */
582
583 static bool
584 decode_one_format (const char *s_orig, const char *s, const char **next,
585                    struct tspec *tspec)
586 {
587   enum size_spec size_spec;
588   unsigned long int size;
589   enum output_format fmt;
590   const char *pre_fmt_string;
591   void (*print_function) (size_t, size_t, void const *, char const *,
592                           int, int);
593   const char *p;
594   char c;
595   int field_width;
596   int precision;
597
598   assert (tspec != NULL);
599
600   switch (*s)
601     {
602     case 'd':
603     case 'o':
604     case 'u':
605     case 'x':
606       c = *s;
607       ++s;
608       switch (*s)
609         {
610         case 'C':
611           ++s;
612           size = sizeof (char);
613           break;
614
615         case 'S':
616           ++s;
617           size = sizeof (short int);
618           break;
619
620         case 'I':
621           ++s;
622           size = sizeof (int);
623           break;
624
625         case 'L':
626           ++s;
627           size = sizeof (long int);
628           break;
629
630         default:
631           if (! simple_strtoul (s, &p, &size))
632             {
633               /* The integer at P in S would overflow an unsigned long int.
634                  A digit string that long is sufficiently odd looking
635                  that the following diagnostic is sufficient.  */
636               error (0, 0, _("invalid type string %s"), quote (s_orig));
637               return false;
638             }
639           if (p == s)
640             size = sizeof (int);
641           else
642             {
643               if (MAX_INTEGRAL_TYPE_SIZE < size
644                   || integral_type_size[size] == NO_SIZE)
645                 {
646                   error (0, 0, _("invalid type string %s;\n\
647 this system doesn't provide a %lu-byte integral type"), quote (s_orig), size);
648                   return false;
649                 }
650               s = p;
651             }
652           break;
653         }
654
655 #define ISPEC_TO_FORMAT(Spec, Min_format, Long_format, Max_format)      \
656   ((Spec) == LONG_LONG ? (Max_format)                                   \
657    : ((Spec) == LONG ? (Long_format)                                    \
658       : (Min_format)))                                                  \
659
660       size_spec = integral_type_size[size];
661
662       switch (c)
663         {
664         case 'd':
665           fmt = SIGNED_DECIMAL;
666           field_width = bytes_to_signed_dec_digits[size];
667           sprintf (tspec->fmt_string, "%%*%s",
668                    ISPEC_TO_FORMAT (size_spec, "d", "ld", PRIdMAX));
669           break;
670
671         case 'o':
672           fmt = OCTAL;
673           sprintf (tspec->fmt_string, "%%*.%d%s",
674                    (field_width = bytes_to_oct_digits[size]),
675                    ISPEC_TO_FORMAT (size_spec, "o", "lo", PRIoMAX));
676           break;
677
678         case 'u':
679           fmt = UNSIGNED_DECIMAL;
680           field_width = bytes_to_unsigned_dec_digits[size];
681           sprintf (tspec->fmt_string, "%%*%s",
682                    ISPEC_TO_FORMAT (size_spec, "u", "lu", PRIuMAX));
683           break;
684
685         case 'x':
686           fmt = HEXADECIMAL;
687           sprintf (tspec->fmt_string, "%%*.%d%s",
688                    (field_width = bytes_to_hex_digits[size]),
689                    ISPEC_TO_FORMAT (size_spec, "x", "lx", PRIxMAX));
690           break;
691
692         default:
693           abort ();
694         }
695
696       assert (strlen (tspec->fmt_string) < FMT_BYTES_ALLOCATED);
697
698       switch (size_spec)
699         {
700         case CHAR:
701           print_function = (fmt == SIGNED_DECIMAL
702                             ? print_s_char
703                             : print_char);
704           break;
705
706         case SHORT:
707           print_function = (fmt == SIGNED_DECIMAL
708                             ? print_s_short
709                             : print_short);
710           break;
711
712         case INT:
713           print_function = print_int;
714           break;
715
716         case LONG:
717           print_function = print_long;
718           break;
719
720         case LONG_LONG:
721           print_function = print_long_long;
722           break;
723
724         default:
725           abort ();
726         }
727       break;
728
729     case 'f':
730       fmt = FLOATING_POINT;
731       ++s;
732       switch (*s)
733         {
734         case 'F':
735           ++s;
736           size = sizeof (float);
737           break;
738
739         case 'D':
740           ++s;
741           size = sizeof (double);
742           break;
743
744         case 'L':
745           ++s;
746           size = sizeof (long double);
747           break;
748
749         default:
750           if (! simple_strtoul (s, &p, &size))
751             {
752               /* The integer at P in S would overflow an unsigned long int.
753                  A digit string that long is sufficiently odd looking
754                  that the following diagnostic is sufficient.  */
755               error (0, 0, _("invalid type string %s"), quote (s_orig));
756               return false;
757             }
758           if (p == s)
759             size = sizeof (double);
760           else
761             {
762               if (size > MAX_FP_TYPE_SIZE
763                   || fp_type_size[size] == NO_SIZE)
764                 {
765                   error (0, 0, _("invalid type string %s;\n\
766 this system doesn't provide a %lu-byte floating point type"),
767                          quote (s_orig), size);
768                   return false;
769                 }
770               s = p;
771             }
772           break;
773         }
774       size_spec = fp_type_size[size];
775
776       switch (size_spec)
777         {
778         case FLOAT_SINGLE:
779           print_function = print_float;
780           /* FIXME - should we use %g instead of %e?  */
781           pre_fmt_string = "%%*.%de";
782           precision = FLT_DIG;
783           break;
784
785         case FLOAT_DOUBLE:
786           print_function = print_double;
787           pre_fmt_string = "%%*.%de";
788           precision = DBL_DIG;
789           break;
790
791         case FLOAT_LONG_DOUBLE:
792           print_function = print_long_double;
793           pre_fmt_string = "%%*.%dLe";
794           precision = LDBL_DIG;
795           break;
796
797         default:
798           abort ();
799         }
800
801       field_width = precision + 8;
802       sprintf (tspec->fmt_string, pre_fmt_string, precision);
803       assert (strlen (tspec->fmt_string) < FMT_BYTES_ALLOCATED);
804       break;
805
806     case 'a':
807       ++s;
808       fmt = NAMED_CHARACTER;
809       size_spec = CHAR;
810       print_function = print_named_ascii;
811       field_width = 3;
812       break;
813
814     case 'c':
815       ++s;
816       fmt = CHARACTER;
817       size_spec = CHAR;
818       print_function = print_ascii;
819       field_width = 3;
820       break;
821
822     default:
823       error (0, 0, _("invalid character `%c' in type string %s"),
824              *s, quote (s_orig));
825       return false;
826     }
827
828   tspec->size = size_spec;
829   tspec->fmt = fmt;
830   tspec->print_function = print_function;
831
832   tspec->field_width = field_width;
833   tspec->hexl_mode_trailer = (*s == 'z');
834   if (tspec->hexl_mode_trailer)
835     s++;
836
837   if (next != NULL)
838     *next = s;
839
840   return true;
841 }
842
843 /* Given a list of one or more input filenames FILE_LIST, set the global
844    file pointer IN_STREAM and the global string INPUT_FILENAME to the
845    first one that can be successfully opened. Modify FILE_LIST to
846    reference the next filename in the list.  A file name of "-" is
847    interpreted as standard input.  If any file open fails, give an error
848    message and return false.  */
849
850 static bool
851 open_next_file (void)
852 {
853   bool ok = true;
854
855   do
856     {
857       input_filename = *file_list;
858       if (input_filename == NULL)
859         return ok;
860       ++file_list;
861
862       if (STREQ (input_filename, "-"))
863         {
864           input_filename = _("standard input");
865           in_stream = stdin;
866           have_read_stdin = true;
867           if (O_BINARY && ! isatty (STDIN_FILENO))
868             xfreopen (NULL, "rb", stdin);
869         }
870       else
871         {
872           in_stream = fopen (input_filename, (O_BINARY ? "rb" : "r"));
873           if (in_stream == NULL)
874             {
875               error (0, errno, "%s", input_filename);
876               ok = false;
877             }
878         }
879     }
880   while (in_stream == NULL);
881
882   if (limit_bytes_to_format & !flag_dump_strings)
883     setvbuf (in_stream, NULL, _IONBF, 0);
884
885   return ok;
886 }
887
888 /* Test whether there have been errors on in_stream, and close it if
889    it is not standard input.  Return false if there has been an error
890    on in_stream or stdout; return true otherwise.  This function will
891    report more than one error only if both a read and a write error
892    have occurred.  IN_ERRNO, if nonzero, is the error number
893    corresponding to the most recent action for IN_STREAM.  */
894
895 static bool
896 check_and_close (int in_errno)
897 {
898   bool ok = true;
899
900   if (in_stream != NULL)
901     {
902       if (ferror (in_stream))
903         {
904           error (0, in_errno, _("%s: read error"), input_filename);
905           if (! STREQ (file_list[-1], "-"))
906             fclose (in_stream);
907           ok = false;
908         }
909       else if (! STREQ (file_list[-1], "-") && fclose (in_stream) != 0)
910         {
911           error (0, errno, "%s", input_filename);
912           ok = false;
913         }
914
915       in_stream = NULL;
916     }
917
918   if (ferror (stdout))
919     {
920       error (0, 0, _("write error"));
921       ok = false;
922     }
923
924   return ok;
925 }
926
927 /* Decode the modern od format string S.  Append the decoded
928    representation to the global array SPEC, reallocating SPEC if
929    necessary.  Return true if S is valid.  */
930
931 static bool
932 decode_format_string (const char *s)
933 {
934   const char *s_orig = s;
935   assert (s != NULL);
936
937   while (*s != '\0')
938     {
939       const char *next;
940
941       if (n_specs_allocated <= n_specs)
942         spec = X2NREALLOC (spec, &n_specs_allocated);
943
944       if (! decode_one_format (s_orig, s, &next, &spec[n_specs]))
945         return false;
946
947       assert (s != next);
948       s = next;
949       ++n_specs;
950     }
951
952   return true;
953 }
954
955 /* Given a list of one or more input filenames FILE_LIST, set the global
956    file pointer IN_STREAM to position N_SKIP in the concatenation of
957    those files.  If any file operation fails or if there are fewer than
958    N_SKIP bytes in the combined input, give an error message and return
959    false.  When possible, use seek rather than read operations to
960    advance IN_STREAM.  */
961
962 static bool
963 skip (uintmax_t n_skip)
964 {
965   bool ok = true;
966   int in_errno = 0;
967
968   if (n_skip == 0)
969     return true;
970
971   while (in_stream != NULL)     /* EOF.  */
972     {
973       struct stat file_stats;
974
975       /* First try seeking.  For large offsets, this extra work is
976          worthwhile.  If the offset is below some threshold it may be
977          more efficient to move the pointer by reading.  There are two
978          issues when trying to seek:
979            - the file must be seekable.
980            - before seeking to the specified position, make sure
981              that the new position is in the current file.
982              Try to do that by getting file's size using fstat.
983              But that will work only for regular files.  */
984
985       if (fstat (fileno (in_stream), &file_stats) == 0)
986         {
987           /* The st_size field is valid only for regular files
988              (and for symbolic links, which cannot occur here).
989              If the number of bytes left to skip is larger than
990              the size of the current file, we can decrement n_skip
991              and go on to the next file.  Skip this optimization also
992              when st_size is 0, because some kernels report that
993              nonempty files in /proc have st_size == 0.  */
994           if (S_ISREG (file_stats.st_mode) && 0 < file_stats.st_size)
995             {
996               if ((uintmax_t) file_stats.st_size < n_skip)
997                 n_skip -= file_stats.st_size;
998               else
999                 {
1000                   if (fseeko (in_stream, n_skip, SEEK_CUR) != 0)
1001                     {
1002                       in_errno = errno;
1003                       ok = false;
1004                     }
1005                   n_skip = 0;
1006                 }
1007             }
1008
1009           /* If it's not a regular file with nonnegative size,
1010              position the file pointer by reading.  */
1011
1012           else
1013             {
1014               char buf[BUFSIZ];
1015               size_t n_bytes_read, n_bytes_to_read = BUFSIZ;
1016
1017               while (0 < n_skip)
1018                 {
1019                   if (n_skip < n_bytes_to_read)
1020                     n_bytes_to_read = n_skip;
1021                   n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1022                   n_skip -= n_bytes_read;
1023                   if (n_bytes_read != n_bytes_to_read)
1024                     {
1025                       in_errno = errno;
1026                       ok = false;
1027                       n_skip = 0;
1028                       break;
1029                     }
1030                 }
1031             }
1032
1033           if (n_skip == 0)
1034             break;
1035         }
1036
1037       else   /* cannot fstat() file */
1038         {
1039           error (0, errno, "%s", input_filename);
1040           ok = false;
1041         }
1042
1043       ok &= check_and_close (in_errno);
1044
1045       ok &= open_next_file ();
1046     }
1047
1048   if (n_skip != 0)
1049     error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1050
1051   return ok;
1052 }
1053
1054 static void
1055 format_address_none (uintmax_t address ATTRIBUTE_UNUSED, char c ATTRIBUTE_UNUSED)
1056 {
1057 }
1058
1059 static void
1060 format_address_std (uintmax_t address, char c)
1061 {
1062   char buf[MAX_ADDRESS_LENGTH + 2];
1063   char *p = buf + sizeof buf;
1064   char const *pbound;
1065
1066   *--p = '\0';
1067   *--p = c;
1068   pbound = p - address_pad_len;
1069
1070   /* Use a special case of the code for each base.  This is measurably
1071      faster than generic code.  */
1072   switch (address_base)
1073     {
1074     case 8:
1075       do
1076         *--p = '0' + (address & 7);
1077       while ((address >>= 3) != 0);
1078       break;
1079
1080     case 10:
1081       do
1082         *--p = '0' + (address % 10);
1083       while ((address /= 10) != 0);
1084       break;
1085
1086     case 16:
1087       do
1088         *--p = "0123456789abcdef"[address & 15];
1089       while ((address >>= 4) != 0);
1090       break;
1091     }
1092
1093   while (pbound < p)
1094     *--p = '0';
1095
1096   fputs (p, stdout);
1097 }
1098
1099 static void
1100 format_address_paren (uintmax_t address, char c)
1101 {
1102   putchar ('(');
1103   format_address_std (address, ')');
1104   if (c)
1105     putchar (c);
1106 }
1107
1108 static void
1109 format_address_label (uintmax_t address, char c)
1110 {
1111   format_address_std (address, ' ');
1112   format_address_paren (address + pseudo_offset, c);
1113 }
1114
1115 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1116    of the N_SPEC format specs.  CURRENT_OFFSET is the byte address of
1117    CURR_BLOCK in the concatenation of input files, and it is printed
1118    (optionally) only before the output line associated with the first
1119    format spec.  When duplicate blocks are being abbreviated, the output
1120    for a sequence of identical input blocks is the output for the first
1121    block followed by an asterisk alone on a line.  It is valid to compare
1122    the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1123    That condition may be false only for the last input block.  */
1124
1125 static void
1126 write_block (uintmax_t current_offset, size_t n_bytes,
1127              const char *prev_block, const char *curr_block)
1128 {
1129   static bool first = true;
1130   static bool prev_pair_equal = false;
1131
1132 #define EQUAL_BLOCKS(b1, b2) (memcmp (b1, b2, bytes_per_block) == 0)
1133
1134   if (abbreviate_duplicate_blocks
1135       && !first && n_bytes == bytes_per_block
1136       && EQUAL_BLOCKS (prev_block, curr_block))
1137     {
1138       if (prev_pair_equal)
1139         {
1140           /* The two preceding blocks were equal, and the current
1141              block is the same as the last one, so print nothing.  */
1142         }
1143       else
1144         {
1145           printf ("*\n");
1146           prev_pair_equal = true;
1147         }
1148     }
1149   else
1150     {
1151       size_t i;
1152
1153       prev_pair_equal = false;
1154       for (i = 0; i < n_specs; i++)
1155         {
1156           int datum_width = width_bytes[spec[i].size];
1157           int fields_per_block = bytes_per_block / datum_width;
1158           int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1159           if (i == 0)
1160             format_address (current_offset, '\0');
1161           else
1162             printf ("%*s", address_pad_len, "");
1163           (*spec[i].print_function) (fields_per_block, blank_fields,
1164                                      curr_block, spec[i].fmt_string,
1165                                      spec[i].field_width, spec[i].pad_width);
1166           if (spec[i].hexl_mode_trailer)
1167             {
1168               /* space-pad out to full line width, then dump the trailer */
1169               int field_width = spec[i].field_width;
1170               int pad_width = (spec[i].pad_width * blank_fields
1171                                / fields_per_block);
1172               printf ("%*s", blank_fields * field_width + pad_width, "");
1173               dump_hexl_mode_trailer (n_bytes, curr_block);
1174             }
1175           putchar ('\n');
1176         }
1177     }
1178   first = false;
1179 }
1180
1181 /* Read a single byte into *C from the concatenation of the input files
1182    named in the global array FILE_LIST.  On the first call to this
1183    function, the global variable IN_STREAM is expected to be an open
1184    stream associated with the input file INPUT_FILENAME.  If IN_STREAM
1185    is at end-of-file, close it and update the global variables IN_STREAM
1186    and INPUT_FILENAME so they correspond to the next file in the list.
1187    Then try to read a byte from the newly opened file.  Repeat if
1188    necessary until EOF is reached for the last file in FILE_LIST, then
1189    set *C to EOF and return.  Subsequent calls do likewise.  Return
1190    true if successful.  */
1191
1192 static bool
1193 read_char (int *c)
1194 {
1195   bool ok = true;
1196
1197   *c = EOF;
1198
1199   while (in_stream != NULL)     /* EOF.  */
1200     {
1201       *c = fgetc (in_stream);
1202
1203       if (*c != EOF)
1204         break;
1205
1206       ok &= check_and_close (errno);
1207
1208       ok &= open_next_file ();
1209     }
1210
1211   return ok;
1212 }
1213
1214 /* Read N bytes into BLOCK from the concatenation of the input files
1215    named in the global array FILE_LIST.  On the first call to this
1216    function, the global variable IN_STREAM is expected to be an open
1217    stream associated with the input file INPUT_FILENAME.  If all N
1218    bytes cannot be read from IN_STREAM, close IN_STREAM and update
1219    the global variables IN_STREAM and INPUT_FILENAME.  Then try to
1220    read the remaining bytes from the newly opened file.  Repeat if
1221    necessary until EOF is reached for the last file in FILE_LIST.
1222    On subsequent calls, don't modify BLOCK and return true.  Set
1223    *N_BYTES_IN_BUFFER to the number of bytes read.  If an error occurs,
1224    it will be detected through ferror when the stream is about to be
1225    closed.  If there is an error, give a message but continue reading
1226    as usual and return false.  Otherwise return true.  */
1227
1228 static bool
1229 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1230 {
1231   bool ok = true;
1232
1233   assert (0 < n && n <= bytes_per_block);
1234
1235   *n_bytes_in_buffer = 0;
1236
1237   if (n == 0)
1238     return true;
1239
1240   while (in_stream != NULL)     /* EOF.  */
1241     {
1242       size_t n_needed;
1243       size_t n_read;
1244
1245       n_needed = n - *n_bytes_in_buffer;
1246       n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1247
1248       *n_bytes_in_buffer += n_read;
1249
1250       if (n_read == n_needed)
1251         break;
1252
1253       ok &= check_and_close (errno);
1254
1255       ok &= open_next_file ();
1256     }
1257
1258   return ok;
1259 }
1260
1261 /* Return the least common multiple of the sizes associated
1262    with the format specs.  */
1263
1264 static int
1265 get_lcm (void)
1266 {
1267   size_t i;
1268   int l_c_m = 1;
1269
1270   for (i = 0; i < n_specs; i++)
1271     l_c_m = lcm (l_c_m, width_bytes[spec[i].size]);
1272   return l_c_m;
1273 }
1274
1275 /* If S is a valid traditional offset specification with an optional
1276    leading '+' return true and set *OFFSET to the offset it denotes.  */
1277
1278 static bool
1279 parse_old_offset (const char *s, uintmax_t *offset)
1280 {
1281   int radix;
1282
1283   if (*s == '\0')
1284     return false;
1285
1286   /* Skip over any leading '+'. */
1287   if (s[0] == '+')
1288     ++s;
1289
1290   /* Determine the radix we'll use to interpret S.  If there is a `.',
1291      it's decimal, otherwise, if the string begins with `0X'or `0x',
1292      it's hexadecimal, else octal.  */
1293   if (strchr (s, '.') != NULL)
1294     radix = 10;
1295   else
1296     {
1297       if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1298         radix = 16;
1299       else
1300         radix = 8;
1301     }
1302
1303   return xstrtoumax (s, NULL, radix, offset, "Bb") == LONGINT_OK;
1304 }
1305
1306 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1307    formatted block to standard output, and repeat until the specified
1308    maximum number of bytes has been read or until all input has been
1309    processed.  If the last block read is smaller than BYTES_PER_BLOCK
1310    and its size is not a multiple of the size associated with a format
1311    spec, extend the input block with zero bytes until its length is a
1312    multiple of all format spec sizes.  Write the final block.  Finally,
1313    write on a line by itself the offset of the byte after the last byte
1314    read.  Accumulate return values from calls to read_block and
1315    check_and_close, and if any was false, return false.
1316    Otherwise, return true.  */
1317
1318 static bool
1319 dump (void)
1320 {
1321   char *block[2];
1322   uintmax_t current_offset;
1323   bool idx = false;
1324   bool ok = true;
1325   size_t n_bytes_read;
1326
1327   block[0] = xnmalloc (2, bytes_per_block);
1328   block[1] = block[0] + bytes_per_block;
1329
1330   current_offset = n_bytes_to_skip;
1331
1332   if (limit_bytes_to_format)
1333     {
1334       while (1)
1335         {
1336           size_t n_needed;
1337           if (current_offset >= end_offset)
1338             {
1339               n_bytes_read = 0;
1340               break;
1341             }
1342           n_needed = MIN (end_offset - current_offset,
1343                           (uintmax_t) bytes_per_block);
1344           ok &= read_block (n_needed, block[idx], &n_bytes_read);
1345           if (n_bytes_read < bytes_per_block)
1346             break;
1347           assert (n_bytes_read == bytes_per_block);
1348           write_block (current_offset, n_bytes_read,
1349                        block[!idx], block[idx]);
1350           current_offset += n_bytes_read;
1351           idx = !idx;
1352         }
1353     }
1354   else
1355     {
1356       while (1)
1357         {
1358           ok &= read_block (bytes_per_block, block[idx], &n_bytes_read);
1359           if (n_bytes_read < bytes_per_block)
1360             break;
1361           assert (n_bytes_read == bytes_per_block);
1362           write_block (current_offset, n_bytes_read,
1363                        block[!idx], block[idx]);
1364           current_offset += n_bytes_read;
1365           idx = !idx;
1366         }
1367     }
1368
1369   if (n_bytes_read > 0)
1370     {
1371       int l_c_m;
1372       size_t bytes_to_write;
1373
1374       l_c_m = get_lcm ();
1375
1376       /* Ensure zero-byte padding up to the smallest multiple of l_c_m that
1377          is at least as large as n_bytes_read.  */
1378       bytes_to_write = l_c_m * ((n_bytes_read + l_c_m - 1) / l_c_m);
1379
1380       memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1381       write_block (current_offset, n_bytes_read, block[!idx], block[idx]);
1382       current_offset += n_bytes_read;
1383     }
1384
1385   format_address (current_offset, '\n');
1386
1387   if (limit_bytes_to_format && current_offset >= end_offset)
1388     ok &= check_and_close (0);
1389
1390   free (block[0]);
1391
1392   return ok;
1393 }
1394
1395 /* STRINGS mode.  Find each "string constant" in the input.
1396    A string constant is a run of at least `string_min' ASCII
1397    graphic (or formatting) characters terminated by a null.
1398    Based on a function written by Richard Stallman for a
1399    traditional version of od.  Return true if successful.  */
1400
1401 static bool
1402 dump_strings (void)
1403 {
1404   size_t bufsize = MAX (100, string_min);
1405   char *buf = xmalloc (bufsize);
1406   uintmax_t address = n_bytes_to_skip;
1407   bool ok = true;
1408
1409   while (1)
1410     {
1411       size_t i;
1412       int c;
1413
1414       /* See if the next `string_min' chars are all printing chars.  */
1415     tryline:
1416
1417       if (limit_bytes_to_format
1418           && (end_offset < string_min || end_offset - string_min <= address))
1419         break;
1420
1421       for (i = 0; i < string_min; i++)
1422         {
1423           ok &= read_char (&c);
1424           address++;
1425           if (c < 0)
1426             {
1427               free (buf);
1428               return ok;
1429             }
1430           if (! isprint (c))
1431             /* Found a non-printing.  Try again starting with next char.  */
1432             goto tryline;
1433           buf[i] = c;
1434         }
1435
1436       /* We found a run of `string_min' printable characters.
1437          Now see if it is terminated with a null byte.  */
1438       while (!limit_bytes_to_format || address < end_offset)
1439         {
1440           if (i == bufsize)
1441             {
1442               buf = X2REALLOC (buf, &bufsize);
1443             }
1444           ok &= read_char (&c);
1445           address++;
1446           if (c < 0)
1447             {
1448               free (buf);
1449               return ok;
1450             }
1451           if (c == '\0')
1452             break;              /* It is; print this string.  */
1453           if (! isprint (c))
1454             goto tryline;       /* It isn't; give up on this string.  */
1455           buf[i++] = c;         /* String continues; store it all.  */
1456         }
1457
1458       /* If we get here, the string is all printable and null-terminated,
1459          so print it.  It is all in `buf' and `i' is its length.  */
1460       buf[i] = 0;
1461       format_address (address - i - 1, ' ');
1462
1463       for (i = 0; (c = buf[i]); i++)
1464         {
1465           switch (c)
1466             {
1467             case '\a':
1468               fputs ("\\a", stdout);
1469               break;
1470
1471             case '\b':
1472               fputs ("\\b", stdout);
1473               break;
1474
1475             case '\f':
1476               fputs ("\\f", stdout);
1477               break;
1478
1479             case '\n':
1480               fputs ("\\n", stdout);
1481               break;
1482
1483             case '\r':
1484               fputs ("\\r", stdout);
1485               break;
1486
1487             case '\t':
1488               fputs ("\\t", stdout);
1489               break;
1490
1491             case '\v':
1492               fputs ("\\v", stdout);
1493               break;
1494
1495             default:
1496               putc (c, stdout);
1497             }
1498         }
1499       putchar ('\n');
1500     }
1501
1502   /* We reach this point only if we search through
1503      (max_bytes_to_format - string_min) bytes before reaching EOF.  */
1504
1505   free (buf);
1506
1507   ok &= check_and_close (0);
1508   return ok;
1509 }
1510
1511 int
1512 main (int argc, char **argv)
1513 {
1514   int n_files;
1515   size_t i;
1516   int l_c_m;
1517   size_t desired_width IF_LINT (= 0);
1518   bool modern = false;
1519   bool width_specified = false;
1520   bool ok = true;
1521   size_t width_per_block = 0;
1522   static char const multipliers[] = "bEGKkMmPTYZ0";
1523
1524   /* The old-style `pseudo starting address' to be printed in parentheses
1525      after any true address.  */
1526   uintmax_t pseudo_start IF_LINT (= 0);
1527
1528   initialize_main (&argc, &argv);
1529   set_program_name (argv[0]);
1530   setlocale (LC_ALL, "");
1531   bindtextdomain (PACKAGE, LOCALEDIR);
1532   textdomain (PACKAGE);
1533
1534   atexit (close_stdout);
1535
1536   for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1537     integral_type_size[i] = NO_SIZE;
1538
1539   integral_type_size[sizeof (char)] = CHAR;
1540   integral_type_size[sizeof (short int)] = SHORT;
1541   integral_type_size[sizeof (int)] = INT;
1542   integral_type_size[sizeof (long int)] = LONG;
1543 #if HAVE_UNSIGNED_LONG_LONG_INT
1544   /* If `long int' and `long long int' have the same size, it's fine
1545      to overwrite the entry for `long' with this one.  */
1546   integral_type_size[sizeof (unsigned_long_long_int)] = LONG_LONG;
1547 #endif
1548
1549   for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1550     fp_type_size[i] = NO_SIZE;
1551
1552   fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1553   /* The array entry for `double' is filled in after that for `long double'
1554      so that if they are the same size, we avoid any overhead of
1555      long double computation in libc.  */
1556   fp_type_size[sizeof (long double)] = FLOAT_LONG_DOUBLE;
1557   fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1558
1559   n_specs = 0;
1560   n_specs_allocated = 0;
1561   spec = NULL;
1562
1563   format_address = format_address_std;
1564   address_base = 8;
1565   address_pad_len = 7;
1566   flag_dump_strings = false;
1567
1568   for (;;)
1569     {
1570       uintmax_t tmp;
1571       enum strtol_error s_err;
1572       int oi = -1;
1573       int c = getopt_long (argc, argv, short_options, long_options, &oi);
1574       if (c == -1)
1575         break;
1576
1577       switch (c)
1578         {
1579         case 'A':
1580           modern = true;
1581           switch (optarg[0])
1582             {
1583             case 'd':
1584               format_address = format_address_std;
1585               address_base = 10;
1586               address_pad_len = 7;
1587               break;
1588             case 'o':
1589               format_address = format_address_std;
1590               address_base = 8;
1591               address_pad_len = 7;
1592               break;
1593             case 'x':
1594               format_address = format_address_std;
1595               address_base = 16;
1596               address_pad_len = 6;
1597               break;
1598             case 'n':
1599               format_address = format_address_none;
1600               address_pad_len = 0;
1601               break;
1602             default:
1603               error (EXIT_FAILURE, 0,
1604                      _("invalid output address radix `%c'; \
1605 it must be one character from [doxn]"),
1606                      optarg[0]);
1607               break;
1608             }
1609           break;
1610
1611         case 'j':
1612           modern = true;
1613           s_err = xstrtoumax (optarg, NULL, 0, &n_bytes_to_skip, multipliers);
1614           if (s_err != LONGINT_OK)
1615             xstrtol_fatal (s_err, oi, c, long_options, optarg);
1616           break;
1617
1618         case 'N':
1619           modern = true;
1620           limit_bytes_to_format = true;
1621
1622           s_err = xstrtoumax (optarg, NULL, 0, &max_bytes_to_format,
1623                               multipliers);
1624           if (s_err != LONGINT_OK)
1625             xstrtol_fatal (s_err, oi, c, long_options, optarg);
1626           break;
1627
1628         case 'S':
1629           modern = true;
1630           if (optarg == NULL)
1631             string_min = 3;
1632           else
1633             {
1634               s_err = xstrtoumax (optarg, NULL, 0, &tmp, multipliers);
1635               if (s_err != LONGINT_OK)
1636                 xstrtol_fatal (s_err, oi, c, long_options, optarg);
1637
1638               /* The minimum string length may be no larger than SIZE_MAX,
1639                  since we may allocate a buffer of this size.  */
1640               if (SIZE_MAX < tmp)
1641                 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1642
1643               string_min = tmp;
1644             }
1645           flag_dump_strings = true;
1646           break;
1647
1648         case 't':
1649           modern = true;
1650           ok &= decode_format_string (optarg);
1651           break;
1652
1653         case 'v':
1654           modern = true;
1655           abbreviate_duplicate_blocks = false;
1656           break;
1657
1658         case TRADITIONAL_OPTION:
1659           traditional = true;
1660           break;
1661
1662           /* The next several cases map the traditional format
1663              specification options to the corresponding modern format
1664              specs.  GNU od accepts any combination of old- and
1665              new-style options.  Format specification options accumulate.
1666              The obsolescent and undocumented formats are compatible
1667              with FreeBSD 4.10 od.  */
1668
1669 #define CASE_OLD_ARG(old_char,new_string)               \
1670         case old_char:                                  \
1671           ok &= decode_format_string (new_string);      \
1672           break
1673
1674           CASE_OLD_ARG ('a', "a");
1675           CASE_OLD_ARG ('b', "o1");
1676           CASE_OLD_ARG ('c', "c");
1677           CASE_OLD_ARG ('D', "u4"); /* obsolescent and undocumented */
1678           CASE_OLD_ARG ('d', "u2");
1679         case 'F': /* obsolescent and undocumented alias */
1680           CASE_OLD_ARG ('e', "fD"); /* obsolescent and undocumented */
1681           CASE_OLD_ARG ('f', "fF");
1682         case 'X': /* obsolescent and undocumented alias */
1683           CASE_OLD_ARG ('H', "x4"); /* obsolescent and undocumented */
1684           CASE_OLD_ARG ('i', "dI");
1685         case 'I': case 'L': /* obsolescent and undocumented aliases */
1686           CASE_OLD_ARG ('l', "dL");
1687           CASE_OLD_ARG ('O', "o4"); /* obsolesent and undocumented */
1688         case 'B': /* obsolescent and undocumented alias */
1689           CASE_OLD_ARG ('o', "o2");
1690           CASE_OLD_ARG ('s', "d2");
1691         case 'h': /* obsolescent and undocumented alias */
1692           CASE_OLD_ARG ('x', "x2");
1693
1694 #undef CASE_OLD_ARG
1695
1696         case 'w':
1697           modern = true;
1698           width_specified = true;
1699           if (optarg == NULL)
1700             {
1701               desired_width = 32;
1702             }
1703           else
1704             {
1705               uintmax_t w_tmp;
1706               s_err = xstrtoumax (optarg, NULL, 10, &w_tmp, "");
1707               if (s_err != LONGINT_OK)
1708                 xstrtol_fatal (s_err, oi, c, long_options, optarg);
1709               if (SIZE_MAX < w_tmp)
1710                 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1711               desired_width = w_tmp;
1712             }
1713           break;
1714
1715         case_GETOPT_HELP_CHAR;
1716
1717         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1718
1719         default:
1720           usage (EXIT_FAILURE);
1721           break;
1722         }
1723     }
1724
1725   if (!ok)
1726     exit (EXIT_FAILURE);
1727
1728   if (flag_dump_strings && n_specs > 0)
1729     error (EXIT_FAILURE, 0,
1730            _("no type may be specified when dumping strings"));
1731
1732   n_files = argc - optind;
1733
1734   /* If the --traditional option is used, there may be from
1735      0 to 3 remaining command line arguments;  handle each case
1736      separately.
1737         od [file] [[+]offset[.][b] [[+]label[.][b]]]
1738      The offset and label have the same syntax.
1739
1740      If --traditional is not given, and if no modern options are
1741      given, and if the offset begins with + or (if there are two
1742      operands) a digit, accept only this form, as per POSIX:
1743         od [file] [[+]offset[.][b]]
1744   */
1745
1746   if (!modern | traditional)
1747     {
1748       uintmax_t o1;
1749       uintmax_t o2;
1750
1751       switch (n_files)
1752         {
1753         case 1:
1754           if ((traditional || argv[optind][0] == '+')
1755               && parse_old_offset (argv[optind], &o1))
1756             {
1757               n_bytes_to_skip = o1;
1758               --n_files;
1759               ++argv;
1760             }
1761           break;
1762
1763         case 2:
1764           if ((traditional || argv[optind + 1][0] == '+'
1765                || ISDIGIT (argv[optind + 1][0]))
1766               && parse_old_offset (argv[optind + 1], &o2))
1767             {
1768               if (traditional && parse_old_offset (argv[optind], &o1))
1769                 {
1770                   n_bytes_to_skip = o1;
1771                   flag_pseudo_start = true;
1772                   pseudo_start = o2;
1773                   argv += 2;
1774                   n_files -= 2;
1775                 }
1776               else
1777                 {
1778                   n_bytes_to_skip = o2;
1779                   --n_files;
1780                   argv[optind + 1] = argv[optind];
1781                   ++argv;
1782                 }
1783             }
1784           break;
1785
1786         case 3:
1787           if (traditional
1788               && parse_old_offset (argv[optind + 1], &o1)
1789               && parse_old_offset (argv[optind + 2], &o2))
1790             {
1791               n_bytes_to_skip = o1;
1792               flag_pseudo_start = true;
1793               pseudo_start = o2;
1794               argv[optind + 2] = argv[optind];
1795               argv += 2;
1796               n_files -= 2;
1797             }
1798           break;
1799         }
1800
1801       if (traditional && 1 < n_files)
1802         {
1803           error (0, 0, _("extra operand %s"), quote (argv[optind + 1]));
1804           error (0, 0, "%s\n",
1805                  _("compatibility mode supports at most one file"));
1806           usage (EXIT_FAILURE);
1807         }
1808     }
1809
1810   if (flag_pseudo_start)
1811     {
1812       if (format_address == format_address_none)
1813         {
1814           address_base = 8;
1815           address_pad_len = 7;
1816           format_address = format_address_paren;
1817         }
1818       else
1819         format_address = format_address_label;
1820     }
1821
1822   if (limit_bytes_to_format)
1823     {
1824       end_offset = n_bytes_to_skip + max_bytes_to_format;
1825       if (end_offset < n_bytes_to_skip)
1826         error (EXIT_FAILURE, 0, _("skip-bytes + read-bytes is too large"));
1827     }
1828
1829   if (n_specs == 0)
1830     decode_format_string ("oS");
1831
1832   if (n_files > 0)
1833     {
1834       /* Set the global pointer FILE_LIST so that it
1835          references the first file-argument on the command-line.  */
1836
1837       file_list = (char const *const *) &argv[optind];
1838     }
1839   else
1840     {
1841       /* No files were listed on the command line.
1842          Set the global pointer FILE_LIST so that it
1843          references the null-terminated list of one name: "-".  */
1844
1845       file_list = default_file_list;
1846     }
1847
1848   /* open the first input file */
1849   ok = open_next_file ();
1850   if (in_stream == NULL)
1851     goto cleanup;
1852
1853   /* skip over any unwanted header bytes */
1854   ok &= skip (n_bytes_to_skip);
1855   if (in_stream == NULL)
1856     goto cleanup;
1857
1858   pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1859
1860   /* Compute output block length.  */
1861   l_c_m = get_lcm ();
1862
1863   if (width_specified)
1864     {
1865       if (desired_width != 0 && desired_width % l_c_m == 0)
1866         bytes_per_block = desired_width;
1867       else
1868         {
1869           error (0, 0, _("warning: invalid width %lu; using %d instead"),
1870                  (unsigned long int) desired_width, l_c_m);
1871           bytes_per_block = l_c_m;
1872         }
1873     }
1874   else
1875     {
1876       if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1877         bytes_per_block = l_c_m * (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1878       else
1879         bytes_per_block = l_c_m;
1880     }
1881
1882   /* Compute padding necessary to align output block.  */
1883   for (i = 0; i < n_specs; i++)
1884     {
1885       int fields_per_block = bytes_per_block / width_bytes[spec[i].size];
1886       int block_width = (spec[i].field_width + 1) * fields_per_block;
1887       if (width_per_block < block_width)
1888         width_per_block = block_width;
1889     }
1890   for (i = 0; i < n_specs; i++)
1891     {
1892       int fields_per_block = bytes_per_block / width_bytes[spec[i].size];
1893       int block_width = spec[i].field_width * fields_per_block;
1894       spec[i].pad_width = width_per_block - block_width;
1895     }
1896
1897 #ifdef DEBUG
1898   printf ("lcm=%d, width_per_block=%zu\n", l_c_m, width_per_block);
1899   for (i = 0; i < n_specs; i++)
1900     {
1901       int fields_per_block = bytes_per_block / width_bytes[spec[i].size];
1902       assert (bytes_per_block % width_bytes[spec[i].size] == 0);
1903       assert (1 <= spec[i].pad_width / fields_per_block);
1904       printf ("%d: fmt=\"%s\" in_width=%d out_width=%d pad=%d\n",
1905               i, spec[i].fmt_string, width_bytes[spec[i].size],
1906               spec[i].field_width, spec[i].pad_width);
1907     }
1908 #endif
1909
1910   ok &= (flag_dump_strings ? dump_strings () : dump ());
1911
1912 cleanup:;
1913
1914   if (have_read_stdin && fclose (stdin) == EOF)
1915     error (EXIT_FAILURE, errno, _("standard input"));
1916
1917   exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);
1918 }