maint: remove empty statement after jump label
[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       struct lconv const *locale = localeconv ();
775       size_t decimal_point_len =
776         (locale->decimal_point[0] ? strlen (locale->decimal_point) : 1);
777
778       switch (size_spec)
779         {
780         case FLOAT_SINGLE:
781           print_function = print_float;
782           field_width = FLT_STRLEN_BOUND_L (decimal_point_len);
783           break;
784
785         case FLOAT_DOUBLE:
786           print_function = print_double;
787           field_width = DBL_STRLEN_BOUND_L (decimal_point_len);
788           break;
789
790         case FLOAT_LONG_DOUBLE:
791           print_function = print_long_double;
792           field_width = LDBL_STRLEN_BOUND_L (decimal_point_len);
793           break;
794
795         default:
796           abort ();
797         }
798
799       break;
800
801     case 'a':
802       ++s;
803       fmt = NAMED_CHARACTER;
804       size_spec = CHAR;
805       print_function = print_named_ascii;
806       field_width = 3;
807       break;
808
809     case 'c':
810       ++s;
811       fmt = CHARACTER;
812       size_spec = CHAR;
813       print_function = print_ascii;
814       field_width = 3;
815       break;
816
817     default:
818       error (0, 0, _("invalid character `%c' in type string %s"),
819              *s, quote (s_orig));
820       return false;
821     }
822
823   tspec->size = size_spec;
824   tspec->fmt = fmt;
825   tspec->print_function = print_function;
826
827   tspec->field_width = field_width;
828   tspec->hexl_mode_trailer = (*s == 'z');
829   if (tspec->hexl_mode_trailer)
830     s++;
831
832   if (next != NULL)
833     *next = s;
834
835   return true;
836 }
837
838 /* Given a list of one or more input filenames FILE_LIST, set the global
839    file pointer IN_STREAM and the global string INPUT_FILENAME to the
840    first one that can be successfully opened. Modify FILE_LIST to
841    reference the next filename in the list.  A file name of "-" is
842    interpreted as standard input.  If any file open fails, give an error
843    message and return false.  */
844
845 static bool
846 open_next_file (void)
847 {
848   bool ok = true;
849
850   do
851     {
852       input_filename = *file_list;
853       if (input_filename == NULL)
854         return ok;
855       ++file_list;
856
857       if (STREQ (input_filename, "-"))
858         {
859           input_filename = _("standard input");
860           in_stream = stdin;
861           have_read_stdin = true;
862           if (O_BINARY && ! isatty (STDIN_FILENO))
863             xfreopen (NULL, "rb", stdin);
864         }
865       else
866         {
867           in_stream = fopen (input_filename, (O_BINARY ? "rb" : "r"));
868           if (in_stream == NULL)
869             {
870               error (0, errno, "%s", input_filename);
871               ok = false;
872             }
873         }
874     }
875   while (in_stream == NULL);
876
877   if (limit_bytes_to_format && !flag_dump_strings)
878     setvbuf (in_stream, NULL, _IONBF, 0);
879
880   return ok;
881 }
882
883 /* Test whether there have been errors on in_stream, and close it if
884    it is not standard input.  Return false if there has been an error
885    on in_stream or stdout; return true otherwise.  This function will
886    report more than one error only if both a read and a write error
887    have occurred.  IN_ERRNO, if nonzero, is the error number
888    corresponding to the most recent action for IN_STREAM.  */
889
890 static bool
891 check_and_close (int in_errno)
892 {
893   bool ok = true;
894
895   if (in_stream != NULL)
896     {
897       if (ferror (in_stream))
898         {
899           error (0, in_errno, _("%s: read error"), input_filename);
900           if (! STREQ (file_list[-1], "-"))
901             fclose (in_stream);
902           ok = false;
903         }
904       else if (! STREQ (file_list[-1], "-") && fclose (in_stream) != 0)
905         {
906           error (0, errno, "%s", input_filename);
907           ok = false;
908         }
909
910       in_stream = NULL;
911     }
912
913   if (ferror (stdout))
914     {
915       error (0, 0, _("write error"));
916       ok = false;
917     }
918
919   return ok;
920 }
921
922 /* Decode the modern od format string S.  Append the decoded
923    representation to the global array SPEC, reallocating SPEC if
924    necessary.  Return true if S is valid.  */
925
926 static bool
927 decode_format_string (const char *s)
928 {
929   const char *s_orig = s;
930   assert (s != NULL);
931
932   while (*s != '\0')
933     {
934       const char *next;
935
936       if (n_specs_allocated <= n_specs)
937         spec = X2NREALLOC (spec, &n_specs_allocated);
938
939       if (! decode_one_format (s_orig, s, &next, &spec[n_specs]))
940         return false;
941
942       assert (s != next);
943       s = next;
944       ++n_specs;
945     }
946
947   return true;
948 }
949
950 /* Given a list of one or more input filenames FILE_LIST, set the global
951    file pointer IN_STREAM to position N_SKIP in the concatenation of
952    those files.  If any file operation fails or if there are fewer than
953    N_SKIP bytes in the combined input, give an error message and return
954    false.  When possible, use seek rather than read operations to
955    advance IN_STREAM.  */
956
957 static bool
958 skip (uintmax_t n_skip)
959 {
960   bool ok = true;
961   int in_errno = 0;
962
963   if (n_skip == 0)
964     return true;
965
966   while (in_stream != NULL)     /* EOF.  */
967     {
968       struct stat file_stats;
969
970       /* First try seeking.  For large offsets, this extra work is
971          worthwhile.  If the offset is below some threshold it may be
972          more efficient to move the pointer by reading.  There are two
973          issues when trying to seek:
974            - the file must be seekable.
975            - before seeking to the specified position, make sure
976              that the new position is in the current file.
977              Try to do that by getting file's size using fstat.
978              But that will work only for regular files.  */
979
980       if (fstat (fileno (in_stream), &file_stats) == 0)
981         {
982           /* The st_size field is valid only for regular files
983              (and for symbolic links, which cannot occur here).
984              If the number of bytes left to skip is larger than
985              the size of the current file, we can decrement n_skip
986              and go on to the next file.  Skip this optimization also
987              when st_size is 0, because some kernels report that
988              nonempty files in /proc have st_size == 0.  */
989           if (S_ISREG (file_stats.st_mode) && 0 < file_stats.st_size)
990             {
991               if ((uintmax_t) file_stats.st_size < n_skip)
992                 n_skip -= file_stats.st_size;
993               else
994                 {
995                   if (fseeko (in_stream, n_skip, SEEK_CUR) != 0)
996                     {
997                       in_errno = errno;
998                       ok = false;
999                     }
1000                   n_skip = 0;
1001                 }
1002             }
1003
1004           /* If it's not a regular file with nonnegative size,
1005              position the file pointer by reading.  */
1006
1007           else
1008             {
1009               char buf[BUFSIZ];
1010               size_t n_bytes_read, n_bytes_to_read = BUFSIZ;
1011
1012               while (0 < n_skip)
1013                 {
1014                   if (n_skip < n_bytes_to_read)
1015                     n_bytes_to_read = n_skip;
1016                   n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1017                   n_skip -= n_bytes_read;
1018                   if (n_bytes_read != n_bytes_to_read)
1019                     {
1020                       in_errno = errno;
1021                       ok = false;
1022                       n_skip = 0;
1023                       break;
1024                     }
1025                 }
1026             }
1027
1028           if (n_skip == 0)
1029             break;
1030         }
1031
1032       else   /* cannot fstat() file */
1033         {
1034           error (0, errno, "%s", input_filename);
1035           ok = false;
1036         }
1037
1038       ok &= check_and_close (in_errno);
1039
1040       ok &= open_next_file ();
1041     }
1042
1043   if (n_skip != 0)
1044     error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1045
1046   return ok;
1047 }
1048
1049 static void
1050 format_address_none (uintmax_t address ATTRIBUTE_UNUSED,
1051                      char c ATTRIBUTE_UNUSED)
1052 {
1053 }
1054
1055 static void
1056 format_address_std (uintmax_t address, char c)
1057 {
1058   char buf[MAX_ADDRESS_LENGTH + 2];
1059   char *p = buf + sizeof buf;
1060   char const *pbound;
1061
1062   *--p = '\0';
1063   *--p = c;
1064   pbound = p - address_pad_len;
1065
1066   /* Use a special case of the code for each base.  This is measurably
1067      faster than generic code.  */
1068   switch (address_base)
1069     {
1070     case 8:
1071       do
1072         *--p = '0' + (address & 7);
1073       while ((address >>= 3) != 0);
1074       break;
1075
1076     case 10:
1077       do
1078         *--p = '0' + (address % 10);
1079       while ((address /= 10) != 0);
1080       break;
1081
1082     case 16:
1083       do
1084         *--p = "0123456789abcdef"[address & 15];
1085       while ((address >>= 4) != 0);
1086       break;
1087     }
1088
1089   while (pbound < p)
1090     *--p = '0';
1091
1092   fputs (p, stdout);
1093 }
1094
1095 static void
1096 format_address_paren (uintmax_t address, char c)
1097 {
1098   putchar ('(');
1099   format_address_std (address, ')');
1100   if (c)
1101     putchar (c);
1102 }
1103
1104 static void
1105 format_address_label (uintmax_t address, char c)
1106 {
1107   format_address_std (address, ' ');
1108   format_address_paren (address + pseudo_offset, c);
1109 }
1110
1111 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1112    of the N_SPEC format specs.  CURRENT_OFFSET is the byte address of
1113    CURR_BLOCK in the concatenation of input files, and it is printed
1114    (optionally) only before the output line associated with the first
1115    format spec.  When duplicate blocks are being abbreviated, the output
1116    for a sequence of identical input blocks is the output for the first
1117    block followed by an asterisk alone on a line.  It is valid to compare
1118    the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1119    That condition may be false only for the last input block.  */
1120
1121 static void
1122 write_block (uintmax_t current_offset, size_t n_bytes,
1123              const char *prev_block, const char *curr_block)
1124 {
1125   static bool first = true;
1126   static bool prev_pair_equal = false;
1127
1128 #define EQUAL_BLOCKS(b1, b2) (memcmp (b1, b2, bytes_per_block) == 0)
1129
1130   if (abbreviate_duplicate_blocks
1131       && !first && n_bytes == bytes_per_block
1132       && EQUAL_BLOCKS (prev_block, curr_block))
1133     {
1134       if (prev_pair_equal)
1135         {
1136           /* The two preceding blocks were equal, and the current
1137              block is the same as the last one, so print nothing.  */
1138         }
1139       else
1140         {
1141           printf ("*\n");
1142           prev_pair_equal = true;
1143         }
1144     }
1145   else
1146     {
1147       size_t i;
1148
1149       prev_pair_equal = false;
1150       for (i = 0; i < n_specs; i++)
1151         {
1152           int datum_width = width_bytes[spec[i].size];
1153           int fields_per_block = bytes_per_block / datum_width;
1154           int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1155           if (i == 0)
1156             format_address (current_offset, '\0');
1157           else
1158             printf ("%*s", address_pad_len, "");
1159           (*spec[i].print_function) (fields_per_block, blank_fields,
1160                                      curr_block, spec[i].fmt_string,
1161                                      spec[i].field_width, spec[i].pad_width);
1162           if (spec[i].hexl_mode_trailer)
1163             {
1164               /* space-pad out to full line width, then dump the trailer */
1165               int field_width = spec[i].field_width;
1166               int pad_width = (spec[i].pad_width * blank_fields
1167                                / fields_per_block);
1168               printf ("%*s", blank_fields * field_width + pad_width, "");
1169               dump_hexl_mode_trailer (n_bytes, curr_block);
1170             }
1171           putchar ('\n');
1172         }
1173     }
1174   first = false;
1175 }
1176
1177 /* Read a single byte into *C from the concatenation of the input files
1178    named in the global array FILE_LIST.  On the first call to this
1179    function, the global variable IN_STREAM is expected to be an open
1180    stream associated with the input file INPUT_FILENAME.  If IN_STREAM
1181    is at end-of-file, close it and update the global variables IN_STREAM
1182    and INPUT_FILENAME so they correspond to the next file in the list.
1183    Then try to read a byte from the newly opened file.  Repeat if
1184    necessary until EOF is reached for the last file in FILE_LIST, then
1185    set *C to EOF and return.  Subsequent calls do likewise.  Return
1186    true if successful.  */
1187
1188 static bool
1189 read_char (int *c)
1190 {
1191   bool ok = true;
1192
1193   *c = EOF;
1194
1195   while (in_stream != NULL)     /* EOF.  */
1196     {
1197       *c = fgetc (in_stream);
1198
1199       if (*c != EOF)
1200         break;
1201
1202       ok &= check_and_close (errno);
1203
1204       ok &= open_next_file ();
1205     }
1206
1207   return ok;
1208 }
1209
1210 /* Read N bytes into BLOCK from the concatenation of the input files
1211    named in the global array FILE_LIST.  On the first call to this
1212    function, the global variable IN_STREAM is expected to be an open
1213    stream associated with the input file INPUT_FILENAME.  If all N
1214    bytes cannot be read from IN_STREAM, close IN_STREAM and update
1215    the global variables IN_STREAM and INPUT_FILENAME.  Then try to
1216    read the remaining bytes from the newly opened file.  Repeat if
1217    necessary until EOF is reached for the last file in FILE_LIST.
1218    On subsequent calls, don't modify BLOCK and return true.  Set
1219    *N_BYTES_IN_BUFFER to the number of bytes read.  If an error occurs,
1220    it will be detected through ferror when the stream is about to be
1221    closed.  If there is an error, give a message but continue reading
1222    as usual and return false.  Otherwise return true.  */
1223
1224 static bool
1225 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1226 {
1227   bool ok = true;
1228
1229   assert (0 < n && n <= bytes_per_block);
1230
1231   *n_bytes_in_buffer = 0;
1232
1233   if (n == 0)
1234     return true;
1235
1236   while (in_stream != NULL)     /* EOF.  */
1237     {
1238       size_t n_needed;
1239       size_t n_read;
1240
1241       n_needed = n - *n_bytes_in_buffer;
1242       n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1243
1244       *n_bytes_in_buffer += n_read;
1245
1246       if (n_read == n_needed)
1247         break;
1248
1249       ok &= check_and_close (errno);
1250
1251       ok &= open_next_file ();
1252     }
1253
1254   return ok;
1255 }
1256
1257 /* Return the least common multiple of the sizes associated
1258    with the format specs.  */
1259
1260 static int _GL_ATTRIBUTE_PURE
1261 get_lcm (void)
1262 {
1263   size_t i;
1264   int l_c_m = 1;
1265
1266   for (i = 0; i < n_specs; i++)
1267     l_c_m = lcm (l_c_m, width_bytes[spec[i].size]);
1268   return l_c_m;
1269 }
1270
1271 /* If S is a valid traditional offset specification with an optional
1272    leading '+' return true and set *OFFSET to the offset it denotes.  */
1273
1274 static bool
1275 parse_old_offset (const char *s, uintmax_t *offset)
1276 {
1277   int radix;
1278
1279   if (*s == '\0')
1280     return false;
1281
1282   /* Skip over any leading '+'. */
1283   if (s[0] == '+')
1284     ++s;
1285
1286   /* Determine the radix we'll use to interpret S.  If there is a `.',
1287      it's decimal, otherwise, if the string begins with `0X'or `0x',
1288      it's hexadecimal, else octal.  */
1289   if (strchr (s, '.') != NULL)
1290     radix = 10;
1291   else
1292     {
1293       if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1294         radix = 16;
1295       else
1296         radix = 8;
1297     }
1298
1299   return xstrtoumax (s, NULL, radix, offset, "Bb") == LONGINT_OK;
1300 }
1301
1302 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1303    formatted block to standard output, and repeat until the specified
1304    maximum number of bytes has been read or until all input has been
1305    processed.  If the last block read is smaller than BYTES_PER_BLOCK
1306    and its size is not a multiple of the size associated with a format
1307    spec, extend the input block with zero bytes until its length is a
1308    multiple of all format spec sizes.  Write the final block.  Finally,
1309    write on a line by itself the offset of the byte after the last byte
1310    read.  Accumulate return values from calls to read_block and
1311    check_and_close, and if any was false, return false.
1312    Otherwise, return true.  */
1313
1314 static bool
1315 dump (void)
1316 {
1317   char *block[2];
1318   uintmax_t current_offset;
1319   bool idx = false;
1320   bool ok = true;
1321   size_t n_bytes_read;
1322
1323   block[0] = xnmalloc (2, bytes_per_block);
1324   block[1] = block[0] + bytes_per_block;
1325
1326   current_offset = n_bytes_to_skip;
1327
1328   if (limit_bytes_to_format)
1329     {
1330       while (1)
1331         {
1332           size_t n_needed;
1333           if (current_offset >= end_offset)
1334             {
1335               n_bytes_read = 0;
1336               break;
1337             }
1338           n_needed = MIN (end_offset - current_offset,
1339                           (uintmax_t) bytes_per_block);
1340           ok &= read_block (n_needed, block[idx], &n_bytes_read);
1341           if (n_bytes_read < bytes_per_block)
1342             break;
1343           assert (n_bytes_read == bytes_per_block);
1344           write_block (current_offset, n_bytes_read,
1345                        block[!idx], block[idx]);
1346           current_offset += n_bytes_read;
1347           idx = !idx;
1348         }
1349     }
1350   else
1351     {
1352       while (1)
1353         {
1354           ok &= read_block (bytes_per_block, block[idx], &n_bytes_read);
1355           if (n_bytes_read < bytes_per_block)
1356             break;
1357           assert (n_bytes_read == bytes_per_block);
1358           write_block (current_offset, n_bytes_read,
1359                        block[!idx], block[idx]);
1360           current_offset += n_bytes_read;
1361           idx = !idx;
1362         }
1363     }
1364
1365   if (n_bytes_read > 0)
1366     {
1367       int l_c_m;
1368       size_t bytes_to_write;
1369
1370       l_c_m = get_lcm ();
1371
1372       /* Ensure zero-byte padding up to the smallest multiple of l_c_m that
1373          is at least as large as n_bytes_read.  */
1374       bytes_to_write = l_c_m * ((n_bytes_read + l_c_m - 1) / l_c_m);
1375
1376       memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1377       write_block (current_offset, n_bytes_read, block[!idx], block[idx]);
1378       current_offset += n_bytes_read;
1379     }
1380
1381   format_address (current_offset, '\n');
1382
1383   if (limit_bytes_to_format && current_offset >= end_offset)
1384     ok &= check_and_close (0);
1385
1386   free (block[0]);
1387
1388   return ok;
1389 }
1390
1391 /* STRINGS mode.  Find each "string constant" in the input.
1392    A string constant is a run of at least `string_min' ASCII
1393    graphic (or formatting) characters terminated by a null.
1394    Based on a function written by Richard Stallman for a
1395    traditional version of od.  Return true if successful.  */
1396
1397 static bool
1398 dump_strings (void)
1399 {
1400   size_t bufsize = MAX (100, string_min);
1401   char *buf = xmalloc (bufsize);
1402   uintmax_t address = n_bytes_to_skip;
1403   bool ok = true;
1404
1405   while (1)
1406     {
1407       size_t i;
1408       int c;
1409
1410       /* See if the next `string_min' chars are all printing chars.  */
1411     tryline:
1412
1413       if (limit_bytes_to_format
1414           && (end_offset < string_min || end_offset - string_min <= address))
1415         break;
1416
1417       for (i = 0; i < string_min; i++)
1418         {
1419           ok &= read_char (&c);
1420           address++;
1421           if (c < 0)
1422             {
1423               free (buf);
1424               return ok;
1425             }
1426           if (! isprint (c))
1427             /* Found a non-printing.  Try again starting with next char.  */
1428             goto tryline;
1429           buf[i] = c;
1430         }
1431
1432       /* We found a run of `string_min' printable characters.
1433          Now see if it is terminated with a null byte.  */
1434       while (!limit_bytes_to_format || address < end_offset)
1435         {
1436           if (i == bufsize)
1437             {
1438               buf = X2REALLOC (buf, &bufsize);
1439             }
1440           ok &= read_char (&c);
1441           address++;
1442           if (c < 0)
1443             {
1444               free (buf);
1445               return ok;
1446             }
1447           if (c == '\0')
1448             break;              /* It is; print this string.  */
1449           if (! isprint (c))
1450             goto tryline;       /* It isn't; give up on this string.  */
1451           buf[i++] = c;         /* String continues; store it all.  */
1452         }
1453
1454       /* If we get here, the string is all printable and null-terminated,
1455          so print it.  It is all in `buf' and `i' is its length.  */
1456       buf[i] = 0;
1457       format_address (address - i - 1, ' ');
1458
1459       for (i = 0; (c = buf[i]); i++)
1460         {
1461           switch (c)
1462             {
1463             case '\a':
1464               fputs ("\\a", stdout);
1465               break;
1466
1467             case '\b':
1468               fputs ("\\b", stdout);
1469               break;
1470
1471             case '\f':
1472               fputs ("\\f", stdout);
1473               break;
1474
1475             case '\n':
1476               fputs ("\\n", stdout);
1477               break;
1478
1479             case '\r':
1480               fputs ("\\r", stdout);
1481               break;
1482
1483             case '\t':
1484               fputs ("\\t", stdout);
1485               break;
1486
1487             case '\v':
1488               fputs ("\\v", stdout);
1489               break;
1490
1491             default:
1492               putc (c, stdout);
1493             }
1494         }
1495       putchar ('\n');
1496     }
1497
1498   /* We reach this point only if we search through
1499      (max_bytes_to_format - string_min) bytes before reaching EOF.  */
1500
1501   free (buf);
1502
1503   ok &= check_and_close (0);
1504   return ok;
1505 }
1506
1507 int
1508 main (int argc, char **argv)
1509 {
1510   int n_files;
1511   size_t i;
1512   int l_c_m;
1513   size_t desired_width IF_LINT ( = 0);
1514   bool modern = false;
1515   bool width_specified = false;
1516   bool ok = true;
1517   size_t width_per_block = 0;
1518   static char const multipliers[] = "bEGKkMmPTYZ0";
1519
1520   /* The old-style `pseudo starting address' to be printed in parentheses
1521      after any true address.  */
1522   uintmax_t pseudo_start IF_LINT ( = 0);
1523
1524   initialize_main (&argc, &argv);
1525   set_program_name (argv[0]);
1526   setlocale (LC_ALL, "");
1527   bindtextdomain (PACKAGE, LOCALEDIR);
1528   textdomain (PACKAGE);
1529
1530   atexit (close_stdout);
1531
1532   for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1533     integral_type_size[i] = NO_SIZE;
1534
1535   integral_type_size[sizeof (char)] = CHAR;
1536   integral_type_size[sizeof (short int)] = SHORT;
1537   integral_type_size[sizeof (int)] = INT;
1538   integral_type_size[sizeof (long int)] = LONG;
1539 #if HAVE_UNSIGNED_LONG_LONG_INT
1540   /* If `long int' and `long long int' have the same size, it's fine
1541      to overwrite the entry for `long' with this one.  */
1542   integral_type_size[sizeof (unsigned_long_long_int)] = LONG_LONG;
1543 #endif
1544
1545   for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1546     fp_type_size[i] = NO_SIZE;
1547
1548   fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1549   /* The array entry for `double' is filled in after that for `long double'
1550      so that if they are the same size, we avoid any overhead of
1551      long double computation in libc.  */
1552   fp_type_size[sizeof (long double)] = FLOAT_LONG_DOUBLE;
1553   fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1554
1555   n_specs = 0;
1556   n_specs_allocated = 0;
1557   spec = NULL;
1558
1559   format_address = format_address_std;
1560   address_base = 8;
1561   address_pad_len = 7;
1562   flag_dump_strings = false;
1563
1564   while (true)
1565     {
1566       uintmax_t tmp;
1567       enum strtol_error s_err;
1568       int oi = -1;
1569       int c = getopt_long (argc, argv, short_options, long_options, &oi);
1570       if (c == -1)
1571         break;
1572
1573       switch (c)
1574         {
1575         case 'A':
1576           modern = true;
1577           switch (optarg[0])
1578             {
1579             case 'd':
1580               format_address = format_address_std;
1581               address_base = 10;
1582               address_pad_len = 7;
1583               break;
1584             case 'o':
1585               format_address = format_address_std;
1586               address_base = 8;
1587               address_pad_len = 7;
1588               break;
1589             case 'x':
1590               format_address = format_address_std;
1591               address_base = 16;
1592               address_pad_len = 6;
1593               break;
1594             case 'n':
1595               format_address = format_address_none;
1596               address_pad_len = 0;
1597               break;
1598             default:
1599               error (EXIT_FAILURE, 0,
1600                      _("invalid output address radix `%c'; \
1601 it must be one character from [doxn]"),
1602                      optarg[0]);
1603               break;
1604             }
1605           break;
1606
1607         case 'j':
1608           modern = true;
1609           s_err = xstrtoumax (optarg, NULL, 0, &n_bytes_to_skip, multipliers);
1610           if (s_err != LONGINT_OK)
1611             xstrtol_fatal (s_err, oi, c, long_options, optarg);
1612           break;
1613
1614         case 'N':
1615           modern = true;
1616           limit_bytes_to_format = true;
1617
1618           s_err = xstrtoumax (optarg, NULL, 0, &max_bytes_to_format,
1619                               multipliers);
1620           if (s_err != LONGINT_OK)
1621             xstrtol_fatal (s_err, oi, c, long_options, optarg);
1622           break;
1623
1624         case 'S':
1625           modern = true;
1626           if (optarg == NULL)
1627             string_min = 3;
1628           else
1629             {
1630               s_err = xstrtoumax (optarg, NULL, 0, &tmp, multipliers);
1631               if (s_err != LONGINT_OK)
1632                 xstrtol_fatal (s_err, oi, c, long_options, optarg);
1633
1634               /* The minimum string length may be no larger than SIZE_MAX,
1635                  since we may allocate a buffer of this size.  */
1636               if (SIZE_MAX < tmp)
1637                 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1638
1639               string_min = tmp;
1640             }
1641           flag_dump_strings = true;
1642           break;
1643
1644         case 't':
1645           modern = true;
1646           ok &= decode_format_string (optarg);
1647           break;
1648
1649         case 'v':
1650           modern = true;
1651           abbreviate_duplicate_blocks = false;
1652           break;
1653
1654         case TRADITIONAL_OPTION:
1655           traditional = true;
1656           break;
1657
1658           /* The next several cases map the traditional format
1659              specification options to the corresponding modern format
1660              specs.  GNU od accepts any combination of old- and
1661              new-style options.  Format specification options accumulate.
1662              The obsolescent and undocumented formats are compatible
1663              with FreeBSD 4.10 od.  */
1664
1665 #define CASE_OLD_ARG(old_char,new_string)               \
1666         case old_char:                                  \
1667           ok &= decode_format_string (new_string);      \
1668           break
1669
1670           CASE_OLD_ARG ('a', "a");
1671           CASE_OLD_ARG ('b', "o1");
1672           CASE_OLD_ARG ('c', "c");
1673           CASE_OLD_ARG ('D', "u4"); /* obsolescent and undocumented */
1674           CASE_OLD_ARG ('d', "u2");
1675         case 'F': /* obsolescent and undocumented alias */
1676           CASE_OLD_ARG ('e', "fD"); /* obsolescent and undocumented */
1677           CASE_OLD_ARG ('f', "fF");
1678         case 'X': /* obsolescent and undocumented alias */
1679           CASE_OLD_ARG ('H', "x4"); /* obsolescent and undocumented */
1680           CASE_OLD_ARG ('i', "dI");
1681         case 'I': case 'L': /* obsolescent and undocumented aliases */
1682           CASE_OLD_ARG ('l', "dL");
1683           CASE_OLD_ARG ('O', "o4"); /* obsolesent and undocumented */
1684         case 'B': /* obsolescent and undocumented alias */
1685           CASE_OLD_ARG ('o', "o2");
1686           CASE_OLD_ARG ('s', "d2");
1687         case 'h': /* obsolescent and undocumented alias */
1688           CASE_OLD_ARG ('x', "x2");
1689
1690 #undef CASE_OLD_ARG
1691
1692         case 'w':
1693           modern = true;
1694           width_specified = true;
1695           if (optarg == NULL)
1696             {
1697               desired_width = 32;
1698             }
1699           else
1700             {
1701               uintmax_t w_tmp;
1702               s_err = xstrtoumax (optarg, NULL, 10, &w_tmp, "");
1703               if (s_err != LONGINT_OK)
1704                 xstrtol_fatal (s_err, oi, c, long_options, optarg);
1705               if (SIZE_MAX < w_tmp)
1706                 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1707               desired_width = w_tmp;
1708             }
1709           break;
1710
1711         case_GETOPT_HELP_CHAR;
1712
1713         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1714
1715         default:
1716           usage (EXIT_FAILURE);
1717           break;
1718         }
1719     }
1720
1721   if (!ok)
1722     exit (EXIT_FAILURE);
1723
1724   if (flag_dump_strings && n_specs > 0)
1725     error (EXIT_FAILURE, 0,
1726            _("no type may be specified when dumping strings"));
1727
1728   n_files = argc - optind;
1729
1730   /* If the --traditional option is used, there may be from
1731      0 to 3 remaining command line arguments;  handle each case
1732      separately.
1733         od [file] [[+]offset[.][b] [[+]label[.][b]]]
1734      The offset and label have the same syntax.
1735
1736      If --traditional is not given, and if no modern options are
1737      given, and if the offset begins with + or (if there are two
1738      operands) a digit, accept only this form, as per POSIX:
1739         od [file] [[+]offset[.][b]]
1740   */
1741
1742   if (!modern || traditional)
1743     {
1744       uintmax_t o1;
1745       uintmax_t o2;
1746
1747       switch (n_files)
1748         {
1749         case 1:
1750           if ((traditional || argv[optind][0] == '+')
1751               && parse_old_offset (argv[optind], &o1))
1752             {
1753               n_bytes_to_skip = o1;
1754               --n_files;
1755               ++argv;
1756             }
1757           break;
1758
1759         case 2:
1760           if ((traditional || argv[optind + 1][0] == '+'
1761                || ISDIGIT (argv[optind + 1][0]))
1762               && parse_old_offset (argv[optind + 1], &o2))
1763             {
1764               if (traditional && parse_old_offset (argv[optind], &o1))
1765                 {
1766                   n_bytes_to_skip = o1;
1767                   flag_pseudo_start = true;
1768                   pseudo_start = o2;
1769                   argv += 2;
1770                   n_files -= 2;
1771                 }
1772               else
1773                 {
1774                   n_bytes_to_skip = o2;
1775                   --n_files;
1776                   argv[optind + 1] = argv[optind];
1777                   ++argv;
1778                 }
1779             }
1780           break;
1781
1782         case 3:
1783           if (traditional
1784               && parse_old_offset (argv[optind + 1], &o1)
1785               && parse_old_offset (argv[optind + 2], &o2))
1786             {
1787               n_bytes_to_skip = o1;
1788               flag_pseudo_start = true;
1789               pseudo_start = o2;
1790               argv[optind + 2] = argv[optind];
1791               argv += 2;
1792               n_files -= 2;
1793             }
1794           break;
1795         }
1796
1797       if (traditional && 1 < n_files)
1798         {
1799           error (0, 0, _("extra operand %s"), quote (argv[optind + 1]));
1800           error (0, 0, "%s",
1801                  _("compatibility mode supports at most one file"));
1802           usage (EXIT_FAILURE);
1803         }
1804     }
1805
1806   if (flag_pseudo_start)
1807     {
1808       if (format_address == format_address_none)
1809         {
1810           address_base = 8;
1811           address_pad_len = 7;
1812           format_address = format_address_paren;
1813         }
1814       else
1815         format_address = format_address_label;
1816     }
1817
1818   if (limit_bytes_to_format)
1819     {
1820       end_offset = n_bytes_to_skip + max_bytes_to_format;
1821       if (end_offset < n_bytes_to_skip)
1822         error (EXIT_FAILURE, 0, _("skip-bytes + read-bytes is too large"));
1823     }
1824
1825   if (n_specs == 0)
1826     decode_format_string ("oS");
1827
1828   if (n_files > 0)
1829     {
1830       /* Set the global pointer FILE_LIST so that it
1831          references the first file-argument on the command-line.  */
1832
1833       file_list = (char const *const *) &argv[optind];
1834     }
1835   else
1836     {
1837       /* No files were listed on the command line.
1838          Set the global pointer FILE_LIST so that it
1839          references the null-terminated list of one name: "-".  */
1840
1841       file_list = default_file_list;
1842     }
1843
1844   /* open the first input file */
1845   ok = open_next_file ();
1846   if (in_stream == NULL)
1847     goto cleanup;
1848
1849   /* skip over any unwanted header bytes */
1850   ok &= skip (n_bytes_to_skip);
1851   if (in_stream == NULL)
1852     goto cleanup;
1853
1854   pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1855
1856   /* Compute output block length.  */
1857   l_c_m = get_lcm ();
1858
1859   if (width_specified)
1860     {
1861       if (desired_width != 0 && desired_width % l_c_m == 0)
1862         bytes_per_block = desired_width;
1863       else
1864         {
1865           error (0, 0, _("warning: invalid width %lu; using %d instead"),
1866                  (unsigned long int) desired_width, l_c_m);
1867           bytes_per_block = l_c_m;
1868         }
1869     }
1870   else
1871     {
1872       if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1873         bytes_per_block = l_c_m * (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1874       else
1875         bytes_per_block = l_c_m;
1876     }
1877
1878   /* Compute padding necessary to align output block.  */
1879   for (i = 0; i < n_specs; i++)
1880     {
1881       int fields_per_block = bytes_per_block / width_bytes[spec[i].size];
1882       int block_width = (spec[i].field_width + 1) * fields_per_block;
1883       if (width_per_block < block_width)
1884         width_per_block = block_width;
1885     }
1886   for (i = 0; i < n_specs; i++)
1887     {
1888       int fields_per_block = bytes_per_block / width_bytes[spec[i].size];
1889       int block_width = spec[i].field_width * fields_per_block;
1890       spec[i].pad_width = width_per_block - block_width;
1891     }
1892
1893 #ifdef DEBUG
1894   printf ("lcm=%d, width_per_block=%zu\n", l_c_m, width_per_block);
1895   for (i = 0; i < n_specs; i++)
1896     {
1897       int fields_per_block = bytes_per_block / width_bytes[spec[i].size];
1898       assert (bytes_per_block % width_bytes[spec[i].size] == 0);
1899       assert (1 <= spec[i].pad_width / fields_per_block);
1900       printf ("%d: fmt=\"%s\" in_width=%d out_width=%d pad=%d\n",
1901               i, spec[i].fmt_string, width_bytes[spec[i].size],
1902               spec[i].field_width, spec[i].pad_width);
1903     }
1904 #endif
1905
1906   ok &= (flag_dump_strings ? dump_strings () : dump ());
1907
1908 cleanup:
1909
1910   if (have_read_stdin && fclose (stdin) == EOF)
1911     error (EXIT_FAILURE, errno, _("standard input"));
1912
1913   exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);
1914 }