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