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