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) ();
147 /* The name this program was run with. */
150 /* Convert the number of 8-bit bytes of a binary representation to
151 the number of characters (digits + sign if the type is signed)
152 required to represent the same quantity in the specified base/type.
153 For example, a 32-bit (4-byte) quantity may require a field width
154 as wide as the following for these types:
158 8 unsigned hexadecimal */
160 static const unsigned int bytes_to_oct_digits[] =
161 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
163 static const unsigned int bytes_to_signed_dec_digits[] =
164 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
166 static const unsigned int bytes_to_unsigned_dec_digits[] =
167 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
169 static const unsigned int bytes_to_hex_digits[] =
170 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
172 /* Convert enum size_spec to the size of the named type. */
173 static const int width_bytes[] =
185 /* Names for some non-printing characters. */
186 static const char *const charname[33] =
188 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
189 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
190 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
191 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
195 /* A printf control string for printing a file offset. */
196 static const char *output_address_fmt_string;
198 /* FIXME: make this the number of octal digits in an unsigned long. */
199 #define MAX_ADDRESS_LENGTH 13
201 /* Space for a normal address, a space, a pseudo address, parentheses
202 around the pseudo address, and a trailing zero byte. */
203 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
204 static char address_pad[MAX_ADDRESS_LENGTH + 1];
206 static unsigned long int string_min;
207 static unsigned long int flag_dump_strings;
209 /* Non-zero if we should recognize the pre-POSIX non-option arguments
210 that specified at most one file and optional arguments specifying
211 offset and pseudo-start address. */
212 static int traditional;
214 /* Non-zero if an old-style `pseudo-address' was specified. */
215 static long int flag_pseudo_start;
217 /* The difference between the old-style pseudo starting address and
218 the number of bytes to skip. */
219 static long int pseudo_offset;
221 /* Function to format an address and optionally an additional parenthesized
222 pseudo-address; it returns the formatted string. */
223 static const char *(*format_address) __P ((long unsigned int));
225 /* The number of input bytes to skip before formatting and writing. */
226 static off_t n_bytes_to_skip = 0;
228 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
229 to be read and formatted. Otherwise all input is formatted. */
230 static int limit_bytes_to_format = 0;
232 /* The maximum number of bytes that will be formatted. This
233 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
234 static off_t max_bytes_to_format;
236 /* When nonzero and two or more consecutive blocks are equal, format
237 only the first block and output an asterisk alone on the following
238 line to indicate that identical blocks have been elided. */
239 static int abbreviate_duplicate_blocks = 1;
241 /* An array of specs describing how to format each input block. */
242 static struct tspec *spec;
244 /* The number of format specs. */
245 static unsigned int n_specs;
247 /* The allocated length of SPEC. */
248 static unsigned int n_specs_allocated;
250 /* The number of input bytes formatted per output line. It must be
251 a multiple of the least common multiple of the sizes associated with
252 the specified output types. It should be as large as possible, but
253 no larger than 16 -- unless specified with the -w option. */
254 static unsigned int bytes_per_block;
256 /* Human-readable representation of *file_list (for error messages).
257 It differs from *file_list only when *file_list is "-". */
258 static char const *input_filename;
260 /* A NULL-terminated list of the file-arguments from the command line.
261 If no file-arguments were specified, this variable is initialized
263 static char const *const *file_list;
265 /* The input stream associated with the current file. */
266 static FILE *in_stream;
268 /* If nonzero, at least one of the files we read was standard input. */
269 static int have_read_stdin;
271 #define LONGEST_INTEGRAL_TYPE long int
273 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
274 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
276 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
277 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
279 /* If nonzero, display usage information and exit. */
280 static int show_help;
282 /* If nonzero, print the version on standard output then exit. */
283 static int show_version;
285 static struct option const long_options[] =
288 {"skip-bytes", required_argument, NULL, 'j'},
289 {"address-radix", required_argument, NULL, 'A'},
290 {"read-bytes", required_argument, NULL, 'N'},
291 {"format", required_argument, NULL, 't'},
292 {"output-duplicates", no_argument, NULL, 'v'},
294 /* non-POSIX options. */
295 {"strings", optional_argument, NULL, 's'},
296 {"traditional", no_argument, NULL, 'B'},
297 {"width", optional_argument, NULL, 'w'},
298 {"help", no_argument, &show_help, 1},
299 {"version", no_argument, &show_version, 1},
307 fprintf (stderr, _("Try `%s --help' for more information.\n"),
312 Usage: %s [OPTION]... [FILE]...\n\
313 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
315 program_name, program_name);
317 Write an unambiguous representation, octal bytes by default, of FILE\n\
318 to standard output. With no FILE, or when FILE is -, read standard input.\n\
320 -A, --address-radix=RADIX decide how file offsets are printed\n\
321 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
322 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
323 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
324 -t, --format=TYPE select output format or formats\n\
325 -v, --output-duplicates do not use * to mark line suppression\n\
326 -w, --width[=BYTES] output BYTES bytes per output line\n\
327 --traditional accept arguments in pre-POSIX form\n\
328 --help display this help and exit\n\
329 --version output version information and exit\n\
331 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
332 -a same as -t a, select named characters\n\
333 -b same as -t oC, select octal bytes\n\
334 -c same as -t c, select ASCII characters or backslash escapes\n\
335 -d same as -t u2, select unsigned decimal shorts\n\
336 -f same as -t fF, select floats\n\
337 -h same as -t x2, select hexadecimal shorts\n\
338 -i same as -t d2, select decimal shorts\n\
339 -l same as -t d4, select decimal longs\n\
340 -o same as -t o2, select octal shorts\n\
341 -x same as -t x2, select hexadecimal shorts\n\
345 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
346 is the pseudo-address at first byte printed, incremented when dump is\n\
347 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
348 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
350 TYPE is made up of one or more of these specifications:\n\
353 c ASCII character or backslash escape\n\
354 d[SIZE] signed decimal, SIZE bytes per integer\n\
355 f[SIZE] floating point, SIZE bytes per integer\n\
356 o[SIZE] octal, SIZE bytes per integer\n\
357 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
358 x[SIZE] hexadecimal, SIZE bytes per integer\n\
360 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
361 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
362 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
363 for sizeof(double) or L for sizeof(long double).\n\
365 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
366 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
367 with b suffix, by 1024 with k and by 1048576 with m. -s without a\n\
368 number implies 3. -w without a number implies 32. By default, od\n\
369 uses -A o -t d2 -w 16.\n\
371 puts (_("\nReport bugs to <textutils-bugs@gnu.ai.mit.edu>."));
373 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
376 /* Compute the greatest common denominator of U and V
377 using Euclid's algorithm. */
380 gcd (unsigned int u, unsigned int v)
392 /* Compute the least common multiple of U and V. */
395 lcm (unsigned int u, unsigned int v)
397 unsigned int t = gcd (u, v);
404 print_s_char (long unsigned int n_bytes, const char *block,
405 const char *fmt_string)
408 for (i = n_bytes; i > 0; i--)
410 int tmp = (unsigned) *(const unsigned char *) block;
412 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
413 assert (tmp <= SCHAR_MAX);
414 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
415 block += sizeof (unsigned char);
420 print_char (long unsigned int n_bytes, const char *block,
421 const char *fmt_string)
424 for (i = n_bytes; i > 0; i--)
426 unsigned int tmp = *(const unsigned char *) block;
427 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
428 block += sizeof (unsigned char);
433 print_s_short (long unsigned int n_bytes, const char *block,
434 const char *fmt_string)
437 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
439 int tmp = (unsigned) *(const unsigned short *) block;
441 tmp -= SHRT_MAX - SHRT_MIN + 1;
442 assert (tmp <= SHRT_MAX);
443 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
444 block += sizeof (unsigned short);
448 print_short (long unsigned int n_bytes, const char *block,
449 const char *fmt_string)
452 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
454 unsigned int tmp = *(const unsigned short *) block;
455 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
456 block += sizeof (unsigned short);
461 print_int (long unsigned int n_bytes, const char *block,
462 const char *fmt_string)
465 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
467 unsigned int tmp = *(const unsigned int *) block;
468 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
469 block += sizeof (unsigned int);
474 print_long (long unsigned int n_bytes, const char *block,
475 const char *fmt_string)
478 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
480 unsigned long tmp = *(const unsigned long *) block;
481 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
482 block += sizeof (unsigned long);
487 print_float (long unsigned int n_bytes, const char *block,
488 const char *fmt_string)
491 for (i = n_bytes / sizeof (float); i > 0; i--)
493 float tmp = *(const float *) block;
494 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
495 block += sizeof (float);
500 print_double (long unsigned int n_bytes, const char *block,
501 const char *fmt_string)
504 for (i = n_bytes / sizeof (double); i > 0; i--)
506 double tmp = *(const double *) block;
507 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
508 block += sizeof (double);
512 #ifdef HAVE_LONG_DOUBLE
514 print_long_double (long unsigned int n_bytes, const char *block,
515 const char *fmt_string)
518 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
520 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
521 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
522 block += sizeof (LONG_DOUBLE);
529 print_named_ascii (long unsigned int n_bytes, const char *block,
530 const char *unused_fmt_string)
533 for (i = n_bytes; i > 0; i--)
535 unsigned int c = *(const unsigned char *) block;
536 unsigned int masked_c = (0x7f & c);
542 else if (masked_c <= 040)
543 s = charname[masked_c];
546 sprintf (buf, " %c", masked_c);
550 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
551 block += sizeof (unsigned char);
556 print_ascii (long unsigned int n_bytes, const char *block,
557 const char *unused_fmt_string)
560 for (i = n_bytes; i > 0; i--)
562 unsigned int c = *(const unsigned char *) block;
601 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
602 s = (const char *) buf;
605 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
606 block += sizeof (unsigned char);
610 /* Convert a null-terminated (possibly zero-length) string S to an
611 unsigned long integer value. If S points to a non-digit set *P to S,
612 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
613 the string of digits. If the string of digits represents a value
614 larger than ULONG_MAX, don't modify *VAL or *P and return nonzero.
615 Otherwise, advance *P to the first non-digit after S, set *VAL to
616 the result of the conversion and return zero. */
619 simple_strtoul (const char *s, const char **p, long unsigned int *val)
621 unsigned long int sum;
626 unsigned int c = *s++ - '0';
627 if (sum > (ULONG_MAX - c) / 10)
636 /* If S points to a single valid POSIX-style od format string, put
637 a description of that format in *TSPEC, make *NEXT point at the
638 character following the just-decoded format (if *NEXT is non-NULL),
639 and return zero. If S is not valid, don't modify *NEXT or *TSPEC,
640 give a diagnostic, and return nonzero. For example, if S were
641 "d4afL" *NEXT would be set to "afL" and *TSPEC would be
643 fmt = SIGNED_DECIMAL;
644 size = INT or LONG; (whichever integral_type_size[4] resolves to)
645 print_function = print_int; (assuming size == INT)
646 fmt_string = "%011d%c";
648 S_ORIG is solely for reporting errors. It should be the full format
653 decode_one_format (const char *s_orig, const char *s, const char **next,
656 enum size_spec size_spec;
657 unsigned long int size;
658 enum output_format fmt;
659 const char *pre_fmt_string;
661 void (*print_function) ();
665 assert (tspec != NULL);
679 size = sizeof (char);
684 size = sizeof (short);
694 size = sizeof (long int);
698 if (simple_strtoul (s, &p, &size) != 0)
700 /* The integer at P in S would overflow an unsigned long.
701 A digit string that long is sufficiently odd looking
702 that the following diagnostic is sufficient. */
703 error (0, 0, _("invalid type string `%s'"), s_orig);
710 if (size > MAX_INTEGRAL_TYPE_SIZE
711 || integral_type_size[size] == NO_SIZE)
713 error (0, 0, _("invalid type string `%s';\n\
714 this system doesn't provide a %lu-byte integral type"), s_orig, size);
722 #define FMT_BYTES_ALLOCATED 9
723 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
725 size_spec = integral_type_size[size];
730 fmt = SIGNED_DECIMAL;
731 sprintf (fmt_string, "%%%u%sd%%c",
732 bytes_to_signed_dec_digits[size],
733 (size_spec == LONG ? "l" : ""));
738 sprintf (fmt_string, "%%0%u%so%%c",
739 bytes_to_oct_digits[size],
740 (size_spec == LONG ? "l" : ""));
744 fmt = UNSIGNED_DECIMAL;
745 sprintf (fmt_string, "%%%u%su%%c",
746 bytes_to_unsigned_dec_digits[size],
747 (size_spec == LONG ? "l" : ""));
752 sprintf (fmt_string, "%%0%u%sx%%c",
753 bytes_to_hex_digits[size],
754 (size_spec == LONG ? "l" : ""));
761 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
766 print_function = (fmt == SIGNED_DECIMAL
772 print_function = (fmt == SIGNED_DECIMAL
778 print_function = print_int;
782 print_function = print_long;
791 fmt = FLOATING_POINT;
797 size = sizeof (float);
802 size = sizeof (double);
807 size = sizeof (LONG_DOUBLE);
811 if (simple_strtoul (s, &p, &size) != 0)
813 /* The integer at P in S would overflow an unsigned long.
814 A digit string that long is sufficiently odd looking
815 that the following diagnostic is sufficient. */
816 error (0, 0, _("invalid type string `%s'"), s_orig);
820 size = sizeof (double);
823 if (size > MAX_FP_TYPE_SIZE
824 || fp_type_size[size] == NO_SIZE)
826 error (0, 0, _("invalid type string `%s';\n\
827 this system doesn't provide a %lu-byte floating point type"), s_orig, size);
834 size_spec = fp_type_size[size];
839 print_function = print_float;
840 /* Don't use %#e; not all systems support it. */
841 pre_fmt_string = "%%%d.%de%%c";
842 fmt_string = xmalloc (strlen (pre_fmt_string));
843 sprintf (fmt_string, pre_fmt_string,
844 FLT_DIG + 8, FLT_DIG);
848 print_function = print_double;
849 pre_fmt_string = "%%%d.%de%%c";
850 fmt_string = xmalloc (strlen (pre_fmt_string));
851 sprintf (fmt_string, pre_fmt_string,
852 DBL_DIG + 8, DBL_DIG);
855 #ifdef HAVE_LONG_DOUBLE
856 case FLOAT_LONG_DOUBLE:
857 print_function = print_long_double;
858 pre_fmt_string = "%%%d.%dLe%%c";
859 fmt_string = xmalloc (strlen (pre_fmt_string));
860 sprintf (fmt_string, pre_fmt_string,
861 LDBL_DIG + 8, LDBL_DIG);
872 fmt = NAMED_CHARACTER;
875 print_function = print_named_ascii;
883 print_function = print_ascii;
887 error (0, 0, _("invalid character `%c' in type string `%s'"),
892 tspec->size = size_spec;
894 tspec->print_function = print_function;
895 tspec->fmt_string = fmt_string;
903 /* Decode the POSIX-style od format string S. Append the decoded
904 representation to the global array SPEC, reallocating SPEC if
905 necessary. Return zero if S is valid, nonzero otherwise. */
908 decode_format_string (const char *s)
910 const char *s_orig = s;
918 if (decode_one_format (s_orig, s, &next, &tspec))
924 if (n_specs >= n_specs_allocated)
926 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
927 spec = (struct tspec *) xrealloc (spec, (n_specs_allocated
928 * sizeof (struct tspec)));
931 memcpy ((char *) &spec[n_specs], (char *) &tspec,
932 sizeof (struct tspec));
939 /* Given a list of one or more input filenames FILE_LIST, set the global
940 file pointer IN_STREAM to position N_SKIP in the concatenation of
941 those files. If any file operation fails or if there are fewer than
942 N_SKIP bytes in the combined input, give an error message and return
943 nonzero. When possible, use seek- rather than read operations to
944 advance IN_STREAM. A file name of "-" is interpreted as standard
953 for ( /* empty */ ; *file_list != NULL; ++file_list)
955 struct stat file_stats;
958 if (STREQ (*file_list, "-"))
960 input_filename = _("standard input");
966 input_filename = *file_list;
967 in_stream = fopen (input_filename, "r");
968 if (in_stream == NULL)
970 error (0, errno, "%s", input_filename);
975 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
980 /* First try using fseek. For large offsets, this extra work is
981 worthwhile. If the offset is below some threshold it may be
982 more efficient to move the pointer by reading. There are two
983 issues when trying to use fseek:
984 - the file must be seekable.
985 - before seeking to the specified position, make sure
986 that the new position is in the current file.
987 Try to do that by getting file's size using fstat().
988 But that will work only for regular files and dirs. */
990 if (fstat (fileno (in_stream), &file_stats))
992 error (0, errno, "%s", input_filename);
997 /* The st_size field is valid only for regular files and
998 directories. FIXME: is the preceding true?
999 If the number of bytes left to skip is at least as large as
1000 the size of the current file, we can decrement
1001 n_skip and go on to the next file. */
1002 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
1004 if (n_skip >= file_stats.st_size)
1006 n_skip -= file_stats.st_size;
1007 if (in_stream != stdin && fclose (in_stream) == EOF)
1009 error (0, errno, "%s", input_filename);
1016 /* fseek may work on some streams for which lseek doesn't.
1017 But fseek's offset argument is restricted to the range
1018 of type `long'. So if N_SKIP is too large or if fseek
1019 fails, try lseek. */
1020 if ((n_skip <= LONG_MAX
1021 && fseek (in_stream, (long) n_skip, SEEK_SET) == 0)
1022 || lseek (fileno (in_stream), n_skip, SEEK_SET) >= 0)
1030 /* Seek didn't work or wasn't attempted; position the file pointer
1033 for (j = n_skip / BUFSIZ; j >= 0; j--)
1036 size_t n_bytes_to_read = (j > 0
1039 size_t n_bytes_read;
1040 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1041 n_skip -= n_bytes_read;
1042 if (n_bytes_read != n_bytes_to_read)
1051 error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1057 format_address_none (long unsigned int address)
1063 format_address_std (long unsigned int address)
1065 const char *address_string;
1067 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1068 address_string = address_fmt_buffer;
1069 return address_string;
1073 format_address_label (long unsigned int address)
1075 const char *address_string;
1076 assert (output_address_fmt_string != NULL);
1078 sprintf (address_fmt_buffer, output_address_fmt_string,
1079 address, address + pseudo_offset);
1080 address_string = address_fmt_buffer;
1081 return address_string;
1084 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1085 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1086 CURR_BLOCK in the concatenation of input files, and it is printed
1087 (optionally) only before the output line associated with the first
1088 format spec. When duplicate blocks are being abbreviated, the output
1089 for a sequence of identical input blocks is the output for the first
1090 block followed by an asterisk alone on a line. It is valid to compare
1091 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1092 That condition may be false only for the last input block -- and then
1093 only when it has not been padded to length BYTES_PER_BLOCK. */
1096 write_block (long unsigned int current_offset, long unsigned int n_bytes,
1097 const char *prev_block, const char *curr_block)
1099 static int first = 1;
1100 static int prev_pair_equal = 0;
1102 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1104 if (abbreviate_duplicate_blocks
1105 && !first && n_bytes == bytes_per_block
1106 && EQUAL_BLOCKS (prev_block, curr_block))
1108 if (prev_pair_equal)
1110 /* The two preceding blocks were equal, and the current
1111 block is the same as the last one, so print nothing. */
1116 prev_pair_equal = 1;
1123 prev_pair_equal = 0;
1124 for (i = 0; i < n_specs; i++)
1126 printf ("%s ", (i == 0
1127 ? format_address (current_offset)
1129 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1135 /* Test whether there have been errors on in_stream, and close it if
1136 it is not standard input. Return nonzero if there has been an error
1137 on in_stream or stdout; return zero otherwise. This function will
1138 report more than one error only if both a read and a write error
1142 check_and_close (void)
1147 if (ferror (in_stream))
1149 error (0, errno, "%s", input_filename);
1150 if (in_stream != stdin)
1154 else if (in_stream != stdin && fclose (in_stream) == EOF)
1156 error (0, errno, "%s", input_filename);
1160 if (ferror (stdout))
1162 error (0, errno, _("standard output"));
1169 /* Read a single byte into *C from the concatenation of the input files
1170 named in the global array FILE_LIST. On the first call to this
1171 function, the global variable IN_STREAM is expected to be an open
1172 stream associated with the input file *FILE_LIST. If IN_STREAM is
1173 at end-of-file, close it and update the global variables IN_STREAM,
1174 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1175 the list. Then try to read a byte from the newly opened file.
1176 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1177 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1178 calls do likewise. The return value is nonzero if any errors
1179 occured, zero otherwise. */
1186 if (*file_list == NULL)
1195 *c = fgetc (in_stream);
1200 err |= check_and_close ();
1205 if (*file_list == NULL)
1208 if (STREQ (*file_list, "-"))
1210 input_filename = _("standard input");
1212 have_read_stdin = 1;
1216 input_filename = *file_list;
1217 in_stream = fopen (input_filename, "r");
1218 if (in_stream == NULL)
1220 error (0, errno, "%s", input_filename);
1224 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1226 while (in_stream == NULL);
1230 /* Read N bytes into BLOCK from the concatenation of the input files
1231 named in the global array FILE_LIST. On the first call to this
1232 function, the global variable IN_STREAM is expected to be an open
1233 stream associated with the input file *FILE_LIST. On subsequent
1234 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1235 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1236 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1237 Then try to read the remaining bytes from the newly opened file.
1238 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1239 to the number of bytes read. If an error occurs, it will be detected
1240 through ferror when the stream is about to be closed. If there is an
1241 error, give a message but continue reading as usual and return nonzero.
1242 Otherwise return zero. */
1245 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1249 assert (n > 0 && n <= bytes_per_block);
1251 *n_bytes_in_buffer = 0;
1256 if (*file_list == NULL)
1257 return 0; /* EOF. */
1265 n_needed = n - *n_bytes_in_buffer;
1266 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1268 *n_bytes_in_buffer += n_read;
1270 if (n_read == n_needed)
1273 err |= check_and_close ();
1278 if (*file_list == NULL)
1281 if (STREQ (*file_list, "-"))
1283 input_filename = _("standard input");
1285 have_read_stdin = 1;
1289 input_filename = *file_list;
1290 in_stream = fopen (input_filename, "r");
1291 if (in_stream == NULL)
1293 error (0, errno, "%s", input_filename);
1297 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1299 while (in_stream == NULL);
1303 /* Return the least common multiple of the sizes associated
1304 with the format specs. */
1312 for (i = 0; i < n_specs; i++)
1313 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1317 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1318 return the offset it denotes. Otherwise, return -1. */
1321 parse_old_offset (const char *s)
1325 enum strtol_error s_err;
1326 long unsigned int tmp;
1331 /* Skip over any leading '+'. */
1335 /* Determine the radix we'll use to interpret S. If there is a `.',
1336 it's decimal, otherwise, if the string begins with `0X'or `0x',
1337 it's hexadecimal, else octal. */
1338 if (strchr (s, '.') != NULL)
1342 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1348 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1349 if (s_err != LONGINT_OK)
1351 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1358 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1359 formatted block to standard output, and repeat until the specified
1360 maximum number of bytes has been read or until all input has been
1361 processed. If the last block read is smaller than BYTES_PER_BLOCK
1362 and its size is not a multiple of the size associated with a format
1363 spec, extend the input block with zero bytes until its length is a
1364 multiple of all format spec sizes. Write the final block. Finally,
1365 write on a line by itself the offset of the byte after the last byte
1366 read. Accumulate return values from calls to read_block and
1367 check_and_close, and if any was nonzero, return nonzero.
1368 Otherwise, return zero. */
1374 off_t current_offset;
1378 size_t n_bytes_read;
1380 #ifdef lint /* Suppress `used before initialized' warning. */
1384 block[0] = (char *) alloca (bytes_per_block);
1385 block[1] = (char *) alloca (bytes_per_block);
1387 current_offset = n_bytes_to_skip;
1391 if (limit_bytes_to_format)
1393 end_offset = n_bytes_to_skip + max_bytes_to_format;
1398 if (current_offset >= end_offset)
1403 n_needed = MIN (end_offset - current_offset,
1404 (off_t) bytes_per_block);
1405 err |= read_block (n_needed, block[idx], &n_bytes_read);
1406 if (n_bytes_read < bytes_per_block)
1408 assert (n_bytes_read == bytes_per_block);
1409 write_block (current_offset, n_bytes_read,
1410 block[!idx], block[idx]);
1411 current_offset += n_bytes_read;
1419 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1420 if (n_bytes_read < bytes_per_block)
1422 assert (n_bytes_read == bytes_per_block);
1423 write_block (current_offset, n_bytes_read,
1424 block[!idx], block[idx]);
1425 current_offset += n_bytes_read;
1430 if (n_bytes_read > 0)
1433 size_t bytes_to_write;
1437 /* Make bytes_to_write the smallest multiple of l_c_m that
1438 is at least as large as n_bytes_read. */
1439 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1441 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1442 write_block (current_offset, bytes_to_write,
1443 block[!idx], block[idx]);
1444 current_offset += n_bytes_read;
1447 if (output_address_fmt_string != NULL)
1448 printf ("%s\n", format_address (current_offset));
1450 if (limit_bytes_to_format && current_offset > end_offset)
1451 err |= check_and_close ();
1456 /* STRINGS mode. Find each "string constant" in the input.
1457 A string constant is a run of at least `string_min' ASCII
1458 graphic (or formatting) characters terminated by a null.
1459 Based on a function written by Richard Stallman for a
1460 pre-POSIX version of od. Return nonzero if an error
1461 occurs. Otherwise, return zero. */
1466 size_t bufsize = MAX (100, string_min);
1467 char *buf = xmalloc (bufsize);
1468 off_t address = n_bytes_to_skip;
1477 /* See if the next `string_min' chars are all printing chars. */
1480 if (limit_bytes_to_format
1481 && address >= (n_bytes_to_skip + max_bytes_to_format - string_min))
1484 for (i = 0; i < string_min; i++)
1486 err |= read_char (&c);
1494 /* Found a non-printing. Try again starting with next char. */
1499 /* We found a run of `string_min' printable characters.
1500 Now see if it is terminated with a null byte. */
1501 while (!limit_bytes_to_format
1502 || address < n_bytes_to_skip + max_bytes_to_format)
1506 bufsize = 1 + 3 * bufsize / 2;
1507 buf = xrealloc (buf, bufsize);
1509 err |= read_char (&c);
1517 break; /* It is; print this string. */
1519 goto tryline; /* It isn't; give up on this string. */
1520 buf[i++] = c; /* String continues; store it all. */
1523 /* If we get here, the string is all printable and null-terminated,
1524 so print it. It is all in `buf' and `i' is its length. */
1526 if (output_address_fmt_string != NULL)
1528 printf ("%s ", format_address (address - i - 1));
1530 for (i = 0; (c = buf[i]); i++)
1535 fputs ("\\a", stdout);
1539 fputs ("\\b", stdout);
1543 fputs ("\\f", stdout);
1547 fputs ("\\n", stdout);
1551 fputs ("\\r", stdout);
1555 fputs ("\\t", stdout);
1559 fputs ("\\v", stdout);
1569 /* We reach this point only if we search through
1570 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1574 err |= check_and_close ();
1579 main (int argc, char **argv)
1585 unsigned int address_pad_len;
1586 unsigned long int desired_width;
1587 int width_specified = 0;
1588 int n_failed_decodes = 0;
1591 /* The old-style `pseudo starting address' to be printed in parentheses
1592 after any true address. */
1593 long int pseudo_start;
1595 #ifdef lint /* Suppress `used before initialized' warning. */
1599 program_name = argv[0];
1600 setlocale (LC_ALL, "");
1601 bindtextdomain (PACKAGE, LOCALEDIR);
1602 textdomain (PACKAGE);
1606 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1607 integral_type_size[i] = NO_SIZE;
1609 integral_type_size[sizeof (char)] = CHAR;
1610 integral_type_size[sizeof (short int)] = SHORT;
1611 integral_type_size[sizeof (int)] = INT;
1612 integral_type_size[sizeof (long int)] = LONG;
1614 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1615 fp_type_size[i] = NO_SIZE;
1617 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1618 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1619 so that if `long double' is the same type or if long double isn't
1620 supported FLOAT_LONG_DOUBLE will never be used. */
1621 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1622 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1625 n_specs_allocated = 5;
1626 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1628 output_address_fmt_string = "%07o";
1629 format_address = format_address_std;
1630 address_pad_len = 7;
1631 flag_dump_strings = 0;
1633 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1634 long_options, NULL)) != -1)
1636 unsigned long int tmp;
1637 enum strtol_error s_err;
1648 output_address_fmt_string = "%07d";
1649 format_address = format_address_std;
1650 address_pad_len = 7;
1653 output_address_fmt_string = "%07o";
1654 format_address = format_address_std;
1655 address_pad_len = 7;
1658 output_address_fmt_string = "%06x";
1659 format_address = format_address_std;
1660 address_pad_len = 6;
1663 output_address_fmt_string = NULL;
1664 format_address = format_address_none;
1665 address_pad_len = 0;
1668 error (EXIT_FAILURE, 0,
1669 _("invalid output address radix `%c'; \
1670 it must be one character from [doxn]"),
1677 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1678 n_bytes_to_skip = tmp;
1679 if (s_err != LONGINT_OK)
1680 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1684 limit_bytes_to_format = 1;
1686 /* FIXME: if off_t is long long and that's an 8-byte type,
1687 use xstrtouq here. */
1688 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1689 max_bytes_to_format = tmp;
1690 if (s_err != LONGINT_OK)
1691 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1694 error (EXIT_FAILURE, 0,
1695 _("specified number of bytes `%s' is larger than \
1696 the maximum\nrepresentable value of type `long'"), optarg);
1704 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1705 if (s_err != LONGINT_OK)
1706 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1708 ++flag_dump_strings;
1712 if (decode_format_string (optarg))
1717 abbreviate_duplicate_blocks = 0;
1724 /* The next several cases map the old, pre-POSIX format
1725 specification options to the corresponding POSIX format
1726 specs. GNU od accepts any combination of old- and
1727 new-style options. Format specification options accumulate. */
1729 #define CASE_OLD_ARG(old_char,new_string) \
1732 if (decode_format_string (new_string)) \
1733 ++n_failed_decodes; \
1737 CASE_OLD_ARG ('a', "a");
1738 CASE_OLD_ARG ('b', "oC");
1739 CASE_OLD_ARG ('c', "c");
1740 CASE_OLD_ARG ('d', "u2");
1741 CASE_OLD_ARG ('f', "fF");
1742 CASE_OLD_ARG ('h', "x2");
1743 CASE_OLD_ARG ('i', "d2");
1744 CASE_OLD_ARG ('l', "d4");
1745 CASE_OLD_ARG ('o', "o2");
1746 CASE_OLD_ARG ('x', "x2");
1751 width_specified = 1;
1758 s_err = xstrtoul (optarg, NULL, 10, &desired_width, "");
1759 if (s_err != LONGINT_OK)
1760 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1770 if (n_failed_decodes > 0)
1771 exit (EXIT_FAILURE);
1775 printf ("od (%s) %s\n", GNU_PACKAGE, VERSION);
1776 exit (EXIT_SUCCESS);
1782 if (flag_dump_strings && n_specs > 0)
1783 error (EXIT_FAILURE, 0,
1784 _("no type may be specified when dumping strings"));
1786 n_files = argc - optind;
1788 /* If the --backward-compatible option is used, there may be from
1789 0 to 3 remaining command line arguments; handle each case
1791 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1792 The offset and pseudo_start have the same syntax. */
1800 if ((offset = parse_old_offset (argv[optind])) >= 0)
1802 n_bytes_to_skip = offset;
1807 else if (n_files == 2)
1810 if ((o1 = parse_old_offset (argv[optind])) >= 0
1811 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1813 n_bytes_to_skip = o1;
1814 flag_pseudo_start = 1;
1819 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1821 n_bytes_to_skip = o2;
1823 argv[optind + 1] = argv[optind];
1829 _("invalid second operand in compatibility mode `%s'"),
1834 else if (n_files == 3)
1837 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1838 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1840 n_bytes_to_skip = o1;
1841 flag_pseudo_start = 1;
1843 argv[optind + 2] = argv[optind];
1850 _("in compatibility mode, the last two arguments must be offsets"));
1854 else if (n_files > 3)
1857 _("compatibility mode supports at most three arguments"));
1861 if (flag_pseudo_start)
1863 static char buf[10];
1865 if (output_address_fmt_string == NULL)
1867 output_address_fmt_string = "(%07o)";
1868 format_address = format_address_std;
1872 sprintf (buf, "%s (%s)",
1873 output_address_fmt_string,
1874 output_address_fmt_string);
1875 output_address_fmt_string = buf;
1876 format_address = format_address_label;
1881 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1882 for (i = 0; i < address_pad_len; i++)
1883 address_pad[i] = ' ';
1884 address_pad[address_pad_len] = '\0';
1888 if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1890 /* This happens on Cray systems that don't have a 2-byte
1892 exit (EXIT_FAILURE);
1899 file_list = (char const *const *) &argv[optind];
1902 /* If no files were listed on the command line, set up the
1903 global array FILE_LIST so that it contains the null-terminated
1904 list of one name: "-". */
1905 static char const *const default_file_list[] = {"-", NULL};
1907 file_list = default_file_list;
1910 err |= skip (n_bytes_to_skip);
1911 if (in_stream == NULL)
1914 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1916 /* Compute output block length. */
1919 if (width_specified)
1921 if (desired_width != 0 && desired_width % l_c_m == 0)
1922 bytes_per_block = desired_width;
1925 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1926 desired_width, l_c_m);
1927 bytes_per_block = l_c_m;
1932 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1933 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1935 bytes_per_block = l_c_m;
1939 for (i = 0; i < n_specs; i++)
1941 printf (_("%d: fmt=\"%s\" width=%d\n"),
1942 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1946 err |= (flag_dump_strings ? dump_strings () : dump ());
1950 if (have_read_stdin && fclose (stdin) == EOF)
1951 error (EXIT_FAILURE, errno, _("standard input"));
1953 if (fclose (stdout) == EOF)
1954 error (EXIT_FAILURE, errno, _("write error"));
1956 exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);