1 /* od -- dump files in octal and other formats
2 Copyright (C) 1992 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
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
18 /* Written by Jim Meyering. */
20 /* AIX requires this to be the first thing in the file. */
22 #if defined (CONFIG_BROKETS)
23 /* We use <config.h> instead of "config.h" so that a compilation
24 using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
25 (which it would do because it found this file in $srcdir). */
33 #define alloca __builtin_alloca
34 #else /* not __GNUC__ */
37 #else /* not HAVE_ALLOCA_H */
43 #endif /* not HAVE_ALLOCA_H */
44 #endif /* not __GNUC__ */
49 #include <sys/types.h>
53 #if defined(__GNUC__) || defined(STDC_HEADERS)
57 #ifdef HAVE_LONG_DOUBLE
58 typedef long double LONG_DOUBLE;
60 typedef double LONG_DOUBLE;
70 #define SCHAR_MIN (-128)
73 #define SHRT_MAX 32767
76 #define SHRT_MIN (-32768)
79 #define ULONG_MAX ((unsigned long) ~(unsigned long) 0)
82 #define STREQ(a,b) (strcmp((a), (b)) == 0)
85 #define MAX(a, b) ((a) > (b) ? (a) : (b))
89 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
92 /* The default number of input bytes per output line. */
93 #define DEFAULT_BYTES_PER_BLOCK 16
95 /* The number of decimal digits of precision in a float. */
100 /* The number of decimal digits of precision in a double. */
105 /* The number of decimal digits of precision in a long double. */
107 #define LDBL_DIG DBL_DIG
139 UINT_OK, UINT_INVALID, UINT_INVALID_SUFFIX_CHAR, UINT_OVERFLOW
141 typedef enum strtoul_error strtoul_error;
143 /* Each output format specification (from POSIX `-t spec' or from
144 old-style options) is represented by one of these structures. */
147 enum output_format fmt;
149 void (*print_function) ();
153 /* The name this program was run with. */
156 /* Convert the number of 8-bit bytes of a binary representation to
157 the number of characters (digits + sign if the type is signed)
158 required to represent the same quantity in the specified base/type.
159 For example, a 32-bit (4-byte) quantity may require a field width
160 as wide as the following for these types:
164 8 unsigned hexadecimal */
166 static const unsigned int bytes_to_oct_digits[] =
167 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
169 static const unsigned int bytes_to_signed_dec_digits[] =
170 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
172 static const unsigned int bytes_to_unsigned_dec_digits[] =
173 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
175 static const unsigned int bytes_to_hex_digits[] =
176 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
178 /* Convert enum size_spec to the size of the named type. */
179 static const int width_bytes[] =
191 /* Names for some non-printing characters. */
192 static const char *const charname[33] =
194 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
195 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
196 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
197 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
201 /* A printf control string for printing a file offset. */
202 static const char *output_address_fmt_string;
204 /* FIXME: make this the number of octal digits in an unsigned long. */
205 #define MAX_ADDRESS_LENGTH 13
207 /* Space for a normal address, a space, a pseudo address, parentheses
208 around the pseudo address, and a trailing zero byte. */
209 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
210 static char address_pad[MAX_ADDRESS_LENGTH + 1];
212 static unsigned long int string_min;
213 static unsigned long int flag_dump_strings;
215 /* Non-zero if we should recognize the pre-POSIX non-option arguments
216 that specified at most one file and optional arguments specifying
217 offset and pseudo-start address. */
218 static int traditional;
220 /* Non-zero if an old-style `pseudo-address' was specified. */
221 static long int flag_pseudo_start;
223 /* The difference between the old-style pseudo starting address and
224 the number of bytes to skip. */
225 static long int pseudo_offset;
227 /* Function to format an address and optionally an additional parenthesized
228 pseudo-address; it returns the formatted string. */
229 static const char *(*format_address) (/* long unsigned int */);
231 /* The number of input bytes to skip before formatting and writing. */
232 static unsigned long int n_bytes_to_skip = 0;
234 /* When non-zero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
235 to be read and formatted. Otherwise all input is formatted. */
236 static int limit_bytes_to_format = 0;
238 /* The maximum number of bytes that will be formatted. This
239 value is used only when LIMIT_BYTES_TO_FORMAT is non-zero. */
240 static unsigned long int max_bytes_to_format;
242 /* When non-zero and two or more consecutive blocks are equal, format
243 only the first block and output an asterisk alone on the following
244 line to indicate that identical blocks have been elided. */
245 static int abbreviate_duplicate_blocks = 1;
247 /* An array of specs describing how to format each input block. */
248 static struct tspec *spec;
250 /* The number of format specs. */
251 static unsigned int n_specs;
253 /* The allocated length of SPEC. */
254 static unsigned int n_specs_allocated;
256 /* The number of input bytes formatted per output line. It must be
257 a multiple of the least common multiple of the sizes associated with
258 the specified output types. It should be as large as possible, but
259 no larger than 16 -- unless specified with the -w option. */
260 static unsigned int bytes_per_block;
262 /* Human-readable representation of *file_list (for error messages).
263 It differs from *file_list only when *file_list is "-". */
264 static char const *input_filename;
266 /* A NULL-terminated list of the file-arguments from the command line.
267 If no file-arguments were specified, this variable is initialized
269 static char const *const *file_list;
271 /* The input stream associated with the current file. */
272 static FILE *in_stream;
274 /* If non-zero, at least one of the files we read was standard input. */
275 static int have_read_stdin;
277 #define LONGEST_INTEGRAL_TYPE long int
279 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
280 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
282 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
283 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
285 /* If non-zero, display usage information and exit. */
286 static int show_help;
288 /* If non-zero, print the version on standard output then exit. */
289 static int show_version;
291 static struct option const long_options[] =
294 {"skip-bytes", required_argument, NULL, 'j'},
295 {"address-radix", required_argument, NULL, 'A'},
296 {"read-bytes", required_argument, NULL, 'N'},
297 {"format", required_argument, NULL, 't'},
298 {"output-duplicates", no_argument, NULL, 'v'},
300 /* non-POSIX options. */
301 {"strings", optional_argument, NULL, 's'},
302 {"traditional", no_argument, NULL, 'B'},
303 {"width", optional_argument, NULL, 'w'},
304 {"help", no_argument, &show_help, 1},
305 {"version", no_argument, &show_version, 1},
314 fprintf (stderr, "Try `%s --help' for more information.\n",
319 Usage: %s [OPTION]... [FILE]...\n\
320 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
322 program_name, program_name);
325 -A, --address-radix=RADIX decide how file offsets are printed\n\
326 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
327 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
328 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
329 -t, --format=TYPE select output format or formats\n\
330 -v, --output-duplicates do not use * to mark line suppression\n\
331 -w, --width[=BYTES] output BYTES bytes per output line\n\
332 --help display this help and exit\n\
333 --traditional accept arguments in pre-POSIX form\n\
334 --version output version information and exit\n\
336 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
337 -a same as -t a, select named characters\n\
338 -b same as -t oC, select octal bytes\n\
339 -c same as -t c, select ASCII characters or backslash escapes\n\
340 -d same as -t u2, select unsigned decimal shorts\n\
341 -f same as -t fF, select floats\n\
342 -h same as -t x2, select hexadecimal shorts\n\
343 -i same as -t d2, select decimal shorts\n\
344 -l same as -t d4, select decimal longs\n\
345 -o same as -t o2, select octal shorts\n\
346 -x same as -t x2, select hexadecimal shorts\n\
350 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
351 is the pseudo-address at first byte printed, incremented when dump is\n\
352 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
353 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
355 TYPE is made up of one or more of these specifications:\n\
358 c ASCII character or backslash escape\n\
359 d[SIZE] signed decimal, SIZE bytes per integer\n\
360 f[SIZE] floating point, SIZE bytes per integer\n\
361 o[SIZE] octal, SIZE bytes per integer\n\
362 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
363 x[SIZE] hexadecimal, SIZE bytes per integer\n\
365 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
366 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
367 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
368 for sizeof(double) or L for sizeof(long double).\n\
370 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
371 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
372 with b suffix, by 1024 with k and by 1048576 with m. -s without a\n\
373 number implies 3. -w without a number implies 32. By default, od\n\
374 uses -A o -t d2 -w 16. With no FILE, or when FILE is -, read standard\n\
381 /* Compute the greatest common denominator of U and V
382 using Euclid's algorithm. */
399 /* Compute the least common multiple of U and V. */
406 unsigned int t = gcd (u, v);
413 my_strtoul (s, base, val, allow_bkm_suffix)
416 long unsigned int *val;
417 int allow_bkm_suffix;
420 unsigned long int tmp;
422 assert (0 <= base && base <= 36);
424 tmp = strtoul (s, &p, base);
426 return UINT_OVERFLOW;
429 if (!allow_bkm_suffix)
437 return UINT_INVALID_SUFFIX_CHAR;
445 #define BKM_SCALE(x,scale_factor,error_return) \
448 if (x > (double) ULONG_MAX / scale_factor) \
449 return error_return; \
455 BKM_SCALE (tmp, 512, UINT_OVERFLOW);
459 BKM_SCALE (tmp, 1024, UINT_OVERFLOW);
463 BKM_SCALE (tmp, 1024 * 1024, UINT_OVERFLOW);
467 return UINT_INVALID_SUFFIX_CHAR;
476 uint_fatal_error (str, argument_type_string, err)
478 const char *argument_type_string;
487 error (2, 0, "invalid %s `%s'", argument_type_string, str);
490 case UINT_INVALID_SUFFIX_CHAR:
491 error (2, 0, "invalid character following %s `%s'",
492 argument_type_string, str);
496 error (2, 0, "%s `%s' larger than maximum unsigned long",
497 argument_type_string, str);
503 print_s_char (n_bytes, block, fmt_string)
504 long unsigned int n_bytes;
506 const char *fmt_string;
509 for (i = n_bytes; i > 0; i--)
511 int tmp = (unsigned) *(const unsigned char *) block;
513 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
514 assert (tmp <= SCHAR_MAX);
515 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
516 block += sizeof (unsigned char);
521 print_char (n_bytes, block, fmt_string)
522 long unsigned int n_bytes;
524 const char *fmt_string;
527 for (i = n_bytes; i > 0; i--)
529 unsigned int tmp = *(const unsigned char *) block;
530 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
531 block += sizeof (unsigned char);
536 print_s_short (n_bytes, block, fmt_string)
537 long unsigned int n_bytes;
539 const char *fmt_string;
542 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
544 int tmp = (unsigned) *(const unsigned short *) block;
546 tmp -= SHRT_MAX - SHRT_MIN + 1;
547 assert (tmp <= SHRT_MAX);
548 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
549 block += sizeof (unsigned short);
553 print_short (n_bytes, block, fmt_string)
554 long unsigned int n_bytes;
556 const char *fmt_string;
559 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
561 unsigned int tmp = *(const unsigned short *) block;
562 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
563 block += sizeof (unsigned short);
568 print_int (n_bytes, block, fmt_string)
569 long unsigned int n_bytes;
571 const char *fmt_string;
574 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
576 unsigned int tmp = *(const unsigned int *) block;
577 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
578 block += sizeof (unsigned int);
583 print_long (n_bytes, block, fmt_string)
584 long unsigned int n_bytes;
586 const char *fmt_string;
589 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
591 unsigned long tmp = *(const unsigned long *) block;
592 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
593 block += sizeof (unsigned long);
598 print_float (n_bytes, block, fmt_string)
599 long unsigned int n_bytes;
601 const char *fmt_string;
604 for (i = n_bytes / sizeof (float); i > 0; i--)
606 float tmp = *(const float *) block;
607 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
608 block += sizeof (float);
613 print_double (n_bytes, block, fmt_string)
614 long unsigned int n_bytes;
616 const char *fmt_string;
619 for (i = n_bytes / sizeof (double); i > 0; i--)
621 double tmp = *(const double *) block;
622 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
623 block += sizeof (double);
627 #ifdef HAVE_LONG_DOUBLE
629 print_long_double (n_bytes, block, fmt_string)
630 long unsigned int n_bytes;
632 const char *fmt_string;
635 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
637 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
638 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
639 block += sizeof (LONG_DOUBLE);
646 print_named_ascii (n_bytes, block, unused_fmt_string)
647 long unsigned int n_bytes;
649 const char *unused_fmt_string;
652 for (i = n_bytes; i > 0; i--)
654 unsigned int c = *(const unsigned char *) block;
655 unsigned int masked_c = (0x7f & c);
661 else if (masked_c <= 040)
662 s = charname[masked_c];
665 sprintf (buf, " %c", masked_c);
669 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
670 block += sizeof (unsigned char);
675 print_ascii (n_bytes, block, unused_fmt_string)
676 long unsigned int n_bytes;
678 const char *unused_fmt_string;
681 for (i = n_bytes; i > 0; i--)
683 unsigned int c = *(const unsigned char *) block;
722 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
723 s = (const char *) buf;
726 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
727 block += sizeof (unsigned char);
731 /* Convert a null-terminated (possibly zero-length) string S to an
732 unsigned long integer value. If S points to a non-digit set *P to S,
733 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
734 the string of digits. If the string of digits represents a value
735 larger than ULONG_MAX, don't modify *VAL or *P and return non-zero.
736 Otherwise, advance *P to the first non-digit after S, set *VAL to
737 the result of the conversion and return zero. */
740 simple_strtoul (s, p, val)
743 long unsigned int *val;
745 unsigned long int sum;
750 unsigned int c = *s++ - '0';
751 if (sum > (ULONG_MAX - c) / 10)
760 /* If S points to a single valid POSIX-style od format string, put a
761 description of that format in *TSPEC, make *NEXT point at the character
762 following the just-decoded format (if *NEXT is non-NULL), and return
763 zero. If S is not valid, don't modify *NEXT or *TSPEC and return
764 non-zero. For example, if S were "d4afL" *NEXT would be set to "afL"
767 fmt = SIGNED_DECIMAL;
768 size = INT or LONG; (whichever integral_type_size[4] resolves to)
769 print_function = print_int; (assuming size == INT)
770 fmt_string = "%011d%c";
775 decode_one_format (s, next, tspec)
780 enum size_spec size_spec;
781 unsigned long int size;
782 enum output_format fmt;
783 const char *pre_fmt_string;
785 void (*print_function) ();
789 assert (tspec != NULL);
803 size = sizeof (char);
808 size = sizeof (short);
818 size = sizeof (long int);
822 if (simple_strtoul (s, &p, &size) != 0)
828 if (size > MAX_INTEGRAL_TYPE_SIZE
829 || integral_type_size[size] == NO_SIZE)
836 #define FMT_BYTES_ALLOCATED 9
837 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
839 size_spec = integral_type_size[size];
844 fmt = SIGNED_DECIMAL;
845 sprintf (fmt_string, "%%%u%sd%%c",
846 bytes_to_signed_dec_digits[size],
847 (size_spec == LONG ? "l" : ""));
852 sprintf (fmt_string, "%%0%u%so%%c",
853 bytes_to_oct_digits[size],
854 (size_spec == LONG ? "l" : ""));
858 fmt = UNSIGNED_DECIMAL;
859 sprintf (fmt_string, "%%%u%su%%c",
860 bytes_to_unsigned_dec_digits[size],
861 (size_spec == LONG ? "l" : ""));
866 sprintf (fmt_string, "%%0%u%sx%%c",
867 bytes_to_hex_digits[size],
868 (size_spec == LONG ? "l" : ""));
875 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
880 print_function = (fmt == SIGNED_DECIMAL
886 print_function = (fmt == SIGNED_DECIMAL
892 print_function = print_int;
896 print_function = print_long;
905 fmt = FLOATING_POINT;
911 size = sizeof (float);
916 size = sizeof (double);
921 size = sizeof (LONG_DOUBLE);
925 if (simple_strtoul (s, &p, &size) != 0)
928 size = sizeof (double);
931 if (size > MAX_FP_TYPE_SIZE
932 || fp_type_size[size] == NO_SIZE)
938 size_spec = fp_type_size[size];
943 print_function = print_float;
944 /* Don't use %#e; not all systems support it. */
945 pre_fmt_string = "%%%d.%de%%c";
946 fmt_string = xmalloc (strlen (pre_fmt_string));
947 sprintf (fmt_string, pre_fmt_string,
948 FLT_DIG + 8, FLT_DIG);
952 print_function = print_double;
953 pre_fmt_string = "%%%d.%de%%c";
954 fmt_string = xmalloc (strlen (pre_fmt_string));
955 sprintf (fmt_string, pre_fmt_string,
956 DBL_DIG + 8, DBL_DIG);
959 #ifdef HAVE_LONG_DOUBLE
961 print_function = print_long_double;
962 pre_fmt_string = "%%%d.%dle%%c";
963 fmt_string = xmalloc (strlen (pre_fmt_string));
964 sprintf (fmt_string, pre_fmt_string,
965 LDBL_DIG + 8, LDBL_DIG);
976 fmt = NAMED_CHARACTER;
979 print_function = print_named_ascii;
987 print_function = print_ascii;
994 tspec->size = size_spec;
996 tspec->print_function = print_function;
997 tspec->fmt_string = fmt_string;
1005 /* Decode the POSIX-style od format string S. Append the decoded
1006 representation to the global array SPEC, reallocating SPEC if
1007 necessary. Return zero if S is valid, non-zero otherwise. */
1010 decode_format_string (s)
1020 if (decode_one_format (s, &next, &tspec))
1026 if (n_specs >= n_specs_allocated)
1028 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
1029 spec = (struct tspec *) xrealloc (spec, (n_specs_allocated
1030 * sizeof (struct tspec)));
1033 bcopy ((char *) &tspec, (char *) &spec[n_specs], sizeof (struct tspec));
1040 /* Given a list of one or more input filenames FILE_LIST, set the global
1041 file pointer IN_STREAM to position N_SKIP in the concatenation of
1042 those files. If any file operation fails or if there are fewer than
1043 N_SKIP bytes in the combined input, give an error message and return
1044 non-zero. When possible, use seek- rather than read operations to
1045 advance IN_STREAM. A file name of "-" is interpreted as standard
1050 long unsigned int n_skip;
1055 for ( /* empty */ ; *file_list != NULL; ++file_list)
1057 struct stat file_stats;
1060 if (STREQ (*file_list, "-"))
1062 input_filename = "standard input";
1064 have_read_stdin = 1;
1068 input_filename = *file_list;
1069 in_stream = fopen (input_filename, "r");
1070 if (in_stream == NULL)
1072 error (0, errno, "%s", input_filename);
1081 /* First try using fseek. For large offsets, this extra work is
1082 worthwhile. If the offset is below some threshold it may be
1083 more efficient to move the pointer by reading. There are two
1084 issues when trying to use fseek:
1085 - the file must be seekable.
1086 - before seeking to the specified position, make sure
1087 that the new position is in the current file.
1088 Try to do that by getting file's size using stat().
1089 But that will work only for regular files and dirs. */
1091 if (fstat (fileno (in_stream), &file_stats))
1093 error (0, errno, "%s", input_filename);
1098 /* The st_size field is valid only for regular files and
1099 directories. FIXME: is the preceding true?
1100 If the number of bytes left to skip is at least as large as
1101 the size of the current file, we can decrement
1102 n_skip and go on to the next file. */
1103 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
1105 if (n_skip >= file_stats.st_size)
1107 n_skip -= file_stats.st_size;
1108 if (in_stream != stdin && fclose (in_stream) == EOF)
1110 error (0, errno, "%s", input_filename);
1117 if (fseek (in_stream, n_skip, SEEK_SET) == 0)
1125 /* fseek didn't work or wasn't attempted; do it the slow way. */
1127 for (j = n_skip / BUFSIZ; j >= 0; j--)
1130 size_t n_bytes_to_read = (j > 0
1133 size_t n_bytes_read;
1134 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1135 n_skip -= n_bytes_read;
1136 if (n_bytes_read != n_bytes_to_read)
1145 error (2, 0, "cannot skip past end of combined input");
1151 format_address_none (address)
1152 long unsigned int address;
1158 format_address_std (address)
1159 long unsigned int address;
1161 const char *address_string;
1163 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1164 address_string = address_fmt_buffer;
1165 return address_string;
1169 format_address_label (address)
1170 long unsigned int address;
1172 const char *address_string;
1173 assert (output_address_fmt_string != NULL);
1175 sprintf (address_fmt_buffer, output_address_fmt_string,
1176 address, address + pseudo_offset);
1177 address_string = address_fmt_buffer;
1178 return address_string;
1181 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1182 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1183 CURR_BLOCK in the concatenation of input files, and it is printed
1184 (optionally) only before the output line associated with the first
1185 format spec. When duplicate blocks are being abbreviated, the output
1186 for a sequence of identical input blocks is the output for the first
1187 block followed by an asterisk alone on a line. It is valid to compare
1188 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1189 That condition may be false only for the last input block -- and then
1190 only when it has not been padded to length BYTES_PER_BLOCK. */
1193 write_block (current_offset, n_bytes, prev_block, curr_block)
1194 long unsigned int current_offset;
1195 long unsigned int n_bytes;
1196 const char *prev_block;
1197 const char *curr_block;
1199 static int first = 1;
1200 static int prev_pair_equal = 0;
1202 #define EQUAL_BLOCKS(b1, b2) (bcmp ((b1), (b2), bytes_per_block) == 0)
1204 if (abbreviate_duplicate_blocks
1205 && !first && n_bytes == bytes_per_block
1206 && EQUAL_BLOCKS (prev_block, curr_block))
1208 if (prev_pair_equal)
1210 /* The two preceding blocks were equal, and the current
1211 block is the same as the last one, so print nothing. */
1216 prev_pair_equal = 1;
1223 prev_pair_equal = 0;
1224 for (i = 0; i < n_specs; i++)
1226 printf ("%s ", (i == 0
1227 ? format_address (current_offset)
1229 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1235 /* Test whether there have been errors on in_stream, and close it if
1236 it is not standard input. Return non-zero if there has been an error
1237 on in_stream or stdout; return zero otherwise. This function will
1238 report more than one error only if both a read and a write error
1247 if (ferror (in_stream))
1249 error (0, errno, "%s", input_filename);
1250 if (in_stream != stdin)
1254 else if (in_stream != stdin && fclose (in_stream) == EOF)
1256 error (0, errno, "%s", input_filename);
1260 if (ferror (stdout))
1262 error (0, errno, "standard output");
1269 /* Read a single byte into *C from the concatenation of the input files
1270 named in the global array FILE_LIST. On the first call to this
1271 function, the global variable IN_STREAM is expected to be an open
1272 stream associated with the input file *FILE_LIST. If IN_STREAM is
1273 at end-of-file, close it and update the global variables IN_STREAM,
1274 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1275 the list. Then try to read a byte from the newly opened file.
1276 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1277 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1278 calls do likewise. The return value is non-zero if any errors
1279 occured, zero otherwise. */
1287 if (*file_list == NULL)
1296 *c = fgetc (in_stream);
1301 err |= check_and_close ();
1306 if (*file_list == NULL)
1309 if (STREQ (*file_list, "-"))
1311 input_filename = "standard input";
1313 have_read_stdin = 1;
1317 input_filename = *file_list;
1318 in_stream = fopen (input_filename, "r");
1319 if (in_stream == NULL)
1321 error (0, errno, "%s", input_filename);
1326 while (in_stream == NULL);
1330 /* Read N bytes into BLOCK from the concatenation of the input files
1331 named in the global array FILE_LIST. On the first call to this
1332 function, the global variable IN_STREAM is expected to be an open
1333 stream associated with the input file *FILE_LIST. On subsequent
1334 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1335 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1336 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1337 Then try to read the remaining bytes from the newly opened file.
1338 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1339 to the number of bytes read. If an error occurs, it will be detected
1340 through ferror when the stream is about to be closed. If there is an
1341 error, give a message but continue reading as usual and return non-zero.
1342 Otherwise return zero. */
1345 read_block (n, block, n_bytes_in_buffer)
1348 size_t *n_bytes_in_buffer;
1352 assert (n > 0 && n <= bytes_per_block);
1354 *n_bytes_in_buffer = 0;
1359 if (*file_list == NULL)
1360 return 0; /* EOF. */
1368 n_needed = n - *n_bytes_in_buffer;
1369 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1371 *n_bytes_in_buffer += n_read;
1373 if (n_read == n_needed)
1376 err |= check_and_close ();
1381 if (*file_list == NULL)
1384 if (STREQ (*file_list, "-"))
1386 input_filename = "standard input";
1388 have_read_stdin = 1;
1392 input_filename = *file_list;
1393 in_stream = fopen (input_filename, "r");
1394 if (in_stream == NULL)
1396 error (0, errno, "%s", input_filename);
1401 while (in_stream == NULL);
1405 /* Return the least common multiple of the sizes associated
1406 with the format specs. */
1414 for (i = 0; i < n_specs; i++)
1415 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1419 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1420 return the offset it denotes. Otherwise, return -1. */
1423 parse_old_offset (s)
1433 /* Skip over any leading '+'. */
1437 /* Determine the radix we'll use to interpret S. If there is a `.',
1438 it's decimal, otherwise, if the string begins with `0X'or `0x',
1439 it's hexadecimal, else octal. */
1440 if (index (s, '.') != NULL)
1444 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1449 offset = strtoul (s, &suffix, radix);
1450 if (suffix == s || errno != 0)
1457 BKM_SCALE (offset, 512, -1);
1462 BKM_SCALE (offset, 1024, -1);
1471 if (*suffix != '\0')
1477 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1478 formatted block to standard output, and repeat until the specified
1479 maximum number of bytes has been read or until all input has been
1480 processed. If the last block read is smaller than BYTES_PER_BLOCK
1481 and its size is not a multiple of the size associated with a format
1482 spec, extend the input block with zero bytes until its length is a
1483 multiple of all format spec sizes. Write the final block. Finally,
1484 write on a line by itself the offset of the byte after the last byte
1485 read. Accumulate return values from calls to read_block and
1486 check_and_close, and if any was non-zero, return non-zero.
1487 Otherwise, return zero. */
1493 unsigned long int current_offset;
1496 size_t n_bytes_read;
1499 #ifdef lint /* Suppress `used before initialized' warning. */
1503 block[0] = (char *) alloca (bytes_per_block);
1504 block[1] = (char *) alloca (bytes_per_block);
1506 current_offset = n_bytes_to_skip;
1510 if (limit_bytes_to_format)
1512 end_offset = n_bytes_to_skip + max_bytes_to_format;
1515 while (current_offset < end_offset)
1518 n_needed = MIN (end_offset - current_offset, bytes_per_block);
1519 err |= read_block (n_needed, block[idx], &n_bytes_read);
1520 if (n_bytes_read < bytes_per_block)
1522 assert (n_bytes_read == bytes_per_block);
1523 write_block (current_offset, n_bytes_read,
1524 block[!idx], block[idx]);
1525 current_offset += n_bytes_read;
1533 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1534 if (n_bytes_read < bytes_per_block)
1536 assert (n_bytes_read == bytes_per_block);
1537 write_block (current_offset, n_bytes_read,
1538 block[!idx], block[idx]);
1539 current_offset += n_bytes_read;
1544 if (n_bytes_read > 0)
1547 size_t bytes_to_write;
1551 /* Make bytes_to_write the smallest multiple of l_c_m that
1552 is at least as large as n_bytes_read. */
1553 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1555 bzero (block[idx] + n_bytes_read, bytes_to_write - n_bytes_read);
1556 write_block (current_offset, bytes_to_write,
1557 block[!idx], block[idx]);
1558 current_offset += n_bytes_read;
1561 if (output_address_fmt_string != NULL)
1562 printf ("%s\n", format_address (current_offset));
1564 if (limit_bytes_to_format && current_offset > end_offset)
1565 err |= check_and_close ();
1570 /* STRINGS mode. Find each "string constant" in the input.
1571 A string constant is a run of at least `string_min' ASCII
1572 graphic (or formatting) characters terminated by a null.
1573 Based on a function written by Richard Stallman for a
1574 pre-POSIX version of od. Return non-zero if an error
1575 occurs. Otherwise, return zero. */
1580 int bufsize = MAX (100, string_min);
1581 char *buf = xmalloc (bufsize);
1582 unsigned long address = n_bytes_to_skip;
1591 /* See if the next `string_min' chars are all printing chars. */
1594 if (limit_bytes_to_format
1595 && address >= (n_bytes_to_skip + max_bytes_to_format - string_min))
1598 for (i = 0; i < string_min; i++)
1600 err |= read_char (&c);
1608 /* Found a non-printing. Try again starting with next char. */
1613 /* We found a run of `string_min' printable characters.
1614 Now see if it is terminated with a null byte. */
1615 while (!limit_bytes_to_format
1616 || address < n_bytes_to_skip + max_bytes_to_format)
1620 bufsize = 1 + 3 * bufsize / 2;
1621 buf = xrealloc (buf, bufsize);
1623 err |= read_char (&c);
1631 break; /* It is; print this string. */
1633 goto tryline; /* It isn't; give up on this string. */
1634 buf[i++] = c; /* String continues; store it all. */
1637 /* If we get here, the string is all printable and null-terminated,
1638 so print it. It is all in `buf' and `i' is its length. */
1640 if (output_address_fmt_string != NULL)
1642 printf ("%s ", format_address (address - i - 1));
1644 for (i = 0; (c = buf[i]); i++)
1649 fputs ("\\a", stdout);
1653 fputs ("\\b", stdout);
1657 fputs ("\\f", stdout);
1661 fputs ("\\n", stdout);
1665 fputs ("\\r", stdout);
1669 fputs ("\\t", stdout);
1673 fputs ("\\v", stdout);
1683 /* We reach this point only if we search through
1684 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1688 err |= check_and_close ();
1701 unsigned int address_pad_len;
1702 unsigned long int desired_width;
1703 int width_specified = 0;
1706 /* The old-style `pseudo starting address' to be printed in parentheses
1707 after any true address. */
1708 long int pseudo_start;
1710 #ifdef lint /* Suppress `used before initialized' warning. */
1714 program_name = argv[0];
1717 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1718 integral_type_size[i] = NO_SIZE;
1720 integral_type_size[sizeof (char)] = CHAR;
1721 integral_type_size[sizeof (short int)] = SHORT;
1722 integral_type_size[sizeof (int)] = INT;
1723 integral_type_size[sizeof (long int)] = LONG;
1725 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1726 fp_type_size[i] = NO_SIZE;
1728 fp_type_size[sizeof (float)] = FP_SINGLE;
1729 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1730 so that if `long double' is the same type or if long double isn't
1731 supported FP_LONG_DOUBLE will never be used. */
1732 fp_type_size[sizeof (LONG_DOUBLE)] = FP_LONG_DOUBLE;
1733 fp_type_size[sizeof (double)] = FP_DOUBLE;
1736 n_specs_allocated = 5;
1737 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1739 output_address_fmt_string = "%07o";
1740 format_address = format_address_std;
1741 address_pad_len = 7;
1742 flag_dump_strings = 0;
1744 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1745 long_options, (int *) 0))
1748 strtoul_error s_err;
1759 output_address_fmt_string = "%07d";
1760 format_address = format_address_std;
1761 address_pad_len = 7;
1764 output_address_fmt_string = "%07o";
1765 format_address = format_address_std;
1766 address_pad_len = 7;
1769 output_address_fmt_string = "%06x";
1770 format_address = format_address_std;
1771 address_pad_len = 6;
1774 output_address_fmt_string = NULL;
1775 format_address = format_address_none;
1776 address_pad_len = 0;
1780 "invalid output address radix `%c'; it must be one character from [doxn]",
1787 s_err = my_strtoul (optarg, 0, &n_bytes_to_skip, 1);
1788 if (s_err != UINT_OK)
1789 uint_fatal_error (optarg, "skip argument", s_err);
1793 limit_bytes_to_format = 1;
1795 s_err = my_strtoul (optarg, 0, &max_bytes_to_format, 1);
1796 if (s_err != UINT_OK)
1797 uint_fatal_error (optarg, "limit argument", s_err);
1805 s_err = my_strtoul (optarg, 0, &string_min, 1);
1806 if (s_err != UINT_OK)
1807 uint_fatal_error (optarg, "minimum string length", s_err);
1809 ++flag_dump_strings;
1813 if (decode_format_string (optarg))
1814 error (2, 0, "invalid type string `%s'", optarg);
1818 abbreviate_duplicate_blocks = 0;
1825 /* The next several cases map the old, pre-POSIX format
1826 specification options to the corresponding POSIX format
1827 specs. GNU od accepts any combination of old- and
1828 new-style options. Format specification options accumulate. */
1830 #define CASE_OLD_ARG(old_char,new_string) \
1834 tmp = decode_format_string (new_string); \
1835 assert (tmp == 0); \
1839 CASE_OLD_ARG ('a', "a");
1840 CASE_OLD_ARG ('b', "oC");
1841 CASE_OLD_ARG ('c', "c");
1842 CASE_OLD_ARG ('d', "u2");
1843 CASE_OLD_ARG ('f', "fF");
1844 CASE_OLD_ARG ('h', "x2");
1845 CASE_OLD_ARG ('i', "d2");
1846 CASE_OLD_ARG ('l', "d4");
1847 CASE_OLD_ARG ('o', "o2");
1848 CASE_OLD_ARG ('x', "x2");
1853 width_specified = 1;
1860 s_err = my_strtoul (optarg, 10, &desired_width, 0);
1861 if (s_err != UINT_OK)
1862 error (2, 0, "invalid width specification `%s'", optarg);
1874 printf ("od - %s\n", version_string);
1881 if (flag_dump_strings && n_specs > 0)
1882 error (2, 0, "no type may be specified when dumping strings");
1884 n_files = argc - optind;
1886 /* If the --backward-compatible option is used, there may be from
1887 0 to 3 remaining command line arguments; handle each case
1889 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1890 The offset and pseudo_start have the same syntax. */
1898 if ((offset = parse_old_offset (argv[optind])) >= 0)
1900 n_bytes_to_skip = offset;
1905 else if (n_files == 2)
1908 if ((o1 = parse_old_offset (argv[optind])) >= 0
1909 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1911 n_bytes_to_skip = o1;
1912 flag_pseudo_start = 1;
1917 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1919 n_bytes_to_skip = o2;
1921 argv[optind + 1] = argv[optind];
1927 "invalid second operand in compatibility mode `%s'",
1932 else if (n_files == 3)
1935 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1936 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1938 n_bytes_to_skip = o1;
1939 flag_pseudo_start = 1;
1941 argv[optind + 2] = argv[optind];
1948 "in compatibility mode the last 2 arguments must be offsets");
1955 "in compatibility mode there may be no more than 3 arguments");
1959 if (flag_pseudo_start)
1961 static char buf[10];
1963 if (output_address_fmt_string == NULL)
1965 output_address_fmt_string = "(%07o)";
1966 format_address = format_address_std;
1970 sprintf (buf, "%s (%s)",
1971 output_address_fmt_string,
1972 output_address_fmt_string);
1973 output_address_fmt_string = buf;
1974 format_address = format_address_label;
1979 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1980 for (i = 0; i < address_pad_len; i++)
1981 address_pad[i] = ' ';
1982 address_pad[address_pad_len] = '\0';
1986 int d_err = decode_one_format ("o2", NULL, &(spec[0]));
1988 assert (d_err == 0);
1993 file_list = (char const *const *) &argv[optind];
1996 /* If no files were listed on the command line, set up the
1997 global array FILE_LIST so that it contains the null-terminated
1998 list of one name: "-". */
1999 static char const *const default_file_list[] = {"-", NULL};
2001 file_list = default_file_list;
2004 err |= skip (n_bytes_to_skip);
2005 if (in_stream == NULL)
2008 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
2010 /* Compute output block length. */
2013 if (width_specified)
2015 if (desired_width != 0 && desired_width % l_c_m == 0)
2016 bytes_per_block = desired_width;
2019 error (0, 0, "warning: invalid width %d; using %d instead",
2020 desired_width, l_c_m);
2021 bytes_per_block = l_c_m;
2026 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
2027 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
2029 bytes_per_block = l_c_m;
2033 for (i = 0; i < n_specs; i++)
2035 printf ("%d: fmt=\"%s\" width=%d\n",
2036 i, spec[i].fmt_string, width_bytes[spec[i].size]);
2040 err |= (flag_dump_strings ? dump_strings () : dump ());
2044 if (have_read_stdin && fclose (stdin) == EOF)
2045 error (2, errno, "standard input");
2047 if (fclose (stdout) == EOF)
2048 error (2, errno, "write error");