(dump): Use IF_LINT macro instead of #ifdef lint...
[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 IF_LINT (= 0);
1366   int idx;
1367   int err;
1368   size_t n_bytes_read;
1369
1370   block[0] = (char *) alloca (bytes_per_block);
1371   block[1] = (char *) alloca (bytes_per_block);
1372
1373   current_offset = n_bytes_to_skip;
1374
1375   idx = 0;
1376   err = 0;
1377   if (limit_bytes_to_format)
1378     {
1379       end_offset = n_bytes_to_skip + max_bytes_to_format;
1380
1381       while (1)
1382         {
1383           size_t n_needed;
1384           if (current_offset >= end_offset)
1385             {
1386               n_bytes_read = 0;
1387               break;
1388             }
1389           n_needed = MIN (end_offset - current_offset,
1390                           (off_t) bytes_per_block);
1391           err |= read_block (n_needed, block[idx], &n_bytes_read);
1392           if (n_bytes_read < bytes_per_block)
1393             break;
1394           assert (n_bytes_read == bytes_per_block);
1395           write_block (current_offset, n_bytes_read,
1396                        block[!idx], block[idx]);
1397           current_offset += n_bytes_read;
1398           idx = !idx;
1399         }
1400     }
1401   else
1402     {
1403       while (1)
1404         {
1405           err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1406           if (n_bytes_read < bytes_per_block)
1407             break;
1408           assert (n_bytes_read == bytes_per_block);
1409           write_block (current_offset, n_bytes_read,
1410                        block[!idx], block[idx]);
1411           current_offset += n_bytes_read;
1412           idx = !idx;
1413         }
1414     }
1415
1416   if (n_bytes_read > 0)
1417     {
1418       int l_c_m;
1419       size_t bytes_to_write;
1420
1421       l_c_m = get_lcm ();
1422
1423       /* Make bytes_to_write the smallest multiple of l_c_m that
1424          is at least as large as n_bytes_read.  */
1425       bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1426
1427       memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1428       write_block (current_offset, bytes_to_write,
1429                    block[!idx], block[idx]);
1430       current_offset += n_bytes_read;
1431     }
1432
1433   if (output_address_fmt_string != NULL)
1434     printf ("%s\n", format_address (current_offset));
1435
1436   if (limit_bytes_to_format && current_offset > end_offset)
1437     err |= check_and_close ();
1438
1439   return err;
1440 }
1441
1442 /* STRINGS mode.  Find each "string constant" in the input.
1443    A string constant is a run of at least `string_min' ASCII
1444    graphic (or formatting) characters terminated by a null.
1445    Based on a function written by Richard Stallman for a
1446    pre-POSIX version of od.  Return nonzero if an error
1447    occurs.  Otherwise, return zero.  */
1448
1449 static int
1450 dump_strings (void)
1451 {
1452   size_t bufsize = MAX (100, string_min);
1453   char *buf = xmalloc (bufsize);
1454   off_t address = n_bytes_to_skip;
1455   int err;
1456
1457   err = 0;
1458   while (1)
1459     {
1460       unsigned int i;
1461       int c;
1462
1463       /* See if the next `string_min' chars are all printing chars.  */
1464     tryline:
1465
1466       if (limit_bytes_to_format
1467           && address >= (n_bytes_to_skip + max_bytes_to_format -
1468                          (off_t) string_min))
1469         break;
1470
1471       for (i = 0; i < string_min; i++)
1472         {
1473           err |= read_char (&c);
1474           address++;
1475           if (c < 0)
1476             {
1477               free (buf);
1478               return err;
1479             }
1480           if (!ISPRINT (c))
1481             /* Found a non-printing.  Try again starting with next char.  */
1482             goto tryline;
1483           buf[i] = c;
1484         }
1485
1486       /* We found a run of `string_min' printable characters.
1487          Now see if it is terminated with a null byte.  */
1488       while (!limit_bytes_to_format
1489              || address < n_bytes_to_skip + max_bytes_to_format)
1490         {
1491           if (i == bufsize)
1492             {
1493               bufsize = 1 + 3 * bufsize / 2;
1494               buf = xrealloc (buf, bufsize);
1495             }
1496           err |= read_char (&c);
1497           address++;
1498           if (c < 0)
1499             {
1500               free (buf);
1501               return err;
1502             }
1503           if (c == '\0')
1504             break;              /* It is; print this string.  */
1505           if (!ISPRINT (c))
1506             goto tryline;       /* It isn't; give up on this string.  */
1507           buf[i++] = c;         /* String continues; store it all.  */
1508         }
1509
1510       /* If we get here, the string is all printable and null-terminated,
1511          so print it.  It is all in `buf' and `i' is its length.  */
1512       buf[i] = 0;
1513       if (output_address_fmt_string != NULL)
1514         {
1515           printf ("%s ", format_address (address - i - 1));
1516         }
1517       for (i = 0; (c = buf[i]); i++)
1518         {
1519           switch (c)
1520             {
1521             case '\007':
1522               fputs ("\\a", stdout);
1523               break;
1524
1525             case '\b':
1526               fputs ("\\b", stdout);
1527               break;
1528
1529             case '\f':
1530               fputs ("\\f", stdout);
1531               break;
1532
1533             case '\n':
1534               fputs ("\\n", stdout);
1535               break;
1536
1537             case '\r':
1538               fputs ("\\r", stdout);
1539               break;
1540
1541             case '\t':
1542               fputs ("\\t", stdout);
1543               break;
1544
1545             case '\v':
1546               fputs ("\\v", stdout);
1547               break;
1548
1549             default:
1550               putc (c, stdout);
1551             }
1552         }
1553       putchar ('\n');
1554     }
1555
1556   /* We reach this point only if we search through
1557      (max_bytes_to_format - string_min) bytes before reachine EOF.  */
1558
1559   free (buf);
1560
1561   err |= check_and_close ();
1562   return err;
1563 }
1564
1565 int
1566 main (int argc, char **argv)
1567 {
1568   int c;
1569   int n_files;
1570   unsigned int i;
1571   unsigned int l_c_m;
1572   unsigned int address_pad_len;
1573   unsigned long int desired_width;
1574   int width_specified = 0;
1575   int n_failed_decodes = 0;
1576   int err;
1577
1578   /* The old-style `pseudo starting address' to be printed in parentheses
1579      after any true address.  */
1580   long int pseudo_start IF_LINT (= 0);
1581
1582   program_name = argv[0];
1583   setlocale (LC_ALL, "");
1584   bindtextdomain (PACKAGE, LOCALEDIR);
1585   textdomain (PACKAGE);
1586
1587   err = 0;
1588
1589   for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1590     integral_type_size[i] = NO_SIZE;
1591
1592   integral_type_size[sizeof (char)] = CHAR;
1593   integral_type_size[sizeof (short int)] = SHORT;
1594   integral_type_size[sizeof (int)] = INT;
1595   integral_type_size[sizeof (long int)] = LONG;
1596
1597   for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1598     fp_type_size[i] = NO_SIZE;
1599
1600   fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1601   /* The array entry for `double' is filled in after that for LONG_DOUBLE
1602      so that if `long double' is the same type or if long double isn't
1603      supported FLOAT_LONG_DOUBLE will never be used.  */
1604   fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1605   fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1606
1607   n_specs = 0;
1608   n_specs_allocated = 5;
1609   spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1610
1611   output_address_fmt_string = "%07o";
1612   format_address = format_address_std;
1613   address_pad_len = 7;
1614   flag_dump_strings = 0;
1615
1616   while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1617                            long_options, NULL)) != -1)
1618     {
1619       unsigned long int tmp;
1620       enum strtol_error s_err;
1621
1622       switch (c)
1623         {
1624         case 0:
1625           break;
1626
1627         case 'A':
1628           switch (optarg[0])
1629             {
1630             case 'd':
1631               output_address_fmt_string = "%07d";
1632               format_address = format_address_std;
1633               address_pad_len = 7;
1634               break;
1635             case 'o':
1636               output_address_fmt_string = "%07o";
1637               format_address = format_address_std;
1638               address_pad_len = 7;
1639               break;
1640             case 'x':
1641               output_address_fmt_string = "%06x";
1642               format_address = format_address_std;
1643               address_pad_len = 6;
1644               break;
1645             case 'n':
1646               output_address_fmt_string = NULL;
1647               format_address = format_address_none;
1648               address_pad_len = 0;
1649               break;
1650             default:
1651               error (EXIT_FAILURE, 0,
1652                      _("invalid output address radix `%c'; \
1653 it must be one character from [doxn]"),
1654                      optarg[0]);
1655               break;
1656             }
1657           break;
1658
1659         case 'j':
1660           s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1661           n_bytes_to_skip = tmp;
1662           if (s_err != LONGINT_OK)
1663             STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1664           break;
1665
1666         case 'N':
1667           limit_bytes_to_format = 1;
1668
1669           /* FIXME: if off_t is long long and that's an 8-byte type,
1670              use xstrtouq here.  */
1671           s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1672           max_bytes_to_format = tmp;
1673           if (s_err != LONGINT_OK)
1674             STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1675
1676           if (tmp > LONG_MAX)
1677             error (EXIT_FAILURE, 0,
1678                    _("specified number of bytes `%s' is larger than \
1679 the maximum\nrepresentable value of type `long'"), optarg);
1680           break;
1681
1682         case 's':
1683           if (optarg == NULL)
1684             string_min = 3;
1685           else
1686             {
1687               s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1688               if (s_err != LONGINT_OK)
1689                 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1690             }
1691           ++flag_dump_strings;
1692           break;
1693
1694         case 't':
1695           if (decode_format_string (optarg))
1696             ++n_failed_decodes;
1697           break;
1698
1699         case 'v':
1700           abbreviate_duplicate_blocks = 0;
1701           break;
1702
1703         case 'B':
1704           traditional = 1;
1705           break;
1706
1707           /* The next several cases map the old, pre-POSIX format
1708              specification options to the corresponding POSIX format
1709              specs.  GNU od accepts any combination of old- and
1710              new-style options.  Format specification options accumulate.  */
1711
1712 #define CASE_OLD_ARG(old_char,new_string)               \
1713         case old_char:                                  \
1714           {                                             \
1715             if (decode_format_string (new_string))      \
1716               ++n_failed_decodes;                       \
1717           }                                             \
1718           break
1719
1720           CASE_OLD_ARG ('a', "a");
1721           CASE_OLD_ARG ('b', "oC");
1722           CASE_OLD_ARG ('c', "c");
1723           CASE_OLD_ARG ('d', "u2");
1724           CASE_OLD_ARG ('f', "fF");
1725           CASE_OLD_ARG ('h', "x2");
1726           CASE_OLD_ARG ('i', "d2");
1727           CASE_OLD_ARG ('l', "d4");
1728           CASE_OLD_ARG ('o', "o2");
1729           CASE_OLD_ARG ('x', "x2");
1730
1731 #undef CASE_OLD_ARG
1732
1733         case 'w':
1734           width_specified = 1;
1735           if (optarg == NULL)
1736             {
1737               desired_width = 32;
1738             }
1739           else
1740             {
1741               s_err = xstrtoul (optarg, NULL, 10, &desired_width, "");
1742               if (s_err != LONGINT_OK)
1743                 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1744             }
1745           break;
1746
1747         case_GETOPT_HELP_CHAR;
1748
1749         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1750
1751         default:
1752           usage (1);
1753           break;
1754         }
1755     }
1756
1757   if (n_failed_decodes > 0)
1758     exit (EXIT_FAILURE);
1759
1760   if (flag_dump_strings && n_specs > 0)
1761     error (EXIT_FAILURE, 0,
1762            _("no type may be specified when dumping strings"));
1763
1764   n_files = argc - optind;
1765
1766   /* If the --backward-compatible option is used, there may be from
1767      0 to 3 remaining command line arguments;  handle each case
1768      separately.
1769         od [file] [[+]offset[.][b] [[+]label[.][b]]]
1770      The offset and pseudo_start have the same syntax.  */
1771
1772   if (traditional)
1773     {
1774       off_t offset;
1775
1776       if (n_files == 1)
1777         {
1778           if ((offset = parse_old_offset (argv[optind])) >= 0)
1779             {
1780               n_bytes_to_skip = offset;
1781               --n_files;
1782               ++argv;
1783             }
1784         }
1785       else if (n_files == 2)
1786         {
1787           off_t o1, o2;
1788           if ((o1 = parse_old_offset (argv[optind])) >= 0
1789               && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1790             {
1791               n_bytes_to_skip = o1;
1792               flag_pseudo_start = 1;
1793               pseudo_start = o2;
1794               argv += 2;
1795               n_files -= 2;
1796             }
1797           else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1798             {
1799               n_bytes_to_skip = o2;
1800               --n_files;
1801               argv[optind + 1] = argv[optind];
1802               ++argv;
1803             }
1804           else
1805             {
1806               error (0, 0,
1807                      _("invalid second operand in compatibility mode `%s'"),
1808                      argv[optind + 1]);
1809               usage (1);
1810             }
1811         }
1812       else if (n_files == 3)
1813         {
1814           off_t o1, o2;
1815           if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1816               && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1817             {
1818               n_bytes_to_skip = o1;
1819               flag_pseudo_start = 1;
1820               pseudo_start = o2;
1821               argv[optind + 2] = argv[optind];
1822               argv += 2;
1823               n_files -= 2;
1824             }
1825           else
1826             {
1827               error (0, 0,
1828             _("in compatibility mode, the last two arguments must be offsets"));
1829               usage (1);
1830             }
1831         }
1832       else if (n_files > 3)
1833         {
1834           error (0, 0,
1835                  _("compatibility mode supports at most three arguments"));
1836           usage (1);
1837         }
1838
1839       if (flag_pseudo_start)
1840         {
1841           static char buf[10];
1842
1843           if (output_address_fmt_string == NULL)
1844             {
1845               output_address_fmt_string = "(%07o)";
1846               format_address = format_address_std;
1847             }
1848           else
1849             {
1850               sprintf (buf, "%s (%s)",
1851                        output_address_fmt_string,
1852                        output_address_fmt_string);
1853               output_address_fmt_string = buf;
1854               format_address = format_address_label;
1855             }
1856         }
1857     }
1858
1859   assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1860   for (i = 0; i < address_pad_len; i++)
1861     address_pad[i] = ' ';
1862   address_pad[address_pad_len] = '\0';
1863
1864   if (n_specs == 0)
1865     {
1866       if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1867         {
1868           /* This happens on Cray systems that don't have a 2-byte
1869              integral type.  */
1870           exit (EXIT_FAILURE);
1871         }
1872
1873       n_specs = 1;
1874     }
1875
1876   if (n_files > 0)
1877     file_list = (char const *const *) &argv[optind];
1878   else
1879     {
1880       /* If no files were listed on the command line, set up the
1881          global array FILE_LIST so that it contains the null-terminated
1882          list of one name: "-".  */
1883       static char const *const default_file_list[] = {"-", NULL};
1884
1885       file_list = default_file_list;
1886     }
1887
1888   err |= skip (n_bytes_to_skip);
1889   if (in_stream == NULL)
1890     goto cleanup;
1891
1892   pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1893
1894   /* Compute output block length.  */
1895   l_c_m = get_lcm ();
1896
1897   if (width_specified)
1898     {
1899       if (desired_width != 0 && desired_width % l_c_m == 0)
1900         bytes_per_block = desired_width;
1901       else
1902         {
1903           error (0, 0, _("warning: invalid width %lu; using %d instead"),
1904                  desired_width, l_c_m);
1905           bytes_per_block = l_c_m;
1906         }
1907     }
1908   else
1909     {
1910       if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1911         bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1912       else
1913         bytes_per_block = l_c_m;
1914     }
1915
1916 #ifdef DEBUG
1917   for (i = 0; i < n_specs; i++)
1918     {
1919       printf (_("%d: fmt=\"%s\" width=%d\n"),
1920               i, spec[i].fmt_string, width_bytes[spec[i].size]);
1921     }
1922 #endif
1923
1924   err |= (flag_dump_strings ? dump_strings () : dump ());
1925
1926 cleanup:;
1927
1928   if (have_read_stdin && fclose (stdin) == EOF)
1929     error (EXIT_FAILURE, errno, _("standard input"));
1930
1931   if (fclose (stdout) == EOF)
1932     error (EXIT_FAILURE, errno, _("write error"));
1933
1934   exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
1935 }