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