1 /* od -- dump files in octal and other formats
2 Copyright (C) 92, 95, 96, 1997 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
18 /* Written by Jim Meyering. */
25 #include <sys/types.h>
30 #if defined(__GNUC__) || defined(STDC_HEADERS)
34 #ifdef HAVE_LONG_DOUBLE
35 typedef long double LONG_DOUBLE;
37 typedef double LONG_DOUBLE;
44 # define SCHAR_MAX 127
47 # define SCHAR_MIN (-128)
50 # define SHRT_MAX 32767
53 # define SHRT_MIN (-32768)
56 # define ULONG_MAX ((unsigned long) ~(unsigned long) 0)
64 # define BITSPERBYTE 8
67 #define STREQ(a,b) (strcmp((a), (b)) == 0)
70 # define MAX(a, b) ((a) > (b) ? (a) : (b))
74 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
77 #if defined (_WIN32) && defined (_O_BINARY)
78 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) \
80 { /* Turn off DOS text file modes, "rb" doesn't work on stdin. */\
81 if (_setmode (_fileno ((IN_STREAM)), _O_BINARY) == -1) \
83 error (0, errno, "%s", (FILENAME)); \
90 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) /* empty */
93 /* The default number of input bytes per output line. */
94 #define DEFAULT_BYTES_PER_BLOCK 16
96 /* The number of decimal digits of precision in a float. */
101 /* The number of decimal digits of precision in a double. */
106 /* The number of decimal digits of precision in a long double. */
108 # define LDBL_DIG DBL_DIG
137 /* Each output format specification (from POSIX `-t spec' or from
138 old-style options) is represented by one of these structures. */
141 enum output_format fmt;
143 void (*print_function) ();
145 int trailer, field_width;
148 /* The name this program was run with. */
151 /* Convert the number of 8-bit bytes of a binary representation to
152 the number of characters (digits + sign if the type is signed)
153 required to represent the same quantity in the specified base/type.
154 For example, a 32-bit (4-byte) quantity may require a field width
155 as wide as the following for these types:
159 8 unsigned hexadecimal */
161 static const unsigned int bytes_to_oct_digits[] =
162 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
164 static const unsigned int bytes_to_signed_dec_digits[] =
165 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
167 static const unsigned int bytes_to_unsigned_dec_digits[] =
168 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
170 static const unsigned int bytes_to_hex_digits[] =
171 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
173 /* Convert enum size_spec to the size of the named type. */
174 static const int width_bytes[] =
186 /* Names for some non-printing characters. */
187 static const char *const charname[33] =
189 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
190 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
191 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
192 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
196 /* A printf control string for printing a file offset. */
197 static const char *output_address_fmt_string;
199 /* FIXME: make this the number of octal digits in an unsigned long. */
200 #define MAX_ADDRESS_LENGTH 13
202 /* Space for a normal address, a space, a pseudo address, parentheses
203 around the pseudo address, and a trailing zero byte. */
204 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
205 static char address_pad[MAX_ADDRESS_LENGTH + 1];
207 static unsigned long int string_min;
208 static unsigned long int flag_dump_strings;
210 /* Non-zero if we should recognize the pre-POSIX non-option arguments
211 that specified at most one file and optional arguments specifying
212 offset and pseudo-start address. */
213 static int traditional;
215 /* Non-zero if an old-style `pseudo-address' was specified. */
216 static long int flag_pseudo_start;
218 /* The difference between the old-style pseudo starting address and
219 the number of bytes to skip. */
220 static long int pseudo_offset;
222 /* Function to format an address and optionally an additional parenthesized
223 pseudo-address; it returns the formatted string. */
224 static const char *(*format_address) __P ((long unsigned int));
226 /* The number of input bytes to skip before formatting and writing. */
227 static off_t n_bytes_to_skip = 0;
229 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
230 to be read and formatted. Otherwise all input is formatted. */
231 static int limit_bytes_to_format = 0;
233 /* The maximum number of bytes that will be formatted. This
234 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
235 static off_t max_bytes_to_format;
237 /* When nonzero and two or more consecutive blocks are equal, format
238 only the first block and output an asterisk alone on the following
239 line to indicate that identical blocks have been elided. */
240 static int abbreviate_duplicate_blocks = 1;
242 /* An array of specs describing how to format each input block. */
243 static struct tspec *spec;
245 /* The number of format specs. */
246 static unsigned int n_specs;
248 /* The allocated length of SPEC. */
249 static unsigned int n_specs_allocated;
251 /* The number of input bytes formatted per output line. It must be
252 a multiple of the least common multiple of the sizes associated with
253 the specified output types. It should be as large as possible, but
254 no larger than 16 -- unless specified with the -w option. */
255 static unsigned int bytes_per_block;
257 /* Human-readable representation of *file_list (for error messages).
258 It differs from *file_list only when *file_list is "-". */
259 static char const *input_filename;
261 /* A NULL-terminated list of the file-arguments from the command line.
262 If no file-arguments were specified, this variable is initialized
264 static char const *const *file_list;
266 /* The input stream associated with the current file. */
267 static FILE *in_stream;
269 /* If nonzero, at least one of the files we read was standard input. */
270 static int have_read_stdin;
272 #define LONGEST_INTEGRAL_TYPE long int
274 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
275 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
277 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
278 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
280 /* If nonzero, display usage information and exit. */
281 static int show_help;
283 /* If nonzero, print the version on standard output then exit. */
284 static int show_version;
286 static struct option const long_options[] =
289 {"skip-bytes", required_argument, NULL, 'j'},
290 {"address-radix", required_argument, NULL, 'A'},
291 {"read-bytes", required_argument, NULL, 'N'},
292 {"format", required_argument, NULL, 't'},
293 {"output-duplicates", no_argument, NULL, 'v'},
295 /* non-POSIX options. */
296 {"strings", optional_argument, NULL, 's'},
297 {"traditional", no_argument, NULL, 'B'},
298 {"width", optional_argument, NULL, 'w'},
299 {"help", no_argument, &show_help, 1},
300 {"version", no_argument, &show_version, 1},
308 fprintf (stderr, _("Try `%s --help' for more information.\n"),
313 Usage: %s [OPTION]... [FILE]...\n\
314 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
316 program_name, program_name);
318 Write an unambiguous representation, octal bytes by default, of FILE\n\
319 to standard output. With no FILE, or when FILE is -, read standard input.\n\
321 -A, --address-radix=RADIX decide how file offsets are printed\n\
322 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
323 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
324 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
325 -t, --format=TYPE select output format or formats\n\
326 -v, --output-duplicates do not use * to mark line suppression\n\
327 -w, --width[=BYTES] output BYTES bytes per output line\n\
328 --traditional accept arguments in pre-POSIX form\n\
329 --help display this help and exit\n\
330 --version output version information and exit\n\
332 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
333 -a same as -t a, select named characters\n\
334 -b same as -t oC, select octal bytes\n\
335 -c same as -t c, select ASCII characters or backslash escapes\n\
336 -d same as -t u2, select unsigned decimal shorts\n\
337 -f same as -t fF, select floats\n\
338 -h same as -t x2, select hexadecimal shorts\n\
339 -i same as -t d2, select decimal shorts\n\
340 -l same as -t d4, select decimal longs\n\
341 -o same as -t o2, select octal shorts\n\
342 -x same as -t x2, select hexadecimal shorts\n\
346 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
347 is the pseudo-address at first byte printed, incremented when dump is\n\
348 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
349 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
351 TYPE is made up of one or more of these specifications:\n\
354 c ASCII character or backslash escape\n\
355 d[SIZE] signed decimal, SIZE bytes per integer\n\
356 f[SIZE] floating point, SIZE bytes per integer\n\
357 o[SIZE] octal, SIZE bytes per integer\n\
358 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
359 x[SIZE] hexadecimal, SIZE bytes per integer\n\
361 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
362 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
363 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
364 for sizeof(double) or L for sizeof(long double).\n\
366 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
367 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
368 with b suffix, by 1024 with k and by 1048576 with m. Adding a z suffix to\n\
369 any type adds a display of printable characters to the end of each line\n\
370 of output. -s without a number implies 3. -w without a number implies 32.\n\
371 By default, od uses -A o -t d2 -w 16.\n\
373 puts (_("\nReport bugs to <textutils-bugs@gnu.ai.mit.edu>."));
375 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
378 /* Compute the greatest common denominator of U and V
379 using Euclid's algorithm. */
382 gcd (unsigned int u, unsigned int v)
394 /* Compute the least common multiple of U and V. */
397 lcm (unsigned int u, unsigned int v)
399 unsigned int t = gcd (u, v);
406 print_s_char (long unsigned int n_bytes, const char *block,
407 const char *fmt_string)
410 for (i = n_bytes; i > 0; i--)
412 int tmp = (unsigned) *(const unsigned char *) block;
414 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
415 assert (tmp <= SCHAR_MAX);
416 printf (fmt_string, tmp);
417 block += sizeof (unsigned char);
422 print_char (long unsigned int n_bytes, const char *block,
423 const char *fmt_string)
426 for (i = n_bytes; i > 0; i--)
428 unsigned int tmp = *(const unsigned char *) block;
429 printf (fmt_string, tmp);
430 block += sizeof (unsigned char);
435 print_s_short (long unsigned int n_bytes, const char *block,
436 const char *fmt_string)
439 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
441 int tmp = (unsigned) *(const unsigned short *) block;
443 tmp -= SHRT_MAX - SHRT_MIN + 1;
444 assert (tmp <= SHRT_MAX);
445 printf (fmt_string, tmp);
446 block += sizeof (unsigned short);
451 print_short (long unsigned int n_bytes, const char *block,
452 const char *fmt_string)
455 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
457 unsigned int tmp = *(const unsigned short *) block;
458 printf (fmt_string, tmp);
459 block += sizeof (unsigned short);
464 print_int (long unsigned int n_bytes, const char *block,
465 const char *fmt_string)
468 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
470 unsigned int tmp = *(const unsigned int *) block;
471 printf (fmt_string, tmp);
472 block += sizeof (unsigned int);
477 print_long (long unsigned int n_bytes, const char *block,
478 const char *fmt_string)
481 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
483 unsigned long tmp = *(const unsigned long *) block;
484 printf (fmt_string, tmp);
485 block += sizeof (unsigned long);
490 print_float (long unsigned int n_bytes, const char *block,
491 const char *fmt_string)
494 for (i = n_bytes / sizeof (float); i > 0; i--)
496 float tmp = *(const float *) block;
497 printf (fmt_string, tmp);
498 block += sizeof (float);
503 print_double (long unsigned int n_bytes, const char *block,
504 const char *fmt_string)
507 for (i = n_bytes / sizeof (double); i > 0; i--)
509 double tmp = *(const double *) block;
510 printf (fmt_string, tmp);
511 block += sizeof (double);
515 #ifdef HAVE_LONG_DOUBLE
517 print_long_double (long unsigned int n_bytes, const char *block,
518 const char *fmt_string)
521 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
523 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
524 printf (fmt_string, tmp);
525 block += sizeof (LONG_DOUBLE);
532 dump_string_trailer(long unsigned int n_bytes, const char *block)
536 for (i = n_bytes; i > 0; i--)
538 unsigned int c = *(const unsigned char *) block;
539 printf ("%c", ISPRINT(c) ? c : '.');
540 block += sizeof (unsigned char);
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);
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;
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
654 a description of that format in *TSPEC, make *NEXT point at the
655 character following the just-decoded format (if *NEXT is non-NULL),
656 and return zero. If S is not valid, don't modify *NEXT or *TSPEC,
657 give a diagnostic, and return nonzero. For example, if S were
658 "d4afL" *NEXT would be set to "afL" and *TSPEC would be
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";
665 S_ORIG is solely for reporting errors. It should be the full format
670 decode_one_format (const char *s_orig, const char *s, const char **next,
673 enum size_spec size_spec;
674 unsigned long int size;
675 enum output_format fmt;
676 const char *pre_fmt_string;
678 void (*print_function) ();
680 unsigned int c, field_width=0;
682 assert (tspec != NULL);
696 size = sizeof (char);
701 size = sizeof (short);
711 size = sizeof (long int);
715 if (simple_strtoul (s, &p, &size) != 0)
717 /* The integer at P in S would overflow an unsigned long.
718 A digit string that long is sufficiently odd looking
719 that the following diagnostic is sufficient. */
720 error (0, 0, _("invalid type string `%s'"), s_orig);
727 if (size > MAX_INTEGRAL_TYPE_SIZE
728 || integral_type_size[size] == NO_SIZE)
730 error (0, 0, _("invalid type string `%s';\n\
731 this system doesn't provide a %lu-byte integral type"), s_orig, size);
739 #define FMT_BYTES_ALLOCATED 9
740 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
742 size_spec = integral_type_size[size];
747 fmt = SIGNED_DECIMAL;
748 sprintf (fmt_string, " %%%u%sd",
749 field_width = bytes_to_signed_dec_digits[size],
750 (size_spec == LONG ? "l" : ""));
755 sprintf (fmt_string, " %%0%u%so",
756 field_width = bytes_to_oct_digits[size],
757 (size_spec == LONG ? "l" : ""));
761 fmt = UNSIGNED_DECIMAL;
762 sprintf (fmt_string, " %%%u%su",
763 field_width = bytes_to_unsigned_dec_digits[size],
764 (size_spec == LONG ? "l" : ""));
769 sprintf (fmt_string, " %%0%u%sx",
770 field_width = bytes_to_hex_digits[size],
771 (size_spec == LONG ? "l" : ""));
778 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
783 print_function = (fmt == SIGNED_DECIMAL
789 print_function = (fmt == SIGNED_DECIMAL
795 print_function = print_int;
799 print_function = print_long;
808 fmt = FLOATING_POINT;
814 size = sizeof (float);
819 size = sizeof (double);
824 size = sizeof (LONG_DOUBLE);
828 if (simple_strtoul (s, &p, &size) != 0)
830 /* The integer at P in S would overflow an unsigned long.
831 A digit string that long is sufficiently odd looking
832 that the following diagnostic is sufficient. */
833 error (0, 0, _("invalid type string `%s'"), s_orig);
837 size = sizeof (double);
840 if (size > MAX_FP_TYPE_SIZE
841 || fp_type_size[size] == NO_SIZE)
843 error (0, 0, _("invalid type string `%s';\n\
844 this system doesn't provide a %lu-byte floating point type"), s_orig, size);
851 size_spec = fp_type_size[size];
856 print_function = print_float;
857 /* Don't use %#e; not all systems support it. */
858 pre_fmt_string = " %%%d.%de";
859 fmt_string = xmalloc (strlen (pre_fmt_string));
860 sprintf (fmt_string, pre_fmt_string,
861 field_width = FLT_DIG + 8, FLT_DIG);
865 print_function = print_double;
866 pre_fmt_string = " %%%d.%de";
867 fmt_string = xmalloc (strlen (pre_fmt_string));
868 sprintf (fmt_string, pre_fmt_string,
869 field_width = DBL_DIG + 8, DBL_DIG);
872 #ifdef HAVE_LONG_DOUBLE
873 case FLOAT_LONG_DOUBLE:
874 print_function = print_long_double;
875 pre_fmt_string = " %%%d.%dLe";
876 fmt_string = xmalloc (strlen (pre_fmt_string));
877 sprintf (fmt_string, pre_fmt_string,
878 field_width = LDBL_DIG + 8, LDBL_DIG);
889 fmt = NAMED_CHARACTER;
892 print_function = print_named_ascii;
901 print_function = print_ascii;
906 error (0, 0, _("invalid character `%c' in type string `%s'"),
911 tspec->size = size_spec;
913 tspec->print_function = print_function;
914 tspec->fmt_string = fmt_string;
916 tspec->field_width = field_width;
917 tspec->trailer = (*s == 'z');
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);
1154 if (spec[i].trailer)
1156 /* space-pad out to full line width, then dump the trailer */
1157 int datum_width = width_bytes[spec[i].size];
1158 int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1159 int field_width = spec[i].field_width + 1;
1160 printf("%*s", blank_fields * field_width, "");
1161 dump_string_trailer(n_bytes, curr_block);
1169 /* Test whether there have been errors on in_stream, and close it if
1170 it is not standard input. Return nonzero if there has been an error
1171 on in_stream or stdout; return zero otherwise. This function will
1172 report more than one error only if both a read and a write error
1176 check_and_close (void)
1181 if (ferror (in_stream))
1183 error (0, errno, "%s", input_filename);
1184 if (in_stream != stdin)
1188 else if (in_stream != stdin && fclose (in_stream) == EOF)
1190 error (0, errno, "%s", input_filename);
1194 if (ferror (stdout))
1196 error (0, errno, _("standard output"));
1203 /* Read a single byte into *C from the concatenation of the input files
1204 named in the global array FILE_LIST. On the first call to this
1205 function, the global variable IN_STREAM is expected to be an open
1206 stream associated with the input file *FILE_LIST. If IN_STREAM is
1207 at end-of-file, close it and update the global variables IN_STREAM,
1208 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1209 the list. Then try to read a byte from the newly opened file.
1210 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1211 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1212 calls do likewise. The return value is nonzero if any errors
1213 occured, zero otherwise. */
1220 if (*file_list == NULL)
1229 *c = fgetc (in_stream);
1234 err |= check_and_close ();
1239 if (*file_list == NULL)
1242 if (STREQ (*file_list, "-"))
1244 input_filename = _("standard input");
1246 have_read_stdin = 1;
1250 input_filename = *file_list;
1251 in_stream = fopen (input_filename, "r");
1252 if (in_stream == NULL)
1254 error (0, errno, "%s", input_filename);
1258 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1260 while (in_stream == NULL);
1264 /* Read N bytes into BLOCK from the concatenation of the input files
1265 named in the global array FILE_LIST. On the first call to this
1266 function, the global variable IN_STREAM is expected to be an open
1267 stream associated with the input file *FILE_LIST. On subsequent
1268 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1269 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1270 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1271 Then try to read the remaining bytes from the newly opened file.
1272 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1273 to the number of bytes read. If an error occurs, it will be detected
1274 through ferror when the stream is about to be closed. If there is an
1275 error, give a message but continue reading as usual and return nonzero.
1276 Otherwise return zero. */
1279 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1283 assert (n > 0 && n <= bytes_per_block);
1285 *n_bytes_in_buffer = 0;
1290 if (*file_list == NULL)
1291 return 0; /* EOF. */
1299 n_needed = n - *n_bytes_in_buffer;
1300 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1302 *n_bytes_in_buffer += n_read;
1304 if (n_read == n_needed)
1307 err |= check_and_close ();
1312 if (*file_list == NULL)
1315 if (STREQ (*file_list, "-"))
1317 input_filename = _("standard input");
1319 have_read_stdin = 1;
1323 input_filename = *file_list;
1324 in_stream = fopen (input_filename, "r");
1325 if (in_stream == NULL)
1327 error (0, errno, "%s", input_filename);
1331 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1333 while (in_stream == NULL);
1337 /* Return the least common multiple of the sizes associated
1338 with the format specs. */
1346 for (i = 0; i < n_specs; i++)
1347 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1351 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1352 return the offset it denotes. Otherwise, return -1. */
1355 parse_old_offset (const char *s)
1359 enum strtol_error s_err;
1360 long unsigned int tmp;
1365 /* Skip over any leading '+'. */
1369 /* Determine the radix we'll use to interpret S. If there is a `.',
1370 it's decimal, otherwise, if the string begins with `0X'or `0x',
1371 it's hexadecimal, else octal. */
1372 if (strchr (s, '.') != NULL)
1376 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1382 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1383 if (s_err != LONGINT_OK)
1385 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1392 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1393 formatted block to standard output, and repeat until the specified
1394 maximum number of bytes has been read or until all input has been
1395 processed. If the last block read is smaller than BYTES_PER_BLOCK
1396 and its size is not a multiple of the size associated with a format
1397 spec, extend the input block with zero bytes until its length is a
1398 multiple of all format spec sizes. Write the final block. Finally,
1399 write on a line by itself the offset of the byte after the last byte
1400 read. Accumulate return values from calls to read_block and
1401 check_and_close, and if any was nonzero, return nonzero.
1402 Otherwise, return zero. */
1408 off_t current_offset;
1412 size_t n_bytes_read;
1414 #ifdef lint /* Suppress `used before initialized' warning. */
1418 block[0] = (char *) alloca (bytes_per_block);
1419 block[1] = (char *) alloca (bytes_per_block);
1421 current_offset = n_bytes_to_skip;
1425 if (limit_bytes_to_format)
1427 end_offset = n_bytes_to_skip + max_bytes_to_format;
1432 if (current_offset >= end_offset)
1437 n_needed = MIN (end_offset - current_offset,
1438 (off_t) bytes_per_block);
1439 err |= read_block (n_needed, block[idx], &n_bytes_read);
1440 if (n_bytes_read < bytes_per_block)
1442 assert (n_bytes_read == bytes_per_block);
1443 write_block (current_offset, n_bytes_read,
1444 block[!idx], block[idx]);
1445 current_offset += n_bytes_read;
1453 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1454 if (n_bytes_read < bytes_per_block)
1456 assert (n_bytes_read == bytes_per_block);
1457 write_block (current_offset, n_bytes_read,
1458 block[!idx], block[idx]);
1459 current_offset += n_bytes_read;
1464 if (n_bytes_read > 0)
1467 size_t bytes_to_write;
1471 /* Make bytes_to_write the smallest multiple of l_c_m that
1472 is at least as large as n_bytes_read. */
1473 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1475 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1476 write_block (current_offset, bytes_to_write,
1477 block[!idx], block[idx]);
1478 current_offset += n_bytes_read;
1481 if (output_address_fmt_string != NULL)
1482 printf ("%s\n", format_address (current_offset));
1484 if (limit_bytes_to_format && current_offset > end_offset)
1485 err |= check_and_close ();
1490 /* STRINGS mode. Find each "string constant" in the input.
1491 A string constant is a run of at least `string_min' ASCII
1492 graphic (or formatting) characters terminated by a null.
1493 Based on a function written by Richard Stallman for a
1494 pre-POSIX version of od. Return nonzero if an error
1495 occurs. Otherwise, return zero. */
1500 size_t bufsize = MAX (100, string_min);
1501 char *buf = xmalloc (bufsize);
1502 off_t address = n_bytes_to_skip;
1511 /* See if the next `string_min' chars are all printing chars. */
1514 if (limit_bytes_to_format
1515 && address >= (n_bytes_to_skip + max_bytes_to_format - string_min))
1518 for (i = 0; i < string_min; i++)
1520 err |= read_char (&c);
1528 /* Found a non-printing. Try again starting with next char. */
1533 /* We found a run of `string_min' printable characters.
1534 Now see if it is terminated with a null byte. */
1535 while (!limit_bytes_to_format
1536 || address < n_bytes_to_skip + max_bytes_to_format)
1540 bufsize = 1 + 3 * bufsize / 2;
1541 buf = xrealloc (buf, bufsize);
1543 err |= read_char (&c);
1551 break; /* It is; print this string. */
1553 goto tryline; /* It isn't; give up on this string. */
1554 buf[i++] = c; /* String continues; store it all. */
1557 /* If we get here, the string is all printable and null-terminated,
1558 so print it. It is all in `buf' and `i' is its length. */
1560 if (output_address_fmt_string != NULL)
1562 printf ("%s ", format_address (address - i - 1));
1564 for (i = 0; (c = buf[i]); i++)
1569 fputs ("\\a", stdout);
1573 fputs ("\\b", stdout);
1577 fputs ("\\f", stdout);
1581 fputs ("\\n", stdout);
1585 fputs ("\\r", stdout);
1589 fputs ("\\t", stdout);
1593 fputs ("\\v", stdout);
1603 /* We reach this point only if we search through
1604 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1608 err |= check_and_close ();
1613 main (int argc, char **argv)
1619 unsigned int address_pad_len;
1620 unsigned long int desired_width;
1621 int width_specified = 0;
1622 int n_failed_decodes = 0;
1625 /* The old-style `pseudo starting address' to be printed in parentheses
1626 after any true address. */
1627 long int pseudo_start;
1629 #ifdef lint /* Suppress `used before initialized' warning. */
1633 program_name = argv[0];
1634 setlocale (LC_ALL, "");
1635 bindtextdomain (PACKAGE, LOCALEDIR);
1636 textdomain (PACKAGE);
1640 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1641 integral_type_size[i] = NO_SIZE;
1643 integral_type_size[sizeof (char)] = CHAR;
1644 integral_type_size[sizeof (short int)] = SHORT;
1645 integral_type_size[sizeof (int)] = INT;
1646 integral_type_size[sizeof (long int)] = LONG;
1648 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1649 fp_type_size[i] = NO_SIZE;
1651 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1652 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1653 so that if `long double' is the same type or if long double isn't
1654 supported FLOAT_LONG_DOUBLE will never be used. */
1655 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1656 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1659 n_specs_allocated = 5;
1660 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1662 output_address_fmt_string = "%07o";
1663 format_address = format_address_std;
1664 address_pad_len = 7;
1665 flag_dump_strings = 0;
1667 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1668 long_options, NULL)) != -1)
1670 unsigned long int tmp;
1671 enum strtol_error s_err;
1682 output_address_fmt_string = "%07d";
1683 format_address = format_address_std;
1684 address_pad_len = 7;
1687 output_address_fmt_string = "%07o";
1688 format_address = format_address_std;
1689 address_pad_len = 7;
1692 output_address_fmt_string = "%06x";
1693 format_address = format_address_std;
1694 address_pad_len = 6;
1697 output_address_fmt_string = NULL;
1698 format_address = format_address_none;
1699 address_pad_len = 0;
1702 error (EXIT_FAILURE, 0,
1703 _("invalid output address radix `%c'; \
1704 it must be one character from [doxn]"),
1711 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1712 n_bytes_to_skip = tmp;
1713 if (s_err != LONGINT_OK)
1714 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1718 limit_bytes_to_format = 1;
1720 /* FIXME: if off_t is long long and that's an 8-byte type,
1721 use xstrtouq here. */
1722 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1723 max_bytes_to_format = tmp;
1724 if (s_err != LONGINT_OK)
1725 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1728 error (EXIT_FAILURE, 0,
1729 _("specified number of bytes `%s' is larger than \
1730 the maximum\nrepresentable value of type `long'"), optarg);
1738 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1739 if (s_err != LONGINT_OK)
1740 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1742 ++flag_dump_strings;
1746 if (decode_format_string (optarg))
1751 abbreviate_duplicate_blocks = 0;
1758 /* The next several cases map the old, pre-POSIX format
1759 specification options to the corresponding POSIX format
1760 specs. GNU od accepts any combination of old- and
1761 new-style options. Format specification options accumulate. */
1763 #define CASE_OLD_ARG(old_char,new_string) \
1766 if (decode_format_string (new_string)) \
1767 ++n_failed_decodes; \
1771 CASE_OLD_ARG ('a', "a");
1772 CASE_OLD_ARG ('b', "oC");
1773 CASE_OLD_ARG ('c', "c");
1774 CASE_OLD_ARG ('d', "u2");
1775 CASE_OLD_ARG ('f', "fF");
1776 CASE_OLD_ARG ('h', "x2");
1777 CASE_OLD_ARG ('i', "d2");
1778 CASE_OLD_ARG ('l', "d4");
1779 CASE_OLD_ARG ('o', "o2");
1780 CASE_OLD_ARG ('x', "x2");
1785 width_specified = 1;
1792 s_err = xstrtoul (optarg, NULL, 10, &desired_width, "");
1793 if (s_err != LONGINT_OK)
1794 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1804 if (n_failed_decodes > 0)
1805 exit (EXIT_FAILURE);
1809 printf ("od (%s) %s\n", GNU_PACKAGE, VERSION);
1810 exit (EXIT_SUCCESS);
1816 if (flag_dump_strings && n_specs > 0)
1817 error (EXIT_FAILURE, 0,
1818 _("no type may be specified when dumping strings"));
1820 n_files = argc - optind;
1822 /* If the --backward-compatible option is used, there may be from
1823 0 to 3 remaining command line arguments; handle each case
1825 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1826 The offset and pseudo_start have the same syntax. */
1834 if ((offset = parse_old_offset (argv[optind])) >= 0)
1836 n_bytes_to_skip = offset;
1841 else if (n_files == 2)
1844 if ((o1 = parse_old_offset (argv[optind])) >= 0
1845 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1847 n_bytes_to_skip = o1;
1848 flag_pseudo_start = 1;
1853 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1855 n_bytes_to_skip = o2;
1857 argv[optind + 1] = argv[optind];
1863 _("invalid second operand in compatibility mode `%s'"),
1868 else if (n_files == 3)
1871 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1872 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1874 n_bytes_to_skip = o1;
1875 flag_pseudo_start = 1;
1877 argv[optind + 2] = argv[optind];
1884 _("in compatibility mode, the last two arguments must be offsets"));
1888 else if (n_files > 3)
1891 _("compatibility mode supports at most three arguments"));
1895 if (flag_pseudo_start)
1897 static char buf[10];
1899 if (output_address_fmt_string == NULL)
1901 output_address_fmt_string = "(%07o)";
1902 format_address = format_address_std;
1906 sprintf (buf, "%s (%s)",
1907 output_address_fmt_string,
1908 output_address_fmt_string);
1909 output_address_fmt_string = buf;
1910 format_address = format_address_label;
1915 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1916 for (i = 0; i < address_pad_len; i++)
1917 address_pad[i] = ' ';
1918 address_pad[address_pad_len] = '\0';
1922 if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1924 /* This happens on Cray systems that don't have a 2-byte
1926 exit (EXIT_FAILURE);
1933 file_list = (char const *const *) &argv[optind];
1936 /* If no files were listed on the command line, set up the
1937 global array FILE_LIST so that it contains the null-terminated
1938 list of one name: "-". */
1939 static char const *const default_file_list[] = {"-", NULL};
1941 file_list = default_file_list;
1944 err |= skip (n_bytes_to_skip);
1945 if (in_stream == NULL)
1948 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1950 /* Compute output block length. */
1953 if (width_specified)
1955 if (desired_width != 0 && desired_width % l_c_m == 0)
1956 bytes_per_block = desired_width;
1959 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1960 desired_width, l_c_m);
1961 bytes_per_block = l_c_m;
1966 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1967 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1969 bytes_per_block = l_c_m;
1973 for (i = 0; i < n_specs; i++)
1975 printf (_("%d: fmt=\"%s\" width=%d\n"),
1976 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1980 err |= (flag_dump_strings ? dump_strings () : dump ());
1984 if (have_read_stdin && fclose (stdin) == EOF)
1985 error (EXIT_FAILURE, errno, _("standard input"));
1987 if (fclose (stdout) == EOF)
1988 error (EXIT_FAILURE, errno, _("write error"));
1990 exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);