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
;
1368 size_t n_bytes_read
;
1370 #ifdef lint /* Suppress `used before initialized' warning. */
1374 block
[0] = (char *) alloca (bytes_per_block
);
1375 block
[1] = (char *) alloca (bytes_per_block
);
1377 current_offset
= n_bytes_to_skip
;
1381 if (limit_bytes_to_format
)
1383 end_offset
= n_bytes_to_skip
+ max_bytes_to_format
;
1388 if (current_offset
>= end_offset
)
1393 n_needed
= MIN (end_offset
- current_offset
,
1394 (off_t
) bytes_per_block
);
1395 err
|= read_block (n_needed
, block
[idx
], &n_bytes_read
);
1396 if (n_bytes_read
< bytes_per_block
)
1398 assert (n_bytes_read
== bytes_per_block
);
1399 write_block (current_offset
, n_bytes_read
,
1400 block
[!idx
], block
[idx
]);
1401 current_offset
+= n_bytes_read
;
1409 err
|= read_block (bytes_per_block
, block
[idx
], &n_bytes_read
);
1410 if (n_bytes_read
< bytes_per_block
)
1412 assert (n_bytes_read
== bytes_per_block
);
1413 write_block (current_offset
, n_bytes_read
,
1414 block
[!idx
], block
[idx
]);
1415 current_offset
+= n_bytes_read
;
1420 if (n_bytes_read
> 0)
1423 size_t bytes_to_write
;
1427 /* Make bytes_to_write the smallest multiple of l_c_m that
1428 is at least as large as n_bytes_read. */
1429 bytes_to_write
= l_c_m
* (int) ((n_bytes_read
+ l_c_m
- 1) / l_c_m
);
1431 memset (block
[idx
] + n_bytes_read
, 0, bytes_to_write
- n_bytes_read
);
1432 write_block (current_offset
, bytes_to_write
,
1433 block
[!idx
], block
[idx
]);
1434 current_offset
+= n_bytes_read
;
1437 if (output_address_fmt_string
!= NULL
)
1438 printf ("%s\n", format_address (current_offset
));
1440 if (limit_bytes_to_format
&& current_offset
> end_offset
)
1441 err
|= check_and_close ();
1446 /* STRINGS mode. Find each "string constant" in the input.
1447 A string constant is a run of at least `string_min' ASCII
1448 graphic (or formatting) characters terminated by a null.
1449 Based on a function written by Richard Stallman for a
1450 pre-POSIX version of od. Return nonzero if an error
1451 occurs. Otherwise, return zero. */
1456 size_t bufsize
= MAX (100, string_min
);
1457 char *buf
= xmalloc (bufsize
);
1458 off_t address
= n_bytes_to_skip
;
1467 /* See if the next `string_min' chars are all printing chars. */
1470 if (limit_bytes_to_format
1471 && address
>= (n_bytes_to_skip
+ max_bytes_to_format
-
1472 (off_t
) string_min
))
1475 for (i
= 0; i
< string_min
; i
++)
1477 err
|= read_char (&c
);
1485 /* Found a non-printing. Try again starting with next char. */
1490 /* We found a run of `string_min' printable characters.
1491 Now see if it is terminated with a null byte. */
1492 while (!limit_bytes_to_format
1493 || address
< n_bytes_to_skip
+ max_bytes_to_format
)
1497 bufsize
= 1 + 3 * bufsize
/ 2;
1498 buf
= xrealloc (buf
, bufsize
);
1500 err
|= read_char (&c
);
1508 break; /* It is; print this string. */
1510 goto tryline
; /* It isn't; give up on this string. */
1511 buf
[i
++] = c
; /* String continues; store it all. */
1514 /* If we get here, the string is all printable and null-terminated,
1515 so print it. It is all in `buf' and `i' is its length. */
1517 if (output_address_fmt_string
!= NULL
)
1519 printf ("%s ", format_address (address
- i
- 1));
1521 for (i
= 0; (c
= buf
[i
]); i
++)
1526 fputs ("\\a", stdout
);
1530 fputs ("\\b", stdout
);
1534 fputs ("\\f", stdout
);
1538 fputs ("\\n", stdout
);
1542 fputs ("\\r", stdout
);
1546 fputs ("\\t", stdout
);
1550 fputs ("\\v", stdout
);
1560 /* We reach this point only if we search through
1561 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1565 err
|= check_and_close ();
1570 main (int argc
, char **argv
)
1576 unsigned int address_pad_len
;
1577 unsigned long int desired_width
;
1578 int width_specified
= 0;
1579 int n_failed_decodes
= 0;
1582 /* The old-style `pseudo starting address' to be printed in parentheses
1583 after any true address. */
1584 long int pseudo_start
;
1586 #ifdef lint /* Suppress `used before initialized' warning. */
1590 program_name
= argv
[0];
1591 setlocale (LC_ALL
, "");
1592 bindtextdomain (PACKAGE
, LOCALEDIR
);
1593 textdomain (PACKAGE
);
1597 for (i
= 0; i
<= MAX_INTEGRAL_TYPE_SIZE
; i
++)
1598 integral_type_size
[i
] = NO_SIZE
;
1600 integral_type_size
[sizeof (char)] = CHAR
;
1601 integral_type_size
[sizeof (short int)] = SHORT
;
1602 integral_type_size
[sizeof (int)] = INT
;
1603 integral_type_size
[sizeof (long int)] = LONG
;
1605 for (i
= 0; i
<= MAX_FP_TYPE_SIZE
; i
++)
1606 fp_type_size
[i
] = NO_SIZE
;
1608 fp_type_size
[sizeof (float)] = FLOAT_SINGLE
;
1609 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1610 so that if `long double' is the same type or if long double isn't
1611 supported FLOAT_LONG_DOUBLE will never be used. */
1612 fp_type_size
[sizeof (LONG_DOUBLE
)] = FLOAT_LONG_DOUBLE
;
1613 fp_type_size
[sizeof (double)] = FLOAT_DOUBLE
;
1616 n_specs_allocated
= 5;
1617 spec
= (struct tspec
*) xmalloc (n_specs_allocated
* sizeof (struct tspec
));
1619 output_address_fmt_string
= "%07o";
1620 format_address
= format_address_std
;
1621 address_pad_len
= 7;
1622 flag_dump_strings
= 0;
1624 while ((c
= getopt_long (argc
, argv
, "abcdfhilos::xw::A:j:N:t:v",
1625 long_options
, NULL
)) != -1)
1627 unsigned long int tmp
;
1628 enum strtol_error s_err
;
1639 output_address_fmt_string
= "%07d";
1640 format_address
= format_address_std
;
1641 address_pad_len
= 7;
1644 output_address_fmt_string
= "%07o";
1645 format_address
= format_address_std
;
1646 address_pad_len
= 7;
1649 output_address_fmt_string
= "%06x";
1650 format_address
= format_address_std
;
1651 address_pad_len
= 6;
1654 output_address_fmt_string
= NULL
;
1655 format_address
= format_address_none
;
1656 address_pad_len
= 0;
1659 error (EXIT_FAILURE
, 0,
1660 _("invalid output address radix `%c'; \
1661 it must be one character from [doxn]"),
1668 s_err
= xstrtoul (optarg
, NULL
, 0, &tmp
, "bkm");
1669 n_bytes_to_skip
= tmp
;
1670 if (s_err
!= LONGINT_OK
)
1671 STRTOL_FATAL_ERROR (optarg
, _("skip argument"), s_err
);
1675 limit_bytes_to_format
= 1;
1677 /* FIXME: if off_t is long long and that's an 8-byte type,
1678 use xstrtouq here. */
1679 s_err
= xstrtoul (optarg
, NULL
, 0, &tmp
, "bkm");
1680 max_bytes_to_format
= tmp
;
1681 if (s_err
!= LONGINT_OK
)
1682 STRTOL_FATAL_ERROR (optarg
, _("limit argument"), s_err
);
1685 error (EXIT_FAILURE
, 0,
1686 _("specified number of bytes `%s' is larger than \
1687 the maximum\nrepresentable value of type `long'"), optarg
);
1695 s_err
= xstrtoul (optarg
, NULL
, 0, &string_min
, "bkm");
1696 if (s_err
!= LONGINT_OK
)
1697 STRTOL_FATAL_ERROR (optarg
, _("minimum string length"), s_err
);
1699 ++flag_dump_strings
;
1703 if (decode_format_string (optarg
))
1708 abbreviate_duplicate_blocks
= 0;
1715 /* The next several cases map the old, pre-POSIX format
1716 specification options to the corresponding POSIX format
1717 specs. GNU od accepts any combination of old- and
1718 new-style options. Format specification options accumulate. */
1720 #define CASE_OLD_ARG(old_char,new_string) \
1723 if (decode_format_string (new_string)) \
1724 ++n_failed_decodes; \
1728 CASE_OLD_ARG ('a', "a");
1729 CASE_OLD_ARG ('b', "oC");
1730 CASE_OLD_ARG ('c', "c");
1731 CASE_OLD_ARG ('d', "u2");
1732 CASE_OLD_ARG ('f', "fF");
1733 CASE_OLD_ARG ('h', "x2");
1734 CASE_OLD_ARG ('i', "d2");
1735 CASE_OLD_ARG ('l', "d4");
1736 CASE_OLD_ARG ('o', "o2");
1737 CASE_OLD_ARG ('x', "x2");
1742 width_specified
= 1;
1749 s_err
= xstrtoul (optarg
, NULL
, 10, &desired_width
, "");
1750 if (s_err
!= LONGINT_OK
)
1751 STRTOL_FATAL_ERROR (optarg
, _("width specification"), s_err
);
1755 case_GETOPT_HELP_CHAR
;
1757 case_GETOPT_VERSION_CHAR (PROGRAM_NAME
, AUTHORS
);
1765 if (n_failed_decodes
> 0)
1766 exit (EXIT_FAILURE
);
1768 if (flag_dump_strings
&& n_specs
> 0)
1769 error (EXIT_FAILURE
, 0,
1770 _("no type may be specified when dumping strings"));
1772 n_files
= argc
- optind
;
1774 /* If the --backward-compatible option is used, there may be from
1775 0 to 3 remaining command line arguments; handle each case
1777 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1778 The offset and pseudo_start have the same syntax. */
1786 if ((offset
= parse_old_offset (argv
[optind
])) >= 0)
1788 n_bytes_to_skip
= offset
;
1793 else if (n_files
== 2)
1796 if ((o1
= parse_old_offset (argv
[optind
])) >= 0
1797 && (o2
= parse_old_offset (argv
[optind
+ 1])) >= 0)
1799 n_bytes_to_skip
= o1
;
1800 flag_pseudo_start
= 1;
1805 else if ((o2
= parse_old_offset (argv
[optind
+ 1])) >= 0)
1807 n_bytes_to_skip
= o2
;
1809 argv
[optind
+ 1] = argv
[optind
];
1815 _("invalid second operand in compatibility mode `%s'"),
1820 else if (n_files
== 3)
1823 if ((o1
= parse_old_offset (argv
[optind
+ 1])) >= 0
1824 && (o2
= parse_old_offset (argv
[optind
+ 2])) >= 0)
1826 n_bytes_to_skip
= o1
;
1827 flag_pseudo_start
= 1;
1829 argv
[optind
+ 2] = argv
[optind
];
1836 _("in compatibility mode, the last two arguments must be offsets"));
1840 else if (n_files
> 3)
1843 _("compatibility mode supports at most three arguments"));
1847 if (flag_pseudo_start
)
1849 static char buf
[10];
1851 if (output_address_fmt_string
== NULL
)
1853 output_address_fmt_string
= "(%07o)";
1854 format_address
= format_address_std
;
1858 sprintf (buf
, "%s (%s)",
1859 output_address_fmt_string
,
1860 output_address_fmt_string
);
1861 output_address_fmt_string
= buf
;
1862 format_address
= format_address_label
;
1867 assert (address_pad_len
<= MAX_ADDRESS_LENGTH
);
1868 for (i
= 0; i
< address_pad_len
; i
++)
1869 address_pad
[i
] = ' ';
1870 address_pad
[address_pad_len
] = '\0';
1874 if (decode_one_format ("o2", "o2", NULL
, &(spec
[0])))
1876 /* This happens on Cray systems that don't have a 2-byte
1878 exit (EXIT_FAILURE
);
1885 file_list
= (char const *const *) &argv
[optind
];
1888 /* If no files were listed on the command line, set up the
1889 global array FILE_LIST so that it contains the null-terminated
1890 list of one name: "-". */
1891 static char const *const default_file_list
[] = {"-", NULL
};
1893 file_list
= default_file_list
;
1896 err
|= skip (n_bytes_to_skip
);
1897 if (in_stream
== NULL
)
1900 pseudo_offset
= (flag_pseudo_start
? pseudo_start
- n_bytes_to_skip
: 0);
1902 /* Compute output block length. */
1905 if (width_specified
)
1907 if (desired_width
!= 0 && desired_width
% l_c_m
== 0)
1908 bytes_per_block
= desired_width
;
1911 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1912 desired_width
, l_c_m
);
1913 bytes_per_block
= l_c_m
;
1918 if (l_c_m
< DEFAULT_BYTES_PER_BLOCK
)
1919 bytes_per_block
= l_c_m
* (int) (DEFAULT_BYTES_PER_BLOCK
/ l_c_m
);
1921 bytes_per_block
= l_c_m
;
1925 for (i
= 0; i
< n_specs
; i
++)
1927 printf (_("%d: fmt=\"%s\" width=%d\n"),
1928 i
, spec
[i
].fmt_string
, width_bytes
[spec
[i
].size
]);
1932 err
|= (flag_dump_strings
? dump_strings () : dump ());
1936 if (have_read_stdin
&& fclose (stdin
) == EOF
)
1937 error (EXIT_FAILURE
, errno
, _("standard input"));
1939 if (fclose (stdout
) == EOF
)
1940 error (EXIT_FAILURE
, errno
, _("write error"));
1942 exit (err
== 0 ? EXIT_SUCCESS
: EXIT_FAILURE
);