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