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