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