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>
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)
79 /* FIXME: is there a way to do this without relying on the
80 `8 bits per byte' assumption? */
81 # define OFF_T_MAX (~((off_t)1 << (sizeof (off_t) * 8 - 1)))
84 #define STREQ(a,b) (strcmp((a), (b)) == 0)
87 # define MAX(a, b) ((a) > (b) ? (a) : (b))
91 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
94 #if defined (_WIN32) && defined (_O_BINARY)
95 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) \
97 { /* Turn off DOS text file modes, "rb" doesn't work on stdin. */\
98 if (_setmode (_fileno ((IN_STREAM)), _O_BINARY) == -1) \
100 error (0, errno, "%s", (FILENAME)); \
107 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) /* empty */
110 /* The default number of input bytes per output line. */
111 #define DEFAULT_BYTES_PER_BLOCK 16
113 /* The number of decimal digits of precision in a float. */
118 /* The number of decimal digits of precision in a double. */
123 /* The number of decimal digits of precision in a long double. */
125 # define LDBL_DIG DBL_DIG
154 /* Each output format specification (from POSIX `-t spec' or from
155 old-style options) is represented by one of these structures. */
158 enum output_format fmt;
160 void (*print_function) ();
164 /* The name this program was run with. */
167 /* Convert the number of 8-bit bytes of a binary representation to
168 the number of characters (digits + sign if the type is signed)
169 required to represent the same quantity in the specified base/type.
170 For example, a 32-bit (4-byte) quantity may require a field width
171 as wide as the following for these types:
175 8 unsigned hexadecimal */
177 static const unsigned int bytes_to_oct_digits[] =
178 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
180 static const unsigned int bytes_to_signed_dec_digits[] =
181 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
183 static const unsigned int bytes_to_unsigned_dec_digits[] =
184 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
186 static const unsigned int bytes_to_hex_digits[] =
187 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
189 /* Convert enum size_spec to the size of the named type. */
190 static const int width_bytes[] =
202 /* Names for some non-printing characters. */
203 static const char *const charname[33] =
205 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
206 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
207 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
208 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
212 /* A printf control string for printing a file offset. */
213 static const char *output_address_fmt_string;
215 /* FIXME: make this the number of octal digits in an unsigned long. */
216 #define MAX_ADDRESS_LENGTH 13
218 /* Space for a normal address, a space, a pseudo address, parentheses
219 around the pseudo address, and a trailing zero byte. */
220 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
221 static char address_pad[MAX_ADDRESS_LENGTH + 1];
223 static unsigned long int string_min;
224 static unsigned long int flag_dump_strings;
226 /* Non-zero if we should recognize the pre-POSIX non-option arguments
227 that specified at most one file and optional arguments specifying
228 offset and pseudo-start address. */
229 static int traditional;
231 /* Non-zero if an old-style `pseudo-address' was specified. */
232 static long int flag_pseudo_start;
234 /* The difference between the old-style pseudo starting address and
235 the number of bytes to skip. */
236 static long int pseudo_offset;
238 /* Function to format an address and optionally an additional parenthesized
239 pseudo-address; it returns the formatted string. */
240 static const char *(*format_address) __P ((long unsigned int));
242 /* The number of input bytes to skip before formatting and writing. */
243 static off_t n_bytes_to_skip = 0;
245 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
246 to be read and formatted. Otherwise all input is formatted. */
247 static int limit_bytes_to_format = 0;
249 /* The maximum number of bytes that will be formatted. This
250 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
251 static off_t max_bytes_to_format;
253 /* When nonzero and two or more consecutive blocks are equal, format
254 only the first block and output an asterisk alone on the following
255 line to indicate that identical blocks have been elided. */
256 static int abbreviate_duplicate_blocks = 1;
258 /* An array of specs describing how to format each input block. */
259 static struct tspec *spec;
261 /* The number of format specs. */
262 static unsigned int n_specs;
264 /* The allocated length of SPEC. */
265 static unsigned int n_specs_allocated;
267 /* The number of input bytes formatted per output line. It must be
268 a multiple of the least common multiple of the sizes associated with
269 the specified output types. It should be as large as possible, but
270 no larger than 16 -- unless specified with the -w option. */
271 static unsigned int bytes_per_block;
273 /* Human-readable representation of *file_list (for error messages).
274 It differs from *file_list only when *file_list is "-". */
275 static char const *input_filename;
277 /* A NULL-terminated list of the file-arguments from the command line.
278 If no file-arguments were specified, this variable is initialized
280 static char const *const *file_list;
282 /* The input stream associated with the current file. */
283 static FILE *in_stream;
285 /* If nonzero, at least one of the files we read was standard input. */
286 static int have_read_stdin;
288 #define LONGEST_INTEGRAL_TYPE long int
290 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
291 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
293 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
294 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
296 /* If nonzero, display usage information and exit. */
297 static int show_help;
299 /* If nonzero, print the version on standard output then exit. */
300 static int show_version;
302 static struct option const long_options[] =
305 {"skip-bytes", required_argument, NULL, 'j'},
306 {"address-radix", required_argument, NULL, 'A'},
307 {"read-bytes", required_argument, NULL, 'N'},
308 {"format", required_argument, NULL, 't'},
309 {"output-duplicates", no_argument, NULL, 'v'},
311 /* non-POSIX options. */
312 {"strings", optional_argument, NULL, 's'},
313 {"traditional", no_argument, NULL, 'B'},
314 {"width", optional_argument, NULL, 'w'},
315 {"help", no_argument, &show_help, 1},
316 {"version", no_argument, &show_version, 1},
324 fprintf (stderr, _("Try `%s --help' for more information.\n"),
329 Usage: %s [OPTION]... [FILE]...\n\
330 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
332 program_name, program_name);
334 Write an unambiguous representation, octal bytes by default, of FILE\n\
335 to standard output. With no FILE, or when FILE is -, read standard input.\n\
337 -A, --address-radix=RADIX decide how file offsets are printed\n\
338 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
339 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
340 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
341 -t, --format=TYPE select output format or formats\n\
342 -v, --output-duplicates do not use * to mark line suppression\n\
343 -w, --width[=BYTES] output BYTES bytes per output line\n\
344 --traditional accept arguments in pre-POSIX form\n\
345 --help display this help and exit\n\
346 --version output version information and exit\n\
348 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
349 -a same as -t a, select named characters\n\
350 -b same as -t oC, select octal bytes\n\
351 -c same as -t c, select ASCII characters or backslash escapes\n\
352 -d same as -t u2, select unsigned decimal shorts\n\
353 -f same as -t fF, select floats\n\
354 -h same as -t x2, select hexadecimal shorts\n\
355 -i same as -t d2, select decimal shorts\n\
356 -l same as -t d4, select decimal longs\n\
357 -o same as -t o2, select octal shorts\n\
358 -x same as -t x2, select hexadecimal shorts\n\
362 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
363 is the pseudo-address at first byte printed, incremented when dump is\n\
364 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
365 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
367 TYPE is made up of one or more of these specifications:\n\
370 c ASCII character or backslash escape\n\
371 d[SIZE] signed decimal, SIZE bytes per integer\n\
372 f[SIZE] floating point, SIZE bytes per integer\n\
373 o[SIZE] octal, SIZE bytes per integer\n\
374 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
375 x[SIZE] hexadecimal, SIZE bytes per integer\n\
377 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
378 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
379 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
380 for sizeof(double) or L for sizeof(long double).\n\
382 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
383 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
384 with b suffix, by 1024 with k and by 1048576 with m. -s without a\n\
385 number implies 3. -w without a number implies 32. By default, od\n\
386 uses -A o -t d2 -w 16.\n\
389 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
392 /* Compute the greatest common denominator of U and V
393 using Euclid's algorithm. */
396 gcd (unsigned int u, unsigned int v)
408 /* Compute the least common multiple of U and V. */
411 lcm (unsigned int u, unsigned int v)
413 unsigned int t = gcd (u, v);
420 print_s_char (long unsigned int n_bytes, const char *block,
421 const char *fmt_string)
424 for (i = n_bytes; i > 0; i--)
426 int tmp = (unsigned) *(const unsigned char *) block;
428 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
429 assert (tmp <= SCHAR_MAX);
430 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
431 block += sizeof (unsigned char);
436 print_char (long unsigned int n_bytes, const char *block,
437 const char *fmt_string)
440 for (i = n_bytes; i > 0; i--)
442 unsigned int tmp = *(const unsigned char *) block;
443 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
444 block += sizeof (unsigned char);
449 print_s_short (long unsigned int n_bytes, const char *block,
450 const char *fmt_string)
453 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
455 int tmp = (unsigned) *(const unsigned short *) block;
457 tmp -= SHRT_MAX - SHRT_MIN + 1;
458 assert (tmp <= SHRT_MAX);
459 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
460 block += sizeof (unsigned short);
464 print_short (long unsigned int n_bytes, const char *block,
465 const char *fmt_string)
468 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
470 unsigned int tmp = *(const unsigned short *) block;
471 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
472 block += sizeof (unsigned short);
477 print_int (long unsigned int n_bytes, const char *block,
478 const char *fmt_string)
481 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
483 unsigned int tmp = *(const unsigned int *) block;
484 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
485 block += sizeof (unsigned int);
490 print_long (long unsigned int n_bytes, const char *block,
491 const char *fmt_string)
494 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
496 unsigned long tmp = *(const unsigned long *) block;
497 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
498 block += sizeof (unsigned long);
503 print_float (long unsigned int n_bytes, const char *block,
504 const char *fmt_string)
507 for (i = n_bytes / sizeof (float); i > 0; i--)
509 float tmp = *(const float *) block;
510 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
511 block += sizeof (float);
516 print_double (long unsigned int n_bytes, const char *block,
517 const char *fmt_string)
520 for (i = n_bytes / sizeof (double); i > 0; i--)
522 double tmp = *(const double *) block;
523 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
524 block += sizeof (double);
528 #ifdef HAVE_LONG_DOUBLE
530 print_long_double (long unsigned int n_bytes, const char *block,
531 const char *fmt_string)
534 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
536 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
537 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
538 block += sizeof (LONG_DOUBLE);
545 print_named_ascii (long unsigned int n_bytes, const char *block,
546 const char *unused_fmt_string)
549 for (i = n_bytes; i > 0; i--)
551 unsigned int c = *(const unsigned char *) block;
552 unsigned int masked_c = (0x7f & c);
558 else if (masked_c <= 040)
559 s = charname[masked_c];
562 sprintf (buf, " %c", masked_c);
566 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
567 block += sizeof (unsigned char);
572 print_ascii (long unsigned int n_bytes, const char *block,
573 const char *unused_fmt_string)
576 for (i = n_bytes; i > 0; i--)
578 unsigned int c = *(const unsigned char *) block;
617 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
618 s = (const char *) buf;
621 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
622 block += sizeof (unsigned char);
626 /* Convert a null-terminated (possibly zero-length) string S to an
627 unsigned long integer value. If S points to a non-digit set *P to S,
628 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
629 the string of digits. If the string of digits represents a value
630 larger than ULONG_MAX, don't modify *VAL or *P and return nonzero.
631 Otherwise, advance *P to the first non-digit after S, set *VAL to
632 the result of the conversion and return zero. */
635 simple_strtoul (const char *s, const char **p, long unsigned int *val)
637 unsigned long int sum;
642 unsigned int c = *s++ - '0';
643 if (sum > (ULONG_MAX - c) / 10)
652 /* If S points to a single valid POSIX-style od format string, put a
653 description of that format in *TSPEC, make *NEXT point at the character
654 following the just-decoded format (if *NEXT is non-NULL), and return
655 zero. If S is not valid, don't modify *NEXT or *TSPEC and return
656 nonzero. For example, if S were "d4afL" *NEXT would be set to "afL"
659 fmt = SIGNED_DECIMAL;
660 size = INT or LONG; (whichever integral_type_size[4] resolves to)
661 print_function = print_int; (assuming size == INT)
662 fmt_string = "%011d%c";
667 decode_one_format (const char *s, const char **next, struct tspec *tspec)
669 enum size_spec size_spec;
670 unsigned long int size;
671 enum output_format fmt;
672 const char *pre_fmt_string;
674 void (*print_function) ();
678 assert (tspec != NULL);
692 size = sizeof (char);
697 size = sizeof (short);
707 size = sizeof (long int);
711 if (simple_strtoul (s, &p, &size) != 0)
717 if (size > MAX_INTEGRAL_TYPE_SIZE
718 || integral_type_size[size] == NO_SIZE)
725 #define FMT_BYTES_ALLOCATED 9
726 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
728 size_spec = integral_type_size[size];
733 fmt = SIGNED_DECIMAL;
734 sprintf (fmt_string, "%%%u%sd%%c",
735 bytes_to_signed_dec_digits[size],
736 (size_spec == LONG ? "l" : ""));
741 sprintf (fmt_string, "%%0%u%so%%c",
742 bytes_to_oct_digits[size],
743 (size_spec == LONG ? "l" : ""));
747 fmt = UNSIGNED_DECIMAL;
748 sprintf (fmt_string, "%%%u%su%%c",
749 bytes_to_unsigned_dec_digits[size],
750 (size_spec == LONG ? "l" : ""));
755 sprintf (fmt_string, "%%0%u%sx%%c",
756 bytes_to_hex_digits[size],
757 (size_spec == LONG ? "l" : ""));
764 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
769 print_function = (fmt == SIGNED_DECIMAL
775 print_function = (fmt == SIGNED_DECIMAL
781 print_function = print_int;
785 print_function = print_long;
794 fmt = FLOATING_POINT;
800 size = sizeof (float);
805 size = sizeof (double);
810 size = sizeof (LONG_DOUBLE);
814 if (simple_strtoul (s, &p, &size) != 0)
817 size = sizeof (double);
820 if (size > MAX_FP_TYPE_SIZE
821 || fp_type_size[size] == NO_SIZE)
827 size_spec = fp_type_size[size];
832 print_function = print_float;
833 /* Don't use %#e; not all systems support it. */
834 pre_fmt_string = "%%%d.%de%%c";
835 fmt_string = xmalloc (strlen (pre_fmt_string));
836 sprintf (fmt_string, pre_fmt_string,
837 FLT_DIG + 8, FLT_DIG);
841 print_function = print_double;
842 pre_fmt_string = "%%%d.%de%%c";
843 fmt_string = xmalloc (strlen (pre_fmt_string));
844 sprintf (fmt_string, pre_fmt_string,
845 DBL_DIG + 8, DBL_DIG);
848 #ifdef HAVE_LONG_DOUBLE
849 case FLOAT_LONG_DOUBLE:
850 print_function = print_long_double;
851 pre_fmt_string = "%%%d.%dle%%c";
852 fmt_string = xmalloc (strlen (pre_fmt_string));
853 sprintf (fmt_string, pre_fmt_string,
854 LDBL_DIG + 8, LDBL_DIG);
865 fmt = NAMED_CHARACTER;
868 print_function = print_named_ascii;
876 print_function = print_ascii;
883 tspec->size = size_spec;
885 tspec->print_function = print_function;
886 tspec->fmt_string = fmt_string;
894 /* Decode the POSIX-style od format string S. Append the decoded
895 representation to the global array SPEC, reallocating SPEC if
896 necessary. Return zero if S is valid, nonzero otherwise. */
899 decode_format_string (const char *s)
908 if (decode_one_format (s, &next, &tspec))
914 if (n_specs >= n_specs_allocated)
916 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
917 spec = (struct tspec *) xrealloc (spec, (n_specs_allocated
918 * sizeof (struct tspec)));
921 memcpy ((char *) &spec[n_specs], (char *) &tspec, sizeof (struct tspec));
928 /* Given a list of one or more input filenames FILE_LIST, set the global
929 file pointer IN_STREAM to position N_SKIP in the concatenation of
930 those files. If any file operation fails or if there are fewer than
931 N_SKIP bytes in the combined input, give an error message and return
932 nonzero. When possible, use seek- rather than read operations to
933 advance IN_STREAM. A file name of "-" is interpreted as standard
942 for ( /* empty */ ; *file_list != NULL; ++file_list)
944 struct stat file_stats;
947 if (STREQ (*file_list, "-"))
949 input_filename = _("standard input");
955 input_filename = *file_list;
956 in_stream = fopen (input_filename, "r");
957 if (in_stream == NULL)
959 error (0, errno, "%s", input_filename);
964 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
969 /* First try using fseek. For large offsets, this extra work is
970 worthwhile. If the offset is below some threshold it may be
971 more efficient to move the pointer by reading. There are two
972 issues when trying to use fseek:
973 - the file must be seekable.
974 - before seeking to the specified position, make sure
975 that the new position is in the current file.
976 Try to do that by getting file's size using fstat().
977 But that will work only for regular files and dirs. */
979 if (fstat (fileno (in_stream), &file_stats))
981 error (0, errno, "%s", input_filename);
986 /* The st_size field is valid only for regular files and
987 directories. FIXME: is the preceding true?
988 If the number of bytes left to skip is at least as large as
989 the size of the current file, we can decrement
990 n_skip and go on to the next file. */
991 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
993 if (n_skip >= file_stats.st_size)
995 n_skip -= file_stats.st_size;
996 if (in_stream != stdin && fclose (in_stream) == EOF)
998 error (0, errno, "%s", input_filename);
1005 /* fseek may work on some streams for which lseek doesn't.
1006 But fseek's offset argument is restricted to the range
1007 of type `long'. So if N_SKIP is too large or if fseek
1008 fails, try lseek. */
1009 if ((n_skip <= LONG_MAX
1010 && fseek (in_stream, (long) n_skip, SEEK_SET) == 0)
1011 || lseek (fileno (in_stream), n_skip, SEEK_SET) >= 0)
1019 /* Seek didn't work or wasn't attempted; position the file pointer
1022 for (j = n_skip / BUFSIZ; j >= 0; j--)
1025 size_t n_bytes_to_read = (j > 0
1028 size_t n_bytes_read;
1029 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1030 n_skip -= n_bytes_read;
1031 if (n_bytes_read != n_bytes_to_read)
1040 error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1046 format_address_none (long unsigned int address)
1052 format_address_std (long unsigned int address)
1054 const char *address_string;
1056 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1057 address_string = address_fmt_buffer;
1058 return address_string;
1062 format_address_label (long unsigned int address)
1064 const char *address_string;
1065 assert (output_address_fmt_string != NULL);
1067 sprintf (address_fmt_buffer, output_address_fmt_string,
1068 address, address + pseudo_offset);
1069 address_string = address_fmt_buffer;
1070 return address_string;
1073 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1074 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1075 CURR_BLOCK in the concatenation of input files, and it is printed
1076 (optionally) only before the output line associated with the first
1077 format spec. When duplicate blocks are being abbreviated, the output
1078 for a sequence of identical input blocks is the output for the first
1079 block followed by an asterisk alone on a line. It is valid to compare
1080 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1081 That condition may be false only for the last input block -- and then
1082 only when it has not been padded to length BYTES_PER_BLOCK. */
1085 write_block (long unsigned int current_offset, long unsigned int n_bytes,
1086 const char *prev_block, const char *curr_block)
1088 static int first = 1;
1089 static int prev_pair_equal = 0;
1091 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1093 if (abbreviate_duplicate_blocks
1094 && !first && n_bytes == bytes_per_block
1095 && EQUAL_BLOCKS (prev_block, curr_block))
1097 if (prev_pair_equal)
1099 /* The two preceding blocks were equal, and the current
1100 block is the same as the last one, so print nothing. */
1105 prev_pair_equal = 1;
1112 prev_pair_equal = 0;
1113 for (i = 0; i < n_specs; i++)
1115 printf ("%s ", (i == 0
1116 ? format_address (current_offset)
1118 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1124 /* Test whether there have been errors on in_stream, and close it if
1125 it is not standard input. Return nonzero if there has been an error
1126 on in_stream or stdout; return zero otherwise. This function will
1127 report more than one error only if both a read and a write error
1131 check_and_close (void)
1136 if (ferror (in_stream))
1138 error (0, errno, "%s", input_filename);
1139 if (in_stream != stdin)
1143 else if (in_stream != stdin && fclose (in_stream) == EOF)
1145 error (0, errno, "%s", input_filename);
1149 if (ferror (stdout))
1151 error (0, errno, _("standard output"));
1158 /* Read a single byte into *C from the concatenation of the input files
1159 named in the global array FILE_LIST. On the first call to this
1160 function, the global variable IN_STREAM is expected to be an open
1161 stream associated with the input file *FILE_LIST. If IN_STREAM is
1162 at end-of-file, close it and update the global variables IN_STREAM,
1163 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1164 the list. Then try to read a byte from the newly opened file.
1165 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1166 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1167 calls do likewise. The return value is nonzero if any errors
1168 occured, zero otherwise. */
1175 if (*file_list == NULL)
1184 *c = fgetc (in_stream);
1189 err |= check_and_close ();
1194 if (*file_list == NULL)
1197 if (STREQ (*file_list, "-"))
1199 input_filename = _("standard input");
1201 have_read_stdin = 1;
1205 input_filename = *file_list;
1206 in_stream = fopen (input_filename, "r");
1207 if (in_stream == NULL)
1209 error (0, errno, "%s", input_filename);
1213 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1215 while (in_stream == NULL);
1219 /* Read N bytes into BLOCK from the concatenation of the input files
1220 named in the global array FILE_LIST. On the first call to this
1221 function, the global variable IN_STREAM is expected to be an open
1222 stream associated with the input file *FILE_LIST. On subsequent
1223 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1224 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1225 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1226 Then try to read the remaining bytes from the newly opened file.
1227 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1228 to the number of bytes read. If an error occurs, it will be detected
1229 through ferror when the stream is about to be closed. If there is an
1230 error, give a message but continue reading as usual and return nonzero.
1231 Otherwise return zero. */
1234 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1238 assert (n > 0 && n <= bytes_per_block);
1240 *n_bytes_in_buffer = 0;
1245 if (*file_list == NULL)
1246 return 0; /* EOF. */
1254 n_needed = n - *n_bytes_in_buffer;
1255 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1257 *n_bytes_in_buffer += n_read;
1259 if (n_read == n_needed)
1262 err |= check_and_close ();
1267 if (*file_list == NULL)
1270 if (STREQ (*file_list, "-"))
1272 input_filename = _("standard input");
1274 have_read_stdin = 1;
1278 input_filename = *file_list;
1279 in_stream = fopen (input_filename, "r");
1280 if (in_stream == NULL)
1282 error (0, errno, "%s", input_filename);
1286 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1288 while (in_stream == NULL);
1292 /* Return the least common multiple of the sizes associated
1293 with the format specs. */
1301 for (i = 0; i < n_specs; i++)
1302 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1306 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1307 return the offset it denotes. Otherwise, return -1. */
1310 parse_old_offset (const char *s)
1314 enum strtol_error s_err;
1315 long unsigned int tmp;
1320 /* Skip over any leading '+'. */
1324 /* Determine the radix we'll use to interpret S. If there is a `.',
1325 it's decimal, otherwise, if the string begins with `0X'or `0x',
1326 it's hexadecimal, else octal. */
1327 if (strchr (s, '.') != NULL)
1331 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1337 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1338 if (s_err != LONGINT_OK)
1340 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1347 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1348 formatted block to standard output, and repeat until the specified
1349 maximum number of bytes has been read or until all input has been
1350 processed. If the last block read is smaller than BYTES_PER_BLOCK
1351 and its size is not a multiple of the size associated with a format
1352 spec, extend the input block with zero bytes until its length is a
1353 multiple of all format spec sizes. Write the final block. Finally,
1354 write on a line by itself the offset of the byte after the last byte
1355 read. Accumulate return values from calls to read_block and
1356 check_and_close, and if any was nonzero, return nonzero.
1357 Otherwise, return zero. */
1363 off_t current_offset;
1367 size_t n_bytes_read;
1369 #ifdef lint /* Suppress `used before initialized' warning. */
1373 block[0] = (char *) alloca (bytes_per_block);
1374 block[1] = (char *) alloca (bytes_per_block);
1376 current_offset = n_bytes_to_skip;
1380 if (limit_bytes_to_format)
1382 end_offset = n_bytes_to_skip + max_bytes_to_format;
1387 if (current_offset >= end_offset)
1392 n_needed = MIN (end_offset - current_offset,
1393 (off_t) bytes_per_block);
1394 err |= read_block (n_needed, block[idx], &n_bytes_read);
1395 if (n_bytes_read < bytes_per_block)
1397 assert (n_bytes_read == bytes_per_block);
1398 write_block (current_offset, n_bytes_read,
1399 block[!idx], block[idx]);
1400 current_offset += n_bytes_read;
1408 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1409 if (n_bytes_read < bytes_per_block)
1411 assert (n_bytes_read == bytes_per_block);
1412 write_block (current_offset, n_bytes_read,
1413 block[!idx], block[idx]);
1414 current_offset += n_bytes_read;
1419 if (n_bytes_read > 0)
1422 size_t bytes_to_write;
1426 /* Make bytes_to_write the smallest multiple of l_c_m that
1427 is at least as large as n_bytes_read. */
1428 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1430 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1431 write_block (current_offset, bytes_to_write,
1432 block[!idx], block[idx]);
1433 current_offset += n_bytes_read;
1436 if (output_address_fmt_string != NULL)
1437 printf ("%s\n", format_address (current_offset));
1439 if (limit_bytes_to_format && current_offset > end_offset)
1440 err |= check_and_close ();
1445 /* STRINGS mode. Find each "string constant" in the input.
1446 A string constant is a run of at least `string_min' ASCII
1447 graphic (or formatting) characters terminated by a null.
1448 Based on a function written by Richard Stallman for a
1449 pre-POSIX version of od. Return nonzero if an error
1450 occurs. Otherwise, return zero. */
1455 size_t bufsize = MAX (100, string_min);
1456 char *buf = xmalloc (bufsize);
1457 off_t address = n_bytes_to_skip;
1466 /* See if the next `string_min' chars are all printing chars. */
1469 if (limit_bytes_to_format
1470 && address >= (n_bytes_to_skip + max_bytes_to_format - string_min))
1473 for (i = 0; i < string_min; i++)
1475 err |= read_char (&c);
1483 /* Found a non-printing. Try again starting with next char. */
1488 /* We found a run of `string_min' printable characters.
1489 Now see if it is terminated with a null byte. */
1490 while (!limit_bytes_to_format
1491 || address < n_bytes_to_skip + max_bytes_to_format)
1495 bufsize = 1 + 3 * bufsize / 2;
1496 buf = xrealloc (buf, bufsize);
1498 err |= read_char (&c);
1506 break; /* It is; print this string. */
1508 goto tryline; /* It isn't; give up on this string. */
1509 buf[i++] = c; /* String continues; store it all. */
1512 /* If we get here, the string is all printable and null-terminated,
1513 so print it. It is all in `buf' and `i' is its length. */
1515 if (output_address_fmt_string != NULL)
1517 printf ("%s ", format_address (address - i - 1));
1519 for (i = 0; (c = buf[i]); i++)
1524 fputs ("\\a", stdout);
1528 fputs ("\\b", stdout);
1532 fputs ("\\f", stdout);
1536 fputs ("\\n", stdout);
1540 fputs ("\\r", stdout);
1544 fputs ("\\t", stdout);
1548 fputs ("\\v", stdout);
1558 /* We reach this point only if we search through
1559 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1563 err |= check_and_close ();
1568 main (int argc, char **argv)
1574 unsigned int address_pad_len;
1575 unsigned long int desired_width;
1576 int width_specified = 0;
1579 /* The old-style `pseudo starting address' to be printed in parentheses
1580 after any true address. */
1581 long int pseudo_start;
1583 #ifdef lint /* Suppress `used before initialized' warning. */
1587 program_name = argv[0];
1588 setlocale (LC_ALL, "");
1589 bindtextdomain (PACKAGE, LOCALEDIR);
1590 textdomain (PACKAGE);
1594 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1595 integral_type_size[i] = NO_SIZE;
1597 integral_type_size[sizeof (char)] = CHAR;
1598 integral_type_size[sizeof (short int)] = SHORT;
1599 integral_type_size[sizeof (int)] = INT;
1600 integral_type_size[sizeof (long int)] = LONG;
1602 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1603 fp_type_size[i] = NO_SIZE;
1605 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1606 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1607 so that if `long double' is the same type or if long double isn't
1608 supported FLOAT_LONG_DOUBLE will never be used. */
1609 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1610 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1613 n_specs_allocated = 5;
1614 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1616 output_address_fmt_string = "%07o";
1617 format_address = format_address_std;
1618 address_pad_len = 7;
1619 flag_dump_strings = 0;
1621 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1622 long_options, (int *) 0))
1625 unsigned long int tmp;
1626 enum strtol_error s_err;
1637 output_address_fmt_string = "%07d";
1638 format_address = format_address_std;
1639 address_pad_len = 7;
1642 output_address_fmt_string = "%07o";
1643 format_address = format_address_std;
1644 address_pad_len = 7;
1647 output_address_fmt_string = "%06x";
1648 format_address = format_address_std;
1649 address_pad_len = 6;
1652 output_address_fmt_string = NULL;
1653 format_address = format_address_none;
1654 address_pad_len = 0;
1657 error (EXIT_FAILURE, 0,
1658 _("invalid output address radix `%c'; \
1659 it must be one character from [doxn]"),
1666 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1667 n_bytes_to_skip = tmp;
1668 if (s_err != LONGINT_OK)
1669 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1673 limit_bytes_to_format = 1;
1675 /* FIXME: if off_t is long long and that's an 8-byte type,
1676 use xstrtouq here. */
1677 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1678 max_bytes_to_format = tmp;
1679 if (s_err != LONGINT_OK)
1680 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1682 if (tmp > OFF_T_MAX)
1683 error (EXIT_FAILURE, 0,
1684 _("specified number of bytes `%s' is larger than \
1685 the maximum\nrepresentable value of type off_t"), optarg);
1693 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1694 if (s_err != LONGINT_OK)
1695 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1697 ++flag_dump_strings;
1701 if (decode_format_string (optarg))
1702 error (EXIT_FAILURE, 0, _("invalid type string `%s'"), optarg);
1706 abbreviate_duplicate_blocks = 0;
1713 /* The next several cases map the old, pre-POSIX format
1714 specification options to the corresponding POSIX format
1715 specs. GNU od accepts any combination of old- and
1716 new-style options. Format specification options accumulate. */
1718 #define CASE_OLD_ARG(old_char,new_string) \
1722 tmp = decode_format_string (new_string); \
1723 assert (tmp == 0); \
1727 CASE_OLD_ARG ('a', "a");
1728 CASE_OLD_ARG ('b', "oC");
1729 CASE_OLD_ARG ('c', "c");
1730 CASE_OLD_ARG ('d', "u2");
1731 CASE_OLD_ARG ('f', "fF");
1732 CASE_OLD_ARG ('h', "x2");
1733 CASE_OLD_ARG ('i', "d2");
1734 CASE_OLD_ARG ('l', "d4");
1735 CASE_OLD_ARG ('o', "o2");
1736 CASE_OLD_ARG ('x', "x2");
1741 width_specified = 1;
1748 s_err = xstrtoul (optarg, NULL, 10, &desired_width, NULL);
1749 if (s_err != LONGINT_OK)
1750 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1762 printf ("od - %s\n", PACKAGE_VERSION);
1763 exit (EXIT_SUCCESS);
1769 if (flag_dump_strings && n_specs > 0)
1770 error (EXIT_FAILURE, 0,
1771 _("no type may be specified when dumping strings"));
1773 n_files = argc - optind;
1775 /* If the --backward-compatible option is used, there may be from
1776 0 to 3 remaining command line arguments; handle each case
1778 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1779 The offset and pseudo_start have the same syntax. */
1787 if ((offset = parse_old_offset (argv[optind])) >= 0)
1789 n_bytes_to_skip = offset;
1794 else if (n_files == 2)
1797 if ((o1 = parse_old_offset (argv[optind])) >= 0
1798 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1800 n_bytes_to_skip = o1;
1801 flag_pseudo_start = 1;
1806 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1808 n_bytes_to_skip = o2;
1810 argv[optind + 1] = argv[optind];
1816 _("invalid second operand in compatibility mode `%s'"),
1821 else if (n_files == 3)
1824 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1825 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1827 n_bytes_to_skip = o1;
1828 flag_pseudo_start = 1;
1830 argv[optind + 2] = argv[optind];
1837 _("in compatibility mode the last 2 arguments must be offsets"));
1844 _("in compatibility mode there may be no more than 3 arguments"));
1848 if (flag_pseudo_start)
1850 static char buf[10];
1852 if (output_address_fmt_string == NULL)
1854 output_address_fmt_string = "(%07o)";
1855 format_address = format_address_std;
1859 sprintf (buf, "%s (%s)",
1860 output_address_fmt_string,
1861 output_address_fmt_string);
1862 output_address_fmt_string = buf;
1863 format_address = format_address_label;
1868 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1869 for (i = 0; i < address_pad_len; i++)
1870 address_pad[i] = ' ';
1871 address_pad[address_pad_len] = '\0';
1875 int d_err = decode_one_format ("o2", NULL, &(spec[0]));
1877 assert (d_err == 0);
1882 file_list = (char const *const *) &argv[optind];
1885 /* If no files were listed on the command line, set up the
1886 global array FILE_LIST so that it contains the null-terminated
1887 list of one name: "-". */
1888 static char const *const default_file_list[] = {"-", NULL};
1890 file_list = default_file_list;
1893 err |= skip (n_bytes_to_skip);
1894 if (in_stream == NULL)
1897 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1899 /* Compute output block length. */
1902 if (width_specified)
1904 if (desired_width != 0 && desired_width % l_c_m == 0)
1905 bytes_per_block = desired_width;
1908 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1909 desired_width, l_c_m);
1910 bytes_per_block = l_c_m;
1915 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1916 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1918 bytes_per_block = l_c_m;
1922 for (i = 0; i < n_specs; i++)
1924 printf (_("%d: fmt=\"%s\" width=%d\n"),
1925 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1929 err |= (flag_dump_strings ? dump_strings () : dump ());
1933 if (have_read_stdin && fclose (stdin) == EOF)
1934 error (EXIT_FAILURE, errno, _("standard input"));
1936 if (fclose (stdout) == EOF)
1937 error (EXIT_FAILURE, errno, _("write error"));
1939 exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);