Remove all uses of `PARAMS'.
[platform/upstream/coreutils.git] / src / od.c
1 /* od -- dump files in octal and other formats
2    Copyright (C) 92, 1995-2002 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 = (struct tspec *) xrealloc ((char *) spec,
1045                                             (n_specs_allocated
1046                                              * sizeof (struct tspec)));
1047         }
1048
1049       memcpy ((char *) &spec[n_specs], (char *) &tspec,
1050               sizeof (struct tspec));
1051       ++n_specs;
1052     }
1053
1054   return 0;
1055 }
1056
1057 /* Given a list of one or more input filenames FILE_LIST, set the global
1058    file pointer IN_STREAM to position N_SKIP in the concatenation of
1059    those files.  If any file operation fails or if there are fewer than
1060    N_SKIP bytes in the combined input, give an error message and return
1061    nonzero.  When possible, use seek rather than read operations to
1062    advance IN_STREAM.  */
1063
1064 static int
1065 skip (uintmax_t n_skip)
1066 {
1067   int err = 0;
1068
1069   if (n_skip == 0)
1070     return 0;
1071
1072   while (in_stream != NULL)     /* EOF.  */
1073     {
1074       struct stat file_stats;
1075
1076       /* First try seeking.  For large offsets, this extra work is
1077          worthwhile.  If the offset is below some threshold it may be
1078          more efficient to move the pointer by reading.  There are two
1079          issues when trying to seek:
1080            - the file must be seekable.
1081            - before seeking to the specified position, make sure
1082              that the new position is in the current file.
1083              Try to do that by getting file's size using fstat.
1084              But that will work only for regular files.  */
1085
1086       if (fstat (fileno (in_stream), &file_stats) == 0)
1087         {
1088           /* The st_size field is valid only for regular files
1089              (and for symbolic links, which cannot occur here).
1090              If the number of bytes left to skip is at least
1091              as large as the size of the current file, we can
1092              decrement n_skip and go on to the next file.  */
1093
1094           if (S_ISREG (file_stats.st_mode) && 0 <= file_stats.st_size)
1095             {
1096               if ((uintmax_t) file_stats.st_size <= n_skip)
1097                 n_skip -= file_stats.st_size;
1098               else
1099                 {
1100                   if (fseeko (in_stream, n_skip, SEEK_CUR) != 0)
1101                     {
1102                       error (0, errno, "%s", input_filename);
1103                       err = 1;
1104                     }
1105                   n_skip = 0;
1106                 }
1107             }
1108
1109           /* If it's not a regular file with nonnegative size,
1110              position the file pointer by reading.  */
1111
1112           else
1113             {
1114               char buf[BUFSIZ];
1115               size_t n_bytes_read, n_bytes_to_read = BUFSIZ;
1116
1117               while (0 < n_skip)
1118                 {
1119                   if (n_skip < n_bytes_to_read)
1120                     n_bytes_to_read = n_skip;
1121                   n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1122                   n_skip -= n_bytes_read;
1123                   if (n_bytes_read != n_bytes_to_read)
1124                     break;
1125                 }
1126             }
1127
1128           if (n_skip == 0)
1129             break;
1130         }
1131
1132       else   /* cannot fstat() file */
1133         {
1134           error (0, errno, "%s", input_filename);
1135           err = 1;
1136         }
1137
1138       err |= check_and_close ();
1139
1140       err |= open_next_file ();
1141     }
1142
1143   if (n_skip != 0)
1144     error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1145
1146   return err;
1147 }
1148
1149 static void
1150 format_address_none (uintmax_t address ATTRIBUTE_UNUSED, char c ATTRIBUTE_UNUSED)
1151 {
1152 }
1153
1154 static void
1155 format_address_std (uintmax_t address, char c)
1156 {
1157   char buf[MAX_ADDRESS_LENGTH + 2];
1158   char *p = buf + sizeof buf;
1159   char const *pbound;
1160
1161   *--p = '\0';
1162   *--p = c;
1163   pbound = p - address_pad_len;
1164
1165   /* Use a special case of the code for each base.  This is measurably
1166      faster than generic code.  */
1167   switch (address_base)
1168     {
1169     case 8:
1170       do
1171         *--p = '0' + (address & 7);
1172       while ((address >>= 3) != 0);
1173       break;
1174
1175     case 10:
1176       do
1177         *--p = '0' + (address % 10);
1178       while ((address /= 10) != 0);
1179       break;
1180
1181     case 16:
1182       do
1183         *--p = "0123456789abcdef"[address & 15];
1184       while ((address >>= 4) != 0);
1185       break;
1186     }
1187
1188   while (pbound < p)
1189     *--p = '0';
1190
1191   fputs (p, stdout);
1192 }
1193
1194 static void
1195 format_address_paren (uintmax_t address, char c)
1196 {
1197   putchar ('(');
1198   format_address_std (address, ')');
1199   putchar (c);
1200 }
1201
1202 static void
1203 format_address_label (uintmax_t address, char c)
1204 {
1205   format_address_std (address, ' ');
1206   format_address_paren (address + pseudo_offset, c);
1207 }
1208
1209 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1210    of the N_SPEC format specs.  CURRENT_OFFSET is the byte address of
1211    CURR_BLOCK in the concatenation of input files, and it is printed
1212    (optionally) only before the output line associated with the first
1213    format spec.  When duplicate blocks are being abbreviated, the output
1214    for a sequence of identical input blocks is the output for the first
1215    block followed by an asterisk alone on a line.  It is valid to compare
1216    the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1217    That condition may be false only for the last input block -- and then
1218    only when it has not been padded to length BYTES_PER_BLOCK.  */
1219
1220 static void
1221 write_block (uintmax_t current_offset, size_t n_bytes,
1222              const char *prev_block, const char *curr_block)
1223 {
1224   static int first = 1;
1225   static int prev_pair_equal = 0;
1226
1227 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1228
1229   if (abbreviate_duplicate_blocks
1230       && !first && n_bytes == bytes_per_block
1231       && EQUAL_BLOCKS (prev_block, curr_block))
1232     {
1233       if (prev_pair_equal)
1234         {
1235           /* The two preceding blocks were equal, and the current
1236              block is the same as the last one, so print nothing.  */
1237         }
1238       else
1239         {
1240           printf ("*\n");
1241           prev_pair_equal = 1;
1242         }
1243     }
1244   else
1245     {
1246       size_t i;
1247
1248       prev_pair_equal = 0;
1249       for (i = 0; i < n_specs; i++)
1250         {
1251           if (i == 0)
1252             format_address (current_offset, '\0');
1253           else
1254             printf ("%*s", address_pad_len, "");
1255           (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1256           if (spec[i].hexl_mode_trailer)
1257             {
1258               /* space-pad out to full line width, then dump the trailer */
1259               int datum_width = width_bytes[spec[i].size];
1260               int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1261               int field_width = spec[i].field_width + 1;
1262               printf ("%*s", blank_fields * field_width, "");
1263               dump_hexl_mode_trailer (n_bytes, curr_block);
1264             }
1265           putchar ('\n');
1266         }
1267     }
1268   first = 0;
1269 }
1270
1271 /* Read a single byte into *C from the concatenation of the input files
1272    named in the global array FILE_LIST.  On the first call to this
1273    function, the global variable IN_STREAM is expected to be an open
1274    stream associated with the input file INPUT_FILENAME.  If IN_STREAM
1275    is at end-of-file, close it and update the global variables IN_STREAM
1276    and INPUT_FILENAME so they correspond to the next file in the list.
1277    Then try to read a byte from the newly opened file.  Repeat if
1278    necessary until EOF is reached for the last file in FILE_LIST, then
1279    set *C to EOF and return.  Subsequent calls do likewise.  The return
1280    value is nonzero if any errors occured, zero otherwise.  */
1281
1282 static int
1283 read_char (int *c)
1284 {
1285   int err = 0;
1286
1287   *c = EOF;
1288
1289   while (in_stream != NULL)     /* EOF.  */
1290     {
1291       *c = fgetc (in_stream);
1292
1293       if (*c != EOF)
1294         break;
1295
1296       err |= check_and_close ();
1297
1298       err |= open_next_file ();
1299     }
1300
1301   return err;
1302 }
1303
1304 /* Read N bytes into BLOCK from the concatenation of the input files
1305    named in the global array FILE_LIST.  On the first call to this
1306    function, the global variable IN_STREAM is expected to be an open
1307    stream associated with the input file INPUT_FILENAME.  If all N
1308    bytes cannot be read from IN_STREAM, close IN_STREAM and update
1309    the global variables IN_STREAM and INPUT_FILENAME.  Then try to
1310    read the remaining bytes from the newly opened file.  Repeat if
1311    necessary until EOF is reached for the last file in FILE_LIST.
1312    On subsequent calls, don't modify BLOCK and return zero.  Set
1313    *N_BYTES_IN_BUFFER to the number of bytes read.  If an error occurs,
1314    it will be detected through ferror when the stream is about to be
1315    closed.  If there is an error, give a message but continue reading
1316    as usual and return nonzero.  Otherwise return zero.  */
1317
1318 static int
1319 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1320 {
1321   int err = 0;
1322
1323   assert (0 < n && n <= bytes_per_block);
1324
1325   *n_bytes_in_buffer = 0;
1326
1327   if (n == 0)
1328     return 0;
1329
1330   while (in_stream != NULL)     /* EOF.  */
1331     {
1332       size_t n_needed;
1333       size_t n_read;
1334
1335       n_needed = n - *n_bytes_in_buffer;
1336       n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1337
1338       *n_bytes_in_buffer += n_read;
1339
1340       if (n_read == n_needed)
1341         break;
1342
1343       err |= check_and_close ();
1344
1345       err |= open_next_file ();
1346     }
1347
1348   return err;
1349 }
1350
1351 /* Return the least common multiple of the sizes associated
1352    with the format specs.  */
1353
1354 static int
1355 get_lcm (void)
1356 {
1357   size_t i;
1358   int l_c_m = 1;
1359
1360   for (i = 0; i < n_specs; i++)
1361     l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1362   return l_c_m;
1363 }
1364
1365 /* If S is a valid traditional offset specification with an optional
1366    leading '+' return nonzero and set *OFFSET to the offset it denotes.  */
1367
1368 static int
1369 parse_old_offset (const char *s, uintmax_t *offset)
1370 {
1371   int radix;
1372   enum strtol_error s_err;
1373
1374   if (*s == '\0')
1375     return 0;
1376
1377   /* Skip over any leading '+'. */
1378   if (s[0] == '+')
1379     ++s;
1380
1381   /* Determine the radix we'll use to interpret S.  If there is a `.',
1382      it's decimal, otherwise, if the string begins with `0X'or `0x',
1383      it's hexadecimal, else octal.  */
1384   if (strchr (s, '.') != NULL)
1385     radix = 10;
1386   else
1387     {
1388       if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1389         radix = 16;
1390       else
1391         radix = 8;
1392     }
1393
1394   s_err = xstrtoumax (s, NULL, radix, offset, "Bb");
1395   if (s_err != LONGINT_OK)
1396     {
1397       STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1398       return 0;
1399     }
1400   return 1;
1401 }
1402
1403 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1404    formatted block to standard output, and repeat until the specified
1405    maximum number of bytes has been read or until all input has been
1406    processed.  If the last block read is smaller than BYTES_PER_BLOCK
1407    and its size is not a multiple of the size associated with a format
1408    spec, extend the input block with zero bytes until its length is a
1409    multiple of all format spec sizes.  Write the final block.  Finally,
1410    write on a line by itself the offset of the byte after the last byte
1411    read.  Accumulate return values from calls to read_block and
1412    check_and_close, and if any was nonzero, return nonzero.
1413    Otherwise, return zero.  */
1414
1415 static int
1416 dump (void)
1417 {
1418   char *block[2];
1419   uintmax_t current_offset;
1420   int idx;
1421   int err;
1422   size_t n_bytes_read;
1423
1424   block[0] = (char *) alloca (bytes_per_block);
1425   block[1] = (char *) alloca (bytes_per_block);
1426
1427   current_offset = n_bytes_to_skip;
1428
1429   idx = 0;
1430   err = 0;
1431   if (limit_bytes_to_format)
1432     {
1433       while (1)
1434         {
1435           size_t n_needed;
1436           if (current_offset >= end_offset)
1437             {
1438               n_bytes_read = 0;
1439               break;
1440             }
1441           n_needed = MIN (end_offset - current_offset,
1442                           (uintmax_t) bytes_per_block);
1443           err |= read_block (n_needed, block[idx], &n_bytes_read);
1444           if (n_bytes_read < bytes_per_block)
1445             break;
1446           assert (n_bytes_read == bytes_per_block);
1447           write_block (current_offset, n_bytes_read,
1448                        block[!idx], block[idx]);
1449           current_offset += n_bytes_read;
1450           idx = !idx;
1451         }
1452     }
1453   else
1454     {
1455       while (1)
1456         {
1457           err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1458           if (n_bytes_read < bytes_per_block)
1459             break;
1460           assert (n_bytes_read == bytes_per_block);
1461           write_block (current_offset, n_bytes_read,
1462                        block[!idx], block[idx]);
1463           current_offset += n_bytes_read;
1464           idx = !idx;
1465         }
1466     }
1467
1468   if (n_bytes_read > 0)
1469     {
1470       int l_c_m;
1471       size_t bytes_to_write;
1472
1473       l_c_m = get_lcm ();
1474
1475       /* Make bytes_to_write the smallest multiple of l_c_m that
1476          is at least as large as n_bytes_read.  */
1477       bytes_to_write = l_c_m * ((n_bytes_read + l_c_m - 1) / l_c_m);
1478
1479       memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1480       write_block (current_offset, bytes_to_write,
1481                    block[!idx], block[idx]);
1482       current_offset += n_bytes_read;
1483     }
1484
1485   format_address (current_offset, '\n');
1486
1487   if (limit_bytes_to_format && current_offset >= end_offset)
1488     err |= check_and_close ();
1489
1490   return err;
1491 }
1492
1493 /* STRINGS mode.  Find each "string constant" in the input.
1494    A string constant is a run of at least `string_min' ASCII
1495    graphic (or formatting) characters terminated by a null.
1496    Based on a function written by Richard Stallman for a
1497    traditional version of od.  Return nonzero if an error
1498    occurs.  Otherwise, return zero.  */
1499
1500 static int
1501 dump_strings (void)
1502 {
1503   size_t bufsize = MAX (100, string_min);
1504   char *buf = xmalloc (bufsize);
1505   uintmax_t address = n_bytes_to_skip;
1506   int err;
1507
1508   err = 0;
1509   while (1)
1510     {
1511       size_t i;
1512       int c;
1513
1514       /* See if the next `string_min' chars are all printing chars.  */
1515     tryline:
1516
1517       if (limit_bytes_to_format
1518           && (end_offset < string_min || end_offset - string_min <= address))
1519         break;
1520
1521       for (i = 0; i < string_min; i++)
1522         {
1523           err |= read_char (&c);
1524           address++;
1525           if (c < 0)
1526             {
1527               free (buf);
1528               return err;
1529             }
1530           if (!ISPRINT (c))
1531             /* Found a non-printing.  Try again starting with next char.  */
1532             goto tryline;
1533           buf[i] = c;
1534         }
1535
1536       /* We found a run of `string_min' printable characters.
1537          Now see if it is terminated with a null byte.  */
1538       while (!limit_bytes_to_format || address < end_offset)
1539         {
1540           if (i == bufsize)
1541             {
1542               bufsize = 1 + 3 * bufsize / 2;
1543               buf = xrealloc (buf, bufsize);
1544             }
1545           err |= read_char (&c);
1546           address++;
1547           if (c < 0)
1548             {
1549               free (buf);
1550               return err;
1551             }
1552           if (c == '\0')
1553             break;              /* It is; print this string.  */
1554           if (!ISPRINT (c))
1555             goto tryline;       /* It isn't; give up on this string.  */
1556           buf[i++] = c;         /* String continues; store it all.  */
1557         }
1558
1559       /* If we get here, the string is all printable and null-terminated,
1560          so print it.  It is all in `buf' and `i' is its length.  */
1561       buf[i] = 0;
1562       format_address (address - i - 1, ' ');
1563
1564       for (i = 0; (c = buf[i]); i++)
1565         {
1566           switch (c)
1567             {
1568             case '\007':
1569               fputs ("\\a", stdout);
1570               break;
1571
1572             case '\b':
1573               fputs ("\\b", stdout);
1574               break;
1575
1576             case '\f':
1577               fputs ("\\f", stdout);
1578               break;
1579
1580             case '\n':
1581               fputs ("\\n", stdout);
1582               break;
1583
1584             case '\r':
1585               fputs ("\\r", stdout);
1586               break;
1587
1588             case '\t':
1589               fputs ("\\t", stdout);
1590               break;
1591
1592             case '\v':
1593               fputs ("\\v", stdout);
1594               break;
1595
1596             default:
1597               putc (c, stdout);
1598             }
1599         }
1600       putchar ('\n');
1601     }
1602
1603   /* We reach this point only if we search through
1604      (max_bytes_to_format - string_min) bytes before reaching EOF.  */
1605
1606   free (buf);
1607
1608   err |= check_and_close ();
1609   return err;
1610 }
1611
1612 int
1613 main (int argc, char **argv)
1614 {
1615   int c;
1616   int n_files;
1617   size_t i;
1618   int l_c_m;
1619   size_t desired_width IF_LINT (= 0);
1620   int width_specified = 0;
1621   int n_failed_decodes = 0;
1622   int err;
1623   char const *short_options = (posix2_version () < 200112
1624                                ? COMMON_SHORT_OPTIONS "s::w::"
1625                                : COMMON_SHORT_OPTIONS "s:w:");
1626
1627   /* The old-style `pseudo starting address' to be printed in parentheses
1628      after any true address.  */
1629   uintmax_t pseudo_start IF_LINT (= 0);
1630
1631   program_name = argv[0];
1632   setlocale (LC_ALL, "");
1633   bindtextdomain (PACKAGE, LOCALEDIR);
1634   textdomain (PACKAGE);
1635
1636   atexit (close_stdout);
1637
1638   err = 0;
1639
1640   for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1641     integral_type_size[i] = NO_SIZE;
1642
1643   integral_type_size[sizeof (char)] = CHAR;
1644   integral_type_size[sizeof (short int)] = SHORT;
1645   integral_type_size[sizeof (int)] = INT;
1646   integral_type_size[sizeof (long int)] = LONG;
1647 #if HAVE_UNSIGNED_LONG_LONG
1648   /* If `long' and `long long' have the same size, it's fine
1649      to overwrite the entry for `long' with this one.  */
1650   integral_type_size[sizeof (ulonglong_t)] = LONG_LONG;
1651 #endif
1652
1653   for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1654     fp_type_size[i] = NO_SIZE;
1655
1656   fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1657   /* The array entry for `double' is filled in after that for LONG_DOUBLE
1658      so that if `long double' is the same type or if long double isn't
1659      supported FLOAT_LONG_DOUBLE will never be used.  */
1660   fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1661   fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1662
1663   n_specs = 0;
1664   n_specs_allocated = 5;
1665   spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1666
1667   format_address = format_address_std;
1668   address_base = 8;
1669   address_pad_len = 7;
1670   flag_dump_strings = 0;
1671
1672   while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
1673          != -1)
1674     {
1675       uintmax_t tmp;
1676       enum strtol_error s_err;
1677
1678       switch (c)
1679         {
1680         case 0:
1681           break;
1682
1683         case 'A':
1684           switch (optarg[0])
1685             {
1686             case 'd':
1687               format_address = format_address_std;
1688               address_base = 10;
1689               address_pad_len = 7;
1690               break;
1691             case 'o':
1692               format_address = format_address_std;
1693               address_base = 8;
1694               address_pad_len = 7;
1695               break;
1696             case 'x':
1697               format_address = format_address_std;
1698               address_base = 16;
1699               address_pad_len = 6;
1700               break;
1701             case 'n':
1702               format_address = format_address_none;
1703               address_pad_len = 0;
1704               break;
1705             default:
1706               error (EXIT_FAILURE, 0,
1707                      _("invalid output address radix `%c'; \
1708 it must be one character from [doxn]"),
1709                      optarg[0]);
1710               break;
1711             }
1712           break;
1713
1714         case 'j':
1715           s_err = xstrtoumax (optarg, NULL, 0, &n_bytes_to_skip, "bkm");
1716           if (s_err != LONGINT_OK)
1717             STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1718           break;
1719
1720         case 'N':
1721           limit_bytes_to_format = 1;
1722
1723           s_err = xstrtoumax (optarg, NULL, 0, &max_bytes_to_format, "bkm");
1724           if (s_err != LONGINT_OK)
1725             STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1726           break;
1727
1728         case 's':
1729           if (optarg == NULL)
1730             string_min = 3;
1731           else
1732             {
1733               s_err = xstrtoumax (optarg, NULL, 0, &tmp, "bkm");
1734               if (s_err != LONGINT_OK)
1735                 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1736
1737               /* The minimum string length may be no larger than SIZE_MAX,
1738                  since we may allocate a buffer of this size.  */
1739               if (SIZE_MAX < tmp)
1740                 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1741
1742               string_min = tmp;
1743             }
1744           flag_dump_strings = 1;
1745           break;
1746
1747         case 't':
1748           if (decode_format_string (optarg))
1749             ++n_failed_decodes;
1750           break;
1751
1752         case 'v':
1753           abbreviate_duplicate_blocks = 0;
1754           break;
1755
1756         case TRADITIONAL_OPTION:
1757           traditional = 1;
1758           break;
1759
1760           /* The next several cases map the traditional format
1761              specification options to the corresponding modern format
1762              specs.  GNU od accepts any combination of old- and
1763              new-style options.  Format specification options accumulate.  */
1764
1765 #define CASE_OLD_ARG(old_char,new_string)               \
1766         case old_char:                                  \
1767           {                                             \
1768             if (decode_format_string (new_string))      \
1769               ++n_failed_decodes;                       \
1770           }                                             \
1771           break
1772
1773           CASE_OLD_ARG ('a', "a");
1774           CASE_OLD_ARG ('b', "oC");
1775           CASE_OLD_ARG ('c', "c");
1776           CASE_OLD_ARG ('d', "u2");
1777           CASE_OLD_ARG ('f', "fF");
1778           CASE_OLD_ARG ('h', "x2");
1779           CASE_OLD_ARG ('i', "d2");
1780           CASE_OLD_ARG ('l', "d4");
1781           CASE_OLD_ARG ('o', "o2");
1782           CASE_OLD_ARG ('x', "x2");
1783
1784           /* FIXME: POSIX 1003.1-2001 with XSI requires this:
1785
1786              CASE_OLD_ARG ('s', "d2");
1787
1788              for the traditional syntax, but this conflicts with case
1789              's' above. */
1790
1791 #undef CASE_OLD_ARG
1792
1793         case 'w':
1794           width_specified = 1;
1795           if (optarg == NULL)
1796             {
1797               desired_width = 32;
1798             }
1799           else
1800             {
1801               uintmax_t w_tmp;
1802               s_err = xstrtoumax (optarg, NULL, 10, &w_tmp, "");
1803               if (s_err != LONGINT_OK)
1804                 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1805               if (SIZE_MAX < w_tmp)
1806                 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1807               desired_width = w_tmp;
1808             }
1809           break;
1810
1811         case_GETOPT_HELP_CHAR;
1812
1813         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1814
1815         default:
1816           usage (EXIT_FAILURE);
1817           break;
1818         }
1819     }
1820
1821   if (n_failed_decodes > 0)
1822     exit (EXIT_FAILURE);
1823
1824   if (flag_dump_strings && n_specs > 0)
1825     error (EXIT_FAILURE, 0,
1826            _("no type may be specified when dumping strings"));
1827
1828   n_files = argc - optind;
1829
1830   /* If the --traditional option is used, there may be from
1831      0 to 3 remaining command line arguments;  handle each case
1832      separately.
1833         od [file] [[+]offset[.][b] [[+]label[.][b]]]
1834      The offset and pseudo_start have the same syntax.
1835
1836      FIXME: POSIX 1003.1-2001 with XSI requires support for the
1837      traditional syntax even if --traditional is not given.  */
1838
1839   if (traditional)
1840     {
1841       uintmax_t offset;
1842
1843       if (n_files == 1)
1844         {
1845           if (parse_old_offset (argv[optind], &offset))
1846             {
1847               n_bytes_to_skip = offset;
1848               --n_files;
1849               ++argv;
1850             }
1851         }
1852       else if (n_files == 2)
1853         {
1854           uintmax_t o1, o2;
1855           if (parse_old_offset (argv[optind], &o1)
1856               && parse_old_offset (argv[optind + 1], &o2))
1857             {
1858               n_bytes_to_skip = o1;
1859               flag_pseudo_start = 1;
1860               pseudo_start = o2;
1861               argv += 2;
1862               n_files -= 2;
1863             }
1864           else if (parse_old_offset (argv[optind + 1], &o2))
1865             {
1866               n_bytes_to_skip = o2;
1867               --n_files;
1868               argv[optind + 1] = argv[optind];
1869               ++argv;
1870             }
1871           else
1872             {
1873               error (0, 0,
1874                      _("invalid second operand in compatibility mode `%s'"),
1875                      argv[optind + 1]);
1876               usage (EXIT_FAILURE);
1877             }
1878         }
1879       else if (n_files == 3)
1880         {
1881           uintmax_t o1, o2;
1882           if (parse_old_offset (argv[optind + 1], &o1)
1883               && parse_old_offset (argv[optind + 2], &o2))
1884             {
1885               n_bytes_to_skip = o1;
1886               flag_pseudo_start = 1;
1887               pseudo_start = o2;
1888               argv[optind + 2] = argv[optind];
1889               argv += 2;
1890               n_files -= 2;
1891             }
1892           else
1893             {
1894               error (0, 0,
1895             _("in compatibility mode, the last two arguments must be offsets"));
1896               usage (EXIT_FAILURE);
1897             }
1898         }
1899       else if (n_files > 3)
1900         {
1901           error (0, 0,
1902                  _("compatibility mode supports at most three arguments"));
1903           usage (EXIT_FAILURE);
1904         }
1905
1906       if (flag_pseudo_start)
1907         {
1908           if (format_address == format_address_none)
1909             {
1910               address_base = 8;
1911               address_pad_len = 7;
1912               format_address = format_address_paren;
1913             }
1914           else
1915             format_address = format_address_label;
1916         }
1917     }
1918
1919   if (limit_bytes_to_format)
1920     {
1921       end_offset = n_bytes_to_skip + max_bytes_to_format;
1922       if (end_offset < n_bytes_to_skip)
1923         error (EXIT_FAILURE, 0, "skip-bytes + read-bytes is too large");
1924     }
1925
1926   if (n_specs == 0)
1927     {
1928       if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1929         {
1930           /* This happens on Cray systems that don't have a 2-byte
1931              integral type.  */
1932           exit (EXIT_FAILURE);
1933         }
1934
1935       n_specs = 1;
1936     }
1937
1938   if (n_files > 0)
1939     {
1940       /* Set the global pointer FILE_LIST so that it
1941          references the first file-argument on the command-line.  */
1942
1943       file_list = (char const *const *) &argv[optind];
1944     }
1945   else
1946     {
1947       /* No files were listed on the command line.
1948          Set the global pointer FILE_LIST so that it
1949          references the null-terminated list of one name: "-".  */
1950
1951       file_list = default_file_list;
1952     }
1953
1954   /* open the first input file */
1955   err |= open_next_file ();
1956   if (in_stream == NULL)
1957     goto cleanup;
1958
1959   /* skip over any unwanted header bytes */
1960   err |= skip (n_bytes_to_skip);
1961   if (in_stream == NULL)
1962     goto cleanup;
1963
1964   pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1965
1966   /* Compute output block length.  */
1967   l_c_m = get_lcm ();
1968
1969   if (width_specified)
1970     {
1971       if (desired_width != 0 && desired_width % l_c_m == 0)
1972         bytes_per_block = desired_width;
1973       else
1974         {
1975           error (0, 0, _("warning: invalid width %lu; using %d instead"),
1976                  (unsigned long) desired_width, l_c_m);
1977           bytes_per_block = l_c_m;
1978         }
1979     }
1980   else
1981     {
1982       if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1983         bytes_per_block = l_c_m * (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1984       else
1985         bytes_per_block = l_c_m;
1986     }
1987
1988 #ifdef DEBUG
1989   for (i = 0; i < n_specs; i++)
1990     {
1991       printf (_("%d: fmt=\"%s\" width=%d\n"),
1992               i, spec[i].fmt_string, width_bytes[spec[i].size]);
1993     }
1994 #endif
1995
1996   err |= (flag_dump_strings ? dump_strings () : dump ());
1997
1998 cleanup:;
1999
2000   if (have_read_stdin && fclose (stdin) == EOF)
2001     error (EXIT_FAILURE, errno, _("standard input"));
2002
2003   exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
2004 }