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