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