1 /* od -- dump files in octal and other formats
2 Copyright (C) 92, 95, 1996 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. */
20 /* AIX requires this to be the first thing in the file. */
24 #define alloca __builtin_alloca
25 #else /* not __GNUC__ */
28 #else /* not HAVE_ALLOCA_H */
37 #endif /* not _WIN32 */
39 #endif /* not HAVE_ALLOCA_H */
40 #endif /* not __GNUC__ */
45 #include <sys/types.h>
50 #if defined(__GNUC__) || defined(STDC_HEADERS)
54 #ifdef HAVE_LONG_DOUBLE
55 typedef long double LONG_DOUBLE;
57 typedef double LONG_DOUBLE;
64 # define SCHAR_MAX 127
67 # define SCHAR_MIN (-128)
70 # define SHRT_MAX 32767
73 # define SHRT_MIN (-32768)
76 # define ULONG_MAX ((unsigned long) ~(unsigned long) 0)
84 # define BITSPERBYTE 8
88 # define OFF_T_MAX ((off_t)(~((unsigned long)1 << (sizeof (off_t)
92 #define STREQ(a,b) (strcmp((a), (b)) == 0)
95 # define MAX(a, b) ((a) > (b) ? (a) : (b))
99 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
102 #if defined (_WIN32) && defined (_O_BINARY)
103 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) \
105 { /* Turn off DOS text file modes, "rb" doesn't work on stdin. */\
106 if (_setmode (_fileno ((IN_STREAM)), _O_BINARY) == -1) \
108 error (0, errno, "%s", (FILENAME)); \
115 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) /* empty */
118 /* The default number of input bytes per output line. */
119 #define DEFAULT_BYTES_PER_BLOCK 16
121 /* The number of decimal digits of precision in a float. */
126 /* The number of decimal digits of precision in a double. */
131 /* The number of decimal digits of precision in a long double. */
133 # define LDBL_DIG DBL_DIG
162 /* Each output format specification (from POSIX `-t spec' or from
163 old-style options) is represented by one of these structures. */
166 enum output_format fmt;
168 void (*print_function) ();
172 /* The name this program was run with. */
175 /* Convert the number of 8-bit bytes of a binary representation to
176 the number of characters (digits + sign if the type is signed)
177 required to represent the same quantity in the specified base/type.
178 For example, a 32-bit (4-byte) quantity may require a field width
179 as wide as the following for these types:
183 8 unsigned hexadecimal */
185 static const unsigned int bytes_to_oct_digits[] =
186 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
188 static const unsigned int bytes_to_signed_dec_digits[] =
189 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
191 static const unsigned int bytes_to_unsigned_dec_digits[] =
192 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
194 static const unsigned int bytes_to_hex_digits[] =
195 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
197 /* Convert enum size_spec to the size of the named type. */
198 static const int width_bytes[] =
210 /* Names for some non-printing characters. */
211 static const char *const charname[33] =
213 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
214 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
215 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
216 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
220 /* A printf control string for printing a file offset. */
221 static const char *output_address_fmt_string;
223 /* FIXME: make this the number of octal digits in an unsigned long. */
224 #define MAX_ADDRESS_LENGTH 13
226 /* Space for a normal address, a space, a pseudo address, parentheses
227 around the pseudo address, and a trailing zero byte. */
228 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
229 static char address_pad[MAX_ADDRESS_LENGTH + 1];
231 static unsigned long int string_min;
232 static unsigned long int flag_dump_strings;
234 /* Non-zero if we should recognize the pre-POSIX non-option arguments
235 that specified at most one file and optional arguments specifying
236 offset and pseudo-start address. */
237 static int traditional;
239 /* Non-zero if an old-style `pseudo-address' was specified. */
240 static long int flag_pseudo_start;
242 /* The difference between the old-style pseudo starting address and
243 the number of bytes to skip. */
244 static long int pseudo_offset;
246 /* Function to format an address and optionally an additional parenthesized
247 pseudo-address; it returns the formatted string. */
248 static const char *(*format_address) __P ((long unsigned int));
250 /* The number of input bytes to skip before formatting and writing. */
251 static off_t n_bytes_to_skip = 0;
253 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
254 to be read and formatted. Otherwise all input is formatted. */
255 static int limit_bytes_to_format = 0;
257 /* The maximum number of bytes that will be formatted. This
258 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
259 static off_t max_bytes_to_format;
261 /* When nonzero and two or more consecutive blocks are equal, format
262 only the first block and output an asterisk alone on the following
263 line to indicate that identical blocks have been elided. */
264 static int abbreviate_duplicate_blocks = 1;
266 /* An array of specs describing how to format each input block. */
267 static struct tspec *spec;
269 /* The number of format specs. */
270 static unsigned int n_specs;
272 /* The allocated length of SPEC. */
273 static unsigned int n_specs_allocated;
275 /* The number of input bytes formatted per output line. It must be
276 a multiple of the least common multiple of the sizes associated with
277 the specified output types. It should be as large as possible, but
278 no larger than 16 -- unless specified with the -w option. */
279 static unsigned int bytes_per_block;
281 /* Human-readable representation of *file_list (for error messages).
282 It differs from *file_list only when *file_list is "-". */
283 static char const *input_filename;
285 /* A NULL-terminated list of the file-arguments from the command line.
286 If no file-arguments were specified, this variable is initialized
288 static char const *const *file_list;
290 /* The input stream associated with the current file. */
291 static FILE *in_stream;
293 /* If nonzero, at least one of the files we read was standard input. */
294 static int have_read_stdin;
296 #define LONGEST_INTEGRAL_TYPE long int
298 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
299 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
301 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
302 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
304 /* If nonzero, display usage information and exit. */
305 static int show_help;
307 /* If nonzero, print the version on standard output then exit. */
308 static int show_version;
310 static struct option const long_options[] =
313 {"skip-bytes", required_argument, NULL, 'j'},
314 {"address-radix", required_argument, NULL, 'A'},
315 {"read-bytes", required_argument, NULL, 'N'},
316 {"format", required_argument, NULL, 't'},
317 {"output-duplicates", no_argument, NULL, 'v'},
319 /* non-POSIX options. */
320 {"strings", optional_argument, NULL, 's'},
321 {"traditional", no_argument, NULL, 'B'},
322 {"width", optional_argument, NULL, 'w'},
323 {"help", no_argument, &show_help, 1},
324 {"version", no_argument, &show_version, 1},
332 fprintf (stderr, _("Try `%s --help' for more information.\n"),
337 Usage: %s [OPTION]... [FILE]...\n\
338 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
340 program_name, program_name);
342 Write an unambiguous representation, octal bytes by default, of FILE\n\
343 to standard output. With no FILE, or when FILE is -, read standard input.\n\
345 -A, --address-radix=RADIX decide how file offsets are printed\n\
346 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
347 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
348 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
349 -t, --format=TYPE select output format or formats\n\
350 -v, --output-duplicates do not use * to mark line suppression\n\
351 -w, --width[=BYTES] output BYTES bytes per output line\n\
352 --traditional accept arguments in pre-POSIX form\n\
353 --help display this help and exit\n\
354 --version output version information and exit\n\
356 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
357 -a same as -t a, select named characters\n\
358 -b same as -t oC, select octal bytes\n\
359 -c same as -t c, select ASCII characters or backslash escapes\n\
360 -d same as -t u2, select unsigned decimal shorts\n\
361 -f same as -t fF, select floats\n\
362 -h same as -t x2, select hexadecimal shorts\n\
363 -i same as -t d2, select decimal shorts\n\
364 -l same as -t d4, select decimal longs\n\
365 -o same as -t o2, select octal shorts\n\
366 -x same as -t x2, select hexadecimal shorts\n\
370 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
371 is the pseudo-address at first byte printed, incremented when dump is\n\
372 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
373 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
375 TYPE is made up of one or more of these specifications:\n\
378 c ASCII character or backslash escape\n\
379 d[SIZE] signed decimal, SIZE bytes per integer\n\
380 f[SIZE] floating point, SIZE bytes per integer\n\
381 o[SIZE] octal, SIZE bytes per integer\n\
382 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
383 x[SIZE] hexadecimal, SIZE bytes per integer\n\
385 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
386 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
387 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
388 for sizeof(double) or L for sizeof(long double).\n\
390 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
391 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
392 with b suffix, by 1024 with k and by 1048576 with m. -s without a\n\
393 number implies 3. -w without a number implies 32. By default, od\n\
394 uses -A o -t d2 -w 16.\n\
397 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
400 /* Compute the greatest common denominator of U and V
401 using Euclid's algorithm. */
404 gcd (unsigned int u, unsigned int v)
416 /* Compute the least common multiple of U and V. */
419 lcm (unsigned int u, unsigned int v)
421 unsigned int t = gcd (u, v);
428 print_s_char (long unsigned int n_bytes, const char *block,
429 const char *fmt_string)
432 for (i = n_bytes; i > 0; i--)
434 int tmp = (unsigned) *(const unsigned char *) block;
436 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
437 assert (tmp <= SCHAR_MAX);
438 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
439 block += sizeof (unsigned char);
444 print_char (long unsigned int n_bytes, const char *block,
445 const char *fmt_string)
448 for (i = n_bytes; i > 0; i--)
450 unsigned int tmp = *(const unsigned char *) block;
451 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
452 block += sizeof (unsigned char);
457 print_s_short (long unsigned int n_bytes, const char *block,
458 const char *fmt_string)
461 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
463 int tmp = (unsigned) *(const unsigned short *) block;
465 tmp -= SHRT_MAX - SHRT_MIN + 1;
466 assert (tmp <= SHRT_MAX);
467 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
468 block += sizeof (unsigned short);
472 print_short (long unsigned int n_bytes, const char *block,
473 const char *fmt_string)
476 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
478 unsigned int tmp = *(const unsigned short *) block;
479 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
480 block += sizeof (unsigned short);
485 print_int (long unsigned int n_bytes, const char *block,
486 const char *fmt_string)
489 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
491 unsigned int tmp = *(const unsigned int *) block;
492 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
493 block += sizeof (unsigned int);
498 print_long (long unsigned int n_bytes, const char *block,
499 const char *fmt_string)
502 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
504 unsigned long tmp = *(const unsigned long *) block;
505 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
506 block += sizeof (unsigned long);
511 print_float (long unsigned int n_bytes, const char *block,
512 const char *fmt_string)
515 for (i = n_bytes / sizeof (float); i > 0; i--)
517 float tmp = *(const float *) block;
518 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
519 block += sizeof (float);
524 print_double (long unsigned int n_bytes, const char *block,
525 const char *fmt_string)
528 for (i = n_bytes / sizeof (double); i > 0; i--)
530 double tmp = *(const double *) block;
531 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
532 block += sizeof (double);
536 #ifdef HAVE_LONG_DOUBLE
538 print_long_double (long unsigned int n_bytes, const char *block,
539 const char *fmt_string)
542 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
544 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
545 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
546 block += sizeof (LONG_DOUBLE);
553 print_named_ascii (long unsigned int n_bytes, const char *block,
554 const char *unused_fmt_string)
557 for (i = n_bytes; i > 0; i--)
559 unsigned int c = *(const unsigned char *) block;
560 unsigned int masked_c = (0x7f & c);
566 else if (masked_c <= 040)
567 s = charname[masked_c];
570 sprintf (buf, " %c", masked_c);
574 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
575 block += sizeof (unsigned char);
580 print_ascii (long unsigned int n_bytes, const char *block,
581 const char *unused_fmt_string)
584 for (i = n_bytes; i > 0; i--)
586 unsigned int c = *(const unsigned char *) block;
625 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
626 s = (const char *) buf;
629 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
630 block += sizeof (unsigned char);
634 /* Convert a null-terminated (possibly zero-length) string S to an
635 unsigned long integer value. If S points to a non-digit set *P to S,
636 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
637 the string of digits. If the string of digits represents a value
638 larger than ULONG_MAX, don't modify *VAL or *P and return nonzero.
639 Otherwise, advance *P to the first non-digit after S, set *VAL to
640 the result of the conversion and return zero. */
643 simple_strtoul (const char *s, const char **p, long unsigned int *val)
645 unsigned long int sum;
650 unsigned int c = *s++ - '0';
651 if (sum > (ULONG_MAX - c) / 10)
660 /* If S points to a single valid POSIX-style od format string, put
661 a description of that format in *TSPEC, make *NEXT point at the
662 character following the just-decoded format (if *NEXT is non-NULL),
663 and return zero. If S is not valid, don't modify *NEXT or *TSPEC,
664 give a diagnostic, and return nonzero. For example, if S were
665 "d4afL" *NEXT would be set to "afL" and *TSPEC would be
667 fmt = SIGNED_DECIMAL;
668 size = INT or LONG; (whichever integral_type_size[4] resolves to)
669 print_function = print_int; (assuming size == INT)
670 fmt_string = "%011d%c";
672 S_ORIG is solely for reporting errors. It should be the full format
677 decode_one_format (const char *s_orig, const char *s, const char **next,
680 enum size_spec size_spec;
681 unsigned long int size;
682 enum output_format fmt;
683 const char *pre_fmt_string;
685 void (*print_function) ();
689 assert (tspec != NULL);
703 size = sizeof (char);
708 size = sizeof (short);
718 size = sizeof (long int);
722 if (simple_strtoul (s, &p, &size) != 0)
724 /* The integer at P in S would overflow an unsigned long.
725 A digit string that long is sufficiently odd looking
726 that the following diagnostic is sufficient. */
727 error (0, 0, _("invalid type string `%s'"), s_orig);
734 if (size > MAX_INTEGRAL_TYPE_SIZE
735 || integral_type_size[size] == NO_SIZE)
737 error (0, 0, _("invalid type string `%s';\n\
738 this system doesn't provide a %lu-byte integral type"), s_orig, size);
746 #define FMT_BYTES_ALLOCATED 9
747 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
749 size_spec = integral_type_size[size];
754 fmt = SIGNED_DECIMAL;
755 sprintf (fmt_string, "%%%u%sd%%c",
756 bytes_to_signed_dec_digits[size],
757 (size_spec == LONG ? "l" : ""));
762 sprintf (fmt_string, "%%0%u%so%%c",
763 bytes_to_oct_digits[size],
764 (size_spec == LONG ? "l" : ""));
768 fmt = UNSIGNED_DECIMAL;
769 sprintf (fmt_string, "%%%u%su%%c",
770 bytes_to_unsigned_dec_digits[size],
771 (size_spec == LONG ? "l" : ""));
776 sprintf (fmt_string, "%%0%u%sx%%c",
777 bytes_to_hex_digits[size],
778 (size_spec == LONG ? "l" : ""));
785 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
790 print_function = (fmt == SIGNED_DECIMAL
796 print_function = (fmt == SIGNED_DECIMAL
802 print_function = print_int;
806 print_function = print_long;
815 fmt = FLOATING_POINT;
821 size = sizeof (float);
826 size = sizeof (double);
831 size = sizeof (LONG_DOUBLE);
835 if (simple_strtoul (s, &p, &size) != 0)
837 /* The integer at P in S would overflow an unsigned long.
838 A digit string that long is sufficiently odd looking
839 that the following diagnostic is sufficient. */
840 error (0, 0, _("invalid type string `%s'"), s_orig);
844 size = sizeof (double);
847 if (size > MAX_FP_TYPE_SIZE
848 || fp_type_size[size] == NO_SIZE)
850 error (0, 0, _("invalid type string `%s';\n\
851 this system doesn't provide a %lu-byte floating point type"), s_orig, size);
858 size_spec = fp_type_size[size];
863 print_function = print_float;
864 /* Don't use %#e; not all systems support it. */
865 pre_fmt_string = "%%%d.%de%%c";
866 fmt_string = xmalloc (strlen (pre_fmt_string));
867 sprintf (fmt_string, pre_fmt_string,
868 FLT_DIG + 8, FLT_DIG);
872 print_function = print_double;
873 pre_fmt_string = "%%%d.%de%%c";
874 fmt_string = xmalloc (strlen (pre_fmt_string));
875 sprintf (fmt_string, pre_fmt_string,
876 DBL_DIG + 8, DBL_DIG);
879 #ifdef HAVE_LONG_DOUBLE
880 case FLOAT_LONG_DOUBLE:
881 print_function = print_long_double;
882 pre_fmt_string = "%%%d.%dLe%%c";
883 fmt_string = xmalloc (strlen (pre_fmt_string));
884 sprintf (fmt_string, pre_fmt_string,
885 LDBL_DIG + 8, LDBL_DIG);
896 fmt = NAMED_CHARACTER;
899 print_function = print_named_ascii;
907 print_function = print_ascii;
911 error (0, 0, _("invalid character `%c' in type string `%s'"),
916 tspec->size = size_spec;
918 tspec->print_function = print_function;
919 tspec->fmt_string = fmt_string;
927 /* Decode the POSIX-style od format string S. Append the decoded
928 representation to the global array SPEC, reallocating SPEC if
929 necessary. Return zero if S is valid, nonzero otherwise. */
932 decode_format_string (const char *s)
934 const char *s_orig = s;
942 if (decode_one_format (s_orig, s, &next, &tspec))
948 if (n_specs >= n_specs_allocated)
950 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
951 spec = (struct tspec *) xrealloc (spec, (n_specs_allocated
952 * sizeof (struct tspec)));
955 memcpy ((char *) &spec[n_specs], (char *) &tspec,
956 sizeof (struct tspec));
963 /* Given a list of one or more input filenames FILE_LIST, set the global
964 file pointer IN_STREAM to position N_SKIP in the concatenation of
965 those files. If any file operation fails or if there are fewer than
966 N_SKIP bytes in the combined input, give an error message and return
967 nonzero. When possible, use seek- rather than read operations to
968 advance IN_STREAM. A file name of "-" is interpreted as standard
977 for ( /* empty */ ; *file_list != NULL; ++file_list)
979 struct stat file_stats;
982 if (STREQ (*file_list, "-"))
984 input_filename = _("standard input");
990 input_filename = *file_list;
991 in_stream = fopen (input_filename, "r");
992 if (in_stream == NULL)
994 error (0, errno, "%s", input_filename);
999 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1004 /* First try using fseek. For large offsets, this extra work is
1005 worthwhile. If the offset is below some threshold it may be
1006 more efficient to move the pointer by reading. There are two
1007 issues when trying to use fseek:
1008 - the file must be seekable.
1009 - before seeking to the specified position, make sure
1010 that the new position is in the current file.
1011 Try to do that by getting file's size using fstat().
1012 But that will work only for regular files and dirs. */
1014 if (fstat (fileno (in_stream), &file_stats))
1016 error (0, errno, "%s", input_filename);
1021 /* The st_size field is valid only for regular files and
1022 directories. FIXME: is the preceding true?
1023 If the number of bytes left to skip is at least as large as
1024 the size of the current file, we can decrement
1025 n_skip and go on to the next file. */
1026 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
1028 if (n_skip >= file_stats.st_size)
1030 n_skip -= file_stats.st_size;
1031 if (in_stream != stdin && fclose (in_stream) == EOF)
1033 error (0, errno, "%s", input_filename);
1040 /* fseek may work on some streams for which lseek doesn't.
1041 But fseek's offset argument is restricted to the range
1042 of type `long'. So if N_SKIP is too large or if fseek
1043 fails, try lseek. */
1044 if ((n_skip <= LONG_MAX
1045 && fseek (in_stream, (long) n_skip, SEEK_SET) == 0)
1046 || lseek (fileno (in_stream), n_skip, SEEK_SET) >= 0)
1054 /* Seek didn't work or wasn't attempted; position the file pointer
1057 for (j = n_skip / BUFSIZ; j >= 0; j--)
1060 size_t n_bytes_to_read = (j > 0
1063 size_t n_bytes_read;
1064 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1065 n_skip -= n_bytes_read;
1066 if (n_bytes_read != n_bytes_to_read)
1075 error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1081 format_address_none (long unsigned int address)
1087 format_address_std (long unsigned int address)
1089 const char *address_string;
1091 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1092 address_string = address_fmt_buffer;
1093 return address_string;
1097 format_address_label (long unsigned int address)
1099 const char *address_string;
1100 assert (output_address_fmt_string != NULL);
1102 sprintf (address_fmt_buffer, output_address_fmt_string,
1103 address, address + pseudo_offset);
1104 address_string = address_fmt_buffer;
1105 return address_string;
1108 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1109 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1110 CURR_BLOCK in the concatenation of input files, and it is printed
1111 (optionally) only before the output line associated with the first
1112 format spec. When duplicate blocks are being abbreviated, the output
1113 for a sequence of identical input blocks is the output for the first
1114 block followed by an asterisk alone on a line. It is valid to compare
1115 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1116 That condition may be false only for the last input block -- and then
1117 only when it has not been padded to length BYTES_PER_BLOCK. */
1120 write_block (long unsigned int current_offset, long unsigned int n_bytes,
1121 const char *prev_block, const char *curr_block)
1123 static int first = 1;
1124 static int prev_pair_equal = 0;
1126 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1128 if (abbreviate_duplicate_blocks
1129 && !first && n_bytes == bytes_per_block
1130 && EQUAL_BLOCKS (prev_block, curr_block))
1132 if (prev_pair_equal)
1134 /* The two preceding blocks were equal, and the current
1135 block is the same as the last one, so print nothing. */
1140 prev_pair_equal = 1;
1147 prev_pair_equal = 0;
1148 for (i = 0; i < n_specs; i++)
1150 printf ("%s ", (i == 0
1151 ? format_address (current_offset)
1153 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1159 /* Test whether there have been errors on in_stream, and close it if
1160 it is not standard input. Return nonzero if there has been an error
1161 on in_stream or stdout; return zero otherwise. This function will
1162 report more than one error only if both a read and a write error
1166 check_and_close (void)
1171 if (ferror (in_stream))
1173 error (0, errno, "%s", input_filename);
1174 if (in_stream != stdin)
1178 else if (in_stream != stdin && fclose (in_stream) == EOF)
1180 error (0, errno, "%s", input_filename);
1184 if (ferror (stdout))
1186 error (0, errno, _("standard output"));
1193 /* Read a single byte into *C from the concatenation of the input files
1194 named in the global array FILE_LIST. On the first call to this
1195 function, the global variable IN_STREAM is expected to be an open
1196 stream associated with the input file *FILE_LIST. If IN_STREAM is
1197 at end-of-file, close it and update the global variables IN_STREAM,
1198 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1199 the list. Then try to read a byte from the newly opened file.
1200 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1201 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1202 calls do likewise. The return value is nonzero if any errors
1203 occured, zero otherwise. */
1210 if (*file_list == NULL)
1219 *c = fgetc (in_stream);
1224 err |= check_and_close ();
1229 if (*file_list == NULL)
1232 if (STREQ (*file_list, "-"))
1234 input_filename = _("standard input");
1236 have_read_stdin = 1;
1240 input_filename = *file_list;
1241 in_stream = fopen (input_filename, "r");
1242 if (in_stream == NULL)
1244 error (0, errno, "%s", input_filename);
1248 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1250 while (in_stream == NULL);
1254 /* Read N bytes into BLOCK from the concatenation of the input files
1255 named in the global array FILE_LIST. On the first call to this
1256 function, the global variable IN_STREAM is expected to be an open
1257 stream associated with the input file *FILE_LIST. On subsequent
1258 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1259 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1260 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1261 Then try to read the remaining bytes from the newly opened file.
1262 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1263 to the number of bytes read. If an error occurs, it will be detected
1264 through ferror when the stream is about to be closed. If there is an
1265 error, give a message but continue reading as usual and return nonzero.
1266 Otherwise return zero. */
1269 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1273 assert (n > 0 && n <= bytes_per_block);
1275 *n_bytes_in_buffer = 0;
1280 if (*file_list == NULL)
1281 return 0; /* EOF. */
1289 n_needed = n - *n_bytes_in_buffer;
1290 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1292 *n_bytes_in_buffer += n_read;
1294 if (n_read == n_needed)
1297 err |= check_and_close ();
1302 if (*file_list == NULL)
1305 if (STREQ (*file_list, "-"))
1307 input_filename = _("standard input");
1309 have_read_stdin = 1;
1313 input_filename = *file_list;
1314 in_stream = fopen (input_filename, "r");
1315 if (in_stream == NULL)
1317 error (0, errno, "%s", input_filename);
1321 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1323 while (in_stream == NULL);
1327 /* Return the least common multiple of the sizes associated
1328 with the format specs. */
1336 for (i = 0; i < n_specs; i++)
1337 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1341 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1342 return the offset it denotes. Otherwise, return -1. */
1345 parse_old_offset (const char *s)
1349 enum strtol_error s_err;
1350 long unsigned int tmp;
1355 /* Skip over any leading '+'. */
1359 /* Determine the radix we'll use to interpret S. If there is a `.',
1360 it's decimal, otherwise, if the string begins with `0X'or `0x',
1361 it's hexadecimal, else octal. */
1362 if (strchr (s, '.') != NULL)
1366 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1372 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1373 if (s_err != LONGINT_OK)
1375 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1382 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1383 formatted block to standard output, and repeat until the specified
1384 maximum number of bytes has been read or until all input has been
1385 processed. If the last block read is smaller than BYTES_PER_BLOCK
1386 and its size is not a multiple of the size associated with a format
1387 spec, extend the input block with zero bytes until its length is a
1388 multiple of all format spec sizes. Write the final block. Finally,
1389 write on a line by itself the offset of the byte after the last byte
1390 read. Accumulate return values from calls to read_block and
1391 check_and_close, and if any was nonzero, return nonzero.
1392 Otherwise, return zero. */
1398 off_t current_offset;
1402 size_t n_bytes_read;
1404 #ifdef lint /* Suppress `used before initialized' warning. */
1408 block[0] = (char *) alloca (bytes_per_block);
1409 block[1] = (char *) alloca (bytes_per_block);
1411 current_offset = n_bytes_to_skip;
1415 if (limit_bytes_to_format)
1417 end_offset = n_bytes_to_skip + max_bytes_to_format;
1422 if (current_offset >= end_offset)
1427 n_needed = MIN (end_offset - current_offset,
1428 (off_t) bytes_per_block);
1429 err |= read_block (n_needed, block[idx], &n_bytes_read);
1430 if (n_bytes_read < bytes_per_block)
1432 assert (n_bytes_read == bytes_per_block);
1433 write_block (current_offset, n_bytes_read,
1434 block[!idx], block[idx]);
1435 current_offset += n_bytes_read;
1443 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1444 if (n_bytes_read < bytes_per_block)
1446 assert (n_bytes_read == bytes_per_block);
1447 write_block (current_offset, n_bytes_read,
1448 block[!idx], block[idx]);
1449 current_offset += n_bytes_read;
1454 if (n_bytes_read > 0)
1457 size_t bytes_to_write;
1461 /* Make bytes_to_write the smallest multiple of l_c_m that
1462 is at least as large as n_bytes_read. */
1463 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1465 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1466 write_block (current_offset, bytes_to_write,
1467 block[!idx], block[idx]);
1468 current_offset += n_bytes_read;
1471 if (output_address_fmt_string != NULL)
1472 printf ("%s\n", format_address (current_offset));
1474 if (limit_bytes_to_format && current_offset > end_offset)
1475 err |= check_and_close ();
1480 /* STRINGS mode. Find each "string constant" in the input.
1481 A string constant is a run of at least `string_min' ASCII
1482 graphic (or formatting) characters terminated by a null.
1483 Based on a function written by Richard Stallman for a
1484 pre-POSIX version of od. Return nonzero if an error
1485 occurs. Otherwise, return zero. */
1490 size_t bufsize = MAX (100, string_min);
1491 char *buf = xmalloc (bufsize);
1492 off_t address = n_bytes_to_skip;
1501 /* See if the next `string_min' chars are all printing chars. */
1504 if (limit_bytes_to_format
1505 && address >= (n_bytes_to_skip + max_bytes_to_format - string_min))
1508 for (i = 0; i < string_min; i++)
1510 err |= read_char (&c);
1518 /* Found a non-printing. Try again starting with next char. */
1523 /* We found a run of `string_min' printable characters.
1524 Now see if it is terminated with a null byte. */
1525 while (!limit_bytes_to_format
1526 || address < n_bytes_to_skip + max_bytes_to_format)
1530 bufsize = 1 + 3 * bufsize / 2;
1531 buf = xrealloc (buf, bufsize);
1533 err |= read_char (&c);
1541 break; /* It is; print this string. */
1543 goto tryline; /* It isn't; give up on this string. */
1544 buf[i++] = c; /* String continues; store it all. */
1547 /* If we get here, the string is all printable and null-terminated,
1548 so print it. It is all in `buf' and `i' is its length. */
1550 if (output_address_fmt_string != NULL)
1552 printf ("%s ", format_address (address - i - 1));
1554 for (i = 0; (c = buf[i]); i++)
1559 fputs ("\\a", stdout);
1563 fputs ("\\b", stdout);
1567 fputs ("\\f", stdout);
1571 fputs ("\\n", stdout);
1575 fputs ("\\r", stdout);
1579 fputs ("\\t", stdout);
1583 fputs ("\\v", stdout);
1593 /* We reach this point only if we search through
1594 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1598 err |= check_and_close ();
1603 main (int argc, char **argv)
1609 unsigned int address_pad_len;
1610 unsigned long int desired_width;
1611 int width_specified = 0;
1612 int n_failed_decodes = 0;
1615 /* The old-style `pseudo starting address' to be printed in parentheses
1616 after any true address. */
1617 long int pseudo_start;
1619 #ifdef lint /* Suppress `used before initialized' warning. */
1623 program_name = argv[0];
1624 setlocale (LC_ALL, "");
1625 bindtextdomain (PACKAGE, LOCALEDIR);
1626 textdomain (PACKAGE);
1630 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1631 integral_type_size[i] = NO_SIZE;
1633 integral_type_size[sizeof (char)] = CHAR;
1634 integral_type_size[sizeof (short int)] = SHORT;
1635 integral_type_size[sizeof (int)] = INT;
1636 integral_type_size[sizeof (long int)] = LONG;
1638 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1639 fp_type_size[i] = NO_SIZE;
1641 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1642 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1643 so that if `long double' is the same type or if long double isn't
1644 supported FLOAT_LONG_DOUBLE will never be used. */
1645 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1646 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1649 n_specs_allocated = 5;
1650 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1652 output_address_fmt_string = "%07o";
1653 format_address = format_address_std;
1654 address_pad_len = 7;
1655 flag_dump_strings = 0;
1657 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1658 long_options, (int *) 0))
1661 unsigned long int tmp;
1662 enum strtol_error s_err;
1673 output_address_fmt_string = "%07d";
1674 format_address = format_address_std;
1675 address_pad_len = 7;
1678 output_address_fmt_string = "%07o";
1679 format_address = format_address_std;
1680 address_pad_len = 7;
1683 output_address_fmt_string = "%06x";
1684 format_address = format_address_std;
1685 address_pad_len = 6;
1688 output_address_fmt_string = NULL;
1689 format_address = format_address_none;
1690 address_pad_len = 0;
1693 error (EXIT_FAILURE, 0,
1694 _("invalid output address radix `%c'; \
1695 it must be one character from [doxn]"),
1702 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1703 n_bytes_to_skip = tmp;
1704 if (s_err != LONGINT_OK)
1705 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1709 limit_bytes_to_format = 1;
1711 /* FIXME: if off_t is long long and that's an 8-byte type,
1712 use xstrtouq here. */
1713 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1714 max_bytes_to_format = tmp;
1715 if (s_err != LONGINT_OK)
1716 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1718 if (tmp > OFF_T_MAX)
1719 error (EXIT_FAILURE, 0,
1720 _("specified number of bytes `%s' is larger than \
1721 the maximum\nrepresentable value of type off_t"), optarg);
1729 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1730 if (s_err != LONGINT_OK)
1731 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1733 ++flag_dump_strings;
1737 if (decode_format_string (optarg))
1742 abbreviate_duplicate_blocks = 0;
1749 /* The next several cases map the old, pre-POSIX format
1750 specification options to the corresponding POSIX format
1751 specs. GNU od accepts any combination of old- and
1752 new-style options. Format specification options accumulate. */
1754 #define CASE_OLD_ARG(old_char,new_string) \
1757 if (decode_format_string (new_string)) \
1758 ++n_failed_decodes; \
1762 CASE_OLD_ARG ('a', "a");
1763 CASE_OLD_ARG ('b', "oC");
1764 CASE_OLD_ARG ('c', "c");
1765 CASE_OLD_ARG ('d', "u2");
1766 CASE_OLD_ARG ('f', "fF");
1767 CASE_OLD_ARG ('h', "x2");
1768 CASE_OLD_ARG ('i', "d2");
1769 CASE_OLD_ARG ('l', "d4");
1770 CASE_OLD_ARG ('o', "o2");
1771 CASE_OLD_ARG ('x', "x2");
1776 width_specified = 1;
1783 s_err = xstrtoul (optarg, NULL, 10, &desired_width, NULL);
1784 if (s_err != LONGINT_OK)
1785 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1795 if (n_failed_decodes > 0)
1796 exit (EXIT_FAILURE);
1800 printf ("od - %s\n", PACKAGE_VERSION);
1801 exit (EXIT_SUCCESS);
1807 if (flag_dump_strings && n_specs > 0)
1808 error (EXIT_FAILURE, 0,
1809 _("no type may be specified when dumping strings"));
1811 n_files = argc - optind;
1813 /* If the --backward-compatible option is used, there may be from
1814 0 to 3 remaining command line arguments; handle each case
1816 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1817 The offset and pseudo_start have the same syntax. */
1825 if ((offset = parse_old_offset (argv[optind])) >= 0)
1827 n_bytes_to_skip = offset;
1832 else if (n_files == 2)
1835 if ((o1 = parse_old_offset (argv[optind])) >= 0
1836 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1838 n_bytes_to_skip = o1;
1839 flag_pseudo_start = 1;
1844 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1846 n_bytes_to_skip = o2;
1848 argv[optind + 1] = argv[optind];
1854 _("invalid second operand in compatibility mode `%s'"),
1859 else if (n_files == 3)
1862 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1863 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1865 n_bytes_to_skip = o1;
1866 flag_pseudo_start = 1;
1868 argv[optind + 2] = argv[optind];
1875 _("in compatibility mode the last 2 arguments must be offsets"));
1882 _("in compatibility mode there may be no more than 3 arguments"));
1886 if (flag_pseudo_start)
1888 static char buf[10];
1890 if (output_address_fmt_string == NULL)
1892 output_address_fmt_string = "(%07o)";
1893 format_address = format_address_std;
1897 sprintf (buf, "%s (%s)",
1898 output_address_fmt_string,
1899 output_address_fmt_string);
1900 output_address_fmt_string = buf;
1901 format_address = format_address_label;
1906 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1907 for (i = 0; i < address_pad_len; i++)
1908 address_pad[i] = ' ';
1909 address_pad[address_pad_len] = '\0';
1913 if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1915 /* This happens on Cray systems that don't have a 2-byte
1917 exit (EXIT_FAILURE);
1924 file_list = (char const *const *) &argv[optind];
1927 /* If no files were listed on the command line, set up the
1928 global array FILE_LIST so that it contains the null-terminated
1929 list of one name: "-". */
1930 static char const *const default_file_list[] = {"-", NULL};
1932 file_list = default_file_list;
1935 err |= skip (n_bytes_to_skip);
1936 if (in_stream == NULL)
1939 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1941 /* Compute output block length. */
1944 if (width_specified)
1946 if (desired_width != 0 && desired_width % l_c_m == 0)
1947 bytes_per_block = desired_width;
1950 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1951 desired_width, l_c_m);
1952 bytes_per_block = l_c_m;
1957 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1958 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1960 bytes_per_block = l_c_m;
1964 for (i = 0; i < n_specs; i++)
1966 printf (_("%d: fmt=\"%s\" width=%d\n"),
1967 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1971 err |= (flag_dump_strings ? dump_strings () : dump ());
1975 if (have_read_stdin && fclose (stdin) == EOF)
1976 error (EXIT_FAILURE, errno, _("standard input"));
1978 if (fclose (stdout) == EOF)
1979 error (EXIT_FAILURE, errno, _("write error"));
1981 exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);