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