1 /* od -- dump files in octal and other formats
2 Copyright (C) 92, 1995-1999 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)
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. */
25 #include <sys/types.h>
30 /* The official name of this program (e.g., no `g' prefix). */
31 #define PROGRAM_NAME "od"
33 #define AUTHORS "Jim Meyering"
35 #if defined(__GNUC__) || defined(STDC_HEADERS)
39 #ifdef HAVE_LONG_DOUBLE
40 typedef long double LONG_DOUBLE
;
42 typedef double LONG_DOUBLE
;
49 /* The default number of input bytes per output line. */
50 #define DEFAULT_BYTES_PER_BLOCK 16
52 /* The number of decimal digits of precision in a float. */
57 /* The number of decimal digits of precision in a double. */
62 /* The number of decimal digits of precision in a long double. */
64 # define LDBL_DIG DBL_DIG
69 # define fseeko(Stream, Offset, Whence) (-1)
95 /* Each output format specification (from POSIX `-t spec' or from
96 old-style options) is represented by one of these structures. */
99 enum output_format fmt
;
101 void (*print_function
) ();
103 int hexl_mode_trailer
;
107 /* The name this program was run with. */
110 /* Convert the number of 8-bit bytes of a binary representation to
111 the number of characters (digits + sign if the type is signed)
112 required to represent the same quantity in the specified base/type.
113 For example, a 32-bit (4-byte) quantity may require a field width
114 as wide as the following for these types:
118 8 unsigned hexadecimal */
120 static const unsigned int bytes_to_oct_digits
[] =
121 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
123 static const unsigned int bytes_to_signed_dec_digits
[] =
124 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
126 static const unsigned int bytes_to_unsigned_dec_digits
[] =
127 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
129 static const unsigned int bytes_to_hex_digits
[] =
130 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
132 /* Convert enum size_spec to the size of the named type. */
133 static const int width_bytes
[] =
145 /* Names for some non-printing characters. */
146 static const char *const charname
[33] =
148 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
149 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
150 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
151 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
155 /* A printf control string for printing a file offset. */
156 static const char *output_address_fmt_string
;
158 /* FIXME: make this the number of octal digits in an unsigned long. */
159 #define MAX_ADDRESS_LENGTH 13
161 /* Space for a normal address, a space, a pseudo address, parentheses
162 around the pseudo address, and a trailing zero byte. */
163 static char address_fmt_buffer
[2 * MAX_ADDRESS_LENGTH
+ 4];
164 static char address_pad
[MAX_ADDRESS_LENGTH
+ 1];
166 static unsigned long int string_min
;
167 static unsigned long int flag_dump_strings
;
169 /* Non-zero if we should recognize the pre-POSIX non-option arguments
170 that specified at most one file and optional arguments specifying
171 offset and pseudo-start address. */
172 static int traditional
;
174 /* Non-zero if an old-style `pseudo-address' was specified. */
175 static long int flag_pseudo_start
;
177 /* The difference between the old-style pseudo starting address and
178 the number of bytes to skip. */
179 static long int pseudo_offset
;
181 /* Function to format an address and optionally an additional parenthesized
182 pseudo-address; it returns the formatted string. */
183 static const char *(*format_address
) PARAMS ((long unsigned int));
185 /* The number of input bytes to skip before formatting and writing. */
186 static off_t n_bytes_to_skip
= 0;
188 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
189 to be read and formatted. Otherwise all input is formatted. */
190 static int limit_bytes_to_format
= 0;
192 /* The maximum number of bytes that will be formatted. This
193 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
194 static off_t max_bytes_to_format
;
196 /* When nonzero and two or more consecutive blocks are equal, format
197 only the first block and output an asterisk alone on the following
198 line to indicate that identical blocks have been elided. */
199 static int abbreviate_duplicate_blocks
= 1;
201 /* An array of specs describing how to format each input block. */
202 static struct tspec
*spec
;
204 /* The number of format specs. */
205 static unsigned int n_specs
;
207 /* The allocated length of SPEC. */
208 static unsigned int n_specs_allocated
;
210 /* The number of input bytes formatted per output line. It must be
211 a multiple of the least common multiple of the sizes associated with
212 the specified output types. It should be as large as possible, but
213 no larger than 16 -- unless specified with the -w option. */
214 static unsigned int bytes_per_block
;
216 /* Human-readable representation of *file_list (for error messages).
217 It differs from *file_list only when *file_list is "-". */
218 static char const *input_filename
;
220 /* A NULL-terminated list of the file-arguments from the command line.
221 If no file-arguments were specified, this variable is initialized
223 static char const *const *file_list
;
225 /* The input stream associated with the current file. */
226 static FILE *in_stream
;
228 /* If nonzero, at least one of the files we read was standard input. */
229 static int have_read_stdin
;
231 #define LONGEST_INTEGRAL_TYPE long int
233 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
234 static enum size_spec integral_type_size
[MAX_INTEGRAL_TYPE_SIZE
+ 1];
236 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
237 static enum size_spec fp_type_size
[MAX_FP_TYPE_SIZE
+ 1];
239 static struct option
const long_options
[] =
242 {"skip-bytes", required_argument
, NULL
, 'j'},
243 {"address-radix", required_argument
, NULL
, 'A'},
244 {"read-bytes", required_argument
, NULL
, 'N'},
245 {"format", required_argument
, NULL
, 't'},
246 {"output-duplicates", no_argument
, NULL
, 'v'},
248 /* non-POSIX options. */
249 {"strings", optional_argument
, NULL
, 's'},
250 {"traditional", no_argument
, NULL
, 'B'},
251 {"width", optional_argument
, NULL
, 'w'},
253 {GETOPT_HELP_OPTION_DECL
},
254 {GETOPT_VERSION_OPTION_DECL
},
262 fprintf (stderr
, _("Try `%s --help' for more information.\n"),
267 Usage: %s [OPTION]... [FILE]...\n\
268 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
270 program_name
, program_name
);
272 Write an unambiguous representation, octal bytes by default, of FILE\n\
273 to standard output. With no FILE, or when FILE is -, read standard input.\n\
275 -A, --address-radix=RADIX decide how file offsets are printed\n\
276 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
277 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
278 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
279 -t, --format=TYPE select output format or formats\n\
280 -v, --output-duplicates do not use * to mark line suppression\n\
281 -w, --width[=BYTES] output BYTES bytes per output line\n\
282 --traditional accept arguments in pre-POSIX form\n\
283 --help display this help and exit\n\
284 --version output version information and exit\n\
286 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
287 -a same as -t a, select named characters\n\
288 -b same as -t oC, select octal bytes\n\
289 -c same as -t c, select ASCII characters or backslash escapes\n\
290 -d same as -t u2, select unsigned decimal shorts\n\
291 -f same as -t fF, select floats\n\
292 -h same as -t x2, select hexadecimal shorts\n\
293 -i same as -t d2, select decimal shorts\n\
294 -l same as -t d4, select decimal longs\n\
295 -o same as -t o2, select octal shorts\n\
296 -x same as -t x2, select hexadecimal shorts\n\
300 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
301 is the pseudo-address at first byte printed, incremented when dump is\n\
302 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
303 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
305 TYPE is made up of one or more of these specifications:\n\
308 c ASCII character or backslash escape\n\
309 d[SIZE] signed decimal, SIZE bytes per integer\n\
310 f[SIZE] floating point, SIZE bytes per integer\n\
311 o[SIZE] octal, SIZE bytes per integer\n\
312 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
313 x[SIZE] hexadecimal, SIZE bytes per integer\n\
315 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
316 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
317 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
318 for sizeof(double) or L for sizeof(long double).\n\
320 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
321 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
322 with b suffix, by 1024 with k and by 1048576 with m. Adding a z suffix to\n\
323 any type adds a display of printable characters to the end of each line\n\
324 of output. -s without a number implies 3. -w without a number implies 32.\n\
325 By default, od uses -A o -t d2 -w 16.\n\
327 puts (_("\nReport bugs to <bug-textutils@gnu.org>."));
329 exit (status
== 0 ? EXIT_SUCCESS
: EXIT_FAILURE
);
332 /* Compute the greatest common denominator of U and V
333 using Euclid's algorithm. */
336 gcd (unsigned int u
, unsigned int v
)
348 /* Compute the least common multiple of U and V. */
351 lcm (unsigned int u
, unsigned int v
)
353 unsigned int t
= gcd (u
, v
);
360 print_s_char (long unsigned int n_bytes
, const char *block
,
361 const char *fmt_string
)
364 for (i
= n_bytes
; i
> 0; i
--)
366 int tmp
= (unsigned) *(const unsigned char *) block
;
368 tmp
-= SCHAR_MAX
- SCHAR_MIN
+ 1;
369 assert (tmp
<= SCHAR_MAX
);
370 printf (fmt_string
, tmp
);
371 block
+= sizeof (unsigned char);
376 print_char (long unsigned int n_bytes
, const char *block
,
377 const char *fmt_string
)
380 for (i
= n_bytes
; i
> 0; i
--)
382 unsigned int tmp
= *(const unsigned char *) block
;
383 printf (fmt_string
, tmp
);
384 block
+= sizeof (unsigned char);
389 print_s_short (long unsigned int n_bytes
, const char *block
,
390 const char *fmt_string
)
393 for (i
= n_bytes
/ sizeof (unsigned short); i
> 0; i
--)
395 int tmp
= (unsigned) *(const unsigned short *) block
;
397 tmp
-= SHRT_MAX
- SHRT_MIN
+ 1;
398 assert (tmp
<= SHRT_MAX
);
399 printf (fmt_string
, tmp
);
400 block
+= sizeof (unsigned short);
405 print_short (long unsigned int n_bytes
, const char *block
,
406 const char *fmt_string
)
409 for (i
= n_bytes
/ sizeof (unsigned short); i
> 0; i
--)
411 unsigned int tmp
= *(const unsigned short *) block
;
412 printf (fmt_string
, tmp
);
413 block
+= sizeof (unsigned short);
418 print_int (long unsigned int n_bytes
, const char *block
,
419 const char *fmt_string
)
422 for (i
= n_bytes
/ sizeof (unsigned int); i
> 0; i
--)
424 unsigned int tmp
= *(const unsigned int *) block
;
425 printf (fmt_string
, tmp
);
426 block
+= sizeof (unsigned int);
431 print_long (long unsigned int n_bytes
, const char *block
,
432 const char *fmt_string
)
435 for (i
= n_bytes
/ sizeof (unsigned long); i
> 0; i
--)
437 unsigned long tmp
= *(const unsigned long *) block
;
438 printf (fmt_string
, tmp
);
439 block
+= sizeof (unsigned long);
444 print_float (long unsigned int n_bytes
, const char *block
,
445 const char *fmt_string
)
448 for (i
= n_bytes
/ sizeof (float); i
> 0; i
--)
450 float tmp
= *(const float *) block
;
451 printf (fmt_string
, tmp
);
452 block
+= sizeof (float);
457 print_double (long unsigned int n_bytes
, const char *block
,
458 const char *fmt_string
)
461 for (i
= n_bytes
/ sizeof (double); i
> 0; i
--)
463 double tmp
= *(const double *) block
;
464 printf (fmt_string
, tmp
);
465 block
+= sizeof (double);
469 #ifdef HAVE_LONG_DOUBLE
471 print_long_double (long unsigned int n_bytes
, const char *block
,
472 const char *fmt_string
)
475 for (i
= n_bytes
/ sizeof (LONG_DOUBLE
); i
> 0; i
--)
477 LONG_DOUBLE tmp
= *(const LONG_DOUBLE
*) block
;
478 printf (fmt_string
, tmp
);
479 block
+= sizeof (LONG_DOUBLE
);
486 dump_hexl_mode_trailer (long unsigned int n_bytes
, const char *block
)
489 fputs (" >", stdout
);
490 for (i
= n_bytes
; i
> 0; i
--)
492 unsigned int c
= *(const unsigned char *) block
;
493 unsigned int c2
= (ISPRINT(c
) ? c
: '.');
495 block
+= sizeof (unsigned char);
501 print_named_ascii (long unsigned int n_bytes
, const char *block
,
502 const char *unused_fmt_string
)
505 for (i
= n_bytes
; i
> 0; i
--)
507 unsigned int c
= *(const unsigned char *) block
;
508 unsigned int masked_c
= (0x7f & c
);
514 else if (masked_c
<= 040)
515 s
= charname
[masked_c
];
518 sprintf (buf
, " %c", masked_c
);
523 block
+= sizeof (unsigned char);
528 print_ascii (long unsigned int n_bytes
, const char *block
,
529 const char *unused_fmt_string
)
532 for (i
= n_bytes
; i
> 0; i
--)
534 unsigned int c
= *(const unsigned char *) block
;
573 sprintf (buf
, (ISPRINT (c
) ? " %c" : "%03o"), c
);
574 s
= (const char *) buf
;
578 block
+= sizeof (unsigned char);
582 /* Convert a null-terminated (possibly zero-length) string S to an
583 unsigned long integer value. If S points to a non-digit set *P to S,
584 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
585 the string of digits. If the string of digits represents a value
586 larger than ULONG_MAX, don't modify *VAL or *P and return nonzero.
587 Otherwise, advance *P to the first non-digit after S, set *VAL to
588 the result of the conversion and return zero. */
591 simple_strtoul (const char *s
, const char **p
, long unsigned int *val
)
593 unsigned long int sum
;
598 unsigned int c
= *s
++ - '0';
599 if (sum
> (ULONG_MAX
- c
) / 10)
608 /* If S points to a single valid POSIX-style od format string, put
609 a description of that format in *TSPEC, make *NEXT point at the
610 character following the just-decoded format (if *NEXT is non-NULL),
611 and return zero. If S is not valid, don't modify *NEXT or *TSPEC,
612 give a diagnostic, and return nonzero. For example, if S were
613 "d4afL" *NEXT would be set to "afL" and *TSPEC would be
615 fmt = SIGNED_DECIMAL;
616 size = INT or LONG; (whichever integral_type_size[4] resolves to)
617 print_function = print_int; (assuming size == INT)
618 fmt_string = "%011d%c";
620 S_ORIG is solely for reporting errors. It should be the full format
625 decode_one_format (const char *s_orig
, const char *s
, const char **next
,
628 enum size_spec size_spec
;
629 unsigned long int size
;
630 enum output_format fmt
;
631 const char *pre_fmt_string
;
633 void (*print_function
) ();
636 unsigned int field_width
= 0;
638 assert (tspec
!= NULL
);
652 size
= sizeof (char);
657 size
= sizeof (short);
667 size
= sizeof (long int);
671 if (simple_strtoul (s
, &p
, &size
) != 0)
673 /* The integer at P in S would overflow an unsigned long.
674 A digit string that long is sufficiently odd looking
675 that the following diagnostic is sufficient. */
676 error (0, 0, _("invalid type string `%s'"), s_orig
);
683 if (size
> MAX_INTEGRAL_TYPE_SIZE
684 || integral_type_size
[size
] == NO_SIZE
)
686 error (0, 0, _("invalid type string `%s';\n\
687 this system doesn't provide a %lu-byte integral type"), s_orig
, size
);
695 #define FMT_BYTES_ALLOCATED 9
696 fmt_string
= xmalloc (FMT_BYTES_ALLOCATED
);
698 size_spec
= integral_type_size
[size
];
703 fmt
= SIGNED_DECIMAL
;
704 sprintf (fmt_string
, " %%%u%sd",
705 (field_width
= bytes_to_signed_dec_digits
[size
]),
706 (size_spec
== LONG
? "l" : ""));
711 sprintf (fmt_string
, " %%0%u%so",
712 (field_width
= bytes_to_oct_digits
[size
]),
713 (size_spec
== LONG
? "l" : ""));
717 fmt
= UNSIGNED_DECIMAL
;
718 sprintf (fmt_string
, " %%%u%su",
719 (field_width
= bytes_to_unsigned_dec_digits
[size
]),
720 (size_spec
== LONG
? "l" : ""));
725 sprintf (fmt_string
, " %%0%u%sx",
726 (field_width
= bytes_to_hex_digits
[size
]),
727 (size_spec
== LONG
? "l" : ""));
734 assert (strlen (fmt_string
) < FMT_BYTES_ALLOCATED
);
739 print_function
= (fmt
== SIGNED_DECIMAL
745 print_function
= (fmt
== SIGNED_DECIMAL
751 print_function
= print_int
;
755 print_function
= print_long
;
764 fmt
= FLOATING_POINT
;
770 size
= sizeof (float);
775 size
= sizeof (double);
780 size
= sizeof (LONG_DOUBLE
);
784 if (simple_strtoul (s
, &p
, &size
) != 0)
786 /* The integer at P in S would overflow an unsigned long.
787 A digit string that long is sufficiently odd looking
788 that the following diagnostic is sufficient. */
789 error (0, 0, _("invalid type string `%s'"), s_orig
);
793 size
= sizeof (double);
796 if (size
> MAX_FP_TYPE_SIZE
797 || fp_type_size
[size
] == NO_SIZE
)
799 error (0, 0, _("invalid type string `%s';\n\
800 this system doesn't provide a %lu-byte floating point type"), s_orig
, size
);
807 size_spec
= fp_type_size
[size
];
812 print_function
= print_float
;
813 /* Don't use %#e; not all systems support it. */
814 pre_fmt_string
= " %%%d.%de";
815 fmt_string
= xmalloc (strlen (pre_fmt_string
));
816 sprintf (fmt_string
, pre_fmt_string
,
817 (field_width
= FLT_DIG
+ 8), FLT_DIG
);
821 print_function
= print_double
;
822 pre_fmt_string
= " %%%d.%de";
823 fmt_string
= xmalloc (strlen (pre_fmt_string
));
824 sprintf (fmt_string
, pre_fmt_string
,
825 (field_width
= DBL_DIG
+ 8), DBL_DIG
);
828 #ifdef HAVE_LONG_DOUBLE
829 case FLOAT_LONG_DOUBLE
:
830 print_function
= print_long_double
;
831 pre_fmt_string
= " %%%d.%dLe";
832 fmt_string
= xmalloc (strlen (pre_fmt_string
));
833 sprintf (fmt_string
, pre_fmt_string
,
834 (field_width
= LDBL_DIG
+ 8), LDBL_DIG
);
845 fmt
= NAMED_CHARACTER
;
848 print_function
= print_named_ascii
;
857 print_function
= print_ascii
;
862 error (0, 0, _("invalid character `%c' in type string `%s'"),
867 tspec
->size
= size_spec
;
869 tspec
->print_function
= print_function
;
870 tspec
->fmt_string
= fmt_string
;
872 tspec
->field_width
= field_width
;
873 tspec
->hexl_mode_trailer
= (*s
== 'z');
874 if (tspec
->hexl_mode_trailer
)
883 /* Decode the POSIX-style od format string S. Append the decoded
884 representation to the global array SPEC, reallocating SPEC if
885 necessary. Return zero if S is valid, nonzero otherwise. */
888 decode_format_string (const char *s
)
890 const char *s_orig
= s
;
898 if (decode_one_format (s_orig
, s
, &next
, &tspec
))
904 if (n_specs
>= n_specs_allocated
)
906 n_specs_allocated
= 1 + (3 * n_specs_allocated
) / 2;
907 spec
= (struct tspec
*) xrealloc ((char *) spec
,
909 * sizeof (struct tspec
)));
912 memcpy ((char *) &spec
[n_specs
], (char *) &tspec
,
913 sizeof (struct tspec
));
920 /* Given a list of one or more input filenames FILE_LIST, set the global
921 file pointer IN_STREAM to position N_SKIP in the concatenation of
922 those files. If any file operation fails or if there are fewer than
923 N_SKIP bytes in the combined input, give an error message and return
924 nonzero. When possible, use seek- rather than read operations to
925 advance IN_STREAM. A file name of "-" is interpreted as standard
934 for ( /* empty */ ; *file_list
!= NULL
; ++file_list
)
936 struct stat file_stats
;
939 if (STREQ (*file_list
, "-"))
941 input_filename
= _("standard input");
947 input_filename
= *file_list
;
948 in_stream
= fopen (input_filename
, "r");
949 if (in_stream
== NULL
)
951 error (0, errno
, "%s", input_filename
);
956 SET_BINARY (fileno (in_stream
));
961 /* First try using fseek. For large offsets, this extra work is
962 worthwhile. If the offset is below some threshold it may be
963 more efficient to move the pointer by reading. There are two
964 issues when trying to use fseek:
965 - the file must be seekable.
966 - before seeking to the specified position, make sure
967 that the new position is in the current file.
968 Try to do that by getting file's size using fstat().
969 But that will work only for regular files and dirs. */
971 if (fstat (fileno (in_stream
), &file_stats
))
973 error (0, errno
, "%s", input_filename
);
978 /* The st_size field is valid only for regular files and
979 directories. FIXME: is the preceding true?
980 If the number of bytes left to skip is at least as large as
981 the size of the current file, we can decrement
982 n_skip and go on to the next file. */
983 if (S_ISREG (file_stats
.st_mode
) || S_ISDIR (file_stats
.st_mode
))
985 if (n_skip
>= file_stats
.st_size
)
987 n_skip
-= file_stats
.st_size
;
988 if (in_stream
!= stdin
&& fclose (in_stream
) == EOF
)
990 error (0, errno
, "%s", input_filename
);
997 /* Try fseeko if available, fseek otherwise. */
998 if (fseeko (in_stream
, n_skip
, SEEK_SET
) == 0
999 || (n_skip
<= LONG_MAX
1000 && fseek (in_stream
, (long) n_skip
, SEEK_SET
) == 0))
1008 /* Seek didn't work or wasn't attempted; position the file pointer
1011 for (j
= n_skip
/ BUFSIZ
; j
>= 0; j
--)
1014 size_t n_bytes_to_read
= (j
> 0
1017 size_t n_bytes_read
;
1018 n_bytes_read
= fread (buf
, 1, n_bytes_to_read
, in_stream
);
1019 n_skip
-= n_bytes_read
;
1020 if (n_bytes_read
!= n_bytes_to_read
)
1029 error (EXIT_FAILURE
, 0, _("cannot skip past end of combined input"));
1035 format_address_none (long unsigned int address
)
1041 format_address_std (long unsigned int address
)
1043 const char *address_string
;
1045 sprintf (address_fmt_buffer
, output_address_fmt_string
, address
);
1046 address_string
= address_fmt_buffer
;
1047 return address_string
;
1051 format_address_label (long unsigned int address
)
1053 const char *address_string
;
1054 assert (output_address_fmt_string
!= NULL
);
1056 sprintf (address_fmt_buffer
, output_address_fmt_string
,
1057 address
, address
+ pseudo_offset
);
1058 address_string
= address_fmt_buffer
;
1059 return address_string
;
1062 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1063 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1064 CURR_BLOCK in the concatenation of input files, and it is printed
1065 (optionally) only before the output line associated with the first
1066 format spec. When duplicate blocks are being abbreviated, the output
1067 for a sequence of identical input blocks is the output for the first
1068 block followed by an asterisk alone on a line. It is valid to compare
1069 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1070 That condition may be false only for the last input block -- and then
1071 only when it has not been padded to length BYTES_PER_BLOCK. */
1074 write_block (long unsigned int current_offset
, long unsigned int n_bytes
,
1075 const char *prev_block
, const char *curr_block
)
1077 static int first
= 1;
1078 static int prev_pair_equal
= 0;
1080 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1082 if (abbreviate_duplicate_blocks
1083 && !first
&& n_bytes
== bytes_per_block
1084 && EQUAL_BLOCKS (prev_block
, curr_block
))
1086 if (prev_pair_equal
)
1088 /* The two preceding blocks were equal, and the current
1089 block is the same as the last one, so print nothing. */
1094 prev_pair_equal
= 1;
1101 prev_pair_equal
= 0;
1102 for (i
= 0; i
< n_specs
; i
++)
1104 const char *addr_or_pad
= (i
== 0
1105 ? format_address (current_offset
)
1108 fputs (addr_or_pad
, stdout
);
1109 (*spec
[i
].print_function
) (n_bytes
, curr_block
, spec
[i
].fmt_string
);
1110 if (spec
[i
].hexl_mode_trailer
)
1112 /* space-pad out to full line width, then dump the trailer */
1113 int datum_width
= width_bytes
[spec
[i
].size
];
1114 int blank_fields
= (bytes_per_block
- n_bytes
) / datum_width
;
1115 int field_width
= spec
[i
].field_width
+ 1;
1116 printf ("%*s", blank_fields
* field_width
, "");
1117 dump_hexl_mode_trailer (n_bytes
, curr_block
);
1125 /* Test whether there have been errors on in_stream, and close it if
1126 it is not standard input. Return nonzero if there has been an error
1127 on in_stream or stdout; return zero otherwise. This function will
1128 report more than one error only if both a read and a write error
1132 check_and_close (void)
1137 if (ferror (in_stream
))
1139 error (0, errno
, "%s", input_filename
);
1140 if (in_stream
!= stdin
)
1144 else if (in_stream
!= stdin
&& fclose (in_stream
) == EOF
)
1146 error (0, errno
, "%s", input_filename
);
1150 if (ferror (stdout
))
1152 error (0, errno
, _("standard output"));
1159 /* Read a single byte into *C from the concatenation of the input files
1160 named in the global array FILE_LIST. On the first call to this
1161 function, the global variable IN_STREAM is expected to be an open
1162 stream associated with the input file *FILE_LIST. If IN_STREAM is
1163 at end-of-file, close it and update the global variables IN_STREAM,
1164 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1165 the list. Then try to read a byte from the newly opened file.
1166 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1167 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1168 calls do likewise. The return value is nonzero if any errors
1169 occured, zero otherwise. */
1176 if (*file_list
== NULL
)
1185 *c
= fgetc (in_stream
);
1190 err
|= check_and_close ();
1195 if (*file_list
== NULL
)
1198 if (STREQ (*file_list
, "-"))
1200 input_filename
= _("standard input");
1202 have_read_stdin
= 1;
1206 input_filename
= *file_list
;
1207 in_stream
= fopen (input_filename
, "r");
1208 if (in_stream
== NULL
)
1210 error (0, errno
, "%s", input_filename
);
1214 SET_BINARY (fileno (in_stream
));
1216 while (in_stream
== NULL
);
1220 /* Read N bytes into BLOCK from the concatenation of the input files
1221 named in the global array FILE_LIST. On the first call to this
1222 function, the global variable IN_STREAM is expected to be an open
1223 stream associated with the input file *FILE_LIST. On subsequent
1224 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1225 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1226 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1227 Then try to read the remaining bytes from the newly opened file.
1228 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1229 to the number of bytes read. If an error occurs, it will be detected
1230 through ferror when the stream is about to be closed. If there is an
1231 error, give a message but continue reading as usual and return nonzero.
1232 Otherwise return zero. */
1235 read_block (size_t n
, char *block
, size_t *n_bytes_in_buffer
)
1239 assert (n
> 0 && n
<= bytes_per_block
);
1241 *n_bytes_in_buffer
= 0;
1246 if (*file_list
== NULL
)
1247 return 0; /* EOF. */
1255 n_needed
= n
- *n_bytes_in_buffer
;
1256 n_read
= fread (block
+ *n_bytes_in_buffer
, 1, n_needed
, in_stream
);
1258 *n_bytes_in_buffer
+= n_read
;
1260 if (n_read
== n_needed
)
1263 err
|= check_and_close ();
1268 if (*file_list
== NULL
)
1271 if (STREQ (*file_list
, "-"))
1273 input_filename
= _("standard input");
1275 have_read_stdin
= 1;
1279 input_filename
= *file_list
;
1280 in_stream
= fopen (input_filename
, "r");
1281 if (in_stream
== NULL
)
1283 error (0, errno
, "%s", input_filename
);
1287 SET_BINARY (fileno (in_stream
));
1289 while (in_stream
== NULL
);
1293 /* Return the least common multiple of the sizes associated
1294 with the format specs. */
1302 for (i
= 0; i
< n_specs
; i
++)
1303 l_c_m
= lcm (l_c_m
, width_bytes
[(int) spec
[i
].size
]);
1307 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1308 return the offset it denotes. Otherwise, return -1. */
1311 parse_old_offset (const char *s
)
1315 enum strtol_error s_err
;
1316 long unsigned int tmp
;
1321 /* Skip over any leading '+'. */
1325 /* Determine the radix we'll use to interpret S. If there is a `.',
1326 it's decimal, otherwise, if the string begins with `0X'or `0x',
1327 it's hexadecimal, else octal. */
1328 if (strchr (s
, '.') != NULL
)
1332 if (s
[0] == '0' && (s
[1] == 'x' || s
[1] == 'X'))
1338 s_err
= xstrtoul (s
, NULL
, radix
, &tmp
, "Bb");
1339 if (s_err
!= LONGINT_OK
)
1341 STRTOL_FAIL_WARN (s
, _("old-style offset"), s_err
);
1348 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1349 formatted block to standard output, and repeat until the specified
1350 maximum number of bytes has been read or until all input has been
1351 processed. If the last block read is smaller than BYTES_PER_BLOCK
1352 and its size is not a multiple of the size associated with a format
1353 spec, extend the input block with zero bytes until its length is a
1354 multiple of all format spec sizes. Write the final block. Finally,
1355 write on a line by itself the offset of the byte after the last byte
1356 read. Accumulate return values from calls to read_block and
1357 check_and_close, and if any was nonzero, return nonzero.
1358 Otherwise, return zero. */
1364 off_t current_offset
;
1365 off_t end_offset
IF_LINT (= 0);
1368 size_t n_bytes_read
;
1370 block
[0] = (char *) alloca (bytes_per_block
);
1371 block
[1] = (char *) alloca (bytes_per_block
);
1373 current_offset
= n_bytes_to_skip
;
1377 if (limit_bytes_to_format
)
1379 end_offset
= n_bytes_to_skip
+ max_bytes_to_format
;
1384 if (current_offset
>= end_offset
)
1389 n_needed
= MIN (end_offset
- current_offset
,
1390 (off_t
) bytes_per_block
);
1391 err
|= read_block (n_needed
, block
[idx
], &n_bytes_read
);
1392 if (n_bytes_read
< bytes_per_block
)
1394 assert (n_bytes_read
== bytes_per_block
);
1395 write_block (current_offset
, n_bytes_read
,
1396 block
[!idx
], block
[idx
]);
1397 current_offset
+= n_bytes_read
;
1405 err
|= read_block (bytes_per_block
, block
[idx
], &n_bytes_read
);
1406 if (n_bytes_read
< bytes_per_block
)
1408 assert (n_bytes_read
== bytes_per_block
);
1409 write_block (current_offset
, n_bytes_read
,
1410 block
[!idx
], block
[idx
]);
1411 current_offset
+= n_bytes_read
;
1416 if (n_bytes_read
> 0)
1419 size_t bytes_to_write
;
1423 /* Make bytes_to_write the smallest multiple of l_c_m that
1424 is at least as large as n_bytes_read. */
1425 bytes_to_write
= l_c_m
* (int) ((n_bytes_read
+ l_c_m
- 1) / l_c_m
);
1427 memset (block
[idx
] + n_bytes_read
, 0, bytes_to_write
- n_bytes_read
);
1428 write_block (current_offset
, bytes_to_write
,
1429 block
[!idx
], block
[idx
]);
1430 current_offset
+= n_bytes_read
;
1433 if (output_address_fmt_string
!= NULL
)
1434 printf ("%s\n", format_address (current_offset
));
1436 if (limit_bytes_to_format
&& current_offset
> end_offset
)
1437 err
|= check_and_close ();
1442 /* STRINGS mode. Find each "string constant" in the input.
1443 A string constant is a run of at least `string_min' ASCII
1444 graphic (or formatting) characters terminated by a null.
1445 Based on a function written by Richard Stallman for a
1446 pre-POSIX version of od. Return nonzero if an error
1447 occurs. Otherwise, return zero. */
1452 size_t bufsize
= MAX (100, string_min
);
1453 char *buf
= xmalloc (bufsize
);
1454 off_t address
= n_bytes_to_skip
;
1463 /* See if the next `string_min' chars are all printing chars. */
1466 if (limit_bytes_to_format
1467 && address
>= (n_bytes_to_skip
+ max_bytes_to_format
-
1468 (off_t
) string_min
))
1471 for (i
= 0; i
< string_min
; i
++)
1473 err
|= read_char (&c
);
1481 /* Found a non-printing. Try again starting with next char. */
1486 /* We found a run of `string_min' printable characters.
1487 Now see if it is terminated with a null byte. */
1488 while (!limit_bytes_to_format
1489 || address
< n_bytes_to_skip
+ max_bytes_to_format
)
1493 bufsize
= 1 + 3 * bufsize
/ 2;
1494 buf
= xrealloc (buf
, bufsize
);
1496 err
|= read_char (&c
);
1504 break; /* It is; print this string. */
1506 goto tryline
; /* It isn't; give up on this string. */
1507 buf
[i
++] = c
; /* String continues; store it all. */
1510 /* If we get here, the string is all printable and null-terminated,
1511 so print it. It is all in `buf' and `i' is its length. */
1513 if (output_address_fmt_string
!= NULL
)
1515 printf ("%s ", format_address (address
- i
- 1));
1517 for (i
= 0; (c
= buf
[i
]); i
++)
1522 fputs ("\\a", stdout
);
1526 fputs ("\\b", stdout
);
1530 fputs ("\\f", stdout
);
1534 fputs ("\\n", stdout
);
1538 fputs ("\\r", stdout
);
1542 fputs ("\\t", stdout
);
1546 fputs ("\\v", stdout
);
1556 /* We reach this point only if we search through
1557 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1561 err
|= check_and_close ();
1566 main (int argc
, char **argv
)
1572 unsigned int address_pad_len
;
1573 unsigned long int desired_width
;
1574 int width_specified
= 0;
1575 int n_failed_decodes
= 0;
1578 /* The old-style `pseudo starting address' to be printed in parentheses
1579 after any true address. */
1580 long int pseudo_start
IF_LINT (= 0);
1582 program_name
= argv
[0];
1583 setlocale (LC_ALL
, "");
1584 bindtextdomain (PACKAGE
, LOCALEDIR
);
1585 textdomain (PACKAGE
);
1589 for (i
= 0; i
<= MAX_INTEGRAL_TYPE_SIZE
; i
++)
1590 integral_type_size
[i
] = NO_SIZE
;
1592 integral_type_size
[sizeof (char)] = CHAR
;
1593 integral_type_size
[sizeof (short int)] = SHORT
;
1594 integral_type_size
[sizeof (int)] = INT
;
1595 integral_type_size
[sizeof (long int)] = LONG
;
1597 for (i
= 0; i
<= MAX_FP_TYPE_SIZE
; i
++)
1598 fp_type_size
[i
] = NO_SIZE
;
1600 fp_type_size
[sizeof (float)] = FLOAT_SINGLE
;
1601 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1602 so that if `long double' is the same type or if long double isn't
1603 supported FLOAT_LONG_DOUBLE will never be used. */
1604 fp_type_size
[sizeof (LONG_DOUBLE
)] = FLOAT_LONG_DOUBLE
;
1605 fp_type_size
[sizeof (double)] = FLOAT_DOUBLE
;
1608 n_specs_allocated
= 5;
1609 spec
= (struct tspec
*) xmalloc (n_specs_allocated
* sizeof (struct tspec
));
1611 output_address_fmt_string
= "%07o";
1612 format_address
= format_address_std
;
1613 address_pad_len
= 7;
1614 flag_dump_strings
= 0;
1616 while ((c
= getopt_long (argc
, argv
, "abcdfhilos::xw::A:j:N:t:v",
1617 long_options
, NULL
)) != -1)
1619 unsigned long int tmp
;
1620 enum strtol_error s_err
;
1631 output_address_fmt_string
= "%07d";
1632 format_address
= format_address_std
;
1633 address_pad_len
= 7;
1636 output_address_fmt_string
= "%07o";
1637 format_address
= format_address_std
;
1638 address_pad_len
= 7;
1641 output_address_fmt_string
= "%06x";
1642 format_address
= format_address_std
;
1643 address_pad_len
= 6;
1646 output_address_fmt_string
= NULL
;
1647 format_address
= format_address_none
;
1648 address_pad_len
= 0;
1651 error (EXIT_FAILURE
, 0,
1652 _("invalid output address radix `%c'; \
1653 it must be one character from [doxn]"),
1660 s_err
= xstrtoul (optarg
, NULL
, 0, &tmp
, "bkm");
1661 n_bytes_to_skip
= tmp
;
1662 if (s_err
!= LONGINT_OK
)
1663 STRTOL_FATAL_ERROR (optarg
, _("skip argument"), s_err
);
1667 limit_bytes_to_format
= 1;
1669 /* FIXME: if off_t is long long and that's an 8-byte type,
1670 use xstrtouq here. */
1671 s_err
= xstrtoul (optarg
, NULL
, 0, &tmp
, "bkm");
1672 max_bytes_to_format
= tmp
;
1673 if (s_err
!= LONGINT_OK
)
1674 STRTOL_FATAL_ERROR (optarg
, _("limit argument"), s_err
);
1677 error (EXIT_FAILURE
, 0,
1678 _("specified number of bytes `%s' is larger than \
1679 the maximum\nrepresentable value of type `long'"), optarg
);
1687 s_err
= xstrtoul (optarg
, NULL
, 0, &string_min
, "bkm");
1688 if (s_err
!= LONGINT_OK
)
1689 STRTOL_FATAL_ERROR (optarg
, _("minimum string length"), s_err
);
1691 ++flag_dump_strings
;
1695 if (decode_format_string (optarg
))
1700 abbreviate_duplicate_blocks
= 0;
1707 /* The next several cases map the old, pre-POSIX format
1708 specification options to the corresponding POSIX format
1709 specs. GNU od accepts any combination of old- and
1710 new-style options. Format specification options accumulate. */
1712 #define CASE_OLD_ARG(old_char,new_string) \
1715 if (decode_format_string (new_string)) \
1716 ++n_failed_decodes; \
1720 CASE_OLD_ARG ('a', "a");
1721 CASE_OLD_ARG ('b', "oC");
1722 CASE_OLD_ARG ('c', "c");
1723 CASE_OLD_ARG ('d', "u2");
1724 CASE_OLD_ARG ('f', "fF");
1725 CASE_OLD_ARG ('h', "x2");
1726 CASE_OLD_ARG ('i', "d2");
1727 CASE_OLD_ARG ('l', "d4");
1728 CASE_OLD_ARG ('o', "o2");
1729 CASE_OLD_ARG ('x', "x2");
1734 width_specified
= 1;
1741 s_err
= xstrtoul (optarg
, NULL
, 10, &desired_width
, "");
1742 if (s_err
!= LONGINT_OK
)
1743 STRTOL_FATAL_ERROR (optarg
, _("width specification"), s_err
);
1747 case_GETOPT_HELP_CHAR
;
1749 case_GETOPT_VERSION_CHAR (PROGRAM_NAME
, AUTHORS
);
1757 if (n_failed_decodes
> 0)
1758 exit (EXIT_FAILURE
);
1760 if (flag_dump_strings
&& n_specs
> 0)
1761 error (EXIT_FAILURE
, 0,
1762 _("no type may be specified when dumping strings"));
1764 n_files
= argc
- optind
;
1766 /* If the --backward-compatible option is used, there may be from
1767 0 to 3 remaining command line arguments; handle each case
1769 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1770 The offset and pseudo_start have the same syntax. */
1778 if ((offset
= parse_old_offset (argv
[optind
])) >= 0)
1780 n_bytes_to_skip
= offset
;
1785 else if (n_files
== 2)
1788 if ((o1
= parse_old_offset (argv
[optind
])) >= 0
1789 && (o2
= parse_old_offset (argv
[optind
+ 1])) >= 0)
1791 n_bytes_to_skip
= o1
;
1792 flag_pseudo_start
= 1;
1797 else if ((o2
= parse_old_offset (argv
[optind
+ 1])) >= 0)
1799 n_bytes_to_skip
= o2
;
1801 argv
[optind
+ 1] = argv
[optind
];
1807 _("invalid second operand in compatibility mode `%s'"),
1812 else if (n_files
== 3)
1815 if ((o1
= parse_old_offset (argv
[optind
+ 1])) >= 0
1816 && (o2
= parse_old_offset (argv
[optind
+ 2])) >= 0)
1818 n_bytes_to_skip
= o1
;
1819 flag_pseudo_start
= 1;
1821 argv
[optind
+ 2] = argv
[optind
];
1828 _("in compatibility mode, the last two arguments must be offsets"));
1832 else if (n_files
> 3)
1835 _("compatibility mode supports at most three arguments"));
1839 if (flag_pseudo_start
)
1841 static char buf
[10];
1843 if (output_address_fmt_string
== NULL
)
1845 output_address_fmt_string
= "(%07o)";
1846 format_address
= format_address_std
;
1850 sprintf (buf
, "%s (%s)",
1851 output_address_fmt_string
,
1852 output_address_fmt_string
);
1853 output_address_fmt_string
= buf
;
1854 format_address
= format_address_label
;
1859 assert (address_pad_len
<= MAX_ADDRESS_LENGTH
);
1860 for (i
= 0; i
< address_pad_len
; i
++)
1861 address_pad
[i
] = ' ';
1862 address_pad
[address_pad_len
] = '\0';
1866 if (decode_one_format ("o2", "o2", NULL
, &(spec
[0])))
1868 /* This happens on Cray systems that don't have a 2-byte
1870 exit (EXIT_FAILURE
);
1877 file_list
= (char const *const *) &argv
[optind
];
1880 /* If no files were listed on the command line, set up the
1881 global array FILE_LIST so that it contains the null-terminated
1882 list of one name: "-". */
1883 static char const *const default_file_list
[] = {"-", NULL
};
1885 file_list
= default_file_list
;
1888 err
|= skip (n_bytes_to_skip
);
1889 if (in_stream
== NULL
)
1892 pseudo_offset
= (flag_pseudo_start
? pseudo_start
- n_bytes_to_skip
: 0);
1894 /* Compute output block length. */
1897 if (width_specified
)
1899 if (desired_width
!= 0 && desired_width
% l_c_m
== 0)
1900 bytes_per_block
= desired_width
;
1903 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1904 desired_width
, l_c_m
);
1905 bytes_per_block
= l_c_m
;
1910 if (l_c_m
< DEFAULT_BYTES_PER_BLOCK
)
1911 bytes_per_block
= l_c_m
* (int) (DEFAULT_BYTES_PER_BLOCK
/ l_c_m
);
1913 bytes_per_block
= l_c_m
;
1917 for (i
= 0; i
< n_specs
; i
++)
1919 printf (_("%d: fmt=\"%s\" width=%d\n"),
1920 i
, spec
[i
].fmt_string
, width_bytes
[spec
[i
].size
]);
1924 err
|= (flag_dump_strings
? dump_strings () : dump ());
1928 if (have_read_stdin
&& fclose (stdin
) == EOF
)
1929 error (EXIT_FAILURE
, errno
, _("standard input"));
1931 if (fclose (stdout
) == EOF
)
1932 error (EXIT_FAILURE
, errno
, _("write error"));
1934 exit (err
== 0 ? EXIT_SUCCESS
: EXIT_FAILURE
);