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