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