The following commands and options now support the standard size
[platform/upstream/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, and may have a multiplier suffix:\n\
387 b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,\n\
388 GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.\n\
389 Adding a z suffix to any type displays printable characters at the end of each\n\
390 output line.  \
391 "), stdout);
392       fputs (_("\
393 --string without a number implies 3.  --width without a number\n\
394 implies 32.  By default, od uses -A o -t d2 -w16.\n\
395 "), stdout);
396       emit_bug_reporting_address ();
397     }
398   exit (status);
399 }
400
401 /* Define the print functions.  */
402
403 static void
404 print_s_char (size_t n_bytes, void const *block, char const *fmt_string)
405 {
406   signed char const *p = block;
407   size_t i;
408   for (i = n_bytes / sizeof *p; i != 0; i--)
409     printf (fmt_string, *p++);
410 }
411
412 static void
413 print_char (size_t n_bytes, void const *block, char const *fmt_string)
414 {
415   unsigned char const *p = block;
416   size_t i;
417   for (i = n_bytes / sizeof *p; i != 0; i--)
418     printf (fmt_string, *p++);
419 }
420
421 static void
422 print_s_short (size_t n_bytes, void const *block, char const *fmt_string)
423 {
424   short int const *p = block;
425   size_t i;
426   for (i = n_bytes / sizeof *p; i != 0; i--)
427     printf (fmt_string, *p++);
428 }
429
430 static void
431 print_short (size_t n_bytes, void const *block, char const *fmt_string)
432 {
433   unsigned short int const *p = block;
434   size_t i;
435   for (i = n_bytes / sizeof *p; i != 0; i--)
436     printf (fmt_string, *p++);
437 }
438
439 static void
440 print_int (size_t n_bytes, void const *block, char const *fmt_string)
441 {
442   unsigned int const *p = block;
443   size_t i;
444   for (i = n_bytes / sizeof *p; i != 0; i--)
445     printf (fmt_string, *p++);
446 }
447
448 static void
449 print_long (size_t n_bytes, void const *block, char const *fmt_string)
450 {
451   unsigned long int const *p = block;
452   size_t i;
453   for (i = n_bytes / sizeof *p; i != 0; i--)
454     printf (fmt_string, *p++);
455 }
456
457 static void
458 print_long_long (size_t n_bytes, void const *block, char const *fmt_string)
459 {
460   unsigned_long_long_int const *p = block;
461   size_t i;
462   for (i = n_bytes / sizeof *p; i != 0; i--)
463     printf (fmt_string, *p++);
464 }
465
466 static void
467 print_float (size_t n_bytes, void const *block, char const *fmt_string)
468 {
469   float const *p = block;
470   size_t i;
471   for (i = n_bytes / sizeof *p; i != 0; i--)
472     printf (fmt_string, *p++);
473 }
474
475 static void
476 print_double (size_t n_bytes, void const *block, char const *fmt_string)
477 {
478   double const *p = block;
479   size_t i;
480   for (i = n_bytes / sizeof *p; i != 0; i--)
481     printf (fmt_string, *p++);
482 }
483
484 #ifdef HAVE_LONG_DOUBLE
485 static void
486 print_long_double (size_t n_bytes, void const *block, char const *fmt_string)
487 {
488   long double const *p = block;
489   size_t i;
490   for (i = n_bytes / sizeof *p; i != 0; i--)
491     printf (fmt_string, *p++);
492 }
493 #endif
494
495 static void
496 dump_hexl_mode_trailer (size_t n_bytes, const char *block)
497 {
498   size_t i;
499   fputs ("  >", stdout);
500   for (i = n_bytes; i > 0; i--)
501     {
502       unsigned char c = *block++;
503       unsigned char c2 = (isprint (c) ? c : '.');
504       putchar (c2);
505     }
506   putchar ('<');
507 }
508
509 static void
510 print_named_ascii (size_t n_bytes, void const *block,
511                    const char *unused_fmt_string ATTRIBUTE_UNUSED)
512 {
513   unsigned char const *p = block;
514   size_t i;
515   for (i = n_bytes; i > 0; i--)
516     {
517       int masked_c = *p++ & 0x7f;
518       const char *s;
519       char buf[5];
520
521       if (masked_c == 127)
522         s = "del";
523       else if (masked_c <= 040)
524         s = charname[masked_c];
525       else
526         {
527           sprintf (buf, "  %c", masked_c);
528           s = buf;
529         }
530
531       printf (" %3s", s);
532     }
533 }
534
535 static void
536 print_ascii (size_t n_bytes, void const *block,
537              const char *unused_fmt_string ATTRIBUTE_UNUSED)
538 {
539   unsigned char const *p = block;
540   size_t i;
541   for (i = n_bytes; i > 0; i--)
542     {
543       unsigned char c = *p++;
544       const char *s;
545       char buf[5];
546
547       switch (c)
548         {
549         case '\0':
550           s = " \\0";
551           break;
552
553         case '\a':
554           s = " \\a";
555           break;
556
557         case '\b':
558           s = " \\b";
559           break;
560
561         case '\f':
562           s = " \\f";
563           break;
564
565         case '\n':
566           s = " \\n";
567           break;
568
569         case '\r':
570           s = " \\r";
571           break;
572
573         case '\t':
574           s = " \\t";
575           break;
576
577         case '\v':
578           s = " \\v";
579           break;
580
581         default:
582           sprintf (buf, (isprint (c) ? "  %c" : "%03o"), c);
583           s = buf;
584         }
585
586       printf (" %3s", s);
587     }
588 }
589
590 /* Convert a null-terminated (possibly zero-length) string S to an
591    unsigned long integer value.  If S points to a non-digit set *P to S,
592    *VAL to 0, and return true.  Otherwise, accumulate the integer value of
593    the string of digits.  If the string of digits represents a value
594    larger than ULONG_MAX, don't modify *VAL or *P and return false.
595    Otherwise, advance *P to the first non-digit after S, set *VAL to
596    the result of the conversion and return true.  */
597
598 static bool
599 simple_strtoul (const char *s, const char **p, unsigned long int *val)
600 {
601   unsigned long int sum;
602
603   sum = 0;
604   while (ISDIGIT (*s))
605     {
606       int c = *s++ - '0';
607       if (sum > (ULONG_MAX - c) / 10)
608         return false;
609       sum = sum * 10 + c;
610     }
611   *p = s;
612   *val = sum;
613   return true;
614 }
615
616 /* If S points to a single valid modern od format string, put
617    a description of that format in *TSPEC, make *NEXT point at the
618    character following the just-decoded format (if *NEXT is non-NULL),
619    and return true.  If S is not valid, don't modify *NEXT or *TSPEC,
620    give a diagnostic, and return false.  For example, if S were
621    "d4afL" *NEXT would be set to "afL" and *TSPEC would be
622      {
623        fmt = SIGNED_DECIMAL;
624        size = INT or LONG; (whichever integral_type_size[4] resolves to)
625        print_function = print_int; (assuming size == INT)
626        fmt_string = "%011d%c";
627       }
628    S_ORIG is solely for reporting errors.  It should be the full format
629    string argument.
630    */
631
632 static bool
633 decode_one_format (const char *s_orig, const char *s, const char **next,
634                    struct tspec *tspec)
635 {
636   enum size_spec size_spec;
637   unsigned long int size;
638   enum output_format fmt;
639   const char *pre_fmt_string;
640   void (*print_function) (size_t, void const *, char const *);
641   const char *p;
642   char c;
643   int field_width;
644   int precision;
645
646   assert (tspec != NULL);
647
648   switch (*s)
649     {
650     case 'd':
651     case 'o':
652     case 'u':
653     case 'x':
654       c = *s;
655       ++s;
656       switch (*s)
657         {
658         case 'C':
659           ++s;
660           size = sizeof (char);
661           break;
662
663         case 'S':
664           ++s;
665           size = sizeof (short int);
666           break;
667
668         case 'I':
669           ++s;
670           size = sizeof (int);
671           break;
672
673         case 'L':
674           ++s;
675           size = sizeof (long int);
676           break;
677
678         default:
679           if (! simple_strtoul (s, &p, &size))
680             {
681               /* The integer at P in S would overflow an unsigned long int.
682                  A digit string that long is sufficiently odd looking
683                  that the following diagnostic is sufficient.  */
684               error (0, 0, _("invalid type string %s"), quote (s_orig));
685               return false;
686             }
687           if (p == s)
688             size = sizeof (int);
689           else
690             {
691               if (MAX_INTEGRAL_TYPE_SIZE < size
692                   || integral_type_size[size] == NO_SIZE)
693                 {
694                   error (0, 0, _("invalid type string %s;\n\
695 this system doesn't provide a %lu-byte integral type"), quote (s_orig), size);
696                   return false;
697                 }
698               s = p;
699             }
700           break;
701         }
702
703 #define ISPEC_TO_FORMAT(Spec, Min_format, Long_format, Max_format)      \
704   ((Spec) == LONG_LONG ? (Max_format)                                   \
705    : ((Spec) == LONG ? (Long_format)                                    \
706       : (Min_format)))                                                  \
707
708       size_spec = integral_type_size[size];
709
710       switch (c)
711         {
712         case 'd':
713           fmt = SIGNED_DECIMAL;
714           sprintf (tspec->fmt_string, " %%%d%s",
715                    (field_width = bytes_to_signed_dec_digits[size]),
716                    ISPEC_TO_FORMAT (size_spec, "d", "ld", PRIdMAX));
717           break;
718
719         case 'o':
720           fmt = OCTAL;
721           sprintf (tspec->fmt_string, " %%0%d%s",
722                    (field_width = bytes_to_oct_digits[size]),
723                    ISPEC_TO_FORMAT (size_spec, "o", "lo", PRIoMAX));
724           break;
725
726         case 'u':
727           fmt = UNSIGNED_DECIMAL;
728           sprintf (tspec->fmt_string, " %%%d%s",
729                    (field_width = bytes_to_unsigned_dec_digits[size]),
730                    ISPEC_TO_FORMAT (size_spec, "u", "lu", PRIuMAX));
731           break;
732
733         case 'x':
734           fmt = HEXADECIMAL;
735           sprintf (tspec->fmt_string, " %%0%d%s",
736                    (field_width = bytes_to_hex_digits[size]),
737                    ISPEC_TO_FORMAT (size_spec, "x", "lx", PRIxMAX));
738           break;
739
740         default:
741           abort ();
742         }
743
744       assert (strlen (tspec->fmt_string) < FMT_BYTES_ALLOCATED);
745
746       switch (size_spec)
747         {
748         case CHAR:
749           print_function = (fmt == SIGNED_DECIMAL
750                             ? print_s_char
751                             : print_char);
752           break;
753
754         case SHORT:
755           print_function = (fmt == SIGNED_DECIMAL
756                             ? print_s_short
757                             : print_short);
758           break;
759
760         case INT:
761           print_function = print_int;
762           break;
763
764         case LONG:
765           print_function = print_long;
766           break;
767
768         case LONG_LONG:
769           print_function = print_long_long;
770           break;
771
772         default:
773           abort ();
774         }
775       break;
776
777     case 'f':
778       fmt = FLOATING_POINT;
779       ++s;
780       switch (*s)
781         {
782         case 'F':
783           ++s;
784           size = sizeof (float);
785           break;
786
787         case 'D':
788           ++s;
789           size = sizeof (double);
790           break;
791
792         case 'L':
793           ++s;
794           size = sizeof (LONG_DOUBLE);
795           break;
796
797         default:
798           if (! simple_strtoul (s, &p, &size))
799             {
800               /* The integer at P in S would overflow an unsigned long int.
801                  A digit string that long is sufficiently odd looking
802                  that the following diagnostic is sufficient.  */
803               error (0, 0, _("invalid type string %s"), quote (s_orig));
804               return false;
805             }
806           if (p == s)
807             size = sizeof (double);
808           else
809             {
810               if (size > MAX_FP_TYPE_SIZE
811                   || fp_type_size[size] == NO_SIZE)
812                 {
813                   error (0, 0, _("invalid type string %s;\n\
814 this system doesn't provide a %lu-byte floating point type"),
815                          quote (s_orig), size);
816                   return false;
817                 }
818               s = p;
819             }
820           break;
821         }
822       size_spec = fp_type_size[size];
823
824       switch (size_spec)
825         {
826         case FLOAT_SINGLE:
827           print_function = print_float;
828           /* Don't use %#e; not all systems support it.  */
829           pre_fmt_string = " %%%d.%de";
830           precision = FLT_DIG;
831           break;
832
833         case FLOAT_DOUBLE:
834           print_function = print_double;
835           pre_fmt_string = " %%%d.%de";
836           precision = DBL_DIG;
837           break;
838
839 #ifdef HAVE_LONG_DOUBLE
840         case FLOAT_LONG_DOUBLE:
841           print_function = print_long_double;
842           pre_fmt_string = " %%%d.%dLe";
843           precision = LDBL_DIG;
844           break;
845 #endif
846
847         default:
848           abort ();
849         }
850
851       field_width = precision + 8;
852       sprintf (tspec->fmt_string, pre_fmt_string, field_width, precision);
853       break;
854
855     case 'a':
856       ++s;
857       fmt = NAMED_CHARACTER;
858       size_spec = CHAR;
859       print_function = print_named_ascii;
860       field_width = 3;
861       break;
862
863     case 'c':
864       ++s;
865       fmt = CHARACTER;
866       size_spec = CHAR;
867       print_function = print_ascii;
868       field_width = 3;
869       break;
870
871     default:
872       error (0, 0, _("invalid character `%c' in type string %s"),
873              *s, quote (s_orig));
874       return false;
875     }
876
877   tspec->size = size_spec;
878   tspec->fmt = fmt;
879   tspec->print_function = print_function;
880
881   tspec->field_width = field_width;
882   tspec->hexl_mode_trailer = (*s == 'z');
883   if (tspec->hexl_mode_trailer)
884     s++;
885
886   if (next != NULL)
887     *next = s;
888
889   return true;
890 }
891
892 /* Given a list of one or more input filenames FILE_LIST, set the global
893    file pointer IN_STREAM and the global string INPUT_FILENAME to the
894    first one that can be successfully opened. Modify FILE_LIST to
895    reference the next filename in the list.  A file name of "-" is
896    interpreted as standard input.  If any file open fails, give an error
897    message and return false.  */
898
899 static bool
900 open_next_file (void)
901 {
902   bool ok = true;
903
904   do
905     {
906       input_filename = *file_list;
907       if (input_filename == NULL)
908         return ok;
909       ++file_list;
910
911       if (STREQ (input_filename, "-"))
912         {
913           input_filename = _("standard input");
914           in_stream = stdin;
915           have_read_stdin = true;
916           if (O_BINARY && ! isatty (STDIN_FILENO))
917             freopen (NULL, "rb", stdin);
918         }
919       else
920         {
921           in_stream = fopen (input_filename, (O_BINARY ? "rb" : "r"));
922           if (in_stream == NULL)
923             {
924               error (0, errno, "%s", input_filename);
925               ok = false;
926             }
927         }
928     }
929   while (in_stream == NULL);
930
931   if (limit_bytes_to_format & !flag_dump_strings)
932     setvbuf (in_stream, NULL, _IONBF, 0);
933
934   return ok;
935 }
936
937 /* Test whether there have been errors on in_stream, and close it if
938    it is not standard input.  Return false if there has been an error
939    on in_stream or stdout; return true otherwise.  This function will
940    report more than one error only if both a read and a write error
941    have occurred.  IN_ERRNO, if nonzero, is the error number
942    corresponding to the most recent action for IN_STREAM.  */
943
944 static bool
945 check_and_close (int in_errno)
946 {
947   bool ok = true;
948
949   if (in_stream != NULL)
950     {
951       if (ferror (in_stream))
952         {
953           error (0, in_errno, _("%s: read error"), input_filename);
954           if (! STREQ (file_list[-1], "-"))
955             fclose (in_stream);
956           ok = false;
957         }
958       else if (! STREQ (file_list[-1], "-") && fclose (in_stream) != 0)
959         {
960           error (0, errno, "%s", input_filename);
961           ok = false;
962         }
963
964       in_stream = NULL;
965     }
966
967   if (ferror (stdout))
968     {
969       error (0, 0, _("write error"));
970       ok = false;
971     }
972
973   return ok;
974 }
975
976 /* Decode the modern od format string S.  Append the decoded
977    representation to the global array SPEC, reallocating SPEC if
978    necessary.  Return true if S is valid.  */
979
980 static bool
981 decode_format_string (const char *s)
982 {
983   const char *s_orig = s;
984   assert (s != NULL);
985
986   while (*s != '\0')
987     {
988       const char *next;
989
990       if (n_specs_allocated <= n_specs)
991         spec = X2NREALLOC (spec, &n_specs_allocated);
992
993       if (! decode_one_format (s_orig, s, &next, &spec[n_specs]))
994         return false;
995
996       assert (s != next);
997       s = next;
998       ++n_specs;
999     }
1000
1001   return true;
1002 }
1003
1004 /* Given a list of one or more input filenames FILE_LIST, set the global
1005    file pointer IN_STREAM to position N_SKIP in the concatenation of
1006    those files.  If any file operation fails or if there are fewer than
1007    N_SKIP bytes in the combined input, give an error message and return
1008    false.  When possible, use seek rather than read operations to
1009    advance IN_STREAM.  */
1010
1011 static bool
1012 skip (uintmax_t n_skip)
1013 {
1014   bool ok = true;
1015   int in_errno = 0;
1016
1017   if (n_skip == 0)
1018     return true;
1019
1020   while (in_stream != NULL)     /* EOF.  */
1021     {
1022       struct stat file_stats;
1023
1024       /* First try seeking.  For large offsets, this extra work is
1025          worthwhile.  If the offset is below some threshold it may be
1026          more efficient to move the pointer by reading.  There are two
1027          issues when trying to seek:
1028            - the file must be seekable.
1029            - before seeking to the specified position, make sure
1030              that the new position is in the current file.
1031              Try to do that by getting file's size using fstat.
1032              But that will work only for regular files.  */
1033
1034       if (fstat (fileno (in_stream), &file_stats) == 0)
1035         {
1036           /* The st_size field is valid only for regular files
1037              (and for symbolic links, which cannot occur here).
1038              If the number of bytes left to skip is at least
1039              as large as the size of the current file, we can
1040              decrement n_skip and go on to the next file.  */
1041
1042           if (S_ISREG (file_stats.st_mode) && 0 <= file_stats.st_size)
1043             {
1044               if ((uintmax_t) file_stats.st_size <= n_skip)
1045                 n_skip -= file_stats.st_size;
1046               else
1047                 {
1048                   if (fseeko (in_stream, n_skip, SEEK_CUR) != 0)
1049                     {
1050                       in_errno = errno;
1051                       ok = false;
1052                     }
1053                   n_skip = 0;
1054                 }
1055             }
1056
1057           /* If it's not a regular file with nonnegative size,
1058              position the file pointer by reading.  */
1059
1060           else
1061             {
1062               char buf[BUFSIZ];
1063               size_t n_bytes_read, n_bytes_to_read = BUFSIZ;
1064
1065               while (0 < n_skip)
1066                 {
1067                   if (n_skip < n_bytes_to_read)
1068                     n_bytes_to_read = n_skip;
1069                   n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1070                   n_skip -= n_bytes_read;
1071                   if (n_bytes_read != n_bytes_to_read)
1072                     {
1073                       in_errno = errno;
1074                       ok = false;
1075                       n_skip = 0;
1076                       break;
1077                     }
1078                 }
1079             }
1080
1081           if (n_skip == 0)
1082             break;
1083         }
1084
1085       else   /* cannot fstat() file */
1086         {
1087           error (0, errno, "%s", input_filename);
1088           ok = false;
1089         }
1090
1091       ok &= check_and_close (in_errno);
1092
1093       ok &= open_next_file ();
1094     }
1095
1096   if (n_skip != 0)
1097     error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1098
1099   return ok;
1100 }
1101
1102 static void
1103 format_address_none (uintmax_t address ATTRIBUTE_UNUSED, char c ATTRIBUTE_UNUSED)
1104 {
1105 }
1106
1107 static void
1108 format_address_std (uintmax_t address, char c)
1109 {
1110   char buf[MAX_ADDRESS_LENGTH + 2];
1111   char *p = buf + sizeof buf;
1112   char const *pbound;
1113
1114   *--p = '\0';
1115   *--p = c;
1116   pbound = p - address_pad_len;
1117
1118   /* Use a special case of the code for each base.  This is measurably
1119      faster than generic code.  */
1120   switch (address_base)
1121     {
1122     case 8:
1123       do
1124         *--p = '0' + (address & 7);
1125       while ((address >>= 3) != 0);
1126       break;
1127
1128     case 10:
1129       do
1130         *--p = '0' + (address % 10);
1131       while ((address /= 10) != 0);
1132       break;
1133
1134     case 16:
1135       do
1136         *--p = "0123456789abcdef"[address & 15];
1137       while ((address >>= 4) != 0);
1138       break;
1139     }
1140
1141   while (pbound < p)
1142     *--p = '0';
1143
1144   fputs (p, stdout);
1145 }
1146
1147 static void
1148 format_address_paren (uintmax_t address, char c)
1149 {
1150   putchar ('(');
1151   format_address_std (address, ')');
1152   if (c)
1153     putchar (c);
1154 }
1155
1156 static void
1157 format_address_label (uintmax_t address, char c)
1158 {
1159   format_address_std (address, ' ');
1160   format_address_paren (address + pseudo_offset, c);
1161 }
1162
1163 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1164    of the N_SPEC format specs.  CURRENT_OFFSET is the byte address of
1165    CURR_BLOCK in the concatenation of input files, and it is printed
1166    (optionally) only before the output line associated with the first
1167    format spec.  When duplicate blocks are being abbreviated, the output
1168    for a sequence of identical input blocks is the output for the first
1169    block followed by an asterisk alone on a line.  It is valid to compare
1170    the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1171    That condition may be false only for the last input block -- and then
1172    only when it has not been padded to length BYTES_PER_BLOCK.  */
1173
1174 static void
1175 write_block (uintmax_t current_offset, size_t n_bytes,
1176              const char *prev_block, const char *curr_block)
1177 {
1178   static bool first = true;
1179   static bool prev_pair_equal = false;
1180
1181 #define EQUAL_BLOCKS(b1, b2) (memcmp (b1, b2, bytes_per_block) == 0)
1182
1183   if (abbreviate_duplicate_blocks
1184       && !first && n_bytes == bytes_per_block
1185       && EQUAL_BLOCKS (prev_block, curr_block))
1186     {
1187       if (prev_pair_equal)
1188         {
1189           /* The two preceding blocks were equal, and the current
1190              block is the same as the last one, so print nothing.  */
1191         }
1192       else
1193         {
1194           printf ("*\n");
1195           prev_pair_equal = true;
1196         }
1197     }
1198   else
1199     {
1200       size_t i;
1201
1202       prev_pair_equal = false;
1203       for (i = 0; i < n_specs; i++)
1204         {
1205           if (i == 0)
1206             format_address (current_offset, '\0');
1207           else
1208             printf ("%*s", address_pad_len, "");
1209           (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1210           if (spec[i].hexl_mode_trailer)
1211             {
1212               /* space-pad out to full line width, then dump the trailer */
1213               int datum_width = width_bytes[spec[i].size];
1214               int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1215               int field_width = spec[i].field_width + 1;
1216               printf ("%*s", blank_fields * field_width, "");
1217               dump_hexl_mode_trailer (n_bytes, curr_block);
1218             }
1219           putchar ('\n');
1220         }
1221     }
1222   first = false;
1223 }
1224
1225 /* Read a single byte into *C from the concatenation of the input files
1226    named in the global array FILE_LIST.  On the first call to this
1227    function, the global variable IN_STREAM is expected to be an open
1228    stream associated with the input file INPUT_FILENAME.  If IN_STREAM
1229    is at end-of-file, close it and update the global variables IN_STREAM
1230    and INPUT_FILENAME so they correspond to the next file in the list.
1231    Then try to read a byte from the newly opened file.  Repeat if
1232    necessary until EOF is reached for the last file in FILE_LIST, then
1233    set *C to EOF and return.  Subsequent calls do likewise.  Return
1234    true if successful.  */
1235
1236 static bool
1237 read_char (int *c)
1238 {
1239   bool ok = true;
1240
1241   *c = EOF;
1242
1243   while (in_stream != NULL)     /* EOF.  */
1244     {
1245       *c = fgetc (in_stream);
1246
1247       if (*c != EOF)
1248         break;
1249
1250       ok &= check_and_close (errno);
1251
1252       ok &= open_next_file ();
1253     }
1254
1255   return ok;
1256 }
1257
1258 /* Read N bytes into BLOCK from the concatenation of the input files
1259    named in the global array FILE_LIST.  On the first call to this
1260    function, the global variable IN_STREAM is expected to be an open
1261    stream associated with the input file INPUT_FILENAME.  If all N
1262    bytes cannot be read from IN_STREAM, close IN_STREAM and update
1263    the global variables IN_STREAM and INPUT_FILENAME.  Then try to
1264    read the remaining bytes from the newly opened file.  Repeat if
1265    necessary until EOF is reached for the last file in FILE_LIST.
1266    On subsequent calls, don't modify BLOCK and return true.  Set
1267    *N_BYTES_IN_BUFFER to the number of bytes read.  If an error occurs,
1268    it will be detected through ferror when the stream is about to be
1269    closed.  If there is an error, give a message but continue reading
1270    as usual and return false.  Otherwise return true.  */
1271
1272 static bool
1273 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1274 {
1275   bool ok = true;
1276
1277   assert (0 < n && n <= bytes_per_block);
1278
1279   *n_bytes_in_buffer = 0;
1280
1281   if (n == 0)
1282     return true;
1283
1284   while (in_stream != NULL)     /* EOF.  */
1285     {
1286       size_t n_needed;
1287       size_t n_read;
1288
1289       n_needed = n - *n_bytes_in_buffer;
1290       n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1291
1292       *n_bytes_in_buffer += n_read;
1293
1294       if (n_read == n_needed)
1295         break;
1296
1297       ok &= check_and_close (errno);
1298
1299       ok &= open_next_file ();
1300     }
1301
1302   return ok;
1303 }
1304
1305 /* Return the least common multiple of the sizes associated
1306    with the format specs.  */
1307
1308 static int
1309 get_lcm (void)
1310 {
1311   size_t i;
1312   int l_c_m = 1;
1313
1314   for (i = 0; i < n_specs; i++)
1315     l_c_m = lcm (l_c_m, width_bytes[spec[i].size]);
1316   return l_c_m;
1317 }
1318
1319 /* If S is a valid traditional offset specification with an optional
1320    leading '+' return true and set *OFFSET to the offset it denotes.  */
1321
1322 static bool
1323 parse_old_offset (const char *s, uintmax_t *offset)
1324 {
1325   int radix;
1326
1327   if (*s == '\0')
1328     return false;
1329
1330   /* Skip over any leading '+'. */
1331   if (s[0] == '+')
1332     ++s;
1333
1334   /* Determine the radix we'll use to interpret S.  If there is a `.',
1335      it's decimal, otherwise, if the string begins with `0X'or `0x',
1336      it's hexadecimal, else octal.  */
1337   if (strchr (s, '.') != NULL)
1338     radix = 10;
1339   else
1340     {
1341       if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1342         radix = 16;
1343       else
1344         radix = 8;
1345     }
1346
1347   return xstrtoumax (s, NULL, radix, offset, "Bb") == LONGINT_OK;
1348 }
1349
1350 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1351    formatted block to standard output, and repeat until the specified
1352    maximum number of bytes has been read or until all input has been
1353    processed.  If the last block read is smaller than BYTES_PER_BLOCK
1354    and its size is not a multiple of the size associated with a format
1355    spec, extend the input block with zero bytes until its length is a
1356    multiple of all format spec sizes.  Write the final block.  Finally,
1357    write on a line by itself the offset of the byte after the last byte
1358    read.  Accumulate return values from calls to read_block and
1359    check_and_close, and if any was false, return false.
1360    Otherwise, return true.  */
1361
1362 static bool
1363 dump (void)
1364 {
1365   char *block[2];
1366   uintmax_t current_offset;
1367   bool idx = false;
1368   bool ok = true;
1369   size_t n_bytes_read;
1370
1371   block[0] = xnmalloc (2, bytes_per_block);
1372   block[1] = block[0] + bytes_per_block;
1373
1374   current_offset = n_bytes_to_skip;
1375
1376   if (limit_bytes_to_format)
1377     {
1378       while (1)
1379         {
1380           size_t n_needed;
1381           if (current_offset >= end_offset)
1382             {
1383               n_bytes_read = 0;
1384               break;
1385             }
1386           n_needed = MIN (end_offset - current_offset,
1387                           (uintmax_t) bytes_per_block);
1388           ok &= read_block (n_needed, block[idx], &n_bytes_read);
1389           if (n_bytes_read < bytes_per_block)
1390             break;
1391           assert (n_bytes_read == bytes_per_block);
1392           write_block (current_offset, n_bytes_read,
1393                        block[!idx], block[idx]);
1394           current_offset += n_bytes_read;
1395           idx = !idx;
1396         }
1397     }
1398   else
1399     {
1400       while (1)
1401         {
1402           ok &= read_block (bytes_per_block, block[idx], &n_bytes_read);
1403           if (n_bytes_read < bytes_per_block)
1404             break;
1405           assert (n_bytes_read == bytes_per_block);
1406           write_block (current_offset, n_bytes_read,
1407                        block[!idx], block[idx]);
1408           current_offset += n_bytes_read;
1409           idx = !idx;
1410         }
1411     }
1412
1413   if (n_bytes_read > 0)
1414     {
1415       int l_c_m;
1416       size_t bytes_to_write;
1417
1418       l_c_m = get_lcm ();
1419
1420       /* Make bytes_to_write the smallest multiple of l_c_m that
1421          is at least as large as n_bytes_read.  */
1422       bytes_to_write = l_c_m * ((n_bytes_read + l_c_m - 1) / l_c_m);
1423
1424       memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1425       write_block (current_offset, bytes_to_write,
1426                    block[!idx], block[idx]);
1427       current_offset += n_bytes_read;
1428     }
1429
1430   format_address (current_offset, '\n');
1431
1432   if (limit_bytes_to_format && current_offset >= end_offset)
1433     ok &= check_and_close (0);
1434
1435   free (block[0]);
1436
1437   return ok;
1438 }
1439
1440 /* STRINGS mode.  Find each "string constant" in the input.
1441    A string constant is a run of at least `string_min' ASCII
1442    graphic (or formatting) characters terminated by a null.
1443    Based on a function written by Richard Stallman for a
1444    traditional version of od.  Return true if successful.  */
1445
1446 static bool
1447 dump_strings (void)
1448 {
1449   size_t bufsize = MAX (100, string_min);
1450   char *buf = xmalloc (bufsize);
1451   uintmax_t address = n_bytes_to_skip;
1452   bool ok = true;
1453
1454   while (1)
1455     {
1456       size_t i;
1457       int c;
1458
1459       /* See if the next `string_min' chars are all printing chars.  */
1460     tryline:
1461
1462       if (limit_bytes_to_format
1463           && (end_offset < string_min || end_offset - string_min <= address))
1464         break;
1465
1466       for (i = 0; i < string_min; i++)
1467         {
1468           ok &= read_char (&c);
1469           address++;
1470           if (c < 0)
1471             {
1472               free (buf);
1473               return ok;
1474             }
1475           if (! isprint (c))
1476             /* Found a non-printing.  Try again starting with next char.  */
1477             goto tryline;
1478           buf[i] = c;
1479         }
1480
1481       /* We found a run of `string_min' printable characters.
1482          Now see if it is terminated with a null byte.  */
1483       while (!limit_bytes_to_format || address < end_offset)
1484         {
1485           if (i == bufsize)
1486             {
1487               buf = X2REALLOC (buf, &bufsize);
1488             }
1489           ok &= read_char (&c);
1490           address++;
1491           if (c < 0)
1492             {
1493               free (buf);
1494               return ok;
1495             }
1496           if (c == '\0')
1497             break;              /* It is; print this string.  */
1498           if (! isprint (c))
1499             goto tryline;       /* It isn't; give up on this string.  */
1500           buf[i++] = c;         /* String continues; store it all.  */
1501         }
1502
1503       /* If we get here, the string is all printable and null-terminated,
1504          so print it.  It is all in `buf' and `i' is its length.  */
1505       buf[i] = 0;
1506       format_address (address - i - 1, ' ');
1507
1508       for (i = 0; (c = buf[i]); i++)
1509         {
1510           switch (c)
1511             {
1512             case '\a':
1513               fputs ("\\a", stdout);
1514               break;
1515
1516             case '\b':
1517               fputs ("\\b", stdout);
1518               break;
1519
1520             case '\f':
1521               fputs ("\\f", stdout);
1522               break;
1523
1524             case '\n':
1525               fputs ("\\n", stdout);
1526               break;
1527
1528             case '\r':
1529               fputs ("\\r", stdout);
1530               break;
1531
1532             case '\t':
1533               fputs ("\\t", stdout);
1534               break;
1535
1536             case '\v':
1537               fputs ("\\v", stdout);
1538               break;
1539
1540             default:
1541               putc (c, stdout);
1542             }
1543         }
1544       putchar ('\n');
1545     }
1546
1547   /* We reach this point only if we search through
1548      (max_bytes_to_format - string_min) bytes before reaching EOF.  */
1549
1550   free (buf);
1551
1552   ok &= check_and_close (0);
1553   return ok;
1554 }
1555
1556 int
1557 main (int argc, char **argv)
1558 {
1559   int c;
1560   int n_files;
1561   size_t i;
1562   int l_c_m;
1563   size_t desired_width IF_LINT (= 0);
1564   bool modern = false;
1565   bool width_specified = false;
1566   bool ok = true;
1567   static char const multipliers[] = "bEGKkMmPTYZ0";
1568
1569   /* The old-style `pseudo starting address' to be printed in parentheses
1570      after any true address.  */
1571   uintmax_t pseudo_start IF_LINT (= 0);
1572
1573   initialize_main (&argc, &argv);
1574   program_name = argv[0];
1575   setlocale (LC_ALL, "");
1576   bindtextdomain (PACKAGE, LOCALEDIR);
1577   textdomain (PACKAGE);
1578
1579   atexit (close_stdout);
1580
1581   for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1582     integral_type_size[i] = NO_SIZE;
1583
1584   integral_type_size[sizeof (char)] = CHAR;
1585   integral_type_size[sizeof (short int)] = SHORT;
1586   integral_type_size[sizeof (int)] = INT;
1587   integral_type_size[sizeof (long int)] = LONG;
1588 #if HAVE_UNSIGNED_LONG_LONG_INT
1589   /* If `long int' and `long long int' have the same size, it's fine
1590      to overwrite the entry for `long' with this one.  */
1591   integral_type_size[sizeof (unsigned_long_long_int)] = LONG_LONG;
1592 #endif
1593
1594   for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1595     fp_type_size[i] = NO_SIZE;
1596
1597   fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1598   /* The array entry for `double' is filled in after that for LONG_DOUBLE
1599      so that if `long double' is the same type or if long double isn't
1600      supported FLOAT_LONG_DOUBLE will never be used.  */
1601   fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1602   fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1603
1604   n_specs = 0;
1605   n_specs_allocated = 0;
1606   spec = NULL;
1607
1608   format_address = format_address_std;
1609   address_base = 8;
1610   address_pad_len = 7;
1611   flag_dump_strings = false;
1612
1613   while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
1614          != -1)
1615     {
1616       uintmax_t tmp;
1617       enum strtol_error s_err;
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             STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
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             STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
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                 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
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                 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
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 }