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 */
34 #endif /* not HAVE_ALLOCA_H */
35 #endif /* not __GNUC__ */
40 #include <sys/types.h>
46 #if defined(__GNUC__) || defined(STDC_HEADERS)
50 #ifdef HAVE_LONG_DOUBLE
51 typedef long double LONG_DOUBLE;
53 typedef double LONG_DOUBLE;
60 # define SCHAR_MAX 127
63 # define SCHAR_MIN (-128)
66 # define SHRT_MAX 32767
69 # define SHRT_MIN (-32768)
72 # define ULONG_MAX ((unsigned long) ~(unsigned long) 0)
75 /* FIXME: is there a way to do this without relying on the
76 `8 bits per byte' assumption? */
77 # define OFF_T_MAX (~((off_t)1 << (sizeof (off_t) * 8 - 1)))
80 #define STREQ(a,b) (strcmp((a), (b)) == 0)
83 # define MAX(a, b) ((a) > (b) ? (a) : (b))
87 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
90 /* The default number of input bytes per output line. */
91 #define DEFAULT_BYTES_PER_BLOCK 16
93 /* The number of decimal digits of precision in a float. */
98 /* The number of decimal digits of precision in a double. */
103 /* The number of decimal digits of precision in a long double. */
105 # define LDBL_DIG DBL_DIG
134 /* Each output format specification (from POSIX `-t spec' or from
135 old-style options) is represented by one of these structures. */
138 enum output_format fmt;
140 void (*print_function) ();
144 /* The name this program was run with. */
147 /* Convert the number of 8-bit bytes of a binary representation to
148 the number of characters (digits + sign if the type is signed)
149 required to represent the same quantity in the specified base/type.
150 For example, a 32-bit (4-byte) quantity may require a field width
151 as wide as the following for these types:
155 8 unsigned hexadecimal */
157 static const unsigned int bytes_to_oct_digits[] =
158 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
160 static const unsigned int bytes_to_signed_dec_digits[] =
161 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
163 static const unsigned int bytes_to_unsigned_dec_digits[] =
164 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
166 static const unsigned int bytes_to_hex_digits[] =
167 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
169 /* Convert enum size_spec to the size of the named type. */
170 static const int width_bytes[] =
182 /* Names for some non-printing characters. */
183 static const char *const charname[33] =
185 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
186 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
187 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
188 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
192 /* A printf control string for printing a file offset. */
193 static const char *output_address_fmt_string;
195 /* FIXME: make this the number of octal digits in an unsigned long. */
196 #define MAX_ADDRESS_LENGTH 13
198 /* Space for a normal address, a space, a pseudo address, parentheses
199 around the pseudo address, and a trailing zero byte. */
200 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
201 static char address_pad[MAX_ADDRESS_LENGTH + 1];
203 static unsigned long int string_min;
204 static unsigned long int flag_dump_strings;
206 /* Non-zero if we should recognize the pre-POSIX non-option arguments
207 that specified at most one file and optional arguments specifying
208 offset and pseudo-start address. */
209 static int traditional;
211 /* Non-zero if an old-style `pseudo-address' was specified. */
212 static long int flag_pseudo_start;
214 /* The difference between the old-style pseudo starting address and
215 the number of bytes to skip. */
216 static long int pseudo_offset;
218 /* Function to format an address and optionally an additional parenthesized
219 pseudo-address; it returns the formatted string. */
220 static const char *(*format_address) (__P (long unsigned int));
222 /* The number of input bytes to skip before formatting and writing. */
223 static off_t n_bytes_to_skip = 0;
225 /* When non-zero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
226 to be read and formatted. Otherwise all input is formatted. */
227 static int limit_bytes_to_format = 0;
229 /* The maximum number of bytes that will be formatted. This
230 value is used only when LIMIT_BYTES_TO_FORMAT is non-zero. */
231 static off_t max_bytes_to_format;
233 /* When non-zero and two or more consecutive blocks are equal, format
234 only the first block and output an asterisk alone on the following
235 line to indicate that identical blocks have been elided. */
236 static int abbreviate_duplicate_blocks = 1;
238 /* An array of specs describing how to format each input block. */
239 static struct tspec *spec;
241 /* The number of format specs. */
242 static unsigned int n_specs;
244 /* The allocated length of SPEC. */
245 static unsigned int n_specs_allocated;
247 /* The number of input bytes formatted per output line. It must be
248 a multiple of the least common multiple of the sizes associated with
249 the specified output types. It should be as large as possible, but
250 no larger than 16 -- unless specified with the -w option. */
251 static unsigned int bytes_per_block;
253 /* Human-readable representation of *file_list (for error messages).
254 It differs from *file_list only when *file_list is "-". */
255 static char const *input_filename;
257 /* A NULL-terminated list of the file-arguments from the command line.
258 If no file-arguments were specified, this variable is initialized
260 static char const *const *file_list;
262 /* The input stream associated with the current file. */
263 static FILE *in_stream;
265 /* If non-zero, at least one of the files we read was standard input. */
266 static int have_read_stdin;
268 #define LONGEST_INTEGRAL_TYPE long int
270 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
271 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
273 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
274 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
276 /* If non-zero, display usage information and exit. */
277 static int show_help;
279 /* If non-zero, print the version on standard output then exit. */
280 static int show_version;
282 static struct option const long_options[] =
285 {"skip-bytes", required_argument, NULL, 'j'},
286 {"address-radix", required_argument, NULL, 'A'},
287 {"read-bytes", required_argument, NULL, 'N'},
288 {"format", required_argument, NULL, 't'},
289 {"output-duplicates", no_argument, NULL, 'v'},
291 /* non-POSIX options. */
292 {"strings", optional_argument, NULL, 's'},
293 {"traditional", no_argument, NULL, 'B'},
294 {"width", optional_argument, NULL, 'w'},
295 {"help", no_argument, &show_help, 1},
296 {"version", no_argument, &show_version, 1},
304 fprintf (stderr, _("Try `%s --help' for more information.\n"),
309 Usage: %s [OPTION]... [FILE]...\n\
310 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
312 program_name, program_name);
314 Write an unambiguous representation, octal bytes by default, of FILE\n\
315 to standard output. With no FILE, or when FILE is -, read standard input.\n\
317 -A, --address-radix=RADIX decide how file offsets are printed\n\
318 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
319 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
320 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
321 -t, --format=TYPE select output format or formats\n\
322 -v, --output-duplicates do not use * to mark line suppression\n\
323 -w, --width[=BYTES] output BYTES bytes per output line\n\
324 --traditional accept arguments in pre-POSIX form\n\
325 --help display this help and exit\n\
326 --version output version information and exit\n\
328 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
329 -a same as -t a, select named characters\n\
330 -b same as -t oC, select octal bytes\n\
331 -c same as -t c, select ASCII characters or backslash escapes\n\
332 -d same as -t u2, select unsigned decimal shorts\n\
333 -f same as -t fF, select floats\n\
334 -h same as -t x2, select hexadecimal shorts\n\
335 -i same as -t d2, select decimal shorts\n\
336 -l same as -t d4, select decimal longs\n\
337 -o same as -t o2, select octal shorts\n\
338 -x same as -t x2, select hexadecimal shorts\n\
342 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
343 is the pseudo-address at first byte printed, incremented when dump is\n\
344 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
345 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
347 TYPE is made up of one or more of these specifications:\n\
350 c ASCII character or backslash escape\n\
351 d[SIZE] signed decimal, SIZE bytes per integer\n\
352 f[SIZE] floating point, SIZE bytes per integer\n\
353 o[SIZE] octal, SIZE bytes per integer\n\
354 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
355 x[SIZE] hexadecimal, SIZE bytes per integer\n\
357 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
358 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
359 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
360 for sizeof(double) or L for sizeof(long double).\n\
362 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
363 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
364 with b suffix, by 1024 with k and by 1048576 with m. -s without a\n\
365 number implies 3. -w without a number implies 32. By default, od\n\
366 uses -A o -t d2 -w 16.\n\
372 /* Compute the greatest common denominator of U and V
373 using Euclid's algorithm. */
376 gcd (unsigned int u, unsigned int v)
388 /* Compute the least common multiple of U and V. */
391 lcm (unsigned int u, unsigned int v)
393 unsigned int t = gcd (u, v);
400 print_s_char (long unsigned int n_bytes, const char *block,
401 const char *fmt_string)
404 for (i = n_bytes; i > 0; i--)
406 int tmp = (unsigned) *(const unsigned char *) block;
408 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
409 assert (tmp <= SCHAR_MAX);
410 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
411 block += sizeof (unsigned char);
416 print_char (long unsigned int n_bytes, const char *block,
417 const char *fmt_string)
420 for (i = n_bytes; i > 0; i--)
422 unsigned int tmp = *(const unsigned char *) block;
423 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
424 block += sizeof (unsigned char);
429 print_s_short (long unsigned int n_bytes, const char *block,
430 const char *fmt_string)
433 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
435 int tmp = (unsigned) *(const unsigned short *) block;
437 tmp -= SHRT_MAX - SHRT_MIN + 1;
438 assert (tmp <= SHRT_MAX);
439 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
440 block += sizeof (unsigned short);
444 print_short (long unsigned int n_bytes, const char *block,
445 const char *fmt_string)
448 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
450 unsigned int tmp = *(const unsigned short *) block;
451 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
452 block += sizeof (unsigned short);
457 print_int (long unsigned int n_bytes, const char *block,
458 const char *fmt_string)
461 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
463 unsigned int tmp = *(const unsigned int *) block;
464 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
465 block += sizeof (unsigned int);
470 print_long (long unsigned int n_bytes, const char *block,
471 const char *fmt_string)
474 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
476 unsigned long tmp = *(const unsigned long *) block;
477 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
478 block += sizeof (unsigned long);
483 print_float (long unsigned int n_bytes, const char *block,
484 const char *fmt_string)
487 for (i = n_bytes / sizeof (float); i > 0; i--)
489 float tmp = *(const float *) block;
490 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
491 block += sizeof (float);
496 print_double (long unsigned int n_bytes, const char *block,
497 const char *fmt_string)
500 for (i = n_bytes / sizeof (double); i > 0; i--)
502 double tmp = *(const double *) block;
503 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
504 block += sizeof (double);
508 #ifdef HAVE_LONG_DOUBLE
510 print_long_double (long unsigned int n_bytes, const char *block,
511 const char *fmt_string)
514 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
516 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
517 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
518 block += sizeof (LONG_DOUBLE);
525 print_named_ascii (long unsigned int n_bytes, const char *block,
526 const char *unused_fmt_string)
529 for (i = n_bytes; i > 0; i--)
531 unsigned int c = *(const unsigned char *) block;
532 unsigned int masked_c = (0x7f & c);
538 else if (masked_c <= 040)
539 s = charname[masked_c];
542 sprintf (buf, " %c", masked_c);
546 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
547 block += sizeof (unsigned char);
552 print_ascii (long unsigned int n_bytes, const char *block,
553 const char *unused_fmt_string)
556 for (i = n_bytes; i > 0; i--)
558 unsigned int c = *(const unsigned char *) block;
597 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
598 s = (const char *) buf;
601 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
602 block += sizeof (unsigned char);
606 /* Convert a null-terminated (possibly zero-length) string S to an
607 unsigned long integer value. If S points to a non-digit set *P to S,
608 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
609 the string of digits. If the string of digits represents a value
610 larger than ULONG_MAX, don't modify *VAL or *P and return non-zero.
611 Otherwise, advance *P to the first non-digit after S, set *VAL to
612 the result of the conversion and return zero. */
615 simple_strtoul (const char *s, const char **p, long unsigned int *val)
617 unsigned long int sum;
622 unsigned int c = *s++ - '0';
623 if (sum > (ULONG_MAX - c) / 10)
632 /* If S points to a single valid POSIX-style od format string, put a
633 description of that format in *TSPEC, make *NEXT point at the character
634 following the just-decoded format (if *NEXT is non-NULL), and return
635 zero. If S is not valid, don't modify *NEXT or *TSPEC and return
636 non-zero. For example, if S were "d4afL" *NEXT would be set to "afL"
639 fmt = SIGNED_DECIMAL;
640 size = INT or LONG; (whichever integral_type_size[4] resolves to)
641 print_function = print_int; (assuming size == INT)
642 fmt_string = "%011d%c";
647 decode_one_format (const char *s, const char **next, struct tspec *tspec)
649 enum size_spec size_spec;
650 unsigned long int size;
651 enum output_format fmt;
652 const char *pre_fmt_string;
654 void (*print_function) ();
658 assert (tspec != NULL);
672 size = sizeof (char);
677 size = sizeof (short);
687 size = sizeof (long int);
691 if (simple_strtoul (s, &p, &size) != 0)
697 if (size > MAX_INTEGRAL_TYPE_SIZE
698 || integral_type_size[size] == NO_SIZE)
705 #define FMT_BYTES_ALLOCATED 9
706 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
708 size_spec = integral_type_size[size];
713 fmt = SIGNED_DECIMAL;
714 sprintf (fmt_string, "%%%u%sd%%c",
715 bytes_to_signed_dec_digits[size],
716 (size_spec == LONG ? "l" : ""));
721 sprintf (fmt_string, "%%0%u%so%%c",
722 bytes_to_oct_digits[size],
723 (size_spec == LONG ? "l" : ""));
727 fmt = UNSIGNED_DECIMAL;
728 sprintf (fmt_string, "%%%u%su%%c",
729 bytes_to_unsigned_dec_digits[size],
730 (size_spec == LONG ? "l" : ""));
735 sprintf (fmt_string, "%%0%u%sx%%c",
736 bytes_to_hex_digits[size],
737 (size_spec == LONG ? "l" : ""));
744 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
749 print_function = (fmt == SIGNED_DECIMAL
755 print_function = (fmt == SIGNED_DECIMAL
761 print_function = print_int;
765 print_function = print_long;
774 fmt = FLOATING_POINT;
780 size = sizeof (float);
785 size = sizeof (double);
790 size = sizeof (LONG_DOUBLE);
794 if (simple_strtoul (s, &p, &size) != 0)
797 size = sizeof (double);
800 if (size > MAX_FP_TYPE_SIZE
801 || fp_type_size[size] == NO_SIZE)
807 size_spec = fp_type_size[size];
812 print_function = print_float;
813 /* Don't use %#e; not all systems support it. */
814 pre_fmt_string = "%%%d.%de%%c";
815 fmt_string = xmalloc (strlen (pre_fmt_string));
816 sprintf (fmt_string, pre_fmt_string,
817 FLT_DIG + 8, FLT_DIG);
821 print_function = print_double;
822 pre_fmt_string = "%%%d.%de%%c";
823 fmt_string = xmalloc (strlen (pre_fmt_string));
824 sprintf (fmt_string, pre_fmt_string,
825 DBL_DIG + 8, DBL_DIG);
828 #ifdef HAVE_LONG_DOUBLE
829 case FLOAT_LONG_DOUBLE:
830 print_function = print_long_double;
831 pre_fmt_string = "%%%d.%dle%%c";
832 fmt_string = xmalloc (strlen (pre_fmt_string));
833 sprintf (fmt_string, pre_fmt_string,
834 LDBL_DIG + 8, LDBL_DIG);
845 fmt = NAMED_CHARACTER;
848 print_function = print_named_ascii;
856 print_function = print_ascii;
863 tspec->size = size_spec;
865 tspec->print_function = print_function;
866 tspec->fmt_string = fmt_string;
874 /* Decode the POSIX-style od format string S. Append the decoded
875 representation to the global array SPEC, reallocating SPEC if
876 necessary. Return zero if S is valid, non-zero otherwise. */
879 decode_format_string (const char *s)
888 if (decode_one_format (s, &next, &tspec))
894 if (n_specs >= n_specs_allocated)
896 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
897 spec = (struct tspec *) xrealloc (spec, (n_specs_allocated
898 * sizeof (struct tspec)));
901 memcpy ((char *) &spec[n_specs], (char *) &tspec, sizeof (struct tspec));
908 /* Given a list of one or more input filenames FILE_LIST, set the global
909 file pointer IN_STREAM to position N_SKIP in the concatenation of
910 those files. If any file operation fails or if there are fewer than
911 N_SKIP bytes in the combined input, give an error message and return
912 non-zero. When possible, use seek- rather than read operations to
913 advance IN_STREAM. A file name of "-" is interpreted as standard
922 for ( /* empty */ ; *file_list != NULL; ++file_list)
924 struct stat file_stats;
927 if (STREQ (*file_list, "-"))
929 input_filename = _("standard input");
935 input_filename = *file_list;
936 in_stream = fopen (input_filename, "r");
937 if (in_stream == NULL)
939 error (0, errno, "%s", input_filename);
948 /* First try using fseek. For large offsets, this extra work is
949 worthwhile. If the offset is below some threshold it may be
950 more efficient to move the pointer by reading. There are two
951 issues when trying to use fseek:
952 - the file must be seekable.
953 - before seeking to the specified position, make sure
954 that the new position is in the current file.
955 Try to do that by getting file's size using fstat().
956 But that will work only for regular files and dirs. */
958 if (fstat (fileno (in_stream), &file_stats))
960 error (0, errno, "%s", input_filename);
965 /* The st_size field is valid only for regular files and
966 directories. FIXME: is the preceding true?
967 If the number of bytes left to skip is at least as large as
968 the size of the current file, we can decrement
969 n_skip and go on to the next file. */
970 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
972 if (n_skip >= file_stats.st_size)
974 n_skip -= file_stats.st_size;
975 if (in_stream != stdin && fclose (in_stream) == EOF)
977 error (0, errno, "%s", input_filename);
984 if (fseek (in_stream, n_skip, SEEK_SET) == 0)
992 /* fseek didn't work or wasn't attempted; do it the slow way. */
994 for (j = n_skip / BUFSIZ; j >= 0; j--)
997 size_t n_bytes_to_read = (j > 0
1000 size_t n_bytes_read;
1001 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1002 n_skip -= n_bytes_read;
1003 if (n_bytes_read != n_bytes_to_read)
1012 error (2, 0, _("cannot skip past end of combined input"));
1018 format_address_none (long unsigned int address)
1024 format_address_std (long unsigned int address)
1026 const char *address_string;
1028 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1029 address_string = address_fmt_buffer;
1030 return address_string;
1034 format_address_label (long unsigned int address)
1036 const char *address_string;
1037 assert (output_address_fmt_string != NULL);
1039 sprintf (address_fmt_buffer, output_address_fmt_string,
1040 address, address + pseudo_offset);
1041 address_string = address_fmt_buffer;
1042 return address_string;
1045 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1046 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1047 CURR_BLOCK in the concatenation of input files, and it is printed
1048 (optionally) only before the output line associated with the first
1049 format spec. When duplicate blocks are being abbreviated, the output
1050 for a sequence of identical input blocks is the output for the first
1051 block followed by an asterisk alone on a line. It is valid to compare
1052 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1053 That condition may be false only for the last input block -- and then
1054 only when it has not been padded to length BYTES_PER_BLOCK. */
1057 write_block (long unsigned int current_offset, long unsigned int n_bytes,
1058 const char *prev_block, const char *curr_block)
1060 static int first = 1;
1061 static int prev_pair_equal = 0;
1063 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1065 if (abbreviate_duplicate_blocks
1066 && !first && n_bytes == bytes_per_block
1067 && EQUAL_BLOCKS (prev_block, curr_block))
1069 if (prev_pair_equal)
1071 /* The two preceding blocks were equal, and the current
1072 block is the same as the last one, so print nothing. */
1077 prev_pair_equal = 1;
1084 prev_pair_equal = 0;
1085 for (i = 0; i < n_specs; i++)
1087 printf ("%s ", (i == 0
1088 ? format_address (current_offset)
1090 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1096 /* Test whether there have been errors on in_stream, and close it if
1097 it is not standard input. Return non-zero if there has been an error
1098 on in_stream or stdout; return zero otherwise. This function will
1099 report more than one error only if both a read and a write error
1103 check_and_close (void)
1108 if (ferror (in_stream))
1110 error (0, errno, "%s", input_filename);
1111 if (in_stream != stdin)
1115 else if (in_stream != stdin && fclose (in_stream) == EOF)
1117 error (0, errno, "%s", input_filename);
1121 if (ferror (stdout))
1123 error (0, errno, _("standard output"));
1130 /* Read a single byte into *C from the concatenation of the input files
1131 named in the global array FILE_LIST. On the first call to this
1132 function, the global variable IN_STREAM is expected to be an open
1133 stream associated with the input file *FILE_LIST. If IN_STREAM is
1134 at end-of-file, close it and update the global variables IN_STREAM,
1135 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1136 the list. Then try to read a byte from the newly opened file.
1137 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1138 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1139 calls do likewise. The return value is non-zero if any errors
1140 occured, zero otherwise. */
1147 if (*file_list == NULL)
1156 *c = fgetc (in_stream);
1161 err |= check_and_close ();
1166 if (*file_list == NULL)
1169 if (STREQ (*file_list, "-"))
1171 input_filename = _("standard input");
1173 have_read_stdin = 1;
1177 input_filename = *file_list;
1178 in_stream = fopen (input_filename, "r");
1179 if (in_stream == NULL)
1181 error (0, errno, "%s", input_filename);
1186 while (in_stream == NULL);
1190 /* Read N bytes into BLOCK from the concatenation of the input files
1191 named in the global array FILE_LIST. On the first call to this
1192 function, the global variable IN_STREAM is expected to be an open
1193 stream associated with the input file *FILE_LIST. On subsequent
1194 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1195 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1196 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1197 Then try to read the remaining bytes from the newly opened file.
1198 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1199 to the number of bytes read. If an error occurs, it will be detected
1200 through ferror when the stream is about to be closed. If there is an
1201 error, give a message but continue reading as usual and return non-zero.
1202 Otherwise return zero. */
1205 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1209 assert (n > 0 && n <= bytes_per_block);
1211 *n_bytes_in_buffer = 0;
1216 if (*file_list == NULL)
1217 return 0; /* EOF. */
1225 n_needed = n - *n_bytes_in_buffer;
1226 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1228 *n_bytes_in_buffer += n_read;
1230 if (n_read == n_needed)
1233 err |= check_and_close ();
1238 if (*file_list == NULL)
1241 if (STREQ (*file_list, "-"))
1243 input_filename = _("standard input");
1245 have_read_stdin = 1;
1249 input_filename = *file_list;
1250 in_stream = fopen (input_filename, "r");
1251 if (in_stream == NULL)
1253 error (0, errno, "%s", input_filename);
1258 while (in_stream == NULL);
1262 /* Return the least common multiple of the sizes associated
1263 with the format specs. */
1271 for (i = 0; i < n_specs; i++)
1272 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1276 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1277 return the offset it denotes. Otherwise, return -1. */
1280 parse_old_offset (const char *s)
1284 enum strtol_error s_err;
1285 long unsigned int tmp;
1290 /* Skip over any leading '+'. */
1294 /* Determine the radix we'll use to interpret S. If there is a `.',
1295 it's decimal, otherwise, if the string begins with `0X'or `0x',
1296 it's hexadecimal, else octal. */
1297 if (strchr (s, '.') != NULL)
1301 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1307 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1308 if (s_err != LONGINT_OK)
1310 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1317 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1318 formatted block to standard output, and repeat until the specified
1319 maximum number of bytes has been read or until all input has been
1320 processed. If the last block read is smaller than BYTES_PER_BLOCK
1321 and its size is not a multiple of the size associated with a format
1322 spec, extend the input block with zero bytes until its length is a
1323 multiple of all format spec sizes. Write the final block. Finally,
1324 write on a line by itself the offset of the byte after the last byte
1325 read. Accumulate return values from calls to read_block and
1326 check_and_close, and if any was non-zero, return non-zero.
1327 Otherwise, return zero. */
1333 off_t current_offset;
1337 size_t n_bytes_read;
1339 #ifdef lint /* Suppress `used before initialized' warning. */
1343 block[0] = (char *) alloca (bytes_per_block);
1344 block[1] = (char *) alloca (bytes_per_block);
1346 current_offset = n_bytes_to_skip;
1350 if (limit_bytes_to_format)
1352 end_offset = n_bytes_to_skip + max_bytes_to_format;
1357 if (current_offset >= end_offset)
1362 n_needed = MIN (end_offset - current_offset,
1363 (off_t) bytes_per_block);
1364 err |= read_block (n_needed, block[idx], &n_bytes_read);
1365 if (n_bytes_read < bytes_per_block)
1367 assert (n_bytes_read == bytes_per_block);
1368 write_block (current_offset, n_bytes_read,
1369 block[!idx], block[idx]);
1370 current_offset += n_bytes_read;
1378 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1379 if (n_bytes_read < bytes_per_block)
1381 assert (n_bytes_read == bytes_per_block);
1382 write_block (current_offset, n_bytes_read,
1383 block[!idx], block[idx]);
1384 current_offset += n_bytes_read;
1389 if (n_bytes_read > 0)
1392 size_t bytes_to_write;
1396 /* Make bytes_to_write the smallest multiple of l_c_m that
1397 is at least as large as n_bytes_read. */
1398 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1400 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1401 write_block (current_offset, bytes_to_write,
1402 block[!idx], block[idx]);
1403 current_offset += n_bytes_read;
1406 if (output_address_fmt_string != NULL)
1407 printf ("%s\n", format_address (current_offset));
1409 if (limit_bytes_to_format && current_offset > end_offset)
1410 err |= check_and_close ();
1415 /* STRINGS mode. Find each "string constant" in the input.
1416 A string constant is a run of at least `string_min' ASCII
1417 graphic (or formatting) characters terminated by a null.
1418 Based on a function written by Richard Stallman for a
1419 pre-POSIX version of od. Return non-zero if an error
1420 occurs. Otherwise, return zero. */
1425 size_t bufsize = MAX (100, string_min);
1426 char *buf = xmalloc (bufsize);
1427 off_t address = n_bytes_to_skip;
1436 /* See if the next `string_min' chars are all printing chars. */
1439 if (limit_bytes_to_format
1440 && address >= (n_bytes_to_skip + max_bytes_to_format - string_min))
1443 for (i = 0; i < string_min; i++)
1445 err |= read_char (&c);
1453 /* Found a non-printing. Try again starting with next char. */
1458 /* We found a run of `string_min' printable characters.
1459 Now see if it is terminated with a null byte. */
1460 while (!limit_bytes_to_format
1461 || address < n_bytes_to_skip + max_bytes_to_format)
1465 bufsize = 1 + 3 * bufsize / 2;
1466 buf = xrealloc (buf, bufsize);
1468 err |= read_char (&c);
1476 break; /* It is; print this string. */
1478 goto tryline; /* It isn't; give up on this string. */
1479 buf[i++] = c; /* String continues; store it all. */
1482 /* If we get here, the string is all printable and null-terminated,
1483 so print it. It is all in `buf' and `i' is its length. */
1485 if (output_address_fmt_string != NULL)
1487 printf ("%s ", format_address (address - i - 1));
1489 for (i = 0; (c = buf[i]); i++)
1494 fputs ("\\a", stdout);
1498 fputs ("\\b", stdout);
1502 fputs ("\\f", stdout);
1506 fputs ("\\n", stdout);
1510 fputs ("\\r", stdout);
1514 fputs ("\\t", stdout);
1518 fputs ("\\v", stdout);
1528 /* We reach this point only if we search through
1529 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1533 err |= check_and_close ();
1538 main (int argc, char **argv)
1544 unsigned int address_pad_len;
1545 unsigned long int desired_width;
1546 int width_specified = 0;
1549 /* The old-style `pseudo starting address' to be printed in parentheses
1550 after any true address. */
1551 long int pseudo_start;
1553 #ifdef lint /* Suppress `used before initialized' warning. */
1557 program_name = argv[0];
1560 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1561 integral_type_size[i] = NO_SIZE;
1563 integral_type_size[sizeof (char)] = CHAR;
1564 integral_type_size[sizeof (short int)] = SHORT;
1565 integral_type_size[sizeof (int)] = INT;
1566 integral_type_size[sizeof (long int)] = LONG;
1568 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1569 fp_type_size[i] = NO_SIZE;
1571 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1572 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1573 so that if `long double' is the same type or if long double isn't
1574 supported FLOAT_LONG_DOUBLE will never be used. */
1575 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1576 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1579 n_specs_allocated = 5;
1580 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1582 output_address_fmt_string = "%07o";
1583 format_address = format_address_std;
1584 address_pad_len = 7;
1585 flag_dump_strings = 0;
1587 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1588 long_options, (int *) 0))
1591 unsigned long int tmp;
1592 enum strtol_error s_err;
1603 output_address_fmt_string = "%07d";
1604 format_address = format_address_std;
1605 address_pad_len = 7;
1608 output_address_fmt_string = "%07o";
1609 format_address = format_address_std;
1610 address_pad_len = 7;
1613 output_address_fmt_string = "%06x";
1614 format_address = format_address_std;
1615 address_pad_len = 6;
1618 output_address_fmt_string = NULL;
1619 format_address = format_address_none;
1620 address_pad_len = 0;
1624 _("invalid output address radix `%c'; it must be one character from [doxn]"),
1631 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1632 n_bytes_to_skip = tmp;
1633 if (s_err != LONGINT_OK)
1634 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1638 limit_bytes_to_format = 1;
1640 /* FIXME: if off_t is long long and that's an 8-byte type,
1641 use xstrtouq here. */
1642 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1643 max_bytes_to_format = tmp;
1644 if (s_err != LONGINT_OK)
1645 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1647 if (tmp > OFF_T_MAX)
1648 error (2, 0, _("specified number of bytes `%s' is larger than \
1649 the maximum\nrepresentable value of type off_t"), optarg);
1657 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1658 if (s_err != LONGINT_OK)
1659 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1661 ++flag_dump_strings;
1665 if (decode_format_string (optarg))
1666 error (2, 0, _("invalid type string `%s'"), optarg);
1670 abbreviate_duplicate_blocks = 0;
1677 /* The next several cases map the old, pre-POSIX format
1678 specification options to the corresponding POSIX format
1679 specs. GNU od accepts any combination of old- and
1680 new-style options. Format specification options accumulate. */
1682 #define CASE_OLD_ARG(old_char,new_string) \
1686 tmp = decode_format_string (new_string); \
1687 assert (tmp == 0); \
1691 CASE_OLD_ARG ('a', "a");
1692 CASE_OLD_ARG ('b', "oC");
1693 CASE_OLD_ARG ('c', "c");
1694 CASE_OLD_ARG ('d', "u2");
1695 CASE_OLD_ARG ('f', "fF");
1696 CASE_OLD_ARG ('h', "x2");
1697 CASE_OLD_ARG ('i', "d2");
1698 CASE_OLD_ARG ('l', "d4");
1699 CASE_OLD_ARG ('o', "o2");
1700 CASE_OLD_ARG ('x', "x2");
1705 width_specified = 1;
1712 s_err = xstrtoul (optarg, NULL, 10, &desired_width, NULL);
1713 if (s_err != LONGINT_OK)
1714 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1726 printf ("od - %s\n", version_string);
1733 if (flag_dump_strings && n_specs > 0)
1734 error (2, 0, _("no type may be specified when dumping strings"));
1736 n_files = argc - optind;
1738 /* If the --backward-compatible option is used, there may be from
1739 0 to 3 remaining command line arguments; handle each case
1741 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1742 The offset and pseudo_start have the same syntax. */
1750 if ((offset = parse_old_offset (argv[optind])) >= 0)
1752 n_bytes_to_skip = offset;
1757 else if (n_files == 2)
1760 if ((o1 = parse_old_offset (argv[optind])) >= 0
1761 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1763 n_bytes_to_skip = o1;
1764 flag_pseudo_start = 1;
1769 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1771 n_bytes_to_skip = o2;
1773 argv[optind + 1] = argv[optind];
1779 _("invalid second operand in compatibility mode `%s'"),
1784 else if (n_files == 3)
1787 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1788 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1790 n_bytes_to_skip = o1;
1791 flag_pseudo_start = 1;
1793 argv[optind + 2] = argv[optind];
1800 _("in compatibility mode the last 2 arguments must be offsets"));
1807 _("in compatibility mode there may be no more than 3 arguments"));
1811 if (flag_pseudo_start)
1813 static char buf[10];
1815 if (output_address_fmt_string == NULL)
1817 output_address_fmt_string = "(%07o)";
1818 format_address = format_address_std;
1822 sprintf (buf, "%s (%s)",
1823 output_address_fmt_string,
1824 output_address_fmt_string);
1825 output_address_fmt_string = buf;
1826 format_address = format_address_label;
1831 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1832 for (i = 0; i < address_pad_len; i++)
1833 address_pad[i] = ' ';
1834 address_pad[address_pad_len] = '\0';
1838 int d_err = decode_one_format ("o2", NULL, &(spec[0]));
1840 assert (d_err == 0);
1845 file_list = (char const *const *) &argv[optind];
1848 /* If no files were listed on the command line, set up the
1849 global array FILE_LIST so that it contains the null-terminated
1850 list of one name: "-". */
1851 static char const *const default_file_list[] = {"-", NULL};
1853 file_list = default_file_list;
1856 err |= skip (n_bytes_to_skip);
1857 if (in_stream == NULL)
1860 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1862 /* Compute output block length. */
1865 if (width_specified)
1867 if (desired_width != 0 && desired_width % l_c_m == 0)
1868 bytes_per_block = desired_width;
1871 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1872 desired_width, l_c_m);
1873 bytes_per_block = l_c_m;
1878 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1879 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1881 bytes_per_block = l_c_m;
1885 for (i = 0; i < n_specs; i++)
1887 printf (_("%d: fmt=\"%s\" width=%d\n"),
1888 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1892 err |= (flag_dump_strings ? dump_strings () : dump ());
1896 if (have_read_stdin && fclose (stdin) == EOF)
1897 error (2, errno, _("standard input"));
1899 if (fclose (stdout) == EOF)
1900 error (2, errno, _("write error"));