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