*** empty log message ***
[coreutils.git] / src / od.c
blob1b4cf6539e9f48af37470a7c92bac65027c91fb2
1 /* od -- dump files in octal and other formats
2 Copyright (C) 92, 95, 96, 1997, 1998 Free Software Foundation, Inc.
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.
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.
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. */
18 /* Written by Jim Meyering. */
20 #include <config.h>
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"
30 #if defined(__GNUC__) || defined(STDC_HEADERS)
31 # include <float.h>
32 #endif
34 #ifdef HAVE_LONG_DOUBLE
35 typedef long double LONG_DOUBLE;
36 #else
37 typedef double LONG_DOUBLE;
38 #endif
40 #if HAVE_VALUES_H
41 # include <values.h>
42 #endif
44 #ifndef MAX
45 # define MAX(a, b) ((a) > (b) ? (a) : (b))
46 #endif
48 #ifndef MIN
49 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
50 #endif
52 /* The default number of input bytes per output line. */
53 #define DEFAULT_BYTES_PER_BLOCK 16
55 /* The number of decimal digits of precision in a float. */
56 #ifndef FLT_DIG
57 # define FLT_DIG 7
58 #endif
60 /* The number of decimal digits of precision in a double. */
61 #ifndef DBL_DIG
62 # define DBL_DIG 15
63 #endif
65 /* The number of decimal digits of precision in a long double. */
66 #ifndef LDBL_DIG
67 # define LDBL_DIG DBL_DIG
68 #endif
70 #if !HAVE_FSEEKO
71 # undef fseeko
72 # define fseeko(Stream, Offset, Whence) (-1)
73 #endif
75 enum size_spec
77 NO_SIZE,
78 CHAR,
79 SHORT,
80 INT,
81 LONG,
82 FLOAT_SINGLE,
83 FLOAT_DOUBLE,
84 FLOAT_LONG_DOUBLE
87 enum output_format
89 SIGNED_DECIMAL,
90 UNSIGNED_DECIMAL,
91 OCTAL,
92 HEXADECIMAL,
93 FLOATING_POINT,
94 NAMED_CHARACTER,
95 CHARACTER
98 /* Each output format specification (from POSIX `-t spec' or from
99 old-style options) is represented by one of these structures. */
100 struct tspec
102 enum output_format fmt;
103 enum size_spec size;
104 void (*print_function) ();
105 char *fmt_string;
106 int hexl_mode_trailer;
107 int field_width;
110 /* The name this program was run with. */
111 char *program_name;
113 /* Convert the number of 8-bit bytes of a binary representation to
114 the number of characters (digits + sign if the type is signed)
115 required to represent the same quantity in the specified base/type.
116 For example, a 32-bit (4-byte) quantity may require a field width
117 as wide as the following for these types:
118 11 unsigned octal
119 11 signed decimal
120 10 unsigned decimal
121 8 unsigned hexadecimal */
123 static const unsigned int bytes_to_oct_digits[] =
124 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
126 static const unsigned int bytes_to_signed_dec_digits[] =
127 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
129 static const unsigned int bytes_to_unsigned_dec_digits[] =
130 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
132 static const unsigned int bytes_to_hex_digits[] =
133 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
135 /* Convert enum size_spec to the size of the named type. */
136 static const int width_bytes[] =
139 sizeof (char),
140 sizeof (short int),
141 sizeof (int),
142 sizeof (long int),
143 sizeof (float),
144 sizeof (double),
145 sizeof (LONG_DOUBLE)
148 /* Names for some non-printing characters. */
149 static const char *const charname[33] =
151 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
152 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
153 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
154 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
155 "sp"
158 /* A printf control string for printing a file offset. */
159 static const char *output_address_fmt_string;
161 /* FIXME: make this the number of octal digits in an unsigned long. */
162 #define MAX_ADDRESS_LENGTH 13
164 /* Space for a normal address, a space, a pseudo address, parentheses
165 around the pseudo address, and a trailing zero byte. */
166 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
167 static char address_pad[MAX_ADDRESS_LENGTH + 1];
169 static unsigned long int string_min;
170 static unsigned long int flag_dump_strings;
172 /* Non-zero if we should recognize the pre-POSIX non-option arguments
173 that specified at most one file and optional arguments specifying
174 offset and pseudo-start address. */
175 static int traditional;
177 /* Non-zero if an old-style `pseudo-address' was specified. */
178 static long int flag_pseudo_start;
180 /* The difference between the old-style pseudo starting address and
181 the number of bytes to skip. */
182 static long int pseudo_offset;
184 /* Function to format an address and optionally an additional parenthesized
185 pseudo-address; it returns the formatted string. */
186 static const char *(*format_address) PARAMS ((long unsigned int));
188 /* The number of input bytes to skip before formatting and writing. */
189 static off_t n_bytes_to_skip = 0;
191 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
192 to be read and formatted. Otherwise all input is formatted. */
193 static int limit_bytes_to_format = 0;
195 /* The maximum number of bytes that will be formatted. This
196 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
197 static off_t max_bytes_to_format;
199 /* When nonzero and two or more consecutive blocks are equal, format
200 only the first block and output an asterisk alone on the following
201 line to indicate that identical blocks have been elided. */
202 static int abbreviate_duplicate_blocks = 1;
204 /* An array of specs describing how to format each input block. */
205 static struct tspec *spec;
207 /* The number of format specs. */
208 static unsigned int n_specs;
210 /* The allocated length of SPEC. */
211 static unsigned int n_specs_allocated;
213 /* The number of input bytes formatted per output line. It must be
214 a multiple of the least common multiple of the sizes associated with
215 the specified output types. It should be as large as possible, but
216 no larger than 16 -- unless specified with the -w option. */
217 static unsigned int bytes_per_block;
219 /* Human-readable representation of *file_list (for error messages).
220 It differs from *file_list only when *file_list is "-". */
221 static char const *input_filename;
223 /* A NULL-terminated list of the file-arguments from the command line.
224 If no file-arguments were specified, this variable is initialized
225 to { "-", NULL }. */
226 static char const *const *file_list;
228 /* The input stream associated with the current file. */
229 static FILE *in_stream;
231 /* If nonzero, at least one of the files we read was standard input. */
232 static int have_read_stdin;
234 #define LONGEST_INTEGRAL_TYPE long int
236 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
237 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
239 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
240 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
242 /* If nonzero, display usage information and exit. */
243 static int show_help;
245 /* If nonzero, print the version on standard output then exit. */
246 static int show_version;
248 static struct option const long_options[] =
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'},
257 /* non-POSIX options. */
258 {"strings", optional_argument, NULL, 's'},
259 {"traditional", no_argument, NULL, 'B'},
260 {"width", optional_argument, NULL, 'w'},
261 {"help", no_argument, &show_help, 1},
262 {"version", no_argument, &show_version, 1},
263 {NULL, 0, NULL, 0}
266 void
267 usage (int status)
269 if (status != 0)
270 fprintf (stderr, _("Try `%s --help' for more information.\n"),
271 program_name);
272 else
274 printf (_("\
275 Usage: %s [OPTION]... [FILE]...\n\
276 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
278 program_name, program_name);
279 printf (_("\
280 Write an unambiguous representation, octal bytes by default, of FILE\n\
281 to standard output. With no FILE, or when FILE is -, read standard input.\n\
283 -A, --address-radix=RADIX decide how file offsets are printed\n\
284 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
285 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
286 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
287 -t, --format=TYPE select output format or formats\n\
288 -v, --output-duplicates do not use * to mark line suppression\n\
289 -w, --width[=BYTES] output BYTES bytes per output line\n\
290 --traditional accept arguments in pre-POSIX form\n\
291 --help display this help and exit\n\
292 --version output version information and exit\n\
294 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
295 -a same as -t a, select named characters\n\
296 -b same as -t oC, select octal bytes\n\
297 -c same as -t c, select ASCII characters or backslash escapes\n\
298 -d same as -t u2, select unsigned decimal shorts\n\
299 -f same as -t fF, select floats\n\
300 -h same as -t x2, select hexadecimal shorts\n\
301 -i same as -t d2, select decimal shorts\n\
302 -l same as -t d4, select decimal longs\n\
303 -o same as -t o2, select octal shorts\n\
304 -x same as -t x2, select hexadecimal shorts\n\
305 "));
306 printf (_("\
308 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
309 is the pseudo-address at first byte printed, incremented when dump is\n\
310 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
311 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
313 TYPE is made up of one or more of these specifications:\n\
315 a named character\n\
316 c ASCII character or backslash escape\n\
317 d[SIZE] signed decimal, SIZE bytes per integer\n\
318 f[SIZE] floating point, SIZE bytes per integer\n\
319 o[SIZE] octal, SIZE bytes per integer\n\
320 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
321 x[SIZE] hexadecimal, SIZE bytes per integer\n\
323 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
324 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
325 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
326 for sizeof(double) or L for sizeof(long double).\n\
328 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
329 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
330 with b suffix, by 1024 with k and by 1048576 with m. Adding a z suffix to\n\
331 any type adds a display of printable characters to the end of each line\n\
332 of output. -s without a number implies 3. -w without a number implies 32.\n\
333 By default, od uses -A o -t d2 -w 16.\n\
334 "));
335 puts (_("\nReport bugs to <bug-textutils@gnu.org>."));
337 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
340 /* Compute the greatest common denominator of U and V
341 using Euclid's algorithm. */
343 static unsigned int
344 gcd (unsigned int u, unsigned int v)
346 unsigned int t;
347 while (v != 0)
349 t = u % v;
350 u = v;
351 v = t;
353 return u;
356 /* Compute the least common multiple of U and V. */
358 static unsigned int
359 lcm (unsigned int u, unsigned int v)
361 unsigned int t = gcd (u, v);
362 if (t == 0)
363 return 0;
364 return u * v / t;
367 static void
368 print_s_char (long unsigned int n_bytes, const char *block,
369 const char *fmt_string)
371 int i;
372 for (i = n_bytes; i > 0; i--)
374 int tmp = (unsigned) *(const unsigned char *) block;
375 if (tmp > SCHAR_MAX)
376 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
377 assert (tmp <= SCHAR_MAX);
378 printf (fmt_string, tmp);
379 block += sizeof (unsigned char);
383 static void
384 print_char (long unsigned int n_bytes, const char *block,
385 const char *fmt_string)
387 int i;
388 for (i = n_bytes; i > 0; i--)
390 unsigned int tmp = *(const unsigned char *) block;
391 printf (fmt_string, tmp);
392 block += sizeof (unsigned char);
396 static void
397 print_s_short (long unsigned int n_bytes, const char *block,
398 const char *fmt_string)
400 int i;
401 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
403 int tmp = (unsigned) *(const unsigned short *) block;
404 if (tmp > SHRT_MAX)
405 tmp -= SHRT_MAX - SHRT_MIN + 1;
406 assert (tmp <= SHRT_MAX);
407 printf (fmt_string, tmp);
408 block += sizeof (unsigned short);
412 static void
413 print_short (long unsigned int n_bytes, const char *block,
414 const char *fmt_string)
416 int i;
417 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
419 unsigned int tmp = *(const unsigned short *) block;
420 printf (fmt_string, tmp);
421 block += sizeof (unsigned short);
425 static void
426 print_int (long unsigned int n_bytes, const char *block,
427 const char *fmt_string)
429 int i;
430 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
432 unsigned int tmp = *(const unsigned int *) block;
433 printf (fmt_string, tmp);
434 block += sizeof (unsigned int);
438 static void
439 print_long (long unsigned int n_bytes, const char *block,
440 const char *fmt_string)
442 int i;
443 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
445 unsigned long tmp = *(const unsigned long *) block;
446 printf (fmt_string, tmp);
447 block += sizeof (unsigned long);
451 static void
452 print_float (long unsigned int n_bytes, const char *block,
453 const char *fmt_string)
455 int i;
456 for (i = n_bytes / sizeof (float); i > 0; i--)
458 float tmp = *(const float *) block;
459 printf (fmt_string, tmp);
460 block += sizeof (float);
464 static void
465 print_double (long unsigned int n_bytes, const char *block,
466 const char *fmt_string)
468 int i;
469 for (i = n_bytes / sizeof (double); i > 0; i--)
471 double tmp = *(const double *) block;
472 printf (fmt_string, tmp);
473 block += sizeof (double);
477 #ifdef HAVE_LONG_DOUBLE
478 static void
479 print_long_double (long unsigned int n_bytes, const char *block,
480 const char *fmt_string)
482 int i;
483 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
485 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
486 printf (fmt_string, tmp);
487 block += sizeof (LONG_DOUBLE);
491 #endif
493 static void
494 dump_hexl_mode_trailer (long unsigned int n_bytes, const char *block)
496 int i;
497 fputs (" >", stdout);
498 for (i = n_bytes; i > 0; i--)
500 unsigned int c = *(const unsigned char *) block;
501 unsigned int c2 = (ISPRINT(c) ? c : '.');
502 putchar (c2);
503 block += sizeof (unsigned char);
505 putchar ('<');
508 static void
509 print_named_ascii (long unsigned int n_bytes, const char *block,
510 const char *unused_fmt_string)
512 int i;
513 for (i = n_bytes; i > 0; i--)
515 unsigned int c = *(const unsigned char *) block;
516 unsigned int masked_c = (0x7f & c);
517 const char *s;
518 char buf[5];
520 if (masked_c == 127)
521 s = "del";
522 else if (masked_c <= 040)
523 s = charname[masked_c];
524 else
526 sprintf (buf, " %c", masked_c);
527 s = buf;
530 printf (" %3s", s);
531 block += sizeof (unsigned char);
535 static void
536 print_ascii (long unsigned int n_bytes, const char *block,
537 const char *unused_fmt_string)
539 int i;
540 for (i = n_bytes; i > 0; i--)
542 unsigned int c = *(const unsigned char *) block;
543 const char *s;
544 char buf[5];
546 switch (c)
548 case '\0':
549 s = " \\0";
550 break;
552 case '\007':
553 s = " \\a";
554 break;
556 case '\b':
557 s = " \\b";
558 break;
560 case '\f':
561 s = " \\f";
562 break;
564 case '\n':
565 s = " \\n";
566 break;
568 case '\r':
569 s = " \\r";
570 break;
572 case '\t':
573 s = " \\t";
574 break;
576 case '\v':
577 s = " \\v";
578 break;
580 default:
581 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
582 s = (const char *) buf;
585 printf (" %3s", s);
586 block += sizeof (unsigned char);
590 /* Convert a null-terminated (possibly zero-length) string S to an
591 unsigned long integer value. If S points to a non-digit set *P to S,
592 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
593 the string of digits. If the string of digits represents a value
594 larger than ULONG_MAX, don't modify *VAL or *P and return nonzero.
595 Otherwise, advance *P to the first non-digit after S, set *VAL to
596 the result of the conversion and return zero. */
598 static int
599 simple_strtoul (const char *s, const char **p, long unsigned int *val)
601 unsigned long int sum;
603 sum = 0;
604 while (ISDIGIT (*s))
606 unsigned int c = *s++ - '0';
607 if (sum > (ULONG_MAX - c) / 10)
608 return 1;
609 sum = sum * 10 + c;
611 *p = s;
612 *val = sum;
613 return 0;
616 /* If S points to a single valid POSIX-style od format string, put
617 a description of that format in *TSPEC, make *NEXT point at the
618 character following the just-decoded format (if *NEXT is non-NULL),
619 and return zero. If S is not valid, don't modify *NEXT or *TSPEC,
620 give a diagnostic, and return nonzero. For example, if S were
621 "d4afL" *NEXT would be set to "afL" and *TSPEC would be
623 fmt = SIGNED_DECIMAL;
624 size = INT or LONG; (whichever integral_type_size[4] resolves to)
625 print_function = print_int; (assuming size == INT)
626 fmt_string = "%011d%c";
628 S_ORIG is solely for reporting errors. It should be the full format
629 string argument.
632 static int
633 decode_one_format (const char *s_orig, const char *s, const char **next,
634 struct tspec *tspec)
636 enum size_spec size_spec;
637 unsigned long int size;
638 enum output_format fmt;
639 const char *pre_fmt_string;
640 char *fmt_string;
641 void (*print_function) ();
642 const char *p;
643 unsigned int c;
644 unsigned int field_width = 0;
646 assert (tspec != NULL);
648 switch (*s)
650 case 'd':
651 case 'o':
652 case 'u':
653 case 'x':
654 c = *s;
655 ++s;
656 switch (*s)
658 case 'C':
659 ++s;
660 size = sizeof (char);
661 break;
663 case 'S':
664 ++s;
665 size = sizeof (short);
666 break;
668 case 'I':
669 ++s;
670 size = sizeof (int);
671 break;
673 case 'L':
674 ++s;
675 size = sizeof (long int);
676 break;
678 default:
679 if (simple_strtoul (s, &p, &size) != 0)
681 /* The integer at P in S would overflow an unsigned long.
682 A digit string that long is sufficiently odd looking
683 that the following diagnostic is sufficient. */
684 error (0, 0, _("invalid type string `%s'"), s_orig);
685 return 1;
687 if (p == s)
688 size = sizeof (int);
689 else
691 if (size > MAX_INTEGRAL_TYPE_SIZE
692 || integral_type_size[size] == NO_SIZE)
694 error (0, 0, _("invalid type string `%s';\n\
695 this system doesn't provide a %lu-byte integral type"), s_orig, size);
696 return 1;
698 s = p;
700 break;
703 #define FMT_BYTES_ALLOCATED 9
704 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
706 size_spec = integral_type_size[size];
708 switch (c)
710 case 'd':
711 fmt = SIGNED_DECIMAL;
712 sprintf (fmt_string, " %%%u%sd",
713 (field_width = bytes_to_signed_dec_digits[size]),
714 (size_spec == LONG ? "l" : ""));
715 break;
717 case 'o':
718 fmt = OCTAL;
719 sprintf (fmt_string, " %%0%u%so",
720 (field_width = bytes_to_oct_digits[size]),
721 (size_spec == LONG ? "l" : ""));
722 break;
724 case 'u':
725 fmt = UNSIGNED_DECIMAL;
726 sprintf (fmt_string, " %%%u%su",
727 (field_width = bytes_to_unsigned_dec_digits[size]),
728 (size_spec == LONG ? "l" : ""));
729 break;
731 case 'x':
732 fmt = HEXADECIMAL;
733 sprintf (fmt_string, " %%0%u%sx",
734 (field_width = bytes_to_hex_digits[size]),
735 (size_spec == LONG ? "l" : ""));
736 break;
738 default:
739 abort ();
742 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
744 switch (size_spec)
746 case CHAR:
747 print_function = (fmt == SIGNED_DECIMAL
748 ? print_s_char
749 : print_char);
750 break;
752 case SHORT:
753 print_function = (fmt == SIGNED_DECIMAL
754 ? print_s_short
755 : print_short);
756 break;
758 case INT:
759 print_function = print_int;
760 break;
762 case LONG:
763 print_function = print_long;
764 break;
766 default:
767 abort ();
769 break;
771 case 'f':
772 fmt = FLOATING_POINT;
773 ++s;
774 switch (*s)
776 case 'F':
777 ++s;
778 size = sizeof (float);
779 break;
781 case 'D':
782 ++s;
783 size = sizeof (double);
784 break;
786 case 'L':
787 ++s;
788 size = sizeof (LONG_DOUBLE);
789 break;
791 default:
792 if (simple_strtoul (s, &p, &size) != 0)
794 /* The integer at P in S would overflow an unsigned long.
795 A digit string that long is sufficiently odd looking
796 that the following diagnostic is sufficient. */
797 error (0, 0, _("invalid type string `%s'"), s_orig);
798 return 1;
800 if (p == s)
801 size = sizeof (double);
802 else
804 if (size > MAX_FP_TYPE_SIZE
805 || fp_type_size[size] == NO_SIZE)
807 error (0, 0, _("invalid type string `%s';\n\
808 this system doesn't provide a %lu-byte floating point type"), s_orig, size);
809 return 1;
811 s = p;
813 break;
815 size_spec = fp_type_size[size];
817 switch (size_spec)
819 case FLOAT_SINGLE:
820 print_function = print_float;
821 /* Don't use %#e; not all systems support it. */
822 pre_fmt_string = " %%%d.%de";
823 fmt_string = xmalloc (strlen (pre_fmt_string));
824 sprintf (fmt_string, pre_fmt_string,
825 (field_width = FLT_DIG + 8), FLT_DIG);
826 break;
828 case FLOAT_DOUBLE:
829 print_function = print_double;
830 pre_fmt_string = " %%%d.%de";
831 fmt_string = xmalloc (strlen (pre_fmt_string));
832 sprintf (fmt_string, pre_fmt_string,
833 (field_width = DBL_DIG + 8), DBL_DIG);
834 break;
836 #ifdef HAVE_LONG_DOUBLE
837 case FLOAT_LONG_DOUBLE:
838 print_function = print_long_double;
839 pre_fmt_string = " %%%d.%dLe";
840 fmt_string = xmalloc (strlen (pre_fmt_string));
841 sprintf (fmt_string, pre_fmt_string,
842 (field_width = LDBL_DIG + 8), LDBL_DIG);
843 break;
844 #endif
846 default:
847 abort ();
849 break;
851 case 'a':
852 ++s;
853 fmt = NAMED_CHARACTER;
854 size_spec = CHAR;
855 fmt_string = NULL;
856 print_function = print_named_ascii;
857 field_width = 3;
858 break;
860 case 'c':
861 ++s;
862 fmt = CHARACTER;
863 size_spec = CHAR;
864 fmt_string = NULL;
865 print_function = print_ascii;
866 field_width = 3;
867 break;
869 default:
870 error (0, 0, _("invalid character `%c' in type string `%s'"),
871 *s, s_orig);
872 return 1;
875 tspec->size = size_spec;
876 tspec->fmt = fmt;
877 tspec->print_function = print_function;
878 tspec->fmt_string = fmt_string;
880 tspec->field_width = field_width;
881 tspec->hexl_mode_trailer = (*s == 'z');
882 if (tspec->hexl_mode_trailer)
883 s++;
885 if (next != NULL)
886 *next = s;
888 return 0;
891 /* Decode the POSIX-style od format string S. Append the decoded
892 representation to the global array SPEC, reallocating SPEC if
893 necessary. Return zero if S is valid, nonzero otherwise. */
895 static int
896 decode_format_string (const char *s)
898 const char *s_orig = s;
899 assert (s != NULL);
901 while (*s != '\0')
903 struct tspec tspec;
904 const char *next;
906 if (decode_one_format (s_orig, s, &next, &tspec))
907 return 1;
909 assert (s != next);
910 s = next;
912 if (n_specs >= n_specs_allocated)
914 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
915 spec = (struct tspec *) xrealloc ((char *) spec,
916 (n_specs_allocated
917 * sizeof (struct tspec)));
920 memcpy ((char *) &spec[n_specs], (char *) &tspec,
921 sizeof (struct tspec));
922 ++n_specs;
925 return 0;
928 /* Given a list of one or more input filenames FILE_LIST, set the global
929 file pointer IN_STREAM to position N_SKIP in the concatenation of
930 those files. If any file operation fails or if there are fewer than
931 N_SKIP bytes in the combined input, give an error message and return
932 nonzero. When possible, use seek- rather than read operations to
933 advance IN_STREAM. A file name of "-" is interpreted as standard
934 input. */
936 static int
937 skip (off_t n_skip)
939 int err;
941 err = 0;
942 for ( /* empty */ ; *file_list != NULL; ++file_list)
944 struct stat file_stats;
945 int j;
947 if (STREQ (*file_list, "-"))
949 input_filename = _("standard input");
950 in_stream = stdin;
951 have_read_stdin = 1;
953 else
955 input_filename = *file_list;
956 in_stream = fopen (input_filename, "r");
957 if (in_stream == NULL)
959 error (0, errno, "%s", input_filename);
960 err = 1;
961 continue;
964 SET_BINARY (fileno (in_stream));
966 if (n_skip == 0)
967 break;
969 /* First try using fseek. For large offsets, this extra work is
970 worthwhile. If the offset is below some threshold it may be
971 more efficient to move the pointer by reading. There are two
972 issues when trying to use fseek:
973 - the file must be seekable.
974 - before seeking to the specified position, make sure
975 that the new position is in the current file.
976 Try to do that by getting file's size using fstat().
977 But that will work only for regular files and dirs. */
979 if (fstat (fileno (in_stream), &file_stats))
981 error (0, errno, "%s", input_filename);
982 err = 1;
983 continue;
986 /* The st_size field is valid only for regular files and
987 directories. FIXME: is the preceding true?
988 If the number of bytes left to skip is at least as large as
989 the size of the current file, we can decrement
990 n_skip and go on to the next file. */
991 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
993 if (n_skip >= file_stats.st_size)
995 n_skip -= file_stats.st_size;
996 if (in_stream != stdin && fclose (in_stream) == EOF)
998 error (0, errno, "%s", input_filename);
999 err = 1;
1001 continue;
1003 else
1005 /* Try fseeko if available, fseek otherwise. */
1006 if (fseeko (in_stream, n_skip, SEEK_SET) == 0
1007 || (n_skip <= LONG_MAX
1008 && fseek (in_stream, (long) n_skip, SEEK_SET) == 0))
1010 n_skip = 0;
1011 break;
1016 /* Seek didn't work or wasn't attempted; position the file pointer
1017 by reading. */
1019 for (j = n_skip / BUFSIZ; j >= 0; j--)
1021 char buf[BUFSIZ];
1022 size_t n_bytes_to_read = (j > 0
1023 ? BUFSIZ
1024 : n_skip % BUFSIZ);
1025 size_t n_bytes_read;
1026 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1027 n_skip -= n_bytes_read;
1028 if (n_bytes_read != n_bytes_to_read)
1029 break;
1032 if (n_skip == 0)
1033 break;
1036 if (n_skip != 0)
1037 error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1039 return err;
1042 static const char *
1043 format_address_none (long unsigned int address)
1045 return "";
1048 static const char *
1049 format_address_std (long unsigned int address)
1051 const char *address_string;
1053 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1054 address_string = address_fmt_buffer;
1055 return address_string;
1058 static const char *
1059 format_address_label (long unsigned int address)
1061 const char *address_string;
1062 assert (output_address_fmt_string != NULL);
1064 sprintf (address_fmt_buffer, output_address_fmt_string,
1065 address, address + pseudo_offset);
1066 address_string = address_fmt_buffer;
1067 return address_string;
1070 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1071 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1072 CURR_BLOCK in the concatenation of input files, and it is printed
1073 (optionally) only before the output line associated with the first
1074 format spec. When duplicate blocks are being abbreviated, the output
1075 for a sequence of identical input blocks is the output for the first
1076 block followed by an asterisk alone on a line. It is valid to compare
1077 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1078 That condition may be false only for the last input block -- and then
1079 only when it has not been padded to length BYTES_PER_BLOCK. */
1081 static void
1082 write_block (long unsigned int current_offset, long unsigned int n_bytes,
1083 const char *prev_block, const char *curr_block)
1085 static int first = 1;
1086 static int prev_pair_equal = 0;
1088 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1090 if (abbreviate_duplicate_blocks
1091 && !first && n_bytes == bytes_per_block
1092 && EQUAL_BLOCKS (prev_block, curr_block))
1094 if (prev_pair_equal)
1096 /* The two preceding blocks were equal, and the current
1097 block is the same as the last one, so print nothing. */
1099 else
1101 printf ("*\n");
1102 prev_pair_equal = 1;
1105 else
1107 unsigned int i;
1109 prev_pair_equal = 0;
1110 for (i = 0; i < n_specs; i++)
1112 const char *addr_or_pad = (i == 0
1113 ? format_address (current_offset)
1114 : address_pad);
1116 fputs (addr_or_pad, stdout);
1117 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1118 if (spec[i].hexl_mode_trailer)
1120 /* space-pad out to full line width, then dump the trailer */
1121 int datum_width = width_bytes[spec[i].size];
1122 int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1123 int field_width = spec[i].field_width + 1;
1124 printf ("%*s", blank_fields * field_width, "");
1125 dump_hexl_mode_trailer (n_bytes, curr_block);
1127 putchar ('\n');
1130 first = 0;
1133 /* Test whether there have been errors on in_stream, and close it if
1134 it is not standard input. Return nonzero if there has been an error
1135 on in_stream or stdout; return zero otherwise. This function will
1136 report more than one error only if both a read and a write error
1137 have occurred. */
1139 static int
1140 check_and_close (void)
1142 int err;
1144 err = 0;
1145 if (ferror (in_stream))
1147 error (0, errno, "%s", input_filename);
1148 if (in_stream != stdin)
1149 fclose (in_stream);
1150 err = 1;
1152 else if (in_stream != stdin && fclose (in_stream) == EOF)
1154 error (0, errno, "%s", input_filename);
1155 err = 1;
1158 if (ferror (stdout))
1160 error (0, errno, _("standard output"));
1161 err = 1;
1164 return err;
1167 /* Read a single byte into *C from the concatenation of the input files
1168 named in the global array FILE_LIST. On the first call to this
1169 function, the global variable IN_STREAM is expected to be an open
1170 stream associated with the input file *FILE_LIST. If IN_STREAM is
1171 at end-of-file, close it and update the global variables IN_STREAM,
1172 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1173 the list. Then try to read a byte from the newly opened file.
1174 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1175 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1176 calls do likewise. The return value is nonzero if any errors
1177 occured, zero otherwise. */
1179 static int
1180 read_char (int *c)
1182 int err;
1184 if (*file_list == NULL)
1186 *c = EOF;
1187 return 0;
1190 err = 0;
1191 while (1)
1193 *c = fgetc (in_stream);
1195 if (*c != EOF)
1196 return err;
1198 err |= check_and_close ();
1202 ++file_list;
1203 if (*file_list == NULL)
1204 return err;
1206 if (STREQ (*file_list, "-"))
1208 input_filename = _("standard input");
1209 in_stream = stdin;
1210 have_read_stdin = 1;
1212 else
1214 input_filename = *file_list;
1215 in_stream = fopen (input_filename, "r");
1216 if (in_stream == NULL)
1218 error (0, errno, "%s", input_filename);
1219 err = 1;
1222 SET_BINARY (fileno (in_stream));
1224 while (in_stream == NULL);
1228 /* Read N bytes into BLOCK from the concatenation of the input files
1229 named in the global array FILE_LIST. On the first call to this
1230 function, the global variable IN_STREAM is expected to be an open
1231 stream associated with the input file *FILE_LIST. On subsequent
1232 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1233 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1234 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1235 Then try to read the remaining bytes from the newly opened file.
1236 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1237 to the number of bytes read. If an error occurs, it will be detected
1238 through ferror when the stream is about to be closed. If there is an
1239 error, give a message but continue reading as usual and return nonzero.
1240 Otherwise return zero. */
1242 static int
1243 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1245 int err;
1247 assert (n > 0 && n <= bytes_per_block);
1249 *n_bytes_in_buffer = 0;
1251 if (n == 0)
1252 return 0;
1254 if (*file_list == NULL)
1255 return 0; /* EOF. */
1257 err = 0;
1258 while (1)
1260 size_t n_needed;
1261 size_t n_read;
1263 n_needed = n - *n_bytes_in_buffer;
1264 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1266 *n_bytes_in_buffer += n_read;
1268 if (n_read == n_needed)
1269 return err;
1271 err |= check_and_close ();
1275 ++file_list;
1276 if (*file_list == NULL)
1277 return err;
1279 if (STREQ (*file_list, "-"))
1281 input_filename = _("standard input");
1282 in_stream = stdin;
1283 have_read_stdin = 1;
1285 else
1287 input_filename = *file_list;
1288 in_stream = fopen (input_filename, "r");
1289 if (in_stream == NULL)
1291 error (0, errno, "%s", input_filename);
1292 err = 1;
1295 SET_BINARY (fileno (in_stream));
1297 while (in_stream == NULL);
1301 /* Return the least common multiple of the sizes associated
1302 with the format specs. */
1304 static int
1305 get_lcm (void)
1307 unsigned int i;
1308 int l_c_m = 1;
1310 for (i = 0; i < n_specs; i++)
1311 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1312 return l_c_m;
1315 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1316 return the offset it denotes. Otherwise, return -1. */
1318 off_t
1319 parse_old_offset (const char *s)
1321 int radix;
1322 off_t offset;
1323 enum strtol_error s_err;
1324 long unsigned int tmp;
1326 if (*s == '\0')
1327 return -1;
1329 /* Skip over any leading '+'. */
1330 if (s[0] == '+')
1331 ++s;
1333 /* Determine the radix we'll use to interpret S. If there is a `.',
1334 it's decimal, otherwise, if the string begins with `0X'or `0x',
1335 it's hexadecimal, else octal. */
1336 if (strchr (s, '.') != NULL)
1337 radix = 10;
1338 else
1340 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1341 radix = 16;
1342 else
1343 radix = 8;
1346 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1347 if (s_err != LONGINT_OK)
1349 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1350 return -1;
1352 offset = tmp;
1353 return offset;
1356 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1357 formatted block to standard output, and repeat until the specified
1358 maximum number of bytes has been read or until all input has been
1359 processed. If the last block read is smaller than BYTES_PER_BLOCK
1360 and its size is not a multiple of the size associated with a format
1361 spec, extend the input block with zero bytes until its length is a
1362 multiple of all format spec sizes. Write the final block. Finally,
1363 write on a line by itself the offset of the byte after the last byte
1364 read. Accumulate return values from calls to read_block and
1365 check_and_close, and if any was nonzero, return nonzero.
1366 Otherwise, return zero. */
1368 static int
1369 dump (void)
1371 char *block[2];
1372 off_t current_offset;
1373 off_t end_offset;
1374 int idx;
1375 int err;
1376 size_t n_bytes_read;
1378 #ifdef lint /* Suppress `used before initialized' warning. */
1379 end_offset = 0;
1380 #endif
1382 block[0] = (char *) alloca (bytes_per_block);
1383 block[1] = (char *) alloca (bytes_per_block);
1385 current_offset = n_bytes_to_skip;
1387 idx = 0;
1388 err = 0;
1389 if (limit_bytes_to_format)
1391 end_offset = n_bytes_to_skip + max_bytes_to_format;
1393 while (1)
1395 size_t n_needed;
1396 if (current_offset >= end_offset)
1398 n_bytes_read = 0;
1399 break;
1401 n_needed = MIN (end_offset - current_offset,
1402 (off_t) bytes_per_block);
1403 err |= read_block (n_needed, block[idx], &n_bytes_read);
1404 if (n_bytes_read < bytes_per_block)
1405 break;
1406 assert (n_bytes_read == bytes_per_block);
1407 write_block (current_offset, n_bytes_read,
1408 block[!idx], block[idx]);
1409 current_offset += n_bytes_read;
1410 idx = !idx;
1413 else
1415 while (1)
1417 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1418 if (n_bytes_read < bytes_per_block)
1419 break;
1420 assert (n_bytes_read == bytes_per_block);
1421 write_block (current_offset, n_bytes_read,
1422 block[!idx], block[idx]);
1423 current_offset += n_bytes_read;
1424 idx = !idx;
1428 if (n_bytes_read > 0)
1430 int l_c_m;
1431 size_t bytes_to_write;
1433 l_c_m = get_lcm ();
1435 /* Make bytes_to_write the smallest multiple of l_c_m that
1436 is at least as large as n_bytes_read. */
1437 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1439 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1440 write_block (current_offset, bytes_to_write,
1441 block[!idx], block[idx]);
1442 current_offset += n_bytes_read;
1445 if (output_address_fmt_string != NULL)
1446 printf ("%s\n", format_address (current_offset));
1448 if (limit_bytes_to_format && current_offset > end_offset)
1449 err |= check_and_close ();
1451 return err;
1454 /* STRINGS mode. Find each "string constant" in the input.
1455 A string constant is a run of at least `string_min' ASCII
1456 graphic (or formatting) characters terminated by a null.
1457 Based on a function written by Richard Stallman for a
1458 pre-POSIX version of od. Return nonzero if an error
1459 occurs. Otherwise, return zero. */
1461 static int
1462 dump_strings (void)
1464 size_t bufsize = MAX (100, string_min);
1465 char *buf = xmalloc (bufsize);
1466 off_t address = n_bytes_to_skip;
1467 int err;
1469 err = 0;
1470 while (1)
1472 unsigned int i;
1473 int c;
1475 /* See if the next `string_min' chars are all printing chars. */
1476 tryline:
1478 if (limit_bytes_to_format
1479 && address >= (n_bytes_to_skip + max_bytes_to_format -
1480 (off_t) string_min))
1481 break;
1483 for (i = 0; i < string_min; i++)
1485 err |= read_char (&c);
1486 address++;
1487 if (c < 0)
1489 free (buf);
1490 return err;
1492 if (!ISPRINT (c))
1493 /* Found a non-printing. Try again starting with next char. */
1494 goto tryline;
1495 buf[i] = c;
1498 /* We found a run of `string_min' printable characters.
1499 Now see if it is terminated with a null byte. */
1500 while (!limit_bytes_to_format
1501 || address < n_bytes_to_skip + max_bytes_to_format)
1503 if (i == bufsize)
1505 bufsize = 1 + 3 * bufsize / 2;
1506 buf = xrealloc (buf, bufsize);
1508 err |= read_char (&c);
1509 address++;
1510 if (c < 0)
1512 free (buf);
1513 return err;
1515 if (c == '\0')
1516 break; /* It is; print this string. */
1517 if (!ISPRINT (c))
1518 goto tryline; /* It isn't; give up on this string. */
1519 buf[i++] = c; /* String continues; store it all. */
1522 /* If we get here, the string is all printable and null-terminated,
1523 so print it. It is all in `buf' and `i' is its length. */
1524 buf[i] = 0;
1525 if (output_address_fmt_string != NULL)
1527 printf ("%s ", format_address (address - i - 1));
1529 for (i = 0; (c = buf[i]); i++)
1531 switch (c)
1533 case '\007':
1534 fputs ("\\a", stdout);
1535 break;
1537 case '\b':
1538 fputs ("\\b", stdout);
1539 break;
1541 case '\f':
1542 fputs ("\\f", stdout);
1543 break;
1545 case '\n':
1546 fputs ("\\n", stdout);
1547 break;
1549 case '\r':
1550 fputs ("\\r", stdout);
1551 break;
1553 case '\t':
1554 fputs ("\\t", stdout);
1555 break;
1557 case '\v':
1558 fputs ("\\v", stdout);
1559 break;
1561 default:
1562 putc (c, stdout);
1565 putchar ('\n');
1568 /* We reach this point only if we search through
1569 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1571 free (buf);
1573 err |= check_and_close ();
1574 return err;
1578 main (int argc, char **argv)
1580 int c;
1581 int n_files;
1582 unsigned int i;
1583 unsigned int l_c_m;
1584 unsigned int address_pad_len;
1585 unsigned long int desired_width;
1586 int width_specified = 0;
1587 int n_failed_decodes = 0;
1588 int err;
1590 /* The old-style `pseudo starting address' to be printed in parentheses
1591 after any true address. */
1592 long int pseudo_start;
1594 #ifdef lint /* Suppress `used before initialized' warning. */
1595 pseudo_start = 0;
1596 #endif
1598 program_name = argv[0];
1599 setlocale (LC_ALL, "");
1600 bindtextdomain (PACKAGE, LOCALEDIR);
1601 textdomain (PACKAGE);
1603 err = 0;
1605 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1606 integral_type_size[i] = NO_SIZE;
1608 integral_type_size[sizeof (char)] = CHAR;
1609 integral_type_size[sizeof (short int)] = SHORT;
1610 integral_type_size[sizeof (int)] = INT;
1611 integral_type_size[sizeof (long int)] = LONG;
1613 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1614 fp_type_size[i] = NO_SIZE;
1616 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1617 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1618 so that if `long double' is the same type or if long double isn't
1619 supported FLOAT_LONG_DOUBLE will never be used. */
1620 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1621 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1623 n_specs = 0;
1624 n_specs_allocated = 5;
1625 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1627 output_address_fmt_string = "%07o";
1628 format_address = format_address_std;
1629 address_pad_len = 7;
1630 flag_dump_strings = 0;
1632 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1633 long_options, NULL)) != -1)
1635 unsigned long int tmp;
1636 enum strtol_error s_err;
1638 switch (c)
1640 case 0:
1641 break;
1643 case 'A':
1644 switch (optarg[0])
1646 case 'd':
1647 output_address_fmt_string = "%07d";
1648 format_address = format_address_std;
1649 address_pad_len = 7;
1650 break;
1651 case 'o':
1652 output_address_fmt_string = "%07o";
1653 format_address = format_address_std;
1654 address_pad_len = 7;
1655 break;
1656 case 'x':
1657 output_address_fmt_string = "%06x";
1658 format_address = format_address_std;
1659 address_pad_len = 6;
1660 break;
1661 case 'n':
1662 output_address_fmt_string = NULL;
1663 format_address = format_address_none;
1664 address_pad_len = 0;
1665 break;
1666 default:
1667 error (EXIT_FAILURE, 0,
1668 _("invalid output address radix `%c'; \
1669 it must be one character from [doxn]"),
1670 optarg[0]);
1671 break;
1673 break;
1675 case 'j':
1676 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1677 n_bytes_to_skip = tmp;
1678 if (s_err != LONGINT_OK)
1679 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1680 break;
1682 case 'N':
1683 limit_bytes_to_format = 1;
1685 /* FIXME: if off_t is long long and that's an 8-byte type,
1686 use xstrtouq here. */
1687 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1688 max_bytes_to_format = tmp;
1689 if (s_err != LONGINT_OK)
1690 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1692 if (tmp > LONG_MAX)
1693 error (EXIT_FAILURE, 0,
1694 _("specified number of bytes `%s' is larger than \
1695 the maximum\nrepresentable value of type `long'"), optarg);
1696 break;
1698 case 's':
1699 if (optarg == NULL)
1700 string_min = 3;
1701 else
1703 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1704 if (s_err != LONGINT_OK)
1705 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1707 ++flag_dump_strings;
1708 break;
1710 case 't':
1711 if (decode_format_string (optarg))
1712 ++n_failed_decodes;
1713 break;
1715 case 'v':
1716 abbreviate_duplicate_blocks = 0;
1717 break;
1719 case 'B':
1720 traditional = 1;
1721 break;
1723 /* The next several cases map the old, pre-POSIX format
1724 specification options to the corresponding POSIX format
1725 specs. GNU od accepts any combination of old- and
1726 new-style options. Format specification options accumulate. */
1728 #define CASE_OLD_ARG(old_char,new_string) \
1729 case old_char: \
1731 if (decode_format_string (new_string)) \
1732 ++n_failed_decodes; \
1734 break
1736 CASE_OLD_ARG ('a', "a");
1737 CASE_OLD_ARG ('b', "oC");
1738 CASE_OLD_ARG ('c', "c");
1739 CASE_OLD_ARG ('d', "u2");
1740 CASE_OLD_ARG ('f', "fF");
1741 CASE_OLD_ARG ('h', "x2");
1742 CASE_OLD_ARG ('i', "d2");
1743 CASE_OLD_ARG ('l', "d4");
1744 CASE_OLD_ARG ('o', "o2");
1745 CASE_OLD_ARG ('x', "x2");
1747 #undef CASE_OLD_ARG
1749 case 'w':
1750 width_specified = 1;
1751 if (optarg == NULL)
1753 desired_width = 32;
1755 else
1757 s_err = xstrtoul (optarg, NULL, 10, &desired_width, "");
1758 if (s_err != LONGINT_OK)
1759 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1761 break;
1763 default:
1764 usage (1);
1765 break;
1769 if (n_failed_decodes > 0)
1770 exit (EXIT_FAILURE);
1772 if (show_version)
1774 printf ("od (%s) %s\n", GNU_PACKAGE, VERSION);
1775 exit (EXIT_SUCCESS);
1778 if (show_help)
1779 usage (0);
1781 if (flag_dump_strings && n_specs > 0)
1782 error (EXIT_FAILURE, 0,
1783 _("no type may be specified when dumping strings"));
1785 n_files = argc - optind;
1787 /* If the --backward-compatible option is used, there may be from
1788 0 to 3 remaining command line arguments; handle each case
1789 separately.
1790 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1791 The offset and pseudo_start have the same syntax. */
1793 if (traditional)
1795 off_t offset;
1797 if (n_files == 1)
1799 if ((offset = parse_old_offset (argv[optind])) >= 0)
1801 n_bytes_to_skip = offset;
1802 --n_files;
1803 ++argv;
1806 else if (n_files == 2)
1808 off_t o1, o2;
1809 if ((o1 = parse_old_offset (argv[optind])) >= 0
1810 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1812 n_bytes_to_skip = o1;
1813 flag_pseudo_start = 1;
1814 pseudo_start = o2;
1815 argv += 2;
1816 n_files -= 2;
1818 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1820 n_bytes_to_skip = o2;
1821 --n_files;
1822 argv[optind + 1] = argv[optind];
1823 ++argv;
1825 else
1827 error (0, 0,
1828 _("invalid second operand in compatibility mode `%s'"),
1829 argv[optind + 1]);
1830 usage (1);
1833 else if (n_files == 3)
1835 off_t o1, o2;
1836 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1837 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1839 n_bytes_to_skip = o1;
1840 flag_pseudo_start = 1;
1841 pseudo_start = o2;
1842 argv[optind + 2] = argv[optind];
1843 argv += 2;
1844 n_files -= 2;
1846 else
1848 error (0, 0,
1849 _("in compatibility mode, the last two arguments must be offsets"));
1850 usage (1);
1853 else if (n_files > 3)
1855 error (0, 0,
1856 _("compatibility mode supports at most three arguments"));
1857 usage (1);
1860 if (flag_pseudo_start)
1862 static char buf[10];
1864 if (output_address_fmt_string == NULL)
1866 output_address_fmt_string = "(%07o)";
1867 format_address = format_address_std;
1869 else
1871 sprintf (buf, "%s (%s)",
1872 output_address_fmt_string,
1873 output_address_fmt_string);
1874 output_address_fmt_string = buf;
1875 format_address = format_address_label;
1880 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1881 for (i = 0; i < address_pad_len; i++)
1882 address_pad[i] = ' ';
1883 address_pad[address_pad_len] = '\0';
1885 if (n_specs == 0)
1887 if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1889 /* This happens on Cray systems that don't have a 2-byte
1890 integral type. */
1891 exit (EXIT_FAILURE);
1894 n_specs = 1;
1897 if (n_files > 0)
1898 file_list = (char const *const *) &argv[optind];
1899 else
1901 /* If no files were listed on the command line, set up the
1902 global array FILE_LIST so that it contains the null-terminated
1903 list of one name: "-". */
1904 static char const *const default_file_list[] = {"-", NULL};
1906 file_list = default_file_list;
1909 err |= skip (n_bytes_to_skip);
1910 if (in_stream == NULL)
1911 goto cleanup;
1913 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1915 /* Compute output block length. */
1916 l_c_m = get_lcm ();
1918 if (width_specified)
1920 if (desired_width != 0 && desired_width % l_c_m == 0)
1921 bytes_per_block = desired_width;
1922 else
1924 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1925 desired_width, l_c_m);
1926 bytes_per_block = l_c_m;
1929 else
1931 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1932 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1933 else
1934 bytes_per_block = l_c_m;
1937 #ifdef DEBUG
1938 for (i = 0; i < n_specs; i++)
1940 printf (_("%d: fmt=\"%s\" width=%d\n"),
1941 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1943 #endif
1945 err |= (flag_dump_strings ? dump_strings () : dump ());
1947 cleanup:;
1949 if (have_read_stdin && fclose (stdin) == EOF)
1950 error (EXIT_FAILURE, errno, _("standard input"));
1952 if (fclose (stdout) == EOF)
1953 error (EXIT_FAILURE, errno, _("write error"));
1955 exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);