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