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