1 /* od -- dump files in octal and other formats
2 Copyright (C) 1992, 1995 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>
51 #if defined(__GNUC__) || defined(STDC_HEADERS)
55 #ifdef HAVE_LONG_DOUBLE
56 typedef long double LONG_DOUBLE;
58 typedef double LONG_DOUBLE;
65 # define SCHAR_MAX 127
68 # define SCHAR_MIN (-128)
71 # define SHRT_MAX 32767
74 # define SHRT_MIN (-32768)
77 # define ULONG_MAX ((unsigned long) ~(unsigned long) 0)
80 /* FIXME: is there a way to do this without relying on the
81 `8 bits per byte' assumption? */
82 # define OFF_T_MAX (~((off_t)1 << (sizeof (off_t) * 8 - 1)))
85 #define STREQ(a,b) (strcmp((a), (b)) == 0)
88 # define MAX(a, b) ((a) > (b) ? (a) : (b))
92 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
95 #if defined (_WIN32) && defined (_O_BINARY)
96 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) \
98 { /* Turn off DOS text file modes, "rb" doesn't work on stdin. */\
99 if (_setmode (_fileno ((IN_STREAM)), _O_BINARY) == -1) \
101 error (0, errno, "%s", (FILENAME)); \
108 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) /* empty */
111 /* The default number of input bytes per output line. */
112 #define DEFAULT_BYTES_PER_BLOCK 16
114 /* The number of decimal digits of precision in a float. */
119 /* The number of decimal digits of precision in a double. */
124 /* The number of decimal digits of precision in a long double. */
126 # define LDBL_DIG DBL_DIG
155 /* Each output format specification (from POSIX `-t spec' or from
156 old-style options) is represented by one of these structures. */
159 enum output_format fmt;
161 void (*print_function) ();
165 /* The name this program was run with. */
168 /* Convert the number of 8-bit bytes of a binary representation to
169 the number of characters (digits + sign if the type is signed)
170 required to represent the same quantity in the specified base/type.
171 For example, a 32-bit (4-byte) quantity may require a field width
172 as wide as the following for these types:
176 8 unsigned hexadecimal */
178 static const unsigned int bytes_to_oct_digits[] =
179 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
181 static const unsigned int bytes_to_signed_dec_digits[] =
182 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
184 static const unsigned int bytes_to_unsigned_dec_digits[] =
185 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
187 static const unsigned int bytes_to_hex_digits[] =
188 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
190 /* Convert enum size_spec to the size of the named type. */
191 static const int width_bytes[] =
203 /* Names for some non-printing characters. */
204 static const char *const charname[33] =
206 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
207 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
208 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
209 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
213 /* A printf control string for printing a file offset. */
214 static const char *output_address_fmt_string;
216 /* FIXME: make this the number of octal digits in an unsigned long. */
217 #define MAX_ADDRESS_LENGTH 13
219 /* Space for a normal address, a space, a pseudo address, parentheses
220 around the pseudo address, and a trailing zero byte. */
221 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
222 static char address_pad[MAX_ADDRESS_LENGTH + 1];
224 static unsigned long int string_min;
225 static unsigned long int flag_dump_strings;
227 /* Non-zero if we should recognize the pre-POSIX non-option arguments
228 that specified at most one file and optional arguments specifying
229 offset and pseudo-start address. */
230 static int traditional;
232 /* Non-zero if an old-style `pseudo-address' was specified. */
233 static long int flag_pseudo_start;
235 /* The difference between the old-style pseudo starting address and
236 the number of bytes to skip. */
237 static long int pseudo_offset;
239 /* Function to format an address and optionally an additional parenthesized
240 pseudo-address; it returns the formatted string. */
241 static const char *(*format_address) __P ((long unsigned int));
243 /* The number of input bytes to skip before formatting and writing. */
244 static off_t n_bytes_to_skip = 0;
246 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
247 to be read and formatted. Otherwise all input is formatted. */
248 static int limit_bytes_to_format = 0;
250 /* The maximum number of bytes that will be formatted. This
251 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
252 static off_t max_bytes_to_format;
254 /* When nonzero and two or more consecutive blocks are equal, format
255 only the first block and output an asterisk alone on the following
256 line to indicate that identical blocks have been elided. */
257 static int abbreviate_duplicate_blocks = 1;
259 /* An array of specs describing how to format each input block. */
260 static struct tspec *spec;
262 /* The number of format specs. */
263 static unsigned int n_specs;
265 /* The allocated length of SPEC. */
266 static unsigned int n_specs_allocated;
268 /* The number of input bytes formatted per output line. It must be
269 a multiple of the least common multiple of the sizes associated with
270 the specified output types. It should be as large as possible, but
271 no larger than 16 -- unless specified with the -w option. */
272 static unsigned int bytes_per_block;
274 /* Human-readable representation of *file_list (for error messages).
275 It differs from *file_list only when *file_list is "-". */
276 static char const *input_filename;
278 /* A NULL-terminated list of the file-arguments from the command line.
279 If no file-arguments were specified, this variable is initialized
281 static char const *const *file_list;
283 /* The input stream associated with the current file. */
284 static FILE *in_stream;
286 /* If nonzero, at least one of the files we read was standard input. */
287 static int have_read_stdin;
289 #define LONGEST_INTEGRAL_TYPE long int
291 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
292 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
294 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
295 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
297 /* If nonzero, display usage information and exit. */
298 static int show_help;
300 /* If nonzero, print the version on standard output then exit. */
301 static int show_version;
303 static struct option const long_options[] =
306 {"skip-bytes", required_argument, NULL, 'j'},
307 {"address-radix", required_argument, NULL, 'A'},
308 {"read-bytes", required_argument, NULL, 'N'},
309 {"format", required_argument, NULL, 't'},
310 {"output-duplicates", no_argument, NULL, 'v'},
312 /* non-POSIX options. */
313 {"strings", optional_argument, NULL, 's'},
314 {"traditional", no_argument, NULL, 'B'},
315 {"width", optional_argument, NULL, 'w'},
316 {"help", no_argument, &show_help, 1},
317 {"version", no_argument, &show_version, 1},
325 fprintf (stderr, _("Try `%s --help' for more information.\n"),
330 Usage: %s [OPTION]... [FILE]...\n\
331 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
333 program_name, program_name);
335 Write an unambiguous representation, octal bytes by default, of FILE\n\
336 to standard output. With no FILE, or when FILE is -, read standard input.\n\
338 -A, --address-radix=RADIX decide how file offsets are printed\n\
339 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
340 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
341 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
342 -t, --format=TYPE select output format or formats\n\
343 -v, --output-duplicates do not use * to mark line suppression\n\
344 -w, --width[=BYTES] output BYTES bytes per output line\n\
345 --traditional accept arguments in pre-POSIX form\n\
346 --help display this help and exit\n\
347 --version output version information and exit\n\
349 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
350 -a same as -t a, select named characters\n\
351 -b same as -t oC, select octal bytes\n\
352 -c same as -t c, select ASCII characters or backslash escapes\n\
353 -d same as -t u2, select unsigned decimal shorts\n\
354 -f same as -t fF, select floats\n\
355 -h same as -t x2, select hexadecimal shorts\n\
356 -i same as -t d2, select decimal shorts\n\
357 -l same as -t d4, select decimal longs\n\
358 -o same as -t o2, select octal shorts\n\
359 -x same as -t x2, select hexadecimal shorts\n\
363 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
364 is the pseudo-address at first byte printed, incremented when dump is\n\
365 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
366 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
368 TYPE is made up of one or more of these specifications:\n\
371 c ASCII character or backslash escape\n\
372 d[SIZE] signed decimal, SIZE bytes per integer\n\
373 f[SIZE] floating point, SIZE bytes per integer\n\
374 o[SIZE] octal, SIZE bytes per integer\n\
375 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
376 x[SIZE] hexadecimal, SIZE bytes per integer\n\
378 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
379 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
380 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
381 for sizeof(double) or L for sizeof(long double).\n\
383 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
384 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
385 with b suffix, by 1024 with k and by 1048576 with m. -s without a\n\
386 number implies 3. -w without a number implies 32. By default, od\n\
387 uses -A o -t d2 -w 16.\n\
393 /* Compute the greatest common denominator of U and V
394 using Euclid's algorithm. */
397 gcd (unsigned int u, unsigned int v)
409 /* Compute the least common multiple of U and V. */
412 lcm (unsigned int u, unsigned int v)
414 unsigned int t = gcd (u, v);
421 print_s_char (long unsigned int n_bytes, const char *block,
422 const char *fmt_string)
425 for (i = n_bytes; i > 0; i--)
427 int tmp = (unsigned) *(const unsigned char *) block;
429 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
430 assert (tmp <= SCHAR_MAX);
431 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
432 block += sizeof (unsigned char);
437 print_char (long unsigned int n_bytes, const char *block,
438 const char *fmt_string)
441 for (i = n_bytes; i > 0; i--)
443 unsigned int tmp = *(const unsigned char *) block;
444 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
445 block += sizeof (unsigned char);
450 print_s_short (long unsigned int n_bytes, const char *block,
451 const char *fmt_string)
454 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
456 int tmp = (unsigned) *(const unsigned short *) block;
458 tmp -= SHRT_MAX - SHRT_MIN + 1;
459 assert (tmp <= SHRT_MAX);
460 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
461 block += sizeof (unsigned short);
465 print_short (long unsigned int n_bytes, const char *block,
466 const char *fmt_string)
469 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
471 unsigned int tmp = *(const unsigned short *) block;
472 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
473 block += sizeof (unsigned short);
478 print_int (long unsigned int n_bytes, const char *block,
479 const char *fmt_string)
482 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
484 unsigned int tmp = *(const unsigned int *) block;
485 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
486 block += sizeof (unsigned int);
491 print_long (long unsigned int n_bytes, const char *block,
492 const char *fmt_string)
495 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
497 unsigned long tmp = *(const unsigned long *) block;
498 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
499 block += sizeof (unsigned long);
504 print_float (long unsigned int n_bytes, const char *block,
505 const char *fmt_string)
508 for (i = n_bytes / sizeof (float); i > 0; i--)
510 float tmp = *(const float *) block;
511 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
512 block += sizeof (float);
517 print_double (long unsigned int n_bytes, const char *block,
518 const char *fmt_string)
521 for (i = n_bytes / sizeof (double); i > 0; i--)
523 double tmp = *(const double *) block;
524 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
525 block += sizeof (double);
529 #ifdef HAVE_LONG_DOUBLE
531 print_long_double (long unsigned int n_bytes, const char *block,
532 const char *fmt_string)
535 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
537 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
538 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
539 block += sizeof (LONG_DOUBLE);
546 print_named_ascii (long unsigned int n_bytes, const char *block,
547 const char *unused_fmt_string)
550 for (i = n_bytes; i > 0; i--)
552 unsigned int c = *(const unsigned char *) block;
553 unsigned int masked_c = (0x7f & c);
559 else if (masked_c <= 040)
560 s = charname[masked_c];
563 sprintf (buf, " %c", masked_c);
567 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
568 block += sizeof (unsigned char);
573 print_ascii (long unsigned int n_bytes, const char *block,
574 const char *unused_fmt_string)
577 for (i = n_bytes; i > 0; i--)
579 unsigned int c = *(const unsigned char *) block;
618 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
619 s = (const char *) buf;
622 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
623 block += sizeof (unsigned char);
627 /* Convert a null-terminated (possibly zero-length) string S to an
628 unsigned long integer value. If S points to a non-digit set *P to S,
629 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
630 the string of digits. If the string of digits represents a value
631 larger than ULONG_MAX, don't modify *VAL or *P and return nonzero.
632 Otherwise, advance *P to the first non-digit after S, set *VAL to
633 the result of the conversion and return zero. */
636 simple_strtoul (const char *s, const char **p, long unsigned int *val)
638 unsigned long int sum;
643 unsigned int c = *s++ - '0';
644 if (sum > (ULONG_MAX - c) / 10)
653 /* If S points to a single valid POSIX-style od format string, put a
654 description of that format in *TSPEC, make *NEXT point at the character
655 following the just-decoded format (if *NEXT is non-NULL), and return
656 zero. If S is not valid, don't modify *NEXT or *TSPEC and return
657 nonzero. For example, if S were "d4afL" *NEXT would be set to "afL"
660 fmt = SIGNED_DECIMAL;
661 size = INT or LONG; (whichever integral_type_size[4] resolves to)
662 print_function = print_int; (assuming size == INT)
663 fmt_string = "%011d%c";
668 decode_one_format (const char *s, const char **next, struct tspec *tspec)
670 enum size_spec size_spec;
671 unsigned long int size;
672 enum output_format fmt;
673 const char *pre_fmt_string;
675 void (*print_function) ();
679 assert (tspec != NULL);
693 size = sizeof (char);
698 size = sizeof (short);
708 size = sizeof (long int);
712 if (simple_strtoul (s, &p, &size) != 0)
718 if (size > MAX_INTEGRAL_TYPE_SIZE
719 || integral_type_size[size] == NO_SIZE)
726 #define FMT_BYTES_ALLOCATED 9
727 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
729 size_spec = integral_type_size[size];
734 fmt = SIGNED_DECIMAL;
735 sprintf (fmt_string, "%%%u%sd%%c",
736 bytes_to_signed_dec_digits[size],
737 (size_spec == LONG ? "l" : ""));
742 sprintf (fmt_string, "%%0%u%so%%c",
743 bytes_to_oct_digits[size],
744 (size_spec == LONG ? "l" : ""));
748 fmt = UNSIGNED_DECIMAL;
749 sprintf (fmt_string, "%%%u%su%%c",
750 bytes_to_unsigned_dec_digits[size],
751 (size_spec == LONG ? "l" : ""));
756 sprintf (fmt_string, "%%0%u%sx%%c",
757 bytes_to_hex_digits[size],
758 (size_spec == LONG ? "l" : ""));
765 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
770 print_function = (fmt == SIGNED_DECIMAL
776 print_function = (fmt == SIGNED_DECIMAL
782 print_function = print_int;
786 print_function = print_long;
795 fmt = FLOATING_POINT;
801 size = sizeof (float);
806 size = sizeof (double);
811 size = sizeof (LONG_DOUBLE);
815 if (simple_strtoul (s, &p, &size) != 0)
818 size = sizeof (double);
821 if (size > MAX_FP_TYPE_SIZE
822 || fp_type_size[size] == NO_SIZE)
828 size_spec = fp_type_size[size];
833 print_function = print_float;
834 /* Don't use %#e; not all systems support it. */
835 pre_fmt_string = "%%%d.%de%%c";
836 fmt_string = xmalloc (strlen (pre_fmt_string));
837 sprintf (fmt_string, pre_fmt_string,
838 FLT_DIG + 8, FLT_DIG);
842 print_function = print_double;
843 pre_fmt_string = "%%%d.%de%%c";
844 fmt_string = xmalloc (strlen (pre_fmt_string));
845 sprintf (fmt_string, pre_fmt_string,
846 DBL_DIG + 8, DBL_DIG);
849 #ifdef HAVE_LONG_DOUBLE
850 case FLOAT_LONG_DOUBLE:
851 print_function = print_long_double;
852 pre_fmt_string = "%%%d.%dle%%c";
853 fmt_string = xmalloc (strlen (pre_fmt_string));
854 sprintf (fmt_string, pre_fmt_string,
855 LDBL_DIG + 8, LDBL_DIG);
866 fmt = NAMED_CHARACTER;
869 print_function = print_named_ascii;
877 print_function = print_ascii;
884 tspec->size = size_spec;
886 tspec->print_function = print_function;
887 tspec->fmt_string = fmt_string;
895 /* Decode the POSIX-style od format string S. Append the decoded
896 representation to the global array SPEC, reallocating SPEC if
897 necessary. Return zero if S is valid, nonzero otherwise. */
900 decode_format_string (const char *s)
909 if (decode_one_format (s, &next, &tspec))
915 if (n_specs >= n_specs_allocated)
917 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
918 spec = (struct tspec *) xrealloc (spec, (n_specs_allocated
919 * sizeof (struct tspec)));
922 memcpy ((char *) &spec[n_specs], (char *) &tspec, sizeof (struct tspec));
929 /* Given a list of one or more input filenames FILE_LIST, set the global
930 file pointer IN_STREAM to position N_SKIP in the concatenation of
931 those files. If any file operation fails or if there are fewer than
932 N_SKIP bytes in the combined input, give an error message and return
933 nonzero. When possible, use seek- rather than read operations to
934 advance IN_STREAM. A file name of "-" is interpreted as standard
943 for ( /* empty */ ; *file_list != NULL; ++file_list)
945 struct stat file_stats;
948 if (STREQ (*file_list, "-"))
950 input_filename = _("standard input");
956 input_filename = *file_list;
957 in_stream = fopen (input_filename, "r");
958 if (in_stream == NULL)
960 error (0, errno, "%s", input_filename);
965 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
970 /* First try using fseek. For large offsets, this extra work is
971 worthwhile. If the offset is below some threshold it may be
972 more efficient to move the pointer by reading. There are two
973 issues when trying to use fseek:
974 - the file must be seekable.
975 - before seeking to the specified position, make sure
976 that the new position is in the current file.
977 Try to do that by getting file's size using fstat().
978 But that will work only for regular files and dirs. */
980 if (fstat (fileno (in_stream), &file_stats))
982 error (0, errno, "%s", input_filename);
987 /* The st_size field is valid only for regular files and
988 directories. FIXME: is the preceding true?
989 If the number of bytes left to skip is at least as large as
990 the size of the current file, we can decrement
991 n_skip and go on to the next file. */
992 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
994 if (n_skip >= file_stats.st_size)
996 n_skip -= file_stats.st_size;
997 if (in_stream != stdin && fclose (in_stream) == EOF)
999 error (0, errno, "%s", input_filename);
1006 /* fseek may work on some streams for which lseek doesn't.
1007 But fseek's offset argument is restricted to the range
1008 of type `long'. So if N_SKIP is too large or if fseek
1009 fails, try lseek. */
1010 if ((n_skip <= LONG_MAX
1011 && fseek (in_stream, (long) n_skip, SEEK_SET) == 0)
1012 || lseek (fileno (in_stream), n_skip, SEEK_SET) >= 0)
1020 /* Seek didn't work or wasn't attempted; position the file pointer
1023 for (j = n_skip / BUFSIZ; j >= 0; j--)
1026 size_t n_bytes_to_read = (j > 0
1029 size_t n_bytes_read;
1030 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1031 n_skip -= n_bytes_read;
1032 if (n_bytes_read != n_bytes_to_read)
1041 error (2, 0, _("cannot skip past end of combined input"));
1047 format_address_none (long unsigned int address)
1053 format_address_std (long unsigned int address)
1055 const char *address_string;
1057 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1058 address_string = address_fmt_buffer;
1059 return address_string;
1063 format_address_label (long unsigned int address)
1065 const char *address_string;
1066 assert (output_address_fmt_string != NULL);
1068 sprintf (address_fmt_buffer, output_address_fmt_string,
1069 address, address + pseudo_offset);
1070 address_string = address_fmt_buffer;
1071 return address_string;
1074 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1075 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1076 CURR_BLOCK in the concatenation of input files, and it is printed
1077 (optionally) only before the output line associated with the first
1078 format spec. When duplicate blocks are being abbreviated, the output
1079 for a sequence of identical input blocks is the output for the first
1080 block followed by an asterisk alone on a line. It is valid to compare
1081 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1082 That condition may be false only for the last input block -- and then
1083 only when it has not been padded to length BYTES_PER_BLOCK. */
1086 write_block (long unsigned int current_offset, long unsigned int n_bytes,
1087 const char *prev_block, const char *curr_block)
1089 static int first = 1;
1090 static int prev_pair_equal = 0;
1092 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1094 if (abbreviate_duplicate_blocks
1095 && !first && n_bytes == bytes_per_block
1096 && EQUAL_BLOCKS (prev_block, curr_block))
1098 if (prev_pair_equal)
1100 /* The two preceding blocks were equal, and the current
1101 block is the same as the last one, so print nothing. */
1106 prev_pair_equal = 1;
1113 prev_pair_equal = 0;
1114 for (i = 0; i < n_specs; i++)
1116 printf ("%s ", (i == 0
1117 ? format_address (current_offset)
1119 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1125 /* Test whether there have been errors on in_stream, and close it if
1126 it is not standard input. Return nonzero if there has been an error
1127 on in_stream or stdout; return zero otherwise. This function will
1128 report more than one error only if both a read and a write error
1132 check_and_close (void)
1137 if (ferror (in_stream))
1139 error (0, errno, "%s", input_filename);
1140 if (in_stream != stdin)
1144 else if (in_stream != stdin && fclose (in_stream) == EOF)
1146 error (0, errno, "%s", input_filename);
1150 if (ferror (stdout))
1152 error (0, errno, _("standard output"));
1159 /* Read a single byte into *C from the concatenation of the input files
1160 named in the global array FILE_LIST. On the first call to this
1161 function, the global variable IN_STREAM is expected to be an open
1162 stream associated with the input file *FILE_LIST. If IN_STREAM is
1163 at end-of-file, close it and update the global variables IN_STREAM,
1164 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1165 the list. Then try to read a byte from the newly opened file.
1166 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1167 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1168 calls do likewise. The return value is nonzero if any errors
1169 occured, zero otherwise. */
1176 if (*file_list == NULL)
1185 *c = fgetc (in_stream);
1190 err |= check_and_close ();
1195 if (*file_list == NULL)
1198 if (STREQ (*file_list, "-"))
1200 input_filename = _("standard input");
1202 have_read_stdin = 1;
1206 input_filename = *file_list;
1207 in_stream = fopen (input_filename, "r");
1208 if (in_stream == NULL)
1210 error (0, errno, "%s", input_filename);
1214 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1216 while (in_stream == NULL);
1220 /* Read N bytes into BLOCK from the concatenation of the input files
1221 named in the global array FILE_LIST. On the first call to this
1222 function, the global variable IN_STREAM is expected to be an open
1223 stream associated with the input file *FILE_LIST. On subsequent
1224 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1225 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1226 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1227 Then try to read the remaining bytes from the newly opened file.
1228 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1229 to the number of bytes read. If an error occurs, it will be detected
1230 through ferror when the stream is about to be closed. If there is an
1231 error, give a message but continue reading as usual and return nonzero.
1232 Otherwise return zero. */
1235 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1239 assert (n > 0 && n <= bytes_per_block);
1241 *n_bytes_in_buffer = 0;
1246 if (*file_list == NULL)
1247 return 0; /* EOF. */
1255 n_needed = n - *n_bytes_in_buffer;
1256 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1258 *n_bytes_in_buffer += n_read;
1260 if (n_read == n_needed)
1263 err |= check_and_close ();
1268 if (*file_list == NULL)
1271 if (STREQ (*file_list, "-"))
1273 input_filename = _("standard input");
1275 have_read_stdin = 1;
1279 input_filename = *file_list;
1280 in_stream = fopen (input_filename, "r");
1281 if (in_stream == NULL)
1283 error (0, errno, "%s", input_filename);
1287 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1289 while (in_stream == NULL);
1293 /* Return the least common multiple of the sizes associated
1294 with the format specs. */
1302 for (i = 0; i < n_specs; i++)
1303 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1307 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1308 return the offset it denotes. Otherwise, return -1. */
1311 parse_old_offset (const char *s)
1315 enum strtol_error s_err;
1316 long unsigned int tmp;
1321 /* Skip over any leading '+'. */
1325 /* Determine the radix we'll use to interpret S. If there is a `.',
1326 it's decimal, otherwise, if the string begins with `0X'or `0x',
1327 it's hexadecimal, else octal. */
1328 if (strchr (s, '.') != NULL)
1332 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1338 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1339 if (s_err != LONGINT_OK)
1341 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1348 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1349 formatted block to standard output, and repeat until the specified
1350 maximum number of bytes has been read or until all input has been
1351 processed. If the last block read is smaller than BYTES_PER_BLOCK
1352 and its size is not a multiple of the size associated with a format
1353 spec, extend the input block with zero bytes until its length is a
1354 multiple of all format spec sizes. Write the final block. Finally,
1355 write on a line by itself the offset of the byte after the last byte
1356 read. Accumulate return values from calls to read_block and
1357 check_and_close, and if any was nonzero, return nonzero.
1358 Otherwise, return zero. */
1364 off_t current_offset;
1368 size_t n_bytes_read;
1370 #ifdef lint /* Suppress `used before initialized' warning. */
1374 block[0] = (char *) alloca (bytes_per_block);
1375 block[1] = (char *) alloca (bytes_per_block);
1377 current_offset = n_bytes_to_skip;
1381 if (limit_bytes_to_format)
1383 end_offset = n_bytes_to_skip + max_bytes_to_format;
1388 if (current_offset >= end_offset)
1393 n_needed = MIN (end_offset - current_offset,
1394 (off_t) bytes_per_block);
1395 err |= read_block (n_needed, block[idx], &n_bytes_read);
1396 if (n_bytes_read < bytes_per_block)
1398 assert (n_bytes_read == bytes_per_block);
1399 write_block (current_offset, n_bytes_read,
1400 block[!idx], block[idx]);
1401 current_offset += n_bytes_read;
1409 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1410 if (n_bytes_read < bytes_per_block)
1412 assert (n_bytes_read == bytes_per_block);
1413 write_block (current_offset, n_bytes_read,
1414 block[!idx], block[idx]);
1415 current_offset += n_bytes_read;
1420 if (n_bytes_read > 0)
1423 size_t bytes_to_write;
1427 /* Make bytes_to_write the smallest multiple of l_c_m that
1428 is at least as large as n_bytes_read. */
1429 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1431 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1432 write_block (current_offset, bytes_to_write,
1433 block[!idx], block[idx]);
1434 current_offset += n_bytes_read;
1437 if (output_address_fmt_string != NULL)
1438 printf ("%s\n", format_address (current_offset));
1440 if (limit_bytes_to_format && current_offset > end_offset)
1441 err |= check_and_close ();
1446 /* STRINGS mode. Find each "string constant" in the input.
1447 A string constant is a run of at least `string_min' ASCII
1448 graphic (or formatting) characters terminated by a null.
1449 Based on a function written by Richard Stallman for a
1450 pre-POSIX version of od. Return nonzero if an error
1451 occurs. Otherwise, return zero. */
1456 size_t bufsize = MAX (100, string_min);
1457 char *buf = xmalloc (bufsize);
1458 off_t address = n_bytes_to_skip;
1467 /* See if the next `string_min' chars are all printing chars. */
1470 if (limit_bytes_to_format
1471 && address >= (n_bytes_to_skip + max_bytes_to_format - string_min))
1474 for (i = 0; i < string_min; i++)
1476 err |= read_char (&c);
1484 /* Found a non-printing. Try again starting with next char. */
1489 /* We found a run of `string_min' printable characters.
1490 Now see if it is terminated with a null byte. */
1491 while (!limit_bytes_to_format
1492 || address < n_bytes_to_skip + max_bytes_to_format)
1496 bufsize = 1 + 3 * bufsize / 2;
1497 buf = xrealloc (buf, bufsize);
1499 err |= read_char (&c);
1507 break; /* It is; print this string. */
1509 goto tryline; /* It isn't; give up on this string. */
1510 buf[i++] = c; /* String continues; store it all. */
1513 /* If we get here, the string is all printable and null-terminated,
1514 so print it. It is all in `buf' and `i' is its length. */
1516 if (output_address_fmt_string != NULL)
1518 printf ("%s ", format_address (address - i - 1));
1520 for (i = 0; (c = buf[i]); i++)
1525 fputs ("\\a", stdout);
1529 fputs ("\\b", stdout);
1533 fputs ("\\f", stdout);
1537 fputs ("\\n", stdout);
1541 fputs ("\\r", stdout);
1545 fputs ("\\t", stdout);
1549 fputs ("\\v", stdout);
1559 /* We reach this point only if we search through
1560 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1564 err |= check_and_close ();
1569 main (int argc, char **argv)
1575 unsigned int address_pad_len;
1576 unsigned long int desired_width;
1577 int width_specified = 0;
1580 /* The old-style `pseudo starting address' to be printed in parentheses
1581 after any true address. */
1582 long int pseudo_start;
1584 #ifdef lint /* Suppress `used before initialized' warning. */
1588 program_name = argv[0];
1591 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1592 integral_type_size[i] = NO_SIZE;
1594 integral_type_size[sizeof (char)] = CHAR;
1595 integral_type_size[sizeof (short int)] = SHORT;
1596 integral_type_size[sizeof (int)] = INT;
1597 integral_type_size[sizeof (long int)] = LONG;
1599 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1600 fp_type_size[i] = NO_SIZE;
1602 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1603 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1604 so that if `long double' is the same type or if long double isn't
1605 supported FLOAT_LONG_DOUBLE will never be used. */
1606 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1607 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1610 n_specs_allocated = 5;
1611 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1613 output_address_fmt_string = "%07o";
1614 format_address = format_address_std;
1615 address_pad_len = 7;
1616 flag_dump_strings = 0;
1618 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1619 long_options, (int *) 0))
1622 unsigned long int tmp;
1623 enum strtol_error s_err;
1634 output_address_fmt_string = "%07d";
1635 format_address = format_address_std;
1636 address_pad_len = 7;
1639 output_address_fmt_string = "%07o";
1640 format_address = format_address_std;
1641 address_pad_len = 7;
1644 output_address_fmt_string = "%06x";
1645 format_address = format_address_std;
1646 address_pad_len = 6;
1649 output_address_fmt_string = NULL;
1650 format_address = format_address_none;
1651 address_pad_len = 0;
1655 _("invalid output address radix `%c'; it must be one character from [doxn]"),
1662 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1663 n_bytes_to_skip = tmp;
1664 if (s_err != LONGINT_OK)
1665 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1669 limit_bytes_to_format = 1;
1671 /* FIXME: if off_t is long long and that's an 8-byte type,
1672 use xstrtouq here. */
1673 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1674 max_bytes_to_format = tmp;
1675 if (s_err != LONGINT_OK)
1676 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1678 if (tmp > OFF_T_MAX)
1679 error (2, 0, _("specified number of bytes `%s' is larger than \
1680 the maximum\nrepresentable value of type off_t"), optarg);
1688 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1689 if (s_err != LONGINT_OK)
1690 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1692 ++flag_dump_strings;
1696 if (decode_format_string (optarg))
1697 error (2, 0, _("invalid type string `%s'"), optarg);
1701 abbreviate_duplicate_blocks = 0;
1708 /* The next several cases map the old, pre-POSIX format
1709 specification options to the corresponding POSIX format
1710 specs. GNU od accepts any combination of old- and
1711 new-style options. Format specification options accumulate. */
1713 #define CASE_OLD_ARG(old_char,new_string) \
1717 tmp = decode_format_string (new_string); \
1718 assert (tmp == 0); \
1722 CASE_OLD_ARG ('a', "a");
1723 CASE_OLD_ARG ('b', "oC");
1724 CASE_OLD_ARG ('c', "c");
1725 CASE_OLD_ARG ('d', "u2");
1726 CASE_OLD_ARG ('f', "fF");
1727 CASE_OLD_ARG ('h', "x2");
1728 CASE_OLD_ARG ('i', "d2");
1729 CASE_OLD_ARG ('l', "d4");
1730 CASE_OLD_ARG ('o', "o2");
1731 CASE_OLD_ARG ('x', "x2");
1736 width_specified = 1;
1743 s_err = xstrtoul (optarg, NULL, 10, &desired_width, NULL);
1744 if (s_err != LONGINT_OK)
1745 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1757 printf ("od - %s\n", version_string);
1764 if (flag_dump_strings && n_specs > 0)
1765 error (2, 0, _("no type may be specified when dumping strings"));
1767 n_files = argc - optind;
1769 /* If the --backward-compatible option is used, there may be from
1770 0 to 3 remaining command line arguments; handle each case
1772 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1773 The offset and pseudo_start have the same syntax. */
1781 if ((offset = parse_old_offset (argv[optind])) >= 0)
1783 n_bytes_to_skip = offset;
1788 else if (n_files == 2)
1791 if ((o1 = parse_old_offset (argv[optind])) >= 0
1792 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1794 n_bytes_to_skip = o1;
1795 flag_pseudo_start = 1;
1800 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1802 n_bytes_to_skip = o2;
1804 argv[optind + 1] = argv[optind];
1810 _("invalid second operand in compatibility mode `%s'"),
1815 else if (n_files == 3)
1818 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1819 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1821 n_bytes_to_skip = o1;
1822 flag_pseudo_start = 1;
1824 argv[optind + 2] = argv[optind];
1831 _("in compatibility mode the last 2 arguments must be offsets"));
1838 _("in compatibility mode there may be no more than 3 arguments"));
1842 if (flag_pseudo_start)
1844 static char buf[10];
1846 if (output_address_fmt_string == NULL)
1848 output_address_fmt_string = "(%07o)";
1849 format_address = format_address_std;
1853 sprintf (buf, "%s (%s)",
1854 output_address_fmt_string,
1855 output_address_fmt_string);
1856 output_address_fmt_string = buf;
1857 format_address = format_address_label;
1862 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1863 for (i = 0; i < address_pad_len; i++)
1864 address_pad[i] = ' ';
1865 address_pad[address_pad_len] = '\0';
1869 int d_err = decode_one_format ("o2", NULL, &(spec[0]));
1871 assert (d_err == 0);
1876 file_list = (char const *const *) &argv[optind];
1879 /* If no files were listed on the command line, set up the
1880 global array FILE_LIST so that it contains the null-terminated
1881 list of one name: "-". */
1882 static char const *const default_file_list[] = {"-", NULL};
1884 file_list = default_file_list;
1887 err |= skip (n_bytes_to_skip);
1888 if (in_stream == NULL)
1891 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1893 /* Compute output block length. */
1896 if (width_specified)
1898 if (desired_width != 0 && desired_width % l_c_m == 0)
1899 bytes_per_block = desired_width;
1902 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1903 desired_width, l_c_m);
1904 bytes_per_block = l_c_m;
1909 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1910 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1912 bytes_per_block = l_c_m;
1916 for (i = 0; i < n_specs; i++)
1918 printf (_("%d: fmt=\"%s\" width=%d\n"),
1919 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1923 err |= (flag_dump_strings ? dump_strings () : dump ());
1927 if (have_read_stdin && fclose (stdin) == EOF)
1928 error (2, errno, _("standard input"));
1930 if (fclose (stdout) == EOF)
1931 error (2, errno, _("write error"));