od: fix a bug that arises when skipping exact length of file
[platform/upstream/coreutils.git] / src / od.c
1 /* od -- dump files in octal and other formats
2    Copyright (C) 92, 1995-2007 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 /* Written by Jim Meyering.  */
18
19 #include <config.h>
20
21 #include <stdio.h>
22 #include <assert.h>
23 #include <getopt.h>
24 #include <sys/types.h>
25 #include "system.h"
26 #include "error.h"
27 #include "quote.h"
28 #include "xstrtol.h"
29
30 /* The official name of this program (e.g., no `g' prefix).  */
31 #define PROGRAM_NAME "od"
32
33 #define AUTHORS "Jim Meyering"
34
35 #include <float.h>
36
37 #ifdef HAVE_LONG_DOUBLE
38 typedef long double LONG_DOUBLE;
39 #else
40 typedef double LONG_DOUBLE;
41 #endif
42
43 /* The default number of input bytes per output line.  */
44 #define DEFAULT_BYTES_PER_BLOCK 16
45
46 /* The number of decimal digits of precision in a float.  */
47 #ifndef FLT_DIG
48 # define FLT_DIG 7
49 #endif
50
51 /* The number of decimal digits of precision in a double.  */
52 #ifndef DBL_DIG
53 # define DBL_DIG 15
54 #endif
55
56 /* The number of decimal digits of precision in a long double.  */
57 #ifndef LDBL_DIG
58 # define LDBL_DIG DBL_DIG
59 #endif
60
61 #if HAVE_UNSIGNED_LONG_LONG_INT
62 typedef unsigned long long int unsigned_long_long_int;
63 #else
64 /* This is just a place-holder to avoid a few `#if' directives.
65    In this case, the type isn't actually used.  */
66 typedef unsigned long int unsigned_long_long_int;
67 #endif
68
69 enum size_spec
70   {
71     NO_SIZE,
72     CHAR,
73     SHORT,
74     INT,
75     LONG,
76     LONG_LONG,
77     /* FIXME: add INTMAX support, too */
78     FLOAT_SINGLE,
79     FLOAT_DOUBLE,
80     FLOAT_LONG_DOUBLE,
81     N_SIZE_SPECS
82   };
83
84 enum output_format
85   {
86     SIGNED_DECIMAL,
87     UNSIGNED_DECIMAL,
88     OCTAL,
89     HEXADECIMAL,
90     FLOATING_POINT,
91     NAMED_CHARACTER,
92     CHARACTER
93   };
94
95 /* The maximum number of bytes needed for a format string,
96    including the trailing null.  */
97 enum
98   {
99     FMT_BYTES_ALLOCATED =
100       MAX ((sizeof " %0" - 1 + INT_STRLEN_BOUND (int)
101             + MAX (sizeof "ld",
102                    MAX (sizeof PRIdMAX,
103                         MAX (sizeof PRIoMAX,
104                              MAX (sizeof PRIuMAX,
105                                   sizeof PRIxMAX))))),
106            sizeof " %.Le" + 2 * INT_STRLEN_BOUND (int))
107   };
108
109 /* Each output format specification (from `-t spec' or from
110    old-style options) is represented by one of these structures.  */
111 struct tspec
112   {
113     enum output_format fmt;
114     enum size_spec size;
115     void (*print_function) (size_t, void const *, char const *);
116     char fmt_string[FMT_BYTES_ALLOCATED];
117     bool hexl_mode_trailer;
118     int field_width;
119   };
120
121 /* The name this program was run with.  */
122 char *program_name;
123
124 /* Convert the number of 8-bit bytes of a binary representation to
125    the number of characters (digits + sign if the type is signed)
126    required to represent the same quantity in the specified base/type.
127    For example, a 32-bit (4-byte) quantity may require a field width
128    as wide as the following for these types:
129    11   unsigned octal
130    11   signed decimal
131    10   unsigned decimal
132    8    unsigned hexadecimal  */
133
134 static unsigned int const bytes_to_oct_digits[] =
135 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
136
137 static unsigned int const bytes_to_signed_dec_digits[] =
138 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
139
140 static unsigned int const bytes_to_unsigned_dec_digits[] =
141 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
142
143 static unsigned int const bytes_to_hex_digits[] =
144 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
145
146 #define MAX_INTEGRAL_TYPE_SIZE sizeof (unsigned_long_long_int)
147
148 /* It'll be a while before we see integral types wider than 16 bytes,
149    but if/when it happens, this check will catch it.  Without this check,
150    a wider type would provoke a buffer overrun.  */
151 verify (MAX_INTEGRAL_TYPE_SIZE
152         < sizeof bytes_to_hex_digits / sizeof *bytes_to_hex_digits);
153
154 /* Make sure the other arrays have the same length.  */
155 verify (sizeof bytes_to_oct_digits == sizeof bytes_to_signed_dec_digits);
156 verify (sizeof bytes_to_oct_digits == sizeof bytes_to_unsigned_dec_digits);
157 verify (sizeof bytes_to_oct_digits == sizeof bytes_to_hex_digits);
158
159 /* Convert enum size_spec to the size of the named type.  */
160 static const int width_bytes[] =
161 {
162   -1,
163   sizeof (char),
164   sizeof (short int),
165   sizeof (int),
166   sizeof (long int),
167   sizeof (unsigned_long_long_int),
168   sizeof (float),
169   sizeof (double),
170   sizeof (LONG_DOUBLE)
171 };
172
173 /* Ensure that for each member of `enum size_spec' there is an
174    initializer in the width_bytes array.  */
175 verify (sizeof width_bytes / sizeof width_bytes[0] == N_SIZE_SPECS);
176
177 /* Names for some non-printing characters.  */
178 static const char *const charname[33] =
179 {
180   "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
181   "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
182   "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
183   "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
184   "sp"
185 };
186
187 /* Address base (8, 10 or 16).  */
188 static int address_base;
189
190 /* The number of octal digits required to represent the largest
191    address value.  */
192 #define MAX_ADDRESS_LENGTH \
193   ((sizeof (uintmax_t) * CHAR_BIT + CHAR_BIT - 1) / 3)
194
195 /* Width of a normal address.  */
196 static int address_pad_len;
197
198 static size_t string_min;
199 static bool flag_dump_strings;
200
201 /* True if we should recognize the older non-option arguments
202    that specified at most one file and optional arguments specifying
203    offset and pseudo-start address.  */
204 static bool traditional;
205
206 /* True if an old-style `pseudo-address' was specified.  */
207 static bool flag_pseudo_start;
208
209 /* The difference between the old-style pseudo starting address and
210    the number of bytes to skip.  */
211 static uintmax_t pseudo_offset;
212
213 /* Function that accepts an address and an optional following char,
214    and prints the address and char to stdout.  */
215 static void (*format_address) (uintmax_t, char);
216
217 /* The number of input bytes to skip before formatting and writing.  */
218 static uintmax_t n_bytes_to_skip = 0;
219
220 /* When false, MAX_BYTES_TO_FORMAT and END_OFFSET are ignored, and all
221    input is formatted.  */
222 static bool limit_bytes_to_format = false;
223
224 /* The maximum number of bytes that will be formatted.  */
225 static uintmax_t max_bytes_to_format;
226
227 /* The offset of the first byte after the last byte to be formatted.  */
228 static uintmax_t end_offset;
229
230 /* When true and two or more consecutive blocks are equal, format
231    only the first block and output an asterisk alone on the following
232    line to indicate that identical blocks have been elided.  */
233 static bool abbreviate_duplicate_blocks = true;
234
235 /* An array of specs describing how to format each input block.  */
236 static struct tspec *spec;
237
238 /* The number of format specs.  */
239 static size_t n_specs;
240
241 /* The allocated length of SPEC.  */
242 static size_t n_specs_allocated;
243
244 /* The number of input bytes formatted per output line.  It must be
245    a multiple of the least common multiple of the sizes associated with
246    the specified output types.  It should be as large as possible, but
247    no larger than 16 -- unless specified with the -w option.  */
248 static size_t bytes_per_block;
249
250 /* Human-readable representation of *file_list (for error messages).
251    It differs from file_list[-1] only when file_list[-1] is "-".  */
252 static char const *input_filename;
253
254 /* A NULL-terminated list of the file-arguments from the command line.  */
255 static char const *const *file_list;
256
257 /* Initializer for file_list if no file-arguments
258    were specified on the command line.  */
259 static char const *const default_file_list[] = {"-", NULL};
260
261 /* The input stream associated with the current file.  */
262 static FILE *in_stream;
263
264 /* If true, at least one of the files we read was standard input.  */
265 static bool have_read_stdin;
266
267 /* Map the size in bytes to a type identifier.  */
268 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
269
270 #define MAX_FP_TYPE_SIZE sizeof (LONG_DOUBLE)
271 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
272
273 static char const short_options[] = "A:aBbcDdeFfHhIij:LlN:OoS:st:vw::Xx";
274
275 /* For long options that have no equivalent short option, use a
276    non-character as a pseudo short option, starting with CHAR_MAX + 1.  */
277 enum
278 {
279   TRADITIONAL_OPTION = CHAR_MAX + 1
280 };
281
282 static struct option const long_options[] =
283 {
284   {"skip-bytes", required_argument, NULL, 'j'},
285   {"address-radix", required_argument, NULL, 'A'},
286   {"read-bytes", required_argument, NULL, 'N'},
287   {"format", required_argument, NULL, 't'},
288   {"output-duplicates", no_argument, NULL, 'v'},
289   {"strings", optional_argument, NULL, 'S'},
290   {"traditional", no_argument, NULL, TRADITIONAL_OPTION},
291   {"width", optional_argument, NULL, 'w'},
292
293   {GETOPT_HELP_OPTION_DECL},
294   {GETOPT_VERSION_OPTION_DECL},
295   {NULL, 0, NULL, 0}
296 };
297
298 void
299 usage (int status)
300 {
301   if (status != EXIT_SUCCESS)
302     fprintf (stderr, _("Try `%s --help' for more information.\n"),
303              program_name);
304   else
305     {
306       printf (_("\
307 Usage: %s [OPTION]... [FILE]...\n\
308   or:  %s [-abcdfilosx]... [FILE] [[+]OFFSET[.][b]]\n\
309   or:  %s --traditional [OPTION]... [FILE] [[+]OFFSET[.][b] [+][LABEL][.][b]]\n\
310 "),
311               program_name, program_name, program_name);
312       fputs (_("\n\
313 Write an unambiguous representation, octal bytes by default,\n\
314 of FILE to standard output.  With more than one FILE argument,\n\
315 concatenate them in the listed order to form the input.\n\
316 With no FILE, or when FILE is -, read standard input.\n\
317 \n\
318 "), stdout);
319       fputs (_("\
320 All arguments to long options are mandatory for short options.\n\
321 "), stdout);
322       fputs (_("\
323   -A, --address-radix=RADIX   decide how file offsets are printed\n\
324   -j, --skip-bytes=BYTES      skip BYTES input bytes first\n\
325 "), stdout);
326       fputs (_("\
327   -N, --read-bytes=BYTES      limit dump to BYTES input bytes\n\
328   -S, --strings[=BYTES]       output strings of at least BYTES graphic chars\n\
329   -t, --format=TYPE           select output format or formats\n\
330   -v, --output-duplicates     do not use * to mark line suppression\n\
331   -w, --width[=BYTES]         output BYTES bytes per output line\n\
332       --traditional           accept arguments in traditional form\n\
333 "), stdout);
334       fputs (HELP_OPTION_DESCRIPTION, stdout);
335       fputs (VERSION_OPTION_DESCRIPTION, stdout);
336       fputs (_("\
337 \n\
338 Traditional format specifications may be intermixed; they accumulate:\n\
339   -a   same as -t a,  select named characters, ignoring high-order bit\n\
340   -b   same as -t o1, select octal bytes\n\
341   -c   same as -t c,  select ASCII characters or backslash escapes\n\
342   -d   same as -t u2, select unsigned decimal 2-byte units\n\
343 "), stdout);
344       fputs (_("\
345   -f   same as -t fF, select floats\n\
346   -i   same as -t dI, select decimal ints\n\
347   -l   same as -t dL, select decimal longs\n\
348   -o   same as -t o2, select octal 2-byte units\n\
349   -s   same as -t d2, select decimal 2-byte units\n\
350   -x   same as -t x2, select hexadecimal 2-byte units\n\
351 "), stdout);
352       fputs (_("\
353 \n\
354 If first and second call formats both apply, the second format is assumed\n\
355 if the last operand begins with + or (if there are 2 operands) a digit.\n\
356 An OFFSET operand means -j OFFSET.  LABEL is the pseudo-address\n\
357 at first byte printed, incremented when dump is progressing.\n\
358 For OFFSET and LABEL, a 0x or 0X prefix indicates hexadecimal;\n\
359 suffixes may be . for octal and b for multiply by 512.\n\
360 "), stdout);
361       fputs (_("\
362 \n\
363 TYPE is made up of one or more of these specifications:\n\
364 \n\
365   a          named character, ignoring high-order bit\n\
366   c          ASCII character or backslash escape\n\
367 "), stdout);
368       fputs (_("\
369   d[SIZE]    signed decimal, SIZE bytes per integer\n\
370   f[SIZE]    floating point, SIZE bytes per integer\n\
371   o[SIZE]    octal, SIZE bytes per integer\n\
372   u[SIZE]    unsigned decimal, SIZE bytes per integer\n\
373   x[SIZE]    hexadecimal, SIZE bytes per integer\n\
374 "), stdout);
375       fputs (_("\
376 \n\
377 SIZE is a number.  For TYPE in doux, SIZE may also be C for\n\
378 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
379 sizeof(long).  If TYPE is f, SIZE may also be F for sizeof(float), D\n\
380 for sizeof(double) or L for sizeof(long double).\n\
381 "), stdout);
382       fputs (_("\
383 \n\
384 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
385 BYTES is hexadecimal with 0x or 0X prefix, and may have a multiplier suffix:\n\
386 b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,\n\
387 GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.\n\
388 Adding a z suffix to any type displays printable characters at the end of each\n\
389 output line.  \
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       emit_bug_reporting_address ();
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 larger than
1038              the size of the current file, we can decrement
1039              n_skip and go on to the next file.  */
1040           if (S_ISREG (file_stats.st_mode) && 0 <= file_stats.st_size)
1041             {
1042               if ((uintmax_t) file_stats.st_size < n_skip)
1043                 n_skip -= file_stats.st_size;
1044               else
1045                 {
1046                   if (fseeko (in_stream, n_skip, SEEK_CUR) != 0)
1047                     {
1048                       in_errno = errno;
1049                       ok = false;
1050                     }
1051                   n_skip = 0;
1052                 }
1053             }
1054
1055           /* If it's not a regular file with nonnegative size,
1056              position the file pointer by reading.  */
1057
1058           else
1059             {
1060               char buf[BUFSIZ];
1061               size_t n_bytes_read, n_bytes_to_read = BUFSIZ;
1062
1063               while (0 < n_skip)
1064                 {
1065                   if (n_skip < n_bytes_to_read)
1066                     n_bytes_to_read = n_skip;
1067                   n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1068                   n_skip -= n_bytes_read;
1069                   if (n_bytes_read != n_bytes_to_read)
1070                     {
1071                       in_errno = errno;
1072                       ok = false;
1073                       n_skip = 0;
1074                       break;
1075                     }
1076                 }
1077             }
1078
1079           if (n_skip == 0)
1080             break;
1081         }
1082
1083       else   /* cannot fstat() file */
1084         {
1085           error (0, errno, "%s", input_filename);
1086           ok = false;
1087         }
1088
1089       ok &= check_and_close (in_errno);
1090
1091       ok &= open_next_file ();
1092     }
1093
1094   if (n_skip != 0)
1095     error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1096
1097   return ok;
1098 }
1099
1100 static void
1101 format_address_none (uintmax_t address ATTRIBUTE_UNUSED, char c ATTRIBUTE_UNUSED)
1102 {
1103 }
1104
1105 static void
1106 format_address_std (uintmax_t address, char c)
1107 {
1108   char buf[MAX_ADDRESS_LENGTH + 2];
1109   char *p = buf + sizeof buf;
1110   char const *pbound;
1111
1112   *--p = '\0';
1113   *--p = c;
1114   pbound = p - address_pad_len;
1115
1116   /* Use a special case of the code for each base.  This is measurably
1117      faster than generic code.  */
1118   switch (address_base)
1119     {
1120     case 8:
1121       do
1122         *--p = '0' + (address & 7);
1123       while ((address >>= 3) != 0);
1124       break;
1125
1126     case 10:
1127       do
1128         *--p = '0' + (address % 10);
1129       while ((address /= 10) != 0);
1130       break;
1131
1132     case 16:
1133       do
1134         *--p = "0123456789abcdef"[address & 15];
1135       while ((address >>= 4) != 0);
1136       break;
1137     }
1138
1139   while (pbound < p)
1140     *--p = '0';
1141
1142   fputs (p, stdout);
1143 }
1144
1145 static void
1146 format_address_paren (uintmax_t address, char c)
1147 {
1148   putchar ('(');
1149   format_address_std (address, ')');
1150   if (c)
1151     putchar (c);
1152 }
1153
1154 static void
1155 format_address_label (uintmax_t address, char c)
1156 {
1157   format_address_std (address, ' ');
1158   format_address_paren (address + pseudo_offset, c);
1159 }
1160
1161 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1162    of the N_SPEC format specs.  CURRENT_OFFSET is the byte address of
1163    CURR_BLOCK in the concatenation of input files, and it is printed
1164    (optionally) only before the output line associated with the first
1165    format spec.  When duplicate blocks are being abbreviated, the output
1166    for a sequence of identical input blocks is the output for the first
1167    block followed by an asterisk alone on a line.  It is valid to compare
1168    the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1169    That condition may be false only for the last input block -- and then
1170    only when it has not been padded to length BYTES_PER_BLOCK.  */
1171
1172 static void
1173 write_block (uintmax_t current_offset, size_t n_bytes,
1174              const char *prev_block, const char *curr_block)
1175 {
1176   static bool first = true;
1177   static bool prev_pair_equal = false;
1178
1179 #define EQUAL_BLOCKS(b1, b2) (memcmp (b1, b2, bytes_per_block) == 0)
1180
1181   if (abbreviate_duplicate_blocks
1182       && !first && n_bytes == bytes_per_block
1183       && EQUAL_BLOCKS (prev_block, curr_block))
1184     {
1185       if (prev_pair_equal)
1186         {
1187           /* The two preceding blocks were equal, and the current
1188              block is the same as the last one, so print nothing.  */
1189         }
1190       else
1191         {
1192           printf ("*\n");
1193           prev_pair_equal = true;
1194         }
1195     }
1196   else
1197     {
1198       size_t i;
1199
1200       prev_pair_equal = false;
1201       for (i = 0; i < n_specs; i++)
1202         {
1203           if (i == 0)
1204             format_address (current_offset, '\0');
1205           else
1206             printf ("%*s", address_pad_len, "");
1207           (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1208           if (spec[i].hexl_mode_trailer)
1209             {
1210               /* space-pad out to full line width, then dump the trailer */
1211               int datum_width = width_bytes[spec[i].size];
1212               int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1213               int field_width = spec[i].field_width + 1;
1214               printf ("%*s", blank_fields * field_width, "");
1215               dump_hexl_mode_trailer (n_bytes, curr_block);
1216             }
1217           putchar ('\n');
1218         }
1219     }
1220   first = false;
1221 }
1222
1223 /* Read a single byte into *C from the concatenation of the input files
1224    named in the global array FILE_LIST.  On the first call to this
1225    function, the global variable IN_STREAM is expected to be an open
1226    stream associated with the input file INPUT_FILENAME.  If IN_STREAM
1227    is at end-of-file, close it and update the global variables IN_STREAM
1228    and INPUT_FILENAME so they correspond to the next file in the list.
1229    Then try to read a byte from the newly opened file.  Repeat if
1230    necessary until EOF is reached for the last file in FILE_LIST, then
1231    set *C to EOF and return.  Subsequent calls do likewise.  Return
1232    true if successful.  */
1233
1234 static bool
1235 read_char (int *c)
1236 {
1237   bool ok = true;
1238
1239   *c = EOF;
1240
1241   while (in_stream != NULL)     /* EOF.  */
1242     {
1243       *c = fgetc (in_stream);
1244
1245       if (*c != EOF)
1246         break;
1247
1248       ok &= check_and_close (errno);
1249
1250       ok &= open_next_file ();
1251     }
1252
1253   return ok;
1254 }
1255
1256 /* Read N bytes into BLOCK from the concatenation of the input files
1257    named in the global array FILE_LIST.  On the first call to this
1258    function, the global variable IN_STREAM is expected to be an open
1259    stream associated with the input file INPUT_FILENAME.  If all N
1260    bytes cannot be read from IN_STREAM, close IN_STREAM and update
1261    the global variables IN_STREAM and INPUT_FILENAME.  Then try to
1262    read the remaining bytes from the newly opened file.  Repeat if
1263    necessary until EOF is reached for the last file in FILE_LIST.
1264    On subsequent calls, don't modify BLOCK and return true.  Set
1265    *N_BYTES_IN_BUFFER to the number of bytes read.  If an error occurs,
1266    it will be detected through ferror when the stream is about to be
1267    closed.  If there is an error, give a message but continue reading
1268    as usual and return false.  Otherwise return true.  */
1269
1270 static bool
1271 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1272 {
1273   bool ok = true;
1274
1275   assert (0 < n && n <= bytes_per_block);
1276
1277   *n_bytes_in_buffer = 0;
1278
1279   if (n == 0)
1280     return true;
1281
1282   while (in_stream != NULL)     /* EOF.  */
1283     {
1284       size_t n_needed;
1285       size_t n_read;
1286
1287       n_needed = n - *n_bytes_in_buffer;
1288       n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1289
1290       *n_bytes_in_buffer += n_read;
1291
1292       if (n_read == n_needed)
1293         break;
1294
1295       ok &= check_and_close (errno);
1296
1297       ok &= open_next_file ();
1298     }
1299
1300   return ok;
1301 }
1302
1303 /* Return the least common multiple of the sizes associated
1304    with the format specs.  */
1305
1306 static int
1307 get_lcm (void)
1308 {
1309   size_t i;
1310   int l_c_m = 1;
1311
1312   for (i = 0; i < n_specs; i++)
1313     l_c_m = lcm (l_c_m, width_bytes[spec[i].size]);
1314   return l_c_m;
1315 }
1316
1317 /* If S is a valid traditional offset specification with an optional
1318    leading '+' return true and set *OFFSET to the offset it denotes.  */
1319
1320 static bool
1321 parse_old_offset (const char *s, uintmax_t *offset)
1322 {
1323   int radix;
1324
1325   if (*s == '\0')
1326     return false;
1327
1328   /* Skip over any leading '+'. */
1329   if (s[0] == '+')
1330     ++s;
1331
1332   /* Determine the radix we'll use to interpret S.  If there is a `.',
1333      it's decimal, otherwise, if the string begins with `0X'or `0x',
1334      it's hexadecimal, else octal.  */
1335   if (strchr (s, '.') != NULL)
1336     radix = 10;
1337   else
1338     {
1339       if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1340         radix = 16;
1341       else
1342         radix = 8;
1343     }
1344
1345   return xstrtoumax (s, NULL, radix, offset, "Bb") == LONGINT_OK;
1346 }
1347
1348 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1349    formatted block to standard output, and repeat until the specified
1350    maximum number of bytes has been read or until all input has been
1351    processed.  If the last block read is smaller than BYTES_PER_BLOCK
1352    and its size is not a multiple of the size associated with a format
1353    spec, extend the input block with zero bytes until its length is a
1354    multiple of all format spec sizes.  Write the final block.  Finally,
1355    write on a line by itself the offset of the byte after the last byte
1356    read.  Accumulate return values from calls to read_block and
1357    check_and_close, and if any was false, return false.
1358    Otherwise, return true.  */
1359
1360 static bool
1361 dump (void)
1362 {
1363   char *block[2];
1364   uintmax_t current_offset;
1365   bool idx = false;
1366   bool ok = true;
1367   size_t n_bytes_read;
1368
1369   block[0] = xnmalloc (2, bytes_per_block);
1370   block[1] = block[0] + bytes_per_block;
1371
1372   current_offset = n_bytes_to_skip;
1373
1374   if (limit_bytes_to_format)
1375     {
1376       while (1)
1377         {
1378           size_t n_needed;
1379           if (current_offset >= end_offset)
1380             {
1381               n_bytes_read = 0;
1382               break;
1383             }
1384           n_needed = MIN (end_offset - current_offset,
1385                           (uintmax_t) bytes_per_block);
1386           ok &= read_block (n_needed, block[idx], &n_bytes_read);
1387           if (n_bytes_read < bytes_per_block)
1388             break;
1389           assert (n_bytes_read == bytes_per_block);
1390           write_block (current_offset, n_bytes_read,
1391                        block[!idx], block[idx]);
1392           current_offset += n_bytes_read;
1393           idx = !idx;
1394         }
1395     }
1396   else
1397     {
1398       while (1)
1399         {
1400           ok &= read_block (bytes_per_block, block[idx], &n_bytes_read);
1401           if (n_bytes_read < bytes_per_block)
1402             break;
1403           assert (n_bytes_read == bytes_per_block);
1404           write_block (current_offset, n_bytes_read,
1405                        block[!idx], block[idx]);
1406           current_offset += n_bytes_read;
1407           idx = !idx;
1408         }
1409     }
1410
1411   if (n_bytes_read > 0)
1412     {
1413       int l_c_m;
1414       size_t bytes_to_write;
1415
1416       l_c_m = get_lcm ();
1417
1418       /* Make bytes_to_write the smallest multiple of l_c_m that
1419          is at least as large as n_bytes_read.  */
1420       bytes_to_write = l_c_m * ((n_bytes_read + l_c_m - 1) / l_c_m);
1421
1422       memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1423       write_block (current_offset, bytes_to_write,
1424                    block[!idx], block[idx]);
1425       current_offset += n_bytes_read;
1426     }
1427
1428   format_address (current_offset, '\n');
1429
1430   if (limit_bytes_to_format && current_offset >= end_offset)
1431     ok &= check_and_close (0);
1432
1433   free (block[0]);
1434
1435   return ok;
1436 }
1437
1438 /* STRINGS mode.  Find each "string constant" in the input.
1439    A string constant is a run of at least `string_min' ASCII
1440    graphic (or formatting) characters terminated by a null.
1441    Based on a function written by Richard Stallman for a
1442    traditional version of od.  Return true if successful.  */
1443
1444 static bool
1445 dump_strings (void)
1446 {
1447   size_t bufsize = MAX (100, string_min);
1448   char *buf = xmalloc (bufsize);
1449   uintmax_t address = n_bytes_to_skip;
1450   bool ok = true;
1451
1452   while (1)
1453     {
1454       size_t i;
1455       int c;
1456
1457       /* See if the next `string_min' chars are all printing chars.  */
1458     tryline:
1459
1460       if (limit_bytes_to_format
1461           && (end_offset < string_min || end_offset - string_min <= address))
1462         break;
1463
1464       for (i = 0; i < string_min; i++)
1465         {
1466           ok &= read_char (&c);
1467           address++;
1468           if (c < 0)
1469             {
1470               free (buf);
1471               return ok;
1472             }
1473           if (! isprint (c))
1474             /* Found a non-printing.  Try again starting with next char.  */
1475             goto tryline;
1476           buf[i] = c;
1477         }
1478
1479       /* We found a run of `string_min' printable characters.
1480          Now see if it is terminated with a null byte.  */
1481       while (!limit_bytes_to_format || address < end_offset)
1482         {
1483           if (i == bufsize)
1484             {
1485               buf = X2REALLOC (buf, &bufsize);
1486             }
1487           ok &= read_char (&c);
1488           address++;
1489           if (c < 0)
1490             {
1491               free (buf);
1492               return ok;
1493             }
1494           if (c == '\0')
1495             break;              /* It is; print this string.  */
1496           if (! isprint (c))
1497             goto tryline;       /* It isn't; give up on this string.  */
1498           buf[i++] = c;         /* String continues; store it all.  */
1499         }
1500
1501       /* If we get here, the string is all printable and null-terminated,
1502          so print it.  It is all in `buf' and `i' is its length.  */
1503       buf[i] = 0;
1504       format_address (address - i - 1, ' ');
1505
1506       for (i = 0; (c = buf[i]); i++)
1507         {
1508           switch (c)
1509             {
1510             case '\a':
1511               fputs ("\\a", stdout);
1512               break;
1513
1514             case '\b':
1515               fputs ("\\b", stdout);
1516               break;
1517
1518             case '\f':
1519               fputs ("\\f", stdout);
1520               break;
1521
1522             case '\n':
1523               fputs ("\\n", stdout);
1524               break;
1525
1526             case '\r':
1527               fputs ("\\r", stdout);
1528               break;
1529
1530             case '\t':
1531               fputs ("\\t", stdout);
1532               break;
1533
1534             case '\v':
1535               fputs ("\\v", stdout);
1536               break;
1537
1538             default:
1539               putc (c, stdout);
1540             }
1541         }
1542       putchar ('\n');
1543     }
1544
1545   /* We reach this point only if we search through
1546      (max_bytes_to_format - string_min) bytes before reaching EOF.  */
1547
1548   free (buf);
1549
1550   ok &= check_and_close (0);
1551   return ok;
1552 }
1553
1554 int
1555 main (int argc, char **argv)
1556 {
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   static char const multipliers[] = "bEGKkMmPTYZ0";
1565
1566   /* The old-style `pseudo starting address' to be printed in parentheses
1567      after any true address.  */
1568   uintmax_t pseudo_start IF_LINT (= 0);
1569
1570   initialize_main (&argc, &argv);
1571   program_name = argv[0];
1572   setlocale (LC_ALL, "");
1573   bindtextdomain (PACKAGE, LOCALEDIR);
1574   textdomain (PACKAGE);
1575
1576   atexit (close_stdout);
1577
1578   for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1579     integral_type_size[i] = NO_SIZE;
1580
1581   integral_type_size[sizeof (char)] = CHAR;
1582   integral_type_size[sizeof (short int)] = SHORT;
1583   integral_type_size[sizeof (int)] = INT;
1584   integral_type_size[sizeof (long int)] = LONG;
1585 #if HAVE_UNSIGNED_LONG_LONG_INT
1586   /* If `long int' and `long long int' have the same size, it's fine
1587      to overwrite the entry for `long' with this one.  */
1588   integral_type_size[sizeof (unsigned_long_long_int)] = LONG_LONG;
1589 #endif
1590
1591   for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1592     fp_type_size[i] = NO_SIZE;
1593
1594   fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1595   /* The array entry for `double' is filled in after that for LONG_DOUBLE
1596      so that if `long double' is the same type or if long double isn't
1597      supported FLOAT_LONG_DOUBLE will never be used.  */
1598   fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1599   fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1600
1601   n_specs = 0;
1602   n_specs_allocated = 0;
1603   spec = NULL;
1604
1605   format_address = format_address_std;
1606   address_base = 8;
1607   address_pad_len = 7;
1608   flag_dump_strings = false;
1609
1610   for (;;)
1611     {
1612       uintmax_t tmp;
1613       enum strtol_error s_err;
1614       int oi = -1;
1615       int c = getopt_long (argc, argv, short_options, long_options, &oi);
1616       if (c == -1)
1617         break;
1618
1619       switch (c)
1620         {
1621         case 'A':
1622           modern = true;
1623           switch (optarg[0])
1624             {
1625             case 'd':
1626               format_address = format_address_std;
1627               address_base = 10;
1628               address_pad_len = 7;
1629               break;
1630             case 'o':
1631               format_address = format_address_std;
1632               address_base = 8;
1633               address_pad_len = 7;
1634               break;
1635             case 'x':
1636               format_address = format_address_std;
1637               address_base = 16;
1638               address_pad_len = 6;
1639               break;
1640             case 'n':
1641               format_address = format_address_none;
1642               address_pad_len = 0;
1643               break;
1644             default:
1645               error (EXIT_FAILURE, 0,
1646                      _("invalid output address radix `%c'; \
1647 it must be one character from [doxn]"),
1648                      optarg[0]);
1649               break;
1650             }
1651           break;
1652
1653         case 'j':
1654           modern = true;
1655           s_err = xstrtoumax (optarg, NULL, 0, &n_bytes_to_skip, multipliers);
1656           if (s_err != LONGINT_OK)
1657             xstrtol_fatal (s_err, oi, c, long_options, optarg);
1658           break;
1659
1660         case 'N':
1661           modern = true;
1662           limit_bytes_to_format = true;
1663
1664           s_err = xstrtoumax (optarg, NULL, 0, &max_bytes_to_format,
1665                               multipliers);
1666           if (s_err != LONGINT_OK)
1667             xstrtol_fatal (s_err, oi, c, long_options, optarg);
1668           break;
1669
1670         case 'S':
1671           modern = true;
1672           if (optarg == NULL)
1673             string_min = 3;
1674           else
1675             {
1676               s_err = xstrtoumax (optarg, NULL, 0, &tmp, multipliers);
1677               if (s_err != LONGINT_OK)
1678                 xstrtol_fatal (s_err, oi, c, long_options, optarg);
1679
1680               /* The minimum string length may be no larger than SIZE_MAX,
1681                  since we may allocate a buffer of this size.  */
1682               if (SIZE_MAX < tmp)
1683                 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1684
1685               string_min = tmp;
1686             }
1687           flag_dump_strings = true;
1688           break;
1689
1690         case 't':
1691           modern = true;
1692           ok &= decode_format_string (optarg);
1693           break;
1694
1695         case 'v':
1696           modern = true;
1697           abbreviate_duplicate_blocks = false;
1698           break;
1699
1700         case TRADITIONAL_OPTION:
1701           traditional = true;
1702           break;
1703
1704           /* The next several cases map the traditional format
1705              specification options to the corresponding modern format
1706              specs.  GNU od accepts any combination of old- and
1707              new-style options.  Format specification options accumulate.
1708              The obsolescent and undocumented formats are compatible
1709              with FreeBSD 4.10 od.  */
1710
1711 #define CASE_OLD_ARG(old_char,new_string)               \
1712         case old_char:                                  \
1713           ok &= decode_format_string (new_string);      \
1714           break
1715
1716           CASE_OLD_ARG ('a', "a");
1717           CASE_OLD_ARG ('b', "o1");
1718           CASE_OLD_ARG ('c', "c");
1719           CASE_OLD_ARG ('D', "u4"); /* obsolescent and undocumented */
1720           CASE_OLD_ARG ('d', "u2");
1721         case 'F': /* obsolescent and undocumented alias */
1722           CASE_OLD_ARG ('e', "fD"); /* obsolescent and undocumented */
1723           CASE_OLD_ARG ('f', "fF");
1724         case 'X': /* obsolescent and undocumented alias */
1725           CASE_OLD_ARG ('H', "x4"); /* obsolescent and undocumented */
1726           CASE_OLD_ARG ('i', "dI");
1727         case 'I': case 'L': /* obsolescent and undocumented aliases */
1728           CASE_OLD_ARG ('l', "dL");
1729           CASE_OLD_ARG ('O', "o4"); /* obsolesent and undocumented */
1730         case 'B': /* obsolescent and undocumented alias */
1731           CASE_OLD_ARG ('o', "o2");
1732           CASE_OLD_ARG ('s', "d2");
1733         case 'h': /* obsolescent and undocumented alias */
1734           CASE_OLD_ARG ('x', "x2");
1735
1736 #undef CASE_OLD_ARG
1737
1738         case 'w':
1739           modern = true;
1740           width_specified = true;
1741           if (optarg == NULL)
1742             {
1743               desired_width = 32;
1744             }
1745           else
1746             {
1747               uintmax_t w_tmp;
1748               s_err = xstrtoumax (optarg, NULL, 10, &w_tmp, "");
1749               if (s_err != LONGINT_OK)
1750                 xstrtol_fatal (s_err, oi, c, long_options, optarg);
1751               if (SIZE_MAX < w_tmp)
1752                 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1753               desired_width = w_tmp;
1754             }
1755           break;
1756
1757         case_GETOPT_HELP_CHAR;
1758
1759         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1760
1761         default:
1762           usage (EXIT_FAILURE);
1763           break;
1764         }
1765     }
1766
1767   if (!ok)
1768     exit (EXIT_FAILURE);
1769
1770   if (flag_dump_strings && n_specs > 0)
1771     error (EXIT_FAILURE, 0,
1772            _("no type may be specified when dumping strings"));
1773
1774   n_files = argc - optind;
1775
1776   /* If the --traditional option is used, there may be from
1777      0 to 3 remaining command line arguments;  handle each case
1778      separately.
1779         od [file] [[+]offset[.][b] [[+]label[.][b]]]
1780      The offset and label have the same syntax.
1781
1782      If --traditional is not given, and if no modern options are
1783      given, and if the offset begins with + or (if there are two
1784      operands) a digit, accept only this form, as per POSIX:
1785         od [file] [[+]offset[.][b]]
1786   */
1787
1788   if (!modern | traditional)
1789     {
1790       uintmax_t o1;
1791       uintmax_t o2;
1792
1793       switch (n_files)
1794         {
1795         case 1:
1796           if ((traditional || argv[optind][0] == '+')
1797               && parse_old_offset (argv[optind], &o1))
1798             {
1799               n_bytes_to_skip = o1;
1800               --n_files;
1801               ++argv;
1802             }
1803           break;
1804
1805         case 2:
1806           if ((traditional || argv[optind + 1][0] == '+'
1807                || ISDIGIT (argv[optind + 1][0]))
1808               && parse_old_offset (argv[optind + 1], &o2))
1809             {
1810               if (traditional && parse_old_offset (argv[optind], &o1))
1811                 {
1812                   n_bytes_to_skip = o1;
1813                   flag_pseudo_start = true;
1814                   pseudo_start = o2;
1815                   argv += 2;
1816                   n_files -= 2;
1817                 }
1818               else
1819                 {
1820                   n_bytes_to_skip = o2;
1821                   --n_files;
1822                   argv[optind + 1] = argv[optind];
1823                   ++argv;
1824                 }
1825             }
1826           break;
1827
1828         case 3:
1829           if (traditional
1830               && parse_old_offset (argv[optind + 1], &o1)
1831               && parse_old_offset (argv[optind + 2], &o2))
1832             {
1833               n_bytes_to_skip = o1;
1834               flag_pseudo_start = true;
1835               pseudo_start = o2;
1836               argv[optind + 2] = argv[optind];
1837               argv += 2;
1838               n_files -= 2;
1839             }
1840           break;
1841         }
1842
1843       if (traditional && 1 < n_files)
1844         {
1845           error (0, 0, _("extra operand %s"), quote (argv[optind + 1]));
1846           error (0, 0, "%s\n",
1847                  _("Compatibility mode supports at most one file."));
1848           usage (EXIT_FAILURE);
1849         }
1850     }
1851
1852   if (flag_pseudo_start)
1853     {
1854       if (format_address == format_address_none)
1855         {
1856           address_base = 8;
1857           address_pad_len = 7;
1858           format_address = format_address_paren;
1859         }
1860       else
1861         format_address = format_address_label;
1862     }
1863
1864   if (limit_bytes_to_format)
1865     {
1866       end_offset = n_bytes_to_skip + max_bytes_to_format;
1867       if (end_offset < n_bytes_to_skip)
1868         error (EXIT_FAILURE, 0, _("skip-bytes + read-bytes is too large"));
1869     }
1870
1871   if (n_specs == 0)
1872     decode_format_string ("oS");
1873
1874   if (n_files > 0)
1875     {
1876       /* Set the global pointer FILE_LIST so that it
1877          references the first file-argument on the command-line.  */
1878
1879       file_list = (char const *const *) &argv[optind];
1880     }
1881   else
1882     {
1883       /* No files were listed on the command line.
1884          Set the global pointer FILE_LIST so that it
1885          references the null-terminated list of one name: "-".  */
1886
1887       file_list = default_file_list;
1888     }
1889
1890   /* open the first input file */
1891   ok = open_next_file ();
1892   if (in_stream == NULL)
1893     goto cleanup;
1894
1895   /* skip over any unwanted header bytes */
1896   ok &= skip (n_bytes_to_skip);
1897   if (in_stream == NULL)
1898     goto cleanup;
1899
1900   pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1901
1902   /* Compute output block length.  */
1903   l_c_m = get_lcm ();
1904
1905   if (width_specified)
1906     {
1907       if (desired_width != 0 && desired_width % l_c_m == 0)
1908         bytes_per_block = desired_width;
1909       else
1910         {
1911           error (0, 0, _("warning: invalid width %lu; using %d instead"),
1912                  (unsigned long int) desired_width, l_c_m);
1913           bytes_per_block = l_c_m;
1914         }
1915     }
1916   else
1917     {
1918       if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1919         bytes_per_block = l_c_m * (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1920       else
1921         bytes_per_block = l_c_m;
1922     }
1923
1924 #ifdef DEBUG
1925   for (i = 0; i < n_specs; i++)
1926     {
1927       printf (_("%d: fmt=\"%s\" width=%d\n"),
1928               i, spec[i].fmt_string, width_bytes[spec[i].size]);
1929     }
1930 #endif
1931
1932   ok &= (flag_dump_strings ? dump_strings () : dump ());
1933
1934 cleanup:;
1935
1936   if (have_read_stdin && fclose (stdin) == EOF)
1937     error (EXIT_FAILURE, errno, _("standard input"));
1938
1939   exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);
1940 }