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>
28 #include "long-options.h"
31 /* The official name of this program (e.g., no `g' prefix). */
32 #define PROGRAM_NAME "od"
34 #if defined(__GNUC__) || defined(STDC_HEADERS)
38 #ifdef HAVE_LONG_DOUBLE
39 typedef long double LONG_DOUBLE;
41 typedef double LONG_DOUBLE;
49 # define MAX(a, b) ((a) > (b) ? (a) : (b))
53 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
56 /* The default number of input bytes per output line. */
57 #define DEFAULT_BYTES_PER_BLOCK 16
59 /* The number of decimal digits of precision in a float. */
64 /* The number of decimal digits of precision in a double. */
69 /* The number of decimal digits of precision in a long double. */
71 # define LDBL_DIG DBL_DIG
76 # define fseeko(Stream, Offset, Whence) (-1)
102 /* Each output format specification (from POSIX `-t spec' or from
103 old-style options) is represented by one of these structures. */
106 enum output_format fmt;
108 void (*print_function) ();
110 int hexl_mode_trailer;
114 /* The name this program was run with. */
117 /* Convert the number of 8-bit bytes of a binary representation to
118 the number of characters (digits + sign if the type is signed)
119 required to represent the same quantity in the specified base/type.
120 For example, a 32-bit (4-byte) quantity may require a field width
121 as wide as the following for these types:
125 8 unsigned hexadecimal */
127 static const unsigned int bytes_to_oct_digits[] =
128 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
130 static const unsigned int bytes_to_signed_dec_digits[] =
131 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
133 static const unsigned int bytes_to_unsigned_dec_digits[] =
134 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
136 static const unsigned int bytes_to_hex_digits[] =
137 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
139 /* Convert enum size_spec to the size of the named type. */
140 static const int width_bytes[] =
152 /* Names for some non-printing characters. */
153 static const char *const charname[33] =
155 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
156 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
157 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
158 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
162 /* A printf control string for printing a file offset. */
163 static const char *output_address_fmt_string;
165 /* FIXME: make this the number of octal digits in an unsigned long. */
166 #define MAX_ADDRESS_LENGTH 13
168 /* Space for a normal address, a space, a pseudo address, parentheses
169 around the pseudo address, and a trailing zero byte. */
170 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
171 static char address_pad[MAX_ADDRESS_LENGTH + 1];
173 static unsigned long int string_min;
174 static unsigned long int flag_dump_strings;
176 /* Non-zero if we should recognize the pre-POSIX non-option arguments
177 that specified at most one file and optional arguments specifying
178 offset and pseudo-start address. */
179 static int traditional;
181 /* Non-zero if an old-style `pseudo-address' was specified. */
182 static long int flag_pseudo_start;
184 /* The difference between the old-style pseudo starting address and
185 the number of bytes to skip. */
186 static long int pseudo_offset;
188 /* Function to format an address and optionally an additional parenthesized
189 pseudo-address; it returns the formatted string. */
190 static const char *(*format_address) PARAMS ((long unsigned int));
192 /* The number of input bytes to skip before formatting and writing. */
193 static off_t n_bytes_to_skip = 0;
195 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
196 to be read and formatted. Otherwise all input is formatted. */
197 static int limit_bytes_to_format = 0;
199 /* The maximum number of bytes that will be formatted. This
200 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
201 static off_t max_bytes_to_format;
203 /* When nonzero and two or more consecutive blocks are equal, format
204 only the first block and output an asterisk alone on the following
205 line to indicate that identical blocks have been elided. */
206 static int abbreviate_duplicate_blocks = 1;
208 /* An array of specs describing how to format each input block. */
209 static struct tspec *spec;
211 /* The number of format specs. */
212 static unsigned int n_specs;
214 /* The allocated length of SPEC. */
215 static unsigned int n_specs_allocated;
217 /* The number of input bytes formatted per output line. It must be
218 a multiple of the least common multiple of the sizes associated with
219 the specified output types. It should be as large as possible, but
220 no larger than 16 -- unless specified with the -w option. */
221 static unsigned int bytes_per_block;
223 /* Human-readable representation of *file_list (for error messages).
224 It differs from *file_list only when *file_list is "-". */
225 static char const *input_filename;
227 /* A NULL-terminated list of the file-arguments from the command line.
228 If no file-arguments were specified, this variable is initialized
230 static char const *const *file_list;
232 /* The input stream associated with the current file. */
233 static FILE *in_stream;
235 /* If nonzero, at least one of the files we read was standard input. */
236 static int have_read_stdin;
238 #define LONGEST_INTEGRAL_TYPE long int
240 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
241 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
243 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
244 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
246 static struct option const long_options[] =
249 {"skip-bytes", required_argument, NULL, 'j'},
250 {"address-radix", required_argument, NULL, 'A'},
251 {"read-bytes", required_argument, NULL, 'N'},
252 {"format", required_argument, NULL, 't'},
253 {"output-duplicates", no_argument, NULL, 'v'},
255 /* non-POSIX options. */
256 {"strings", optional_argument, NULL, 's'},
257 {"traditional", no_argument, NULL, 'B'},
258 {"width", optional_argument, NULL, 'w'},
266 fprintf (stderr, _("Try `%s --help' for more information.\n"),
271 Usage: %s [OPTION]... [FILE]...\n\
272 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
274 program_name, program_name);
276 Write an unambiguous representation, octal bytes by default, of FILE\n\
277 to standard output. With no FILE, or when FILE is -, read standard input.\n\
279 -A, --address-radix=RADIX decide how file offsets are printed\n\
280 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
281 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
282 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
283 -t, --format=TYPE select output format or formats\n\
284 -v, --output-duplicates do not use * to mark line suppression\n\
285 -w, --width[=BYTES] output BYTES bytes per output line\n\
286 --traditional accept arguments in pre-POSIX form\n\
287 --help display this help and exit\n\
288 --version output version information and exit\n\
290 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
291 -a same as -t a, select named characters\n\
292 -b same as -t oC, select octal bytes\n\
293 -c same as -t c, select ASCII characters or backslash escapes\n\
294 -d same as -t u2, select unsigned decimal shorts\n\
295 -f same as -t fF, select floats\n\
296 -h same as -t x2, select hexadecimal shorts\n\
297 -i same as -t d2, select decimal shorts\n\
298 -l same as -t d4, select decimal longs\n\
299 -o same as -t o2, select octal shorts\n\
300 -x same as -t x2, select hexadecimal shorts\n\
304 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
305 is the pseudo-address at first byte printed, incremented when dump is\n\
306 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
307 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
309 TYPE is made up of one or more of these specifications:\n\
312 c ASCII character or backslash escape\n\
313 d[SIZE] signed decimal, SIZE bytes per integer\n\
314 f[SIZE] floating point, SIZE bytes per integer\n\
315 o[SIZE] octal, SIZE bytes per integer\n\
316 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
317 x[SIZE] hexadecimal, SIZE bytes per integer\n\
319 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
320 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
321 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
322 for sizeof(double) or L for sizeof(long double).\n\
324 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
325 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
326 with b suffix, by 1024 with k and by 1048576 with m. Adding a z suffix to\n\
327 any type adds a display of printable characters to the end of each line\n\
328 of output. -s without a number implies 3. -w without a number implies 32.\n\
329 By default, od uses -A o -t d2 -w 16.\n\
331 puts (_("\nReport bugs to <bug-textutils@gnu.org>."));
333 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
336 /* Compute the greatest common denominator of U and V
337 using Euclid's algorithm. */
340 gcd (unsigned int u, unsigned int v)
352 /* Compute the least common multiple of U and V. */
355 lcm (unsigned int u, unsigned int v)
357 unsigned int t = gcd (u, v);
364 print_s_char (long unsigned int n_bytes, const char *block,
365 const char *fmt_string)
368 for (i = n_bytes; i > 0; i--)
370 int tmp = (unsigned) *(const unsigned char *) block;
372 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
373 assert (tmp <= SCHAR_MAX);
374 printf (fmt_string, tmp);
375 block += sizeof (unsigned char);
380 print_char (long unsigned int n_bytes, const char *block,
381 const char *fmt_string)
384 for (i = n_bytes; i > 0; i--)
386 unsigned int tmp = *(const unsigned char *) block;
387 printf (fmt_string, tmp);
388 block += sizeof (unsigned char);
393 print_s_short (long unsigned int n_bytes, const char *block,
394 const char *fmt_string)
397 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
399 int tmp = (unsigned) *(const unsigned short *) block;
401 tmp -= SHRT_MAX - SHRT_MIN + 1;
402 assert (tmp <= SHRT_MAX);
403 printf (fmt_string, tmp);
404 block += sizeof (unsigned short);
409 print_short (long unsigned int n_bytes, const char *block,
410 const char *fmt_string)
413 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
415 unsigned int tmp = *(const unsigned short *) block;
416 printf (fmt_string, tmp);
417 block += sizeof (unsigned short);
422 print_int (long unsigned int n_bytes, const char *block,
423 const char *fmt_string)
426 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
428 unsigned int tmp = *(const unsigned int *) block;
429 printf (fmt_string, tmp);
430 block += sizeof (unsigned int);
435 print_long (long unsigned int n_bytes, const char *block,
436 const char *fmt_string)
439 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
441 unsigned long tmp = *(const unsigned long *) block;
442 printf (fmt_string, tmp);
443 block += sizeof (unsigned long);
448 print_float (long unsigned int n_bytes, const char *block,
449 const char *fmt_string)
452 for (i = n_bytes / sizeof (float); i > 0; i--)
454 float tmp = *(const float *) block;
455 printf (fmt_string, tmp);
456 block += sizeof (float);
461 print_double (long unsigned int n_bytes, const char *block,
462 const char *fmt_string)
465 for (i = n_bytes / sizeof (double); i > 0; i--)
467 double tmp = *(const double *) block;
468 printf (fmt_string, tmp);
469 block += sizeof (double);
473 #ifdef HAVE_LONG_DOUBLE
475 print_long_double (long unsigned int n_bytes, const char *block,
476 const char *fmt_string)
479 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
481 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
482 printf (fmt_string, tmp);
483 block += sizeof (LONG_DOUBLE);
490 dump_hexl_mode_trailer (long unsigned int n_bytes, const char *block)
493 fputs (" >", stdout);
494 for (i = n_bytes; i > 0; i--)
496 unsigned int c = *(const unsigned char *) block;
497 unsigned int c2 = (ISPRINT(c) ? c : '.');
499 block += sizeof (unsigned char);
505 print_named_ascii (long unsigned int n_bytes, const char *block,
506 const char *unused_fmt_string)
509 for (i = n_bytes; i > 0; i--)
511 unsigned int c = *(const unsigned char *) block;
512 unsigned int masked_c = (0x7f & c);
518 else if (masked_c <= 040)
519 s = charname[masked_c];
522 sprintf (buf, " %c", masked_c);
527 block += sizeof (unsigned char);
532 print_ascii (long unsigned int n_bytes, const char *block,
533 const char *unused_fmt_string)
536 for (i = n_bytes; i > 0; i--)
538 unsigned int c = *(const unsigned char *) block;
577 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
578 s = (const char *) buf;
582 block += sizeof (unsigned char);
586 /* Convert a null-terminated (possibly zero-length) string S to an
587 unsigned long integer value. If S points to a non-digit set *P to S,
588 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
589 the string of digits. If the string of digits represents a value
590 larger than ULONG_MAX, don't modify *VAL or *P and return nonzero.
591 Otherwise, advance *P to the first non-digit after S, set *VAL to
592 the result of the conversion and return zero. */
595 simple_strtoul (const char *s, const char **p, long unsigned int *val)
597 unsigned long int sum;
602 unsigned int c = *s++ - '0';
603 if (sum > (ULONG_MAX - c) / 10)
612 /* If S points to a single valid POSIX-style od format string, put
613 a description of that format in *TSPEC, make *NEXT point at the
614 character following the just-decoded format (if *NEXT is non-NULL),
615 and return zero. If S is not valid, don't modify *NEXT or *TSPEC,
616 give a diagnostic, and return nonzero. For example, if S were
617 "d4afL" *NEXT would be set to "afL" and *TSPEC would be
619 fmt = SIGNED_DECIMAL;
620 size = INT or LONG; (whichever integral_type_size[4] resolves to)
621 print_function = print_int; (assuming size == INT)
622 fmt_string = "%011d%c";
624 S_ORIG is solely for reporting errors. It should be the full format
629 decode_one_format (const char *s_orig, const char *s, const char **next,
632 enum size_spec size_spec;
633 unsigned long int size;
634 enum output_format fmt;
635 const char *pre_fmt_string;
637 void (*print_function) ();
640 unsigned int field_width = 0;
642 assert (tspec != NULL);
656 size = sizeof (char);
661 size = sizeof (short);
671 size = sizeof (long int);
675 if (simple_strtoul (s, &p, &size) != 0)
677 /* The integer at P in S would overflow an unsigned long.
678 A digit string that long is sufficiently odd looking
679 that the following diagnostic is sufficient. */
680 error (0, 0, _("invalid type string `%s'"), s_orig);
687 if (size > MAX_INTEGRAL_TYPE_SIZE
688 || integral_type_size[size] == NO_SIZE)
690 error (0, 0, _("invalid type string `%s';\n\
691 this system doesn't provide a %lu-byte integral type"), s_orig, size);
699 #define FMT_BYTES_ALLOCATED 9
700 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
702 size_spec = integral_type_size[size];
707 fmt = SIGNED_DECIMAL;
708 sprintf (fmt_string, " %%%u%sd",
709 (field_width = bytes_to_signed_dec_digits[size]),
710 (size_spec == LONG ? "l" : ""));
715 sprintf (fmt_string, " %%0%u%so",
716 (field_width = bytes_to_oct_digits[size]),
717 (size_spec == LONG ? "l" : ""));
721 fmt = UNSIGNED_DECIMAL;
722 sprintf (fmt_string, " %%%u%su",
723 (field_width = bytes_to_unsigned_dec_digits[size]),
724 (size_spec == LONG ? "l" : ""));
729 sprintf (fmt_string, " %%0%u%sx",
730 (field_width = bytes_to_hex_digits[size]),
731 (size_spec == LONG ? "l" : ""));
738 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
743 print_function = (fmt == SIGNED_DECIMAL
749 print_function = (fmt == SIGNED_DECIMAL
755 print_function = print_int;
759 print_function = print_long;
768 fmt = FLOATING_POINT;
774 size = sizeof (float);
779 size = sizeof (double);
784 size = sizeof (LONG_DOUBLE);
788 if (simple_strtoul (s, &p, &size) != 0)
790 /* The integer at P in S would overflow an unsigned long.
791 A digit string that long is sufficiently odd looking
792 that the following diagnostic is sufficient. */
793 error (0, 0, _("invalid type string `%s'"), s_orig);
797 size = sizeof (double);
800 if (size > MAX_FP_TYPE_SIZE
801 || fp_type_size[size] == NO_SIZE)
803 error (0, 0, _("invalid type string `%s';\n\
804 this system doesn't provide a %lu-byte floating point type"), s_orig, size);
811 size_spec = fp_type_size[size];
816 print_function = print_float;
817 /* Don't use %#e; not all systems support it. */
818 pre_fmt_string = " %%%d.%de";
819 fmt_string = xmalloc (strlen (pre_fmt_string));
820 sprintf (fmt_string, pre_fmt_string,
821 (field_width = FLT_DIG + 8), FLT_DIG);
825 print_function = print_double;
826 pre_fmt_string = " %%%d.%de";
827 fmt_string = xmalloc (strlen (pre_fmt_string));
828 sprintf (fmt_string, pre_fmt_string,
829 (field_width = DBL_DIG + 8), DBL_DIG);
832 #ifdef HAVE_LONG_DOUBLE
833 case FLOAT_LONG_DOUBLE:
834 print_function = print_long_double;
835 pre_fmt_string = " %%%d.%dLe";
836 fmt_string = xmalloc (strlen (pre_fmt_string));
837 sprintf (fmt_string, pre_fmt_string,
838 (field_width = LDBL_DIG + 8), LDBL_DIG);
849 fmt = NAMED_CHARACTER;
852 print_function = print_named_ascii;
861 print_function = print_ascii;
866 error (0, 0, _("invalid character `%c' in type string `%s'"),
871 tspec->size = size_spec;
873 tspec->print_function = print_function;
874 tspec->fmt_string = fmt_string;
876 tspec->field_width = field_width;
877 tspec->hexl_mode_trailer = (*s == 'z');
878 if (tspec->hexl_mode_trailer)
887 /* Decode the POSIX-style od format string S. Append the decoded
888 representation to the global array SPEC, reallocating SPEC if
889 necessary. Return zero if S is valid, nonzero otherwise. */
892 decode_format_string (const char *s)
894 const char *s_orig = s;
902 if (decode_one_format (s_orig, s, &next, &tspec))
908 if (n_specs >= n_specs_allocated)
910 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
911 spec = (struct tspec *) xrealloc ((char *) spec,
913 * sizeof (struct tspec)));
916 memcpy ((char *) &spec[n_specs], (char *) &tspec,
917 sizeof (struct tspec));
924 /* Given a list of one or more input filenames FILE_LIST, set the global
925 file pointer IN_STREAM to position N_SKIP in the concatenation of
926 those files. If any file operation fails or if there are fewer than
927 N_SKIP bytes in the combined input, give an error message and return
928 nonzero. When possible, use seek- rather than read operations to
929 advance IN_STREAM. A file name of "-" is interpreted as standard
938 for ( /* empty */ ; *file_list != NULL; ++file_list)
940 struct stat file_stats;
943 if (STREQ (*file_list, "-"))
945 input_filename = _("standard input");
951 input_filename = *file_list;
952 in_stream = fopen (input_filename, "r");
953 if (in_stream == NULL)
955 error (0, errno, "%s", input_filename);
960 SET_BINARY (fileno (in_stream));
965 /* First try using fseek. For large offsets, this extra work is
966 worthwhile. If the offset is below some threshold it may be
967 more efficient to move the pointer by reading. There are two
968 issues when trying to use fseek:
969 - the file must be seekable.
970 - before seeking to the specified position, make sure
971 that the new position is in the current file.
972 Try to do that by getting file's size using fstat().
973 But that will work only for regular files and dirs. */
975 if (fstat (fileno (in_stream), &file_stats))
977 error (0, errno, "%s", input_filename);
982 /* The st_size field is valid only for regular files and
983 directories. FIXME: is the preceding true?
984 If the number of bytes left to skip is at least as large as
985 the size of the current file, we can decrement
986 n_skip and go on to the next file. */
987 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
989 if (n_skip >= file_stats.st_size)
991 n_skip -= file_stats.st_size;
992 if (in_stream != stdin && fclose (in_stream) == EOF)
994 error (0, errno, "%s", input_filename);
1001 /* Try fseeko if available, fseek otherwise. */
1002 if (fseeko (in_stream, n_skip, SEEK_SET) == 0
1003 || (n_skip <= LONG_MAX
1004 && fseek (in_stream, (long) n_skip, SEEK_SET) == 0))
1012 /* Seek didn't work or wasn't attempted; position the file pointer
1015 for (j = n_skip / BUFSIZ; j >= 0; j--)
1018 size_t n_bytes_to_read = (j > 0
1021 size_t n_bytes_read;
1022 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1023 n_skip -= n_bytes_read;
1024 if (n_bytes_read != n_bytes_to_read)
1033 error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1039 format_address_none (long unsigned int address)
1045 format_address_std (long unsigned int address)
1047 const char *address_string;
1049 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1050 address_string = address_fmt_buffer;
1051 return address_string;
1055 format_address_label (long unsigned int address)
1057 const char *address_string;
1058 assert (output_address_fmt_string != NULL);
1060 sprintf (address_fmt_buffer, output_address_fmt_string,
1061 address, address + pseudo_offset);
1062 address_string = address_fmt_buffer;
1063 return address_string;
1066 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1067 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1068 CURR_BLOCK in the concatenation of input files, and it is printed
1069 (optionally) only before the output line associated with the first
1070 format spec. When duplicate blocks are being abbreviated, the output
1071 for a sequence of identical input blocks is the output for the first
1072 block followed by an asterisk alone on a line. It is valid to compare
1073 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1074 That condition may be false only for the last input block -- and then
1075 only when it has not been padded to length BYTES_PER_BLOCK. */
1078 write_block (long unsigned int current_offset, long unsigned int n_bytes,
1079 const char *prev_block, const char *curr_block)
1081 static int first = 1;
1082 static int prev_pair_equal = 0;
1084 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1086 if (abbreviate_duplicate_blocks
1087 && !first && n_bytes == bytes_per_block
1088 && EQUAL_BLOCKS (prev_block, curr_block))
1090 if (prev_pair_equal)
1092 /* The two preceding blocks were equal, and the current
1093 block is the same as the last one, so print nothing. */
1098 prev_pair_equal = 1;
1105 prev_pair_equal = 0;
1106 for (i = 0; i < n_specs; i++)
1108 const char *addr_or_pad = (i == 0
1109 ? format_address (current_offset)
1112 fputs (addr_or_pad, stdout);
1113 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1114 if (spec[i].hexl_mode_trailer)
1116 /* space-pad out to full line width, then dump the trailer */
1117 int datum_width = width_bytes[spec[i].size];
1118 int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1119 int field_width = spec[i].field_width + 1;
1120 printf ("%*s", blank_fields * field_width, "");
1121 dump_hexl_mode_trailer (n_bytes, curr_block);
1129 /* Test whether there have been errors on in_stream, and close it if
1130 it is not standard input. Return nonzero if there has been an error
1131 on in_stream or stdout; return zero otherwise. This function will
1132 report more than one error only if both a read and a write error
1136 check_and_close (void)
1141 if (ferror (in_stream))
1143 error (0, errno, "%s", input_filename);
1144 if (in_stream != stdin)
1148 else if (in_stream != stdin && fclose (in_stream) == EOF)
1150 error (0, errno, "%s", input_filename);
1154 if (ferror (stdout))
1156 error (0, errno, _("standard output"));
1163 /* Read a single byte into *C from the concatenation of the input files
1164 named in the global array FILE_LIST. On the first call to this
1165 function, the global variable IN_STREAM is expected to be an open
1166 stream associated with the input file *FILE_LIST. If IN_STREAM is
1167 at end-of-file, close it and update the global variables IN_STREAM,
1168 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1169 the list. Then try to read a byte from the newly opened file.
1170 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1171 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1172 calls do likewise. The return value is nonzero if any errors
1173 occured, zero otherwise. */
1180 if (*file_list == NULL)
1189 *c = fgetc (in_stream);
1194 err |= check_and_close ();
1199 if (*file_list == NULL)
1202 if (STREQ (*file_list, "-"))
1204 input_filename = _("standard input");
1206 have_read_stdin = 1;
1210 input_filename = *file_list;
1211 in_stream = fopen (input_filename, "r");
1212 if (in_stream == NULL)
1214 error (0, errno, "%s", input_filename);
1218 SET_BINARY (fileno (in_stream));
1220 while (in_stream == NULL);
1224 /* Read N bytes into BLOCK from the concatenation of the input files
1225 named in the global array FILE_LIST. On the first call to this
1226 function, the global variable IN_STREAM is expected to be an open
1227 stream associated with the input file *FILE_LIST. On subsequent
1228 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1229 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1230 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1231 Then try to read the remaining bytes from the newly opened file.
1232 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1233 to the number of bytes read. If an error occurs, it will be detected
1234 through ferror when the stream is about to be closed. If there is an
1235 error, give a message but continue reading as usual and return nonzero.
1236 Otherwise return zero. */
1239 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1243 assert (n > 0 && n <= bytes_per_block);
1245 *n_bytes_in_buffer = 0;
1250 if (*file_list == NULL)
1251 return 0; /* EOF. */
1259 n_needed = n - *n_bytes_in_buffer;
1260 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1262 *n_bytes_in_buffer += n_read;
1264 if (n_read == n_needed)
1267 err |= check_and_close ();
1272 if (*file_list == NULL)
1275 if (STREQ (*file_list, "-"))
1277 input_filename = _("standard input");
1279 have_read_stdin = 1;
1283 input_filename = *file_list;
1284 in_stream = fopen (input_filename, "r");
1285 if (in_stream == NULL)
1287 error (0, errno, "%s", input_filename);
1291 SET_BINARY (fileno (in_stream));
1293 while (in_stream == NULL);
1297 /* Return the least common multiple of the sizes associated
1298 with the format specs. */
1306 for (i = 0; i < n_specs; i++)
1307 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1311 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1312 return the offset it denotes. Otherwise, return -1. */
1315 parse_old_offset (const char *s)
1319 enum strtol_error s_err;
1320 long unsigned int tmp;
1325 /* Skip over any leading '+'. */
1329 /* Determine the radix we'll use to interpret S. If there is a `.',
1330 it's decimal, otherwise, if the string begins with `0X'or `0x',
1331 it's hexadecimal, else octal. */
1332 if (strchr (s, '.') != NULL)
1336 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1342 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1343 if (s_err != LONGINT_OK)
1345 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1352 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1353 formatted block to standard output, and repeat until the specified
1354 maximum number of bytes has been read or until all input has been
1355 processed. If the last block read is smaller than BYTES_PER_BLOCK
1356 and its size is not a multiple of the size associated with a format
1357 spec, extend the input block with zero bytes until its length is a
1358 multiple of all format spec sizes. Write the final block. Finally,
1359 write on a line by itself the offset of the byte after the last byte
1360 read. Accumulate return values from calls to read_block and
1361 check_and_close, and if any was nonzero, return nonzero.
1362 Otherwise, return zero. */
1368 off_t current_offset;
1372 size_t n_bytes_read;
1374 #ifdef lint /* Suppress `used before initialized' warning. */
1378 block[0] = (char *) alloca (bytes_per_block);
1379 block[1] = (char *) alloca (bytes_per_block);
1381 current_offset = n_bytes_to_skip;
1385 if (limit_bytes_to_format)
1387 end_offset = n_bytes_to_skip + max_bytes_to_format;
1392 if (current_offset >= end_offset)
1397 n_needed = MIN (end_offset - current_offset,
1398 (off_t) bytes_per_block);
1399 err |= read_block (n_needed, block[idx], &n_bytes_read);
1400 if (n_bytes_read < bytes_per_block)
1402 assert (n_bytes_read == bytes_per_block);
1403 write_block (current_offset, n_bytes_read,
1404 block[!idx], block[idx]);
1405 current_offset += n_bytes_read;
1413 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1414 if (n_bytes_read < bytes_per_block)
1416 assert (n_bytes_read == bytes_per_block);
1417 write_block (current_offset, n_bytes_read,
1418 block[!idx], block[idx]);
1419 current_offset += n_bytes_read;
1424 if (n_bytes_read > 0)
1427 size_t bytes_to_write;
1431 /* Make bytes_to_write the smallest multiple of l_c_m that
1432 is at least as large as n_bytes_read. */
1433 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1435 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1436 write_block (current_offset, bytes_to_write,
1437 block[!idx], block[idx]);
1438 current_offset += n_bytes_read;
1441 if (output_address_fmt_string != NULL)
1442 printf ("%s\n", format_address (current_offset));
1444 if (limit_bytes_to_format && current_offset > end_offset)
1445 err |= check_and_close ();
1450 /* STRINGS mode. Find each "string constant" in the input.
1451 A string constant is a run of at least `string_min' ASCII
1452 graphic (or formatting) characters terminated by a null.
1453 Based on a function written by Richard Stallman for a
1454 pre-POSIX version of od. Return nonzero if an error
1455 occurs. Otherwise, return zero. */
1460 size_t bufsize = MAX (100, string_min);
1461 char *buf = xmalloc (bufsize);
1462 off_t address = n_bytes_to_skip;
1471 /* See if the next `string_min' chars are all printing chars. */
1474 if (limit_bytes_to_format
1475 && address >= (n_bytes_to_skip + max_bytes_to_format -
1476 (off_t) string_min))
1479 for (i = 0; i < string_min; i++)
1481 err |= read_char (&c);
1489 /* Found a non-printing. Try again starting with next char. */
1494 /* We found a run of `string_min' printable characters.
1495 Now see if it is terminated with a null byte. */
1496 while (!limit_bytes_to_format
1497 || address < n_bytes_to_skip + max_bytes_to_format)
1501 bufsize = 1 + 3 * bufsize / 2;
1502 buf = xrealloc (buf, bufsize);
1504 err |= read_char (&c);
1512 break; /* It is; print this string. */
1514 goto tryline; /* It isn't; give up on this string. */
1515 buf[i++] = c; /* String continues; store it all. */
1518 /* If we get here, the string is all printable and null-terminated,
1519 so print it. It is all in `buf' and `i' is its length. */
1521 if (output_address_fmt_string != NULL)
1523 printf ("%s ", format_address (address - i - 1));
1525 for (i = 0; (c = buf[i]); i++)
1530 fputs ("\\a", stdout);
1534 fputs ("\\b", stdout);
1538 fputs ("\\f", stdout);
1542 fputs ("\\n", stdout);
1546 fputs ("\\r", stdout);
1550 fputs ("\\t", stdout);
1554 fputs ("\\v", stdout);
1564 /* We reach this point only if we search through
1565 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1569 err |= check_and_close ();
1574 main (int argc, char **argv)
1580 unsigned int address_pad_len;
1581 unsigned long int desired_width;
1582 int width_specified = 0;
1583 int n_failed_decodes = 0;
1586 /* The old-style `pseudo starting address' to be printed in parentheses
1587 after any true address. */
1588 long int pseudo_start;
1590 #ifdef lint /* Suppress `used before initialized' warning. */
1594 program_name = argv[0];
1595 setlocale (LC_ALL, "");
1596 bindtextdomain (PACKAGE, LOCALEDIR);
1597 textdomain (PACKAGE);
1599 parse_long_options (argc, argv, "od", GNU_PACKAGE, VERSION,
1600 "Jim Meyering", usage);
1604 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1605 integral_type_size[i] = NO_SIZE;
1607 integral_type_size[sizeof (char)] = CHAR;
1608 integral_type_size[sizeof (short int)] = SHORT;
1609 integral_type_size[sizeof (int)] = INT;
1610 integral_type_size[sizeof (long int)] = LONG;
1612 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1613 fp_type_size[i] = NO_SIZE;
1615 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1616 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1617 so that if `long double' is the same type or if long double isn't
1618 supported FLOAT_LONG_DOUBLE will never be used. */
1619 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1620 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1623 n_specs_allocated = 5;
1624 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1626 output_address_fmt_string = "%07o";
1627 format_address = format_address_std;
1628 address_pad_len = 7;
1629 flag_dump_strings = 0;
1631 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1632 long_options, NULL)) != -1)
1634 unsigned long int tmp;
1635 enum strtol_error s_err;
1646 output_address_fmt_string = "%07d";
1647 format_address = format_address_std;
1648 address_pad_len = 7;
1651 output_address_fmt_string = "%07o";
1652 format_address = format_address_std;
1653 address_pad_len = 7;
1656 output_address_fmt_string = "%06x";
1657 format_address = format_address_std;
1658 address_pad_len = 6;
1661 output_address_fmt_string = NULL;
1662 format_address = format_address_none;
1663 address_pad_len = 0;
1666 error (EXIT_FAILURE, 0,
1667 _("invalid output address radix `%c'; \
1668 it must be one character from [doxn]"),
1675 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1676 n_bytes_to_skip = tmp;
1677 if (s_err != LONGINT_OK)
1678 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1682 limit_bytes_to_format = 1;
1684 /* FIXME: if off_t is long long and that's an 8-byte type,
1685 use xstrtouq here. */
1686 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1687 max_bytes_to_format = tmp;
1688 if (s_err != LONGINT_OK)
1689 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1692 error (EXIT_FAILURE, 0,
1693 _("specified number of bytes `%s' is larger than \
1694 the maximum\nrepresentable value of type `long'"), optarg);
1702 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1703 if (s_err != LONGINT_OK)
1704 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1706 ++flag_dump_strings;
1710 if (decode_format_string (optarg))
1715 abbreviate_duplicate_blocks = 0;
1722 /* The next several cases map the old, pre-POSIX format
1723 specification options to the corresponding POSIX format
1724 specs. GNU od accepts any combination of old- and
1725 new-style options. Format specification options accumulate. */
1727 #define CASE_OLD_ARG(old_char,new_string) \
1730 if (decode_format_string (new_string)) \
1731 ++n_failed_decodes; \
1735 CASE_OLD_ARG ('a', "a");
1736 CASE_OLD_ARG ('b', "oC");
1737 CASE_OLD_ARG ('c', "c");
1738 CASE_OLD_ARG ('d', "u2");
1739 CASE_OLD_ARG ('f', "fF");
1740 CASE_OLD_ARG ('h', "x2");
1741 CASE_OLD_ARG ('i', "d2");
1742 CASE_OLD_ARG ('l', "d4");
1743 CASE_OLD_ARG ('o', "o2");
1744 CASE_OLD_ARG ('x', "x2");
1749 width_specified = 1;
1756 s_err = xstrtoul (optarg, NULL, 10, &desired_width, "");
1757 if (s_err != LONGINT_OK)
1758 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1768 if (n_failed_decodes > 0)
1769 exit (EXIT_FAILURE);
1771 if (flag_dump_strings && n_specs > 0)
1772 error (EXIT_FAILURE, 0,
1773 _("no type may be specified when dumping strings"));
1775 n_files = argc - optind;
1777 /* If the --backward-compatible option is used, there may be from
1778 0 to 3 remaining command line arguments; handle each case
1780 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1781 The offset and pseudo_start have the same syntax. */
1789 if ((offset = parse_old_offset (argv[optind])) >= 0)
1791 n_bytes_to_skip = offset;
1796 else if (n_files == 2)
1799 if ((o1 = parse_old_offset (argv[optind])) >= 0
1800 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1802 n_bytes_to_skip = o1;
1803 flag_pseudo_start = 1;
1808 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1810 n_bytes_to_skip = o2;
1812 argv[optind + 1] = argv[optind];
1818 _("invalid second operand in compatibility mode `%s'"),
1823 else if (n_files == 3)
1826 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1827 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1829 n_bytes_to_skip = o1;
1830 flag_pseudo_start = 1;
1832 argv[optind + 2] = argv[optind];
1839 _("in compatibility mode, the last two arguments must be offsets"));
1843 else if (n_files > 3)
1846 _("compatibility mode supports at most three arguments"));
1850 if (flag_pseudo_start)
1852 static char buf[10];
1854 if (output_address_fmt_string == NULL)
1856 output_address_fmt_string = "(%07o)";
1857 format_address = format_address_std;
1861 sprintf (buf, "%s (%s)",
1862 output_address_fmt_string,
1863 output_address_fmt_string);
1864 output_address_fmt_string = buf;
1865 format_address = format_address_label;
1870 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1871 for (i = 0; i < address_pad_len; i++)
1872 address_pad[i] = ' ';
1873 address_pad[address_pad_len] = '\0';
1877 if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1879 /* This happens on Cray systems that don't have a 2-byte
1881 exit (EXIT_FAILURE);
1888 file_list = (char const *const *) &argv[optind];
1891 /* If no files were listed on the command line, set up the
1892 global array FILE_LIST so that it contains the null-terminated
1893 list of one name: "-". */
1894 static char const *const default_file_list[] = {"-", NULL};
1896 file_list = default_file_list;
1899 err |= skip (n_bytes_to_skip);
1900 if (in_stream == NULL)
1903 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1905 /* Compute output block length. */
1908 if (width_specified)
1910 if (desired_width != 0 && desired_width % l_c_m == 0)
1911 bytes_per_block = desired_width;
1914 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1915 desired_width, l_c_m);
1916 bytes_per_block = l_c_m;
1921 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1922 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1924 bytes_per_block = l_c_m;
1928 for (i = 0; i < n_specs; i++)
1930 printf (_("%d: fmt=\"%s\" width=%d\n"),
1931 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1935 err |= (flag_dump_strings ? dump_strings () : dump ());
1939 if (have_read_stdin && fclose (stdin) == EOF)
1940 error (EXIT_FAILURE, errno, _("standard input"));
1942 if (fclose (stdout) == EOF)
1943 error (EXIT_FAILURE, errno, _("write error"));
1945 exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);