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