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