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