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