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