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