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