1 /* od -- dump files in octal and other formats
2 Copyright (C) 92, 95, 96, 1997 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 #if defined(__GNUC__) || defined(STDC_HEADERS)
34 #ifdef HAVE_LONG_DOUBLE
35 typedef long double LONG_DOUBLE;
37 typedef double LONG_DOUBLE;
44 # define SCHAR_MAX 127
47 # define SCHAR_MIN (-128)
50 # define SHRT_MAX 32767
53 # define SHRT_MIN (-32768)
56 # define ULONG_MAX ((unsigned long) ~(unsigned long) 0)
64 # define BITSPERBYTE 8
67 #define STREQ(a,b) (strcmp((a), (b)) == 0)
70 # define MAX(a, b) ((a) > (b) ? (a) : (b))
74 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
77 #if defined (_WIN32) && defined (_O_BINARY)
78 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) \
80 { /* Turn off DOS text file modes, "rb" doesn't work on stdin. */\
81 if (_setmode (_fileno ((IN_STREAM)), _O_BINARY) == -1) \
83 error (0, errno, "%s", (FILENAME)); \
90 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) /* empty */
93 /* The default number of input bytes per output line. */
94 #define DEFAULT_BYTES_PER_BLOCK 16
96 /* The number of decimal digits of precision in a float. */
101 /* The number of decimal digits of precision in a double. */
106 /* The number of decimal digits of precision in a long double. */
108 # define LDBL_DIG DBL_DIG
137 /* Each output format specification (from POSIX `-t spec' or from
138 old-style options) is represented by one of these structures. */
141 enum output_format fmt;
143 void (*print_function) ();
145 int hexl_mode_trailer;
149 /* The name this program was run with. */
152 /* Convert the number of 8-bit bytes of a binary representation to
153 the number of characters (digits + sign if the type is signed)
154 required to represent the same quantity in the specified base/type.
155 For example, a 32-bit (4-byte) quantity may require a field width
156 as wide as the following for these types:
160 8 unsigned hexadecimal */
162 static const unsigned int bytes_to_oct_digits[] =
163 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
165 static const unsigned int bytes_to_signed_dec_digits[] =
166 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
168 static const unsigned int bytes_to_unsigned_dec_digits[] =
169 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
171 static const unsigned int bytes_to_hex_digits[] =
172 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
174 /* Convert enum size_spec to the size of the named type. */
175 static const int width_bytes[] =
187 /* Names for some non-printing characters. */
188 static const char *const charname[33] =
190 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
191 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
192 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
193 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
197 /* A printf control string for printing a file offset. */
198 static const char *output_address_fmt_string;
200 /* FIXME: make this the number of octal digits in an unsigned long. */
201 #define MAX_ADDRESS_LENGTH 13
203 /* Space for a normal address, a space, a pseudo address, parentheses
204 around the pseudo address, and a trailing zero byte. */
205 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
206 static char address_pad[MAX_ADDRESS_LENGTH + 1];
208 static unsigned long int string_min;
209 static unsigned long int flag_dump_strings;
211 /* Non-zero if we should recognize the pre-POSIX non-option arguments
212 that specified at most one file and optional arguments specifying
213 offset and pseudo-start address. */
214 static int traditional;
216 /* Non-zero if an old-style `pseudo-address' was specified. */
217 static long int flag_pseudo_start;
219 /* The difference between the old-style pseudo starting address and
220 the number of bytes to skip. */
221 static long int pseudo_offset;
223 /* Function to format an address and optionally an additional parenthesized
224 pseudo-address; it returns the formatted string. */
225 static const char *(*format_address) __P ((long unsigned int));
227 /* The number of input bytes to skip before formatting and writing. */
228 static off_t n_bytes_to_skip = 0;
230 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
231 to be read and formatted. Otherwise all input is formatted. */
232 static int limit_bytes_to_format = 0;
234 /* The maximum number of bytes that will be formatted. This
235 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
236 static off_t max_bytes_to_format;
238 /* When nonzero and two or more consecutive blocks are equal, format
239 only the first block and output an asterisk alone on the following
240 line to indicate that identical blocks have been elided. */
241 static int abbreviate_duplicate_blocks = 1;
243 /* An array of specs describing how to format each input block. */
244 static struct tspec *spec;
246 /* The number of format specs. */
247 static unsigned int n_specs;
249 /* The allocated length of SPEC. */
250 static unsigned int n_specs_allocated;
252 /* The number of input bytes formatted per output line. It must be
253 a multiple of the least common multiple of the sizes associated with
254 the specified output types. It should be as large as possible, but
255 no larger than 16 -- unless specified with the -w option. */
256 static unsigned int bytes_per_block;
258 /* Human-readable representation of *file_list (for error messages).
259 It differs from *file_list only when *file_list is "-". */
260 static char const *input_filename;
262 /* A NULL-terminated list of the file-arguments from the command line.
263 If no file-arguments were specified, this variable is initialized
265 static char const *const *file_list;
267 /* The input stream associated with the current file. */
268 static FILE *in_stream;
270 /* If nonzero, at least one of the files we read was standard input. */
271 static int have_read_stdin;
273 #define LONGEST_INTEGRAL_TYPE long int
275 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
276 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
278 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
279 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
281 /* If nonzero, display usage information and exit. */
282 static int show_help;
284 /* If nonzero, print the version on standard output then exit. */
285 static int show_version;
287 static struct option const long_options[] =
290 {"skip-bytes", required_argument, NULL, 'j'},
291 {"address-radix", required_argument, NULL, 'A'},
292 {"read-bytes", required_argument, NULL, 'N'},
293 {"format", required_argument, NULL, 't'},
294 {"output-duplicates", no_argument, NULL, 'v'},
296 /* non-POSIX options. */
297 {"strings", optional_argument, NULL, 's'},
298 {"traditional", no_argument, NULL, 'B'},
299 {"width", optional_argument, NULL, 'w'},
300 {"help", no_argument, &show_help, 1},
301 {"version", no_argument, &show_version, 1},
309 fprintf (stderr, _("Try `%s --help' for more information.\n"),
314 Usage: %s [OPTION]... [FILE]...\n\
315 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
317 program_name, program_name);
319 Write an unambiguous representation, octal bytes by default, of FILE\n\
320 to standard output. With no FILE, or when FILE is -, read standard input.\n\
322 -A, --address-radix=RADIX decide how file offsets are printed\n\
323 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
324 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
325 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
326 -t, --format=TYPE select output format or formats\n\
327 -v, --output-duplicates do not use * to mark line suppression\n\
328 -w, --width[=BYTES] output BYTES bytes per output line\n\
329 --traditional accept arguments in pre-POSIX form\n\
330 --help display this help and exit\n\
331 --version output version information and exit\n\
333 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
334 -a same as -t a, select named characters\n\
335 -b same as -t oC, select octal bytes\n\
336 -c same as -t c, select ASCII characters or backslash escapes\n\
337 -d same as -t u2, select unsigned decimal shorts\n\
338 -f same as -t fF, select floats\n\
339 -h same as -t x2, select hexadecimal shorts\n\
340 -i same as -t d2, select decimal shorts\n\
341 -l same as -t d4, select decimal longs\n\
342 -o same as -t o2, select octal shorts\n\
343 -x same as -t x2, select hexadecimal shorts\n\
347 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
348 is the pseudo-address at first byte printed, incremented when dump is\n\
349 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
350 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
352 TYPE is made up of one or more of these specifications:\n\
355 c ASCII character or backslash escape\n\
356 d[SIZE] signed decimal, SIZE bytes per integer\n\
357 f[SIZE] floating point, SIZE bytes per integer\n\
358 o[SIZE] octal, SIZE bytes per integer\n\
359 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
360 x[SIZE] hexadecimal, SIZE bytes per integer\n\
362 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
363 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
364 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
365 for sizeof(double) or L for sizeof(long double).\n\
367 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
368 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
369 with b suffix, by 1024 with k and by 1048576 with m. Adding a z suffix to\n\
370 any type adds a display of printable characters to the end of each line\n\
371 of output. -s without a number implies 3. -w without a number implies 32.\n\
372 By default, od uses -A o -t d2 -w 16.\n\
374 puts (_("\nReport bugs to <textutils-bugs@gnu.org>."));
376 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
379 /* Compute the greatest common denominator of U and V
380 using Euclid's algorithm. */
383 gcd (unsigned int u, unsigned int v)
395 /* Compute the least common multiple of U and V. */
398 lcm (unsigned int u, unsigned int v)
400 unsigned int t = gcd (u, v);
407 print_s_char (long unsigned int n_bytes, const char *block,
408 const char *fmt_string)
411 for (i = n_bytes; i > 0; i--)
413 int tmp = (unsigned) *(const unsigned char *) block;
415 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
416 assert (tmp <= SCHAR_MAX);
417 printf (fmt_string, tmp);
418 block += sizeof (unsigned char);
423 print_char (long unsigned int n_bytes, const char *block,
424 const char *fmt_string)
427 for (i = n_bytes; i > 0; i--)
429 unsigned int tmp = *(const unsigned char *) block;
430 printf (fmt_string, tmp);
431 block += sizeof (unsigned char);
436 print_s_short (long unsigned int n_bytes, const char *block,
437 const char *fmt_string)
440 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
442 int tmp = (unsigned) *(const unsigned short *) block;
444 tmp -= SHRT_MAX - SHRT_MIN + 1;
445 assert (tmp <= SHRT_MAX);
446 printf (fmt_string, tmp);
447 block += sizeof (unsigned short);
452 print_short (long unsigned int n_bytes, const char *block,
453 const char *fmt_string)
456 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
458 unsigned int tmp = *(const unsigned short *) block;
459 printf (fmt_string, tmp);
460 block += sizeof (unsigned short);
465 print_int (long unsigned int n_bytes, const char *block,
466 const char *fmt_string)
469 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
471 unsigned int tmp = *(const unsigned int *) block;
472 printf (fmt_string, tmp);
473 block += sizeof (unsigned int);
478 print_long (long unsigned int n_bytes, const char *block,
479 const char *fmt_string)
482 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
484 unsigned long tmp = *(const unsigned long *) block;
485 printf (fmt_string, tmp);
486 block += sizeof (unsigned long);
491 print_float (long unsigned int n_bytes, const char *block,
492 const char *fmt_string)
495 for (i = n_bytes / sizeof (float); i > 0; i--)
497 float tmp = *(const float *) block;
498 printf (fmt_string, tmp);
499 block += sizeof (float);
504 print_double (long unsigned int n_bytes, const char *block,
505 const char *fmt_string)
508 for (i = n_bytes / sizeof (double); i > 0; i--)
510 double tmp = *(const double *) block;
511 printf (fmt_string, tmp);
512 block += sizeof (double);
516 #ifdef HAVE_LONG_DOUBLE
518 print_long_double (long unsigned int n_bytes, const char *block,
519 const char *fmt_string)
522 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
524 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
525 printf (fmt_string, tmp);
526 block += sizeof (LONG_DOUBLE);
533 dump_hexl_mode_trailer (long unsigned int n_bytes, const char *block)
536 fputs (" >", stdout);
537 for (i = n_bytes; i > 0; i--)
539 unsigned int c = *(const unsigned char *) block;
540 unsigned int c2 = (ISPRINT(c) ? c : '.');
542 block += sizeof (unsigned char);
548 print_named_ascii (long unsigned int n_bytes, const char *block,
549 const char *unused_fmt_string)
552 for (i = n_bytes; i > 0; i--)
554 unsigned int c = *(const unsigned char *) block;
555 unsigned int masked_c = (0x7f & c);
561 else if (masked_c <= 040)
562 s = charname[masked_c];
565 sprintf (buf, " %c", masked_c);
570 block += sizeof (unsigned char);
575 print_ascii (long unsigned int n_bytes, const char *block,
576 const char *unused_fmt_string)
579 for (i = n_bytes; i > 0; i--)
581 unsigned int c = *(const unsigned char *) block;
620 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
621 s = (const char *) buf;
625 block += sizeof (unsigned char);
629 /* Convert a null-terminated (possibly zero-length) string S to an
630 unsigned long integer value. If S points to a non-digit set *P to S,
631 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
632 the string of digits. If the string of digits represents a value
633 larger than ULONG_MAX, don't modify *VAL or *P and return nonzero.
634 Otherwise, advance *P to the first non-digit after S, set *VAL to
635 the result of the conversion and return zero. */
638 simple_strtoul (const char *s, const char **p, long unsigned int *val)
640 unsigned long int sum;
645 unsigned int c = *s++ - '0';
646 if (sum > (ULONG_MAX - c) / 10)
655 /* If S points to a single valid POSIX-style od format string, put
656 a description of that format in *TSPEC, make *NEXT point at the
657 character following the just-decoded format (if *NEXT is non-NULL),
658 and return zero. If S is not valid, don't modify *NEXT or *TSPEC,
659 give a diagnostic, and return nonzero. For example, if S were
660 "d4afL" *NEXT would be set to "afL" and *TSPEC would be
662 fmt = SIGNED_DECIMAL;
663 size = INT or LONG; (whichever integral_type_size[4] resolves to)
664 print_function = print_int; (assuming size == INT)
665 fmt_string = "%011d%c";
667 S_ORIG is solely for reporting errors. It should be the full format
672 decode_one_format (const char *s_orig, const char *s, const char **next,
675 enum size_spec size_spec;
676 unsigned long int size;
677 enum output_format fmt;
678 const char *pre_fmt_string;
680 void (*print_function) ();
683 unsigned int field_width = 0;
685 assert (tspec != NULL);
699 size = sizeof (char);
704 size = sizeof (short);
714 size = sizeof (long int);
718 if (simple_strtoul (s, &p, &size) != 0)
720 /* The integer at P in S would overflow an unsigned long.
721 A digit string that long is sufficiently odd looking
722 that the following diagnostic is sufficient. */
723 error (0, 0, _("invalid type string `%s'"), s_orig);
730 if (size > MAX_INTEGRAL_TYPE_SIZE
731 || integral_type_size[size] == NO_SIZE)
733 error (0, 0, _("invalid type string `%s';\n\
734 this system doesn't provide a %lu-byte integral type"), s_orig, size);
742 #define FMT_BYTES_ALLOCATED 9
743 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
745 size_spec = integral_type_size[size];
750 fmt = SIGNED_DECIMAL;
751 sprintf (fmt_string, " %%%u%sd",
752 (field_width = bytes_to_signed_dec_digits[size]),
753 (size_spec == LONG ? "l" : ""));
758 sprintf (fmt_string, " %%0%u%so",
759 (field_width = bytes_to_oct_digits[size]),
760 (size_spec == LONG ? "l" : ""));
764 fmt = UNSIGNED_DECIMAL;
765 sprintf (fmt_string, " %%%u%su",
766 (field_width = bytes_to_unsigned_dec_digits[size]),
767 (size_spec == LONG ? "l" : ""));
772 sprintf (fmt_string, " %%0%u%sx",
773 (field_width = bytes_to_hex_digits[size]),
774 (size_spec == LONG ? "l" : ""));
781 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
786 print_function = (fmt == SIGNED_DECIMAL
792 print_function = (fmt == SIGNED_DECIMAL
798 print_function = print_int;
802 print_function = print_long;
811 fmt = FLOATING_POINT;
817 size = sizeof (float);
822 size = sizeof (double);
827 size = sizeof (LONG_DOUBLE);
831 if (simple_strtoul (s, &p, &size) != 0)
833 /* The integer at P in S would overflow an unsigned long.
834 A digit string that long is sufficiently odd looking
835 that the following diagnostic is sufficient. */
836 error (0, 0, _("invalid type string `%s'"), s_orig);
840 size = sizeof (double);
843 if (size > MAX_FP_TYPE_SIZE
844 || fp_type_size[size] == NO_SIZE)
846 error (0, 0, _("invalid type string `%s';\n\
847 this system doesn't provide a %lu-byte floating point type"), s_orig, size);
854 size_spec = fp_type_size[size];
859 print_function = print_float;
860 /* Don't use %#e; not all systems support it. */
861 pre_fmt_string = " %%%d.%de";
862 fmt_string = xmalloc (strlen (pre_fmt_string));
863 sprintf (fmt_string, pre_fmt_string,
864 (field_width = FLT_DIG + 8), FLT_DIG);
868 print_function = print_double;
869 pre_fmt_string = " %%%d.%de";
870 fmt_string = xmalloc (strlen (pre_fmt_string));
871 sprintf (fmt_string, pre_fmt_string,
872 (field_width = DBL_DIG + 8), DBL_DIG);
875 #ifdef HAVE_LONG_DOUBLE
876 case FLOAT_LONG_DOUBLE:
877 print_function = print_long_double;
878 pre_fmt_string = " %%%d.%dLe";
879 fmt_string = xmalloc (strlen (pre_fmt_string));
880 sprintf (fmt_string, pre_fmt_string,
881 (field_width = LDBL_DIG + 8), LDBL_DIG);
892 fmt = NAMED_CHARACTER;
895 print_function = print_named_ascii;
904 print_function = print_ascii;
909 error (0, 0, _("invalid character `%c' in type string `%s'"),
914 tspec->size = size_spec;
916 tspec->print_function = print_function;
917 tspec->fmt_string = fmt_string;
919 tspec->field_width = field_width;
920 tspec->hexl_mode_trailer = (*s == 'z');
921 if (tspec->hexl_mode_trailer)
930 /* Decode the POSIX-style od format string S. Append the decoded
931 representation to the global array SPEC, reallocating SPEC if
932 necessary. Return zero if S is valid, nonzero otherwise. */
935 decode_format_string (const char *s)
937 const char *s_orig = s;
945 if (decode_one_format (s_orig, s, &next, &tspec))
951 if (n_specs >= n_specs_allocated)
953 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
954 spec = (struct tspec *) xrealloc (spec, (n_specs_allocated
955 * sizeof (struct tspec)));
958 memcpy ((char *) &spec[n_specs], (char *) &tspec,
959 sizeof (struct tspec));
966 /* Given a list of one or more input filenames FILE_LIST, set the global
967 file pointer IN_STREAM to position N_SKIP in the concatenation of
968 those files. If any file operation fails or if there are fewer than
969 N_SKIP bytes in the combined input, give an error message and return
970 nonzero. When possible, use seek- rather than read operations to
971 advance IN_STREAM. A file name of "-" is interpreted as standard
980 for ( /* empty */ ; *file_list != NULL; ++file_list)
982 struct stat file_stats;
985 if (STREQ (*file_list, "-"))
987 input_filename = _("standard input");
993 input_filename = *file_list;
994 in_stream = fopen (input_filename, "r");
995 if (in_stream == NULL)
997 error (0, errno, "%s", input_filename);
1002 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1007 /* First try using fseek. For large offsets, this extra work is
1008 worthwhile. If the offset is below some threshold it may be
1009 more efficient to move the pointer by reading. There are two
1010 issues when trying to use fseek:
1011 - the file must be seekable.
1012 - before seeking to the specified position, make sure
1013 that the new position is in the current file.
1014 Try to do that by getting file's size using fstat().
1015 But that will work only for regular files and dirs. */
1017 if (fstat (fileno (in_stream), &file_stats))
1019 error (0, errno, "%s", input_filename);
1024 /* The st_size field is valid only for regular files and
1025 directories. FIXME: is the preceding true?
1026 If the number of bytes left to skip is at least as large as
1027 the size of the current file, we can decrement
1028 n_skip and go on to the next file. */
1029 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
1031 if (n_skip >= file_stats.st_size)
1033 n_skip -= file_stats.st_size;
1034 if (in_stream != stdin && fclose (in_stream) == EOF)
1036 error (0, errno, "%s", input_filename);
1043 /* fseek may work on some streams for which lseek doesn't.
1044 But fseek's offset argument is restricted to the range
1045 of type `long'. So if N_SKIP is too large or if fseek
1046 fails, try lseek. */
1047 if ((n_skip <= LONG_MAX
1048 && fseek (in_stream, (long) n_skip, SEEK_SET) == 0)
1049 || lseek (fileno (in_stream), n_skip, SEEK_SET) >= 0)
1057 /* Seek didn't work or wasn't attempted; position the file pointer
1060 for (j = n_skip / BUFSIZ; j >= 0; j--)
1063 size_t n_bytes_to_read = (j > 0
1066 size_t n_bytes_read;
1067 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1068 n_skip -= n_bytes_read;
1069 if (n_bytes_read != n_bytes_to_read)
1078 error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1084 format_address_none (long unsigned int address)
1090 format_address_std (long unsigned int address)
1092 const char *address_string;
1094 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1095 address_string = address_fmt_buffer;
1096 return address_string;
1100 format_address_label (long unsigned int address)
1102 const char *address_string;
1103 assert (output_address_fmt_string != NULL);
1105 sprintf (address_fmt_buffer, output_address_fmt_string,
1106 address, address + pseudo_offset);
1107 address_string = address_fmt_buffer;
1108 return address_string;
1111 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1112 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1113 CURR_BLOCK in the concatenation of input files, and it is printed
1114 (optionally) only before the output line associated with the first
1115 format spec. When duplicate blocks are being abbreviated, the output
1116 for a sequence of identical input blocks is the output for the first
1117 block followed by an asterisk alone on a line. It is valid to compare
1118 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1119 That condition may be false only for the last input block -- and then
1120 only when it has not been padded to length BYTES_PER_BLOCK. */
1123 write_block (long unsigned int current_offset, long unsigned int n_bytes,
1124 const char *prev_block, const char *curr_block)
1126 static int first = 1;
1127 static int prev_pair_equal = 0;
1129 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1131 if (abbreviate_duplicate_blocks
1132 && !first && n_bytes == bytes_per_block
1133 && EQUAL_BLOCKS (prev_block, curr_block))
1135 if (prev_pair_equal)
1137 /* The two preceding blocks were equal, and the current
1138 block is the same as the last one, so print nothing. */
1143 prev_pair_equal = 1;
1150 prev_pair_equal = 0;
1151 for (i = 0; i < n_specs; i++)
1153 const char *addr_or_pad = (i == 0
1154 ? format_address (current_offset)
1157 fputs (addr_or_pad, stdout);
1158 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1159 if (spec[i].hexl_mode_trailer)
1161 /* space-pad out to full line width, then dump the trailer */
1162 int datum_width = width_bytes[spec[i].size];
1163 int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1164 int field_width = spec[i].field_width + 1;
1165 printf ("%*s", blank_fields * field_width, "");
1166 dump_hexl_mode_trailer (n_bytes, curr_block);
1174 /* Test whether there have been errors on in_stream, and close it if
1175 it is not standard input. Return nonzero if there has been an error
1176 on in_stream or stdout; return zero otherwise. This function will
1177 report more than one error only if both a read and a write error
1181 check_and_close (void)
1186 if (ferror (in_stream))
1188 error (0, errno, "%s", input_filename);
1189 if (in_stream != stdin)
1193 else if (in_stream != stdin && fclose (in_stream) == EOF)
1195 error (0, errno, "%s", input_filename);
1199 if (ferror (stdout))
1201 error (0, errno, _("standard output"));
1208 /* Read a single byte into *C from the concatenation of the input files
1209 named in the global array FILE_LIST. On the first call to this
1210 function, the global variable IN_STREAM is expected to be an open
1211 stream associated with the input file *FILE_LIST. If IN_STREAM is
1212 at end-of-file, close it and update the global variables IN_STREAM,
1213 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1214 the list. Then try to read a byte from the newly opened file.
1215 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1216 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1217 calls do likewise. The return value is nonzero if any errors
1218 occured, zero otherwise. */
1225 if (*file_list == NULL)
1234 *c = fgetc (in_stream);
1239 err |= check_and_close ();
1244 if (*file_list == NULL)
1247 if (STREQ (*file_list, "-"))
1249 input_filename = _("standard input");
1251 have_read_stdin = 1;
1255 input_filename = *file_list;
1256 in_stream = fopen (input_filename, "r");
1257 if (in_stream == NULL)
1259 error (0, errno, "%s", input_filename);
1263 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1265 while (in_stream == NULL);
1269 /* Read N bytes into BLOCK from the concatenation of the input files
1270 named in the global array FILE_LIST. On the first call to this
1271 function, the global variable IN_STREAM is expected to be an open
1272 stream associated with the input file *FILE_LIST. On subsequent
1273 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1274 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1275 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1276 Then try to read the remaining bytes from the newly opened file.
1277 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1278 to the number of bytes read. If an error occurs, it will be detected
1279 through ferror when the stream is about to be closed. If there is an
1280 error, give a message but continue reading as usual and return nonzero.
1281 Otherwise return zero. */
1284 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1288 assert (n > 0 && n <= bytes_per_block);
1290 *n_bytes_in_buffer = 0;
1295 if (*file_list == NULL)
1296 return 0; /* EOF. */
1304 n_needed = n - *n_bytes_in_buffer;
1305 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1307 *n_bytes_in_buffer += n_read;
1309 if (n_read == n_needed)
1312 err |= check_and_close ();
1317 if (*file_list == NULL)
1320 if (STREQ (*file_list, "-"))
1322 input_filename = _("standard input");
1324 have_read_stdin = 1;
1328 input_filename = *file_list;
1329 in_stream = fopen (input_filename, "r");
1330 if (in_stream == NULL)
1332 error (0, errno, "%s", input_filename);
1336 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1338 while (in_stream == NULL);
1342 /* Return the least common multiple of the sizes associated
1343 with the format specs. */
1351 for (i = 0; i < n_specs; i++)
1352 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1356 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1357 return the offset it denotes. Otherwise, return -1. */
1360 parse_old_offset (const char *s)
1364 enum strtol_error s_err;
1365 long unsigned int tmp;
1370 /* Skip over any leading '+'. */
1374 /* Determine the radix we'll use to interpret S. If there is a `.',
1375 it's decimal, otherwise, if the string begins with `0X'or `0x',
1376 it's hexadecimal, else octal. */
1377 if (strchr (s, '.') != NULL)
1381 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1387 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1388 if (s_err != LONGINT_OK)
1390 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1397 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1398 formatted block to standard output, and repeat until the specified
1399 maximum number of bytes has been read or until all input has been
1400 processed. If the last block read is smaller than BYTES_PER_BLOCK
1401 and its size is not a multiple of the size associated with a format
1402 spec, extend the input block with zero bytes until its length is a
1403 multiple of all format spec sizes. Write the final block. Finally,
1404 write on a line by itself the offset of the byte after the last byte
1405 read. Accumulate return values from calls to read_block and
1406 check_and_close, and if any was nonzero, return nonzero.
1407 Otherwise, return zero. */
1413 off_t current_offset;
1417 size_t n_bytes_read;
1419 #ifdef lint /* Suppress `used before initialized' warning. */
1423 block[0] = (char *) alloca (bytes_per_block);
1424 block[1] = (char *) alloca (bytes_per_block);
1426 current_offset = n_bytes_to_skip;
1430 if (limit_bytes_to_format)
1432 end_offset = n_bytes_to_skip + max_bytes_to_format;
1437 if (current_offset >= end_offset)
1442 n_needed = MIN (end_offset - current_offset,
1443 (off_t) bytes_per_block);
1444 err |= read_block (n_needed, block[idx], &n_bytes_read);
1445 if (n_bytes_read < bytes_per_block)
1447 assert (n_bytes_read == bytes_per_block);
1448 write_block (current_offset, n_bytes_read,
1449 block[!idx], block[idx]);
1450 current_offset += n_bytes_read;
1458 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1459 if (n_bytes_read < bytes_per_block)
1461 assert (n_bytes_read == bytes_per_block);
1462 write_block (current_offset, n_bytes_read,
1463 block[!idx], block[idx]);
1464 current_offset += n_bytes_read;
1469 if (n_bytes_read > 0)
1472 size_t bytes_to_write;
1476 /* Make bytes_to_write the smallest multiple of l_c_m that
1477 is at least as large as n_bytes_read. */
1478 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1480 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1481 write_block (current_offset, bytes_to_write,
1482 block[!idx], block[idx]);
1483 current_offset += n_bytes_read;
1486 if (output_address_fmt_string != NULL)
1487 printf ("%s\n", format_address (current_offset));
1489 if (limit_bytes_to_format && current_offset > end_offset)
1490 err |= check_and_close ();
1495 /* STRINGS mode. Find each "string constant" in the input.
1496 A string constant is a run of at least `string_min' ASCII
1497 graphic (or formatting) characters terminated by a null.
1498 Based on a function written by Richard Stallman for a
1499 pre-POSIX version of od. Return nonzero if an error
1500 occurs. Otherwise, return zero. */
1505 size_t bufsize = MAX (100, string_min);
1506 char *buf = xmalloc (bufsize);
1507 off_t address = n_bytes_to_skip;
1516 /* See if the next `string_min' chars are all printing chars. */
1519 if (limit_bytes_to_format
1520 && address >= (n_bytes_to_skip + max_bytes_to_format -
1521 (off_t) string_min))
1524 for (i = 0; i < string_min; i++)
1526 err |= read_char (&c);
1534 /* Found a non-printing. Try again starting with next char. */
1539 /* We found a run of `string_min' printable characters.
1540 Now see if it is terminated with a null byte. */
1541 while (!limit_bytes_to_format
1542 || address < n_bytes_to_skip + max_bytes_to_format)
1546 bufsize = 1 + 3 * bufsize / 2;
1547 buf = xrealloc (buf, bufsize);
1549 err |= read_char (&c);
1557 break; /* It is; print this string. */
1559 goto tryline; /* It isn't; give up on this string. */
1560 buf[i++] = c; /* String continues; store it all. */
1563 /* If we get here, the string is all printable and null-terminated,
1564 so print it. It is all in `buf' and `i' is its length. */
1566 if (output_address_fmt_string != NULL)
1568 printf ("%s ", format_address (address - i - 1));
1570 for (i = 0; (c = buf[i]); i++)
1575 fputs ("\\a", stdout);
1579 fputs ("\\b", stdout);
1583 fputs ("\\f", stdout);
1587 fputs ("\\n", stdout);
1591 fputs ("\\r", stdout);
1595 fputs ("\\t", stdout);
1599 fputs ("\\v", stdout);
1609 /* We reach this point only if we search through
1610 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1614 err |= check_and_close ();
1619 main (int argc, char **argv)
1625 unsigned int address_pad_len;
1626 unsigned long int desired_width;
1627 int width_specified = 0;
1628 int n_failed_decodes = 0;
1631 /* The old-style `pseudo starting address' to be printed in parentheses
1632 after any true address. */
1633 long int pseudo_start;
1635 #ifdef lint /* Suppress `used before initialized' warning. */
1639 program_name = argv[0];
1640 setlocale (LC_ALL, "");
1641 bindtextdomain (PACKAGE, LOCALEDIR);
1642 textdomain (PACKAGE);
1646 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1647 integral_type_size[i] = NO_SIZE;
1649 integral_type_size[sizeof (char)] = CHAR;
1650 integral_type_size[sizeof (short int)] = SHORT;
1651 integral_type_size[sizeof (int)] = INT;
1652 integral_type_size[sizeof (long int)] = LONG;
1654 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1655 fp_type_size[i] = NO_SIZE;
1657 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1658 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1659 so that if `long double' is the same type or if long double isn't
1660 supported FLOAT_LONG_DOUBLE will never be used. */
1661 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1662 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1665 n_specs_allocated = 5;
1666 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1668 output_address_fmt_string = "%07o";
1669 format_address = format_address_std;
1670 address_pad_len = 7;
1671 flag_dump_strings = 0;
1673 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1674 long_options, NULL)) != -1)
1676 unsigned long int tmp;
1677 enum strtol_error s_err;
1688 output_address_fmt_string = "%07d";
1689 format_address = format_address_std;
1690 address_pad_len = 7;
1693 output_address_fmt_string = "%07o";
1694 format_address = format_address_std;
1695 address_pad_len = 7;
1698 output_address_fmt_string = "%06x";
1699 format_address = format_address_std;
1700 address_pad_len = 6;
1703 output_address_fmt_string = NULL;
1704 format_address = format_address_none;
1705 address_pad_len = 0;
1708 error (EXIT_FAILURE, 0,
1709 _("invalid output address radix `%c'; \
1710 it must be one character from [doxn]"),
1717 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1718 n_bytes_to_skip = tmp;
1719 if (s_err != LONGINT_OK)
1720 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1724 limit_bytes_to_format = 1;
1726 /* FIXME: if off_t is long long and that's an 8-byte type,
1727 use xstrtouq here. */
1728 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1729 max_bytes_to_format = tmp;
1730 if (s_err != LONGINT_OK)
1731 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1734 error (EXIT_FAILURE, 0,
1735 _("specified number of bytes `%s' is larger than \
1736 the maximum\nrepresentable value of type `long'"), optarg);
1744 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1745 if (s_err != LONGINT_OK)
1746 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1748 ++flag_dump_strings;
1752 if (decode_format_string (optarg))
1757 abbreviate_duplicate_blocks = 0;
1764 /* The next several cases map the old, pre-POSIX format
1765 specification options to the corresponding POSIX format
1766 specs. GNU od accepts any combination of old- and
1767 new-style options. Format specification options accumulate. */
1769 #define CASE_OLD_ARG(old_char,new_string) \
1772 if (decode_format_string (new_string)) \
1773 ++n_failed_decodes; \
1777 CASE_OLD_ARG ('a', "a");
1778 CASE_OLD_ARG ('b', "oC");
1779 CASE_OLD_ARG ('c', "c");
1780 CASE_OLD_ARG ('d', "u2");
1781 CASE_OLD_ARG ('f', "fF");
1782 CASE_OLD_ARG ('h', "x2");
1783 CASE_OLD_ARG ('i', "d2");
1784 CASE_OLD_ARG ('l', "d4");
1785 CASE_OLD_ARG ('o', "o2");
1786 CASE_OLD_ARG ('x', "x2");
1791 width_specified = 1;
1798 s_err = xstrtoul (optarg, NULL, 10, &desired_width, "");
1799 if (s_err != LONGINT_OK)
1800 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1810 if (n_failed_decodes > 0)
1811 exit (EXIT_FAILURE);
1815 printf ("od (%s) %s\n", GNU_PACKAGE, VERSION);
1816 exit (EXIT_SUCCESS);
1822 if (flag_dump_strings && n_specs > 0)
1823 error (EXIT_FAILURE, 0,
1824 _("no type may be specified when dumping strings"));
1826 n_files = argc - optind;
1828 /* If the --backward-compatible option is used, there may be from
1829 0 to 3 remaining command line arguments; handle each case
1831 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1832 The offset and pseudo_start have the same syntax. */
1840 if ((offset = parse_old_offset (argv[optind])) >= 0)
1842 n_bytes_to_skip = offset;
1847 else if (n_files == 2)
1850 if ((o1 = parse_old_offset (argv[optind])) >= 0
1851 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1853 n_bytes_to_skip = o1;
1854 flag_pseudo_start = 1;
1859 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1861 n_bytes_to_skip = o2;
1863 argv[optind + 1] = argv[optind];
1869 _("invalid second operand in compatibility mode `%s'"),
1874 else if (n_files == 3)
1877 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1878 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1880 n_bytes_to_skip = o1;
1881 flag_pseudo_start = 1;
1883 argv[optind + 2] = argv[optind];
1890 _("in compatibility mode, the last two arguments must be offsets"));
1894 else if (n_files > 3)
1897 _("compatibility mode supports at most three arguments"));
1901 if (flag_pseudo_start)
1903 static char buf[10];
1905 if (output_address_fmt_string == NULL)
1907 output_address_fmt_string = "(%07o)";
1908 format_address = format_address_std;
1912 sprintf (buf, "%s (%s)",
1913 output_address_fmt_string,
1914 output_address_fmt_string);
1915 output_address_fmt_string = buf;
1916 format_address = format_address_label;
1921 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1922 for (i = 0; i < address_pad_len; i++)
1923 address_pad[i] = ' ';
1924 address_pad[address_pad_len] = '\0';
1928 if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1930 /* This happens on Cray systems that don't have a 2-byte
1932 exit (EXIT_FAILURE);
1939 file_list = (char const *const *) &argv[optind];
1942 /* If no files were listed on the command line, set up the
1943 global array FILE_LIST so that it contains the null-terminated
1944 list of one name: "-". */
1945 static char const *const default_file_list[] = {"-", NULL};
1947 file_list = default_file_list;
1950 err |= skip (n_bytes_to_skip);
1951 if (in_stream == NULL)
1954 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1956 /* Compute output block length. */
1959 if (width_specified)
1961 if (desired_width != 0 && desired_width % l_c_m == 0)
1962 bytes_per_block = desired_width;
1965 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1966 desired_width, l_c_m);
1967 bytes_per_block = l_c_m;
1972 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1973 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1975 bytes_per_block = l_c_m;
1979 for (i = 0; i < n_specs; i++)
1981 printf (_("%d: fmt=\"%s\" width=%d\n"),
1982 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1986 err |= (flag_dump_strings ? dump_strings () : dump ());
1990 if (have_read_stdin && fclose (stdin) == EOF)
1991 error (EXIT_FAILURE, errno, _("standard input"));
1993 if (fclose (stdout) == EOF)
1994 error (EXIT_FAILURE, errno, _("write error"));
1996 exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);