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