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);
425 tmp = strtoul (s, &p, base);
427 return UINT_OVERFLOW;
430 if (!allow_bkm_suffix)
438 return UINT_INVALID_SUFFIX_CHAR;
446 #define BKM_SCALE(x,scale_factor,error_return) \
449 if (x > (double) ULONG_MAX / scale_factor) \
450 return error_return; \
456 BKM_SCALE (tmp, 512, UINT_OVERFLOW);
460 BKM_SCALE (tmp, 1024, UINT_OVERFLOW);
464 BKM_SCALE (tmp, 1024 * 1024, UINT_OVERFLOW);
468 return UINT_INVALID_SUFFIX_CHAR;
477 uint_fatal_error (str, argument_type_string, err)
479 const char *argument_type_string;
488 error (2, 0, "invalid %s `%s'", argument_type_string, str);
491 case UINT_INVALID_SUFFIX_CHAR:
492 error (2, 0, "invalid character following %s `%s'",
493 argument_type_string, str);
497 error (2, 0, "%s `%s' larger than maximum unsigned long",
498 argument_type_string, str);
504 print_s_char (n_bytes, block, fmt_string)
505 long unsigned int n_bytes;
507 const char *fmt_string;
510 for (i = n_bytes; i > 0; i--)
512 int tmp = (unsigned) *(const unsigned char *) block;
514 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
515 assert (tmp <= SCHAR_MAX);
516 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
517 block += sizeof (unsigned char);
522 print_char (n_bytes, block, fmt_string)
523 long unsigned int n_bytes;
525 const char *fmt_string;
528 for (i = n_bytes; i > 0; i--)
530 unsigned int tmp = *(const unsigned char *) block;
531 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
532 block += sizeof (unsigned char);
537 print_s_short (n_bytes, block, fmt_string)
538 long unsigned int n_bytes;
540 const char *fmt_string;
543 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
545 int tmp = (unsigned) *(const unsigned short *) block;
547 tmp -= SHRT_MAX - SHRT_MIN + 1;
548 assert (tmp <= SHRT_MAX);
549 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
550 block += sizeof (unsigned short);
554 print_short (n_bytes, block, fmt_string)
555 long unsigned int n_bytes;
557 const char *fmt_string;
560 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
562 unsigned int tmp = *(const unsigned short *) block;
563 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
564 block += sizeof (unsigned short);
569 print_int (n_bytes, block, fmt_string)
570 long unsigned int n_bytes;
572 const char *fmt_string;
575 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
577 unsigned int tmp = *(const unsigned int *) block;
578 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
579 block += sizeof (unsigned int);
584 print_long (n_bytes, block, fmt_string)
585 long unsigned int n_bytes;
587 const char *fmt_string;
590 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
592 unsigned long tmp = *(const unsigned long *) block;
593 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
594 block += sizeof (unsigned long);
599 print_float (n_bytes, block, fmt_string)
600 long unsigned int n_bytes;
602 const char *fmt_string;
605 for (i = n_bytes / sizeof (float); i > 0; i--)
607 float tmp = *(const float *) block;
608 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
609 block += sizeof (float);
614 print_double (n_bytes, block, fmt_string)
615 long unsigned int n_bytes;
617 const char *fmt_string;
620 for (i = n_bytes / sizeof (double); i > 0; i--)
622 double tmp = *(const double *) block;
623 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
624 block += sizeof (double);
628 #ifdef HAVE_LONG_DOUBLE
630 print_long_double (n_bytes, block, fmt_string)
631 long unsigned int n_bytes;
633 const char *fmt_string;
636 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
638 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
639 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
640 block += sizeof (LONG_DOUBLE);
647 print_named_ascii (n_bytes, block, unused_fmt_string)
648 long unsigned int n_bytes;
650 const char *unused_fmt_string;
653 for (i = n_bytes; i > 0; i--)
655 unsigned int c = *(const unsigned char *) block;
656 unsigned int masked_c = (0x7f & c);
662 else if (masked_c <= 040)
663 s = charname[masked_c];
666 sprintf (buf, " %c", masked_c);
670 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
671 block += sizeof (unsigned char);
676 print_ascii (n_bytes, block, unused_fmt_string)
677 long unsigned int n_bytes;
679 const char *unused_fmt_string;
682 for (i = n_bytes; i > 0; i--)
684 unsigned int c = *(const unsigned char *) block;
723 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
724 s = (const char *) buf;
727 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
728 block += sizeof (unsigned char);
732 /* Convert a null-terminated (possibly zero-length) string S to an
733 unsigned long integer value. If S points to a non-digit set *P to S,
734 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
735 the string of digits. If the string of digits represents a value
736 larger than ULONG_MAX, don't modify *VAL or *P and return non-zero.
737 Otherwise, advance *P to the first non-digit after S, set *VAL to
738 the result of the conversion and return zero. */
741 simple_strtoul (s, p, val)
744 long unsigned int *val;
746 unsigned long int sum;
751 unsigned int c = *s++ - '0';
752 if (sum > (ULONG_MAX - c) / 10)
761 /* If S points to a single valid POSIX-style od format string, put a
762 description of that format in *TSPEC, make *NEXT point at the character
763 following the just-decoded format (if *NEXT is non-NULL), and return
764 zero. If S is not valid, don't modify *NEXT or *TSPEC and return
765 non-zero. For example, if S were "d4afL" *NEXT would be set to "afL"
768 fmt = SIGNED_DECIMAL;
769 size = INT or LONG; (whichever integral_type_size[4] resolves to)
770 print_function = print_int; (assuming size == INT)
771 fmt_string = "%011d%c";
776 decode_one_format (s, next, tspec)
781 enum size_spec size_spec;
782 unsigned long int size;
783 enum output_format fmt;
784 const char *pre_fmt_string;
786 void (*print_function) ();
790 assert (tspec != NULL);
804 size = sizeof (char);
809 size = sizeof (short);
819 size = sizeof (long int);
823 if (simple_strtoul (s, &p, &size) != 0)
829 if (size > MAX_INTEGRAL_TYPE_SIZE
830 || integral_type_size[size] == NO_SIZE)
837 #define FMT_BYTES_ALLOCATED 9
838 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
840 size_spec = integral_type_size[size];
845 fmt = SIGNED_DECIMAL;
846 sprintf (fmt_string, "%%%u%sd%%c",
847 bytes_to_signed_dec_digits[size],
848 (size_spec == LONG ? "l" : ""));
853 sprintf (fmt_string, "%%0%u%so%%c",
854 bytes_to_oct_digits[size],
855 (size_spec == LONG ? "l" : ""));
859 fmt = UNSIGNED_DECIMAL;
860 sprintf (fmt_string, "%%%u%su%%c",
861 bytes_to_unsigned_dec_digits[size],
862 (size_spec == LONG ? "l" : ""));
867 sprintf (fmt_string, "%%0%u%sx%%c",
868 bytes_to_hex_digits[size],
869 (size_spec == LONG ? "l" : ""));
876 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
881 print_function = (fmt == SIGNED_DECIMAL
887 print_function = (fmt == SIGNED_DECIMAL
893 print_function = print_int;
897 print_function = print_long;
906 fmt = FLOATING_POINT;
912 size = sizeof (float);
917 size = sizeof (double);
922 size = sizeof (LONG_DOUBLE);
926 if (simple_strtoul (s, &p, &size) != 0)
929 size = sizeof (double);
932 if (size > MAX_FP_TYPE_SIZE
933 || fp_type_size[size] == NO_SIZE)
939 size_spec = fp_type_size[size];
944 print_function = print_float;
945 /* Don't use %#e; not all systems support it. */
946 pre_fmt_string = "%%%d.%de%%c";
947 fmt_string = xmalloc (strlen (pre_fmt_string));
948 sprintf (fmt_string, pre_fmt_string,
949 FLT_DIG + 8, FLT_DIG);
953 print_function = print_double;
954 pre_fmt_string = "%%%d.%de%%c";
955 fmt_string = xmalloc (strlen (pre_fmt_string));
956 sprintf (fmt_string, pre_fmt_string,
957 DBL_DIG + 8, DBL_DIG);
960 #ifdef HAVE_LONG_DOUBLE
962 print_function = print_long_double;
963 pre_fmt_string = "%%%d.%dle%%c";
964 fmt_string = xmalloc (strlen (pre_fmt_string));
965 sprintf (fmt_string, pre_fmt_string,
966 LDBL_DIG + 8, LDBL_DIG);
977 fmt = NAMED_CHARACTER;
980 print_function = print_named_ascii;
988 print_function = print_ascii;
995 tspec->size = size_spec;
997 tspec->print_function = print_function;
998 tspec->fmt_string = fmt_string;
1006 /* Decode the POSIX-style od format string S. Append the decoded
1007 representation to the global array SPEC, reallocating SPEC if
1008 necessary. Return zero if S is valid, non-zero otherwise. */
1011 decode_format_string (s)
1021 if (decode_one_format (s, &next, &tspec))
1027 if (n_specs >= n_specs_allocated)
1029 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
1030 spec = (struct tspec *) xrealloc (spec, (n_specs_allocated
1031 * sizeof (struct tspec)));
1034 bcopy ((char *) &tspec, (char *) &spec[n_specs], sizeof (struct tspec));
1041 /* Given a list of one or more input filenames FILE_LIST, set the global
1042 file pointer IN_STREAM to position N_SKIP in the concatenation of
1043 those files. If any file operation fails or if there are fewer than
1044 N_SKIP bytes in the combined input, give an error message and return
1045 non-zero. When possible, use seek- rather than read operations to
1046 advance IN_STREAM. A file name of "-" is interpreted as standard
1051 long unsigned int n_skip;
1056 for ( /* empty */ ; *file_list != NULL; ++file_list)
1058 struct stat file_stats;
1061 if (STREQ (*file_list, "-"))
1063 input_filename = "standard input";
1065 have_read_stdin = 1;
1069 input_filename = *file_list;
1070 in_stream = fopen (input_filename, "r");
1071 if (in_stream == NULL)
1073 error (0, errno, "%s", input_filename);
1082 /* First try using fseek. For large offsets, this extra work is
1083 worthwhile. If the offset is below some threshold it may be
1084 more efficient to move the pointer by reading. There are two
1085 issues when trying to use fseek:
1086 - the file must be seekable.
1087 - before seeking to the specified position, make sure
1088 that the new position is in the current file.
1089 Try to do that by getting file's size using fstat().
1090 But that will work only for regular files and dirs. */
1092 if (fstat (fileno (in_stream), &file_stats))
1094 error (0, errno, "%s", input_filename);
1099 /* The st_size field is valid only for regular files and
1100 directories. FIXME: is the preceding true?
1101 If the number of bytes left to skip is at least as large as
1102 the size of the current file, we can decrement
1103 n_skip and go on to the next file. */
1104 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
1106 if (n_skip >= file_stats.st_size)
1108 n_skip -= file_stats.st_size;
1109 if (in_stream != stdin && fclose (in_stream) == EOF)
1111 error (0, errno, "%s", input_filename);
1118 if (fseek (in_stream, n_skip, SEEK_SET) == 0)
1126 /* fseek didn't work or wasn't attempted; do it the slow way. */
1128 for (j = n_skip / BUFSIZ; j >= 0; j--)
1131 size_t n_bytes_to_read = (j > 0
1134 size_t n_bytes_read;
1135 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1136 n_skip -= n_bytes_read;
1137 if (n_bytes_read != n_bytes_to_read)
1146 error (2, 0, "cannot skip past end of combined input");
1152 format_address_none (address)
1153 long unsigned int address;
1159 format_address_std (address)
1160 long unsigned int address;
1162 const char *address_string;
1164 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1165 address_string = address_fmt_buffer;
1166 return address_string;
1170 format_address_label (address)
1171 long unsigned int address;
1173 const char *address_string;
1174 assert (output_address_fmt_string != NULL);
1176 sprintf (address_fmt_buffer, output_address_fmt_string,
1177 address, address + pseudo_offset);
1178 address_string = address_fmt_buffer;
1179 return address_string;
1182 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1183 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1184 CURR_BLOCK in the concatenation of input files, and it is printed
1185 (optionally) only before the output line associated with the first
1186 format spec. When duplicate blocks are being abbreviated, the output
1187 for a sequence of identical input blocks is the output for the first
1188 block followed by an asterisk alone on a line. It is valid to compare
1189 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1190 That condition may be false only for the last input block -- and then
1191 only when it has not been padded to length BYTES_PER_BLOCK. */
1194 write_block (current_offset, n_bytes, prev_block, curr_block)
1195 long unsigned int current_offset;
1196 long unsigned int n_bytes;
1197 const char *prev_block;
1198 const char *curr_block;
1200 static int first = 1;
1201 static int prev_pair_equal = 0;
1203 #define EQUAL_BLOCKS(b1, b2) (bcmp ((b1), (b2), bytes_per_block) == 0)
1205 if (abbreviate_duplicate_blocks
1206 && !first && n_bytes == bytes_per_block
1207 && EQUAL_BLOCKS (prev_block, curr_block))
1209 if (prev_pair_equal)
1211 /* The two preceding blocks were equal, and the current
1212 block is the same as the last one, so print nothing. */
1217 prev_pair_equal = 1;
1224 prev_pair_equal = 0;
1225 for (i = 0; i < n_specs; i++)
1227 printf ("%s ", (i == 0
1228 ? format_address (current_offset)
1230 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1236 /* Test whether there have been errors on in_stream, and close it if
1237 it is not standard input. Return non-zero if there has been an error
1238 on in_stream or stdout; return zero otherwise. This function will
1239 report more than one error only if both a read and a write error
1248 if (ferror (in_stream))
1250 error (0, errno, "%s", input_filename);
1251 if (in_stream != stdin)
1255 else if (in_stream != stdin && fclose (in_stream) == EOF)
1257 error (0, errno, "%s", input_filename);
1261 if (ferror (stdout))
1263 error (0, errno, "standard output");
1270 /* Read a single byte into *C from the concatenation of the input files
1271 named in the global array FILE_LIST. On the first call to this
1272 function, the global variable IN_STREAM is expected to be an open
1273 stream associated with the input file *FILE_LIST. If IN_STREAM is
1274 at end-of-file, close it and update the global variables IN_STREAM,
1275 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1276 the list. Then try to read a byte from the newly opened file.
1277 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1278 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1279 calls do likewise. The return value is non-zero if any errors
1280 occured, zero otherwise. */
1288 if (*file_list == NULL)
1297 *c = fgetc (in_stream);
1302 err |= check_and_close ();
1307 if (*file_list == NULL)
1310 if (STREQ (*file_list, "-"))
1312 input_filename = "standard input";
1314 have_read_stdin = 1;
1318 input_filename = *file_list;
1319 in_stream = fopen (input_filename, "r");
1320 if (in_stream == NULL)
1322 error (0, errno, "%s", input_filename);
1327 while (in_stream == NULL);
1331 /* Read N bytes into BLOCK from the concatenation of the input files
1332 named in the global array FILE_LIST. On the first call to this
1333 function, the global variable IN_STREAM is expected to be an open
1334 stream associated with the input file *FILE_LIST. On subsequent
1335 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1336 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1337 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1338 Then try to read the remaining bytes from the newly opened file.
1339 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1340 to the number of bytes read. If an error occurs, it will be detected
1341 through ferror when the stream is about to be closed. If there is an
1342 error, give a message but continue reading as usual and return non-zero.
1343 Otherwise return zero. */
1346 read_block (n, block, n_bytes_in_buffer)
1349 size_t *n_bytes_in_buffer;
1353 assert (n > 0 && n <= bytes_per_block);
1355 *n_bytes_in_buffer = 0;
1360 if (*file_list == NULL)
1361 return 0; /* EOF. */
1369 n_needed = n - *n_bytes_in_buffer;
1370 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1372 *n_bytes_in_buffer += n_read;
1374 if (n_read == n_needed)
1377 err |= check_and_close ();
1382 if (*file_list == NULL)
1385 if (STREQ (*file_list, "-"))
1387 input_filename = "standard input";
1389 have_read_stdin = 1;
1393 input_filename = *file_list;
1394 in_stream = fopen (input_filename, "r");
1395 if (in_stream == NULL)
1397 error (0, errno, "%s", input_filename);
1402 while (in_stream == NULL);
1406 /* Return the least common multiple of the sizes associated
1407 with the format specs. */
1415 for (i = 0; i < n_specs; i++)
1416 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1420 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1421 return the offset it denotes. Otherwise, return -1. */
1424 parse_old_offset (s)
1434 /* Skip over any leading '+'. */
1438 /* Determine the radix we'll use to interpret S. If there is a `.',
1439 it's decimal, otherwise, if the string begins with `0X'or `0x',
1440 it's hexadecimal, else octal. */
1441 if (index (s, '.') != NULL)
1445 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1450 offset = strtoul (s, &suffix, radix);
1451 if (suffix == s || errno != 0)
1458 BKM_SCALE (offset, 512, -1);
1463 BKM_SCALE (offset, 1024, -1);
1472 if (*suffix != '\0')
1478 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1479 formatted block to standard output, and repeat until the specified
1480 maximum number of bytes has been read or until all input has been
1481 processed. If the last block read is smaller than BYTES_PER_BLOCK
1482 and its size is not a multiple of the size associated with a format
1483 spec, extend the input block with zero bytes until its length is a
1484 multiple of all format spec sizes. Write the final block. Finally,
1485 write on a line by itself the offset of the byte after the last byte
1486 read. Accumulate return values from calls to read_block and
1487 check_and_close, and if any was non-zero, return non-zero.
1488 Otherwise, return zero. */
1494 unsigned long int current_offset;
1497 size_t n_bytes_read;
1500 #ifdef lint /* Suppress `used before initialized' warning. */
1504 block[0] = (char *) alloca (bytes_per_block);
1505 block[1] = (char *) alloca (bytes_per_block);
1507 current_offset = n_bytes_to_skip;
1511 if (limit_bytes_to_format)
1513 end_offset = n_bytes_to_skip + max_bytes_to_format;
1516 while (current_offset < end_offset)
1519 n_needed = MIN (end_offset - current_offset, bytes_per_block);
1520 err |= read_block (n_needed, block[idx], &n_bytes_read);
1521 if (n_bytes_read < bytes_per_block)
1523 assert (n_bytes_read == bytes_per_block);
1524 write_block (current_offset, n_bytes_read,
1525 block[!idx], block[idx]);
1526 current_offset += n_bytes_read;
1534 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1535 if (n_bytes_read < bytes_per_block)
1537 assert (n_bytes_read == bytes_per_block);
1538 write_block (current_offset, n_bytes_read,
1539 block[!idx], block[idx]);
1540 current_offset += n_bytes_read;
1545 if (n_bytes_read > 0)
1548 size_t bytes_to_write;
1552 /* Make bytes_to_write the smallest multiple of l_c_m that
1553 is at least as large as n_bytes_read. */
1554 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1556 bzero (block[idx] + n_bytes_read, bytes_to_write - n_bytes_read);
1557 write_block (current_offset, bytes_to_write,
1558 block[!idx], block[idx]);
1559 current_offset += n_bytes_read;
1562 if (output_address_fmt_string != NULL)
1563 printf ("%s\n", format_address (current_offset));
1565 if (limit_bytes_to_format && current_offset > end_offset)
1566 err |= check_and_close ();
1571 /* STRINGS mode. Find each "string constant" in the input.
1572 A string constant is a run of at least `string_min' ASCII
1573 graphic (or formatting) characters terminated by a null.
1574 Based on a function written by Richard Stallman for a
1575 pre-POSIX version of od. Return non-zero if an error
1576 occurs. Otherwise, return zero. */
1581 int bufsize = MAX (100, string_min);
1582 char *buf = xmalloc (bufsize);
1583 unsigned long address = n_bytes_to_skip;
1592 /* See if the next `string_min' chars are all printing chars. */
1595 if (limit_bytes_to_format
1596 && address >= (n_bytes_to_skip + max_bytes_to_format - string_min))
1599 for (i = 0; i < string_min; i++)
1601 err |= read_char (&c);
1609 /* Found a non-printing. Try again starting with next char. */
1614 /* We found a run of `string_min' printable characters.
1615 Now see if it is terminated with a null byte. */
1616 while (!limit_bytes_to_format
1617 || address < n_bytes_to_skip + max_bytes_to_format)
1621 bufsize = 1 + 3 * bufsize / 2;
1622 buf = xrealloc (buf, bufsize);
1624 err |= read_char (&c);
1632 break; /* It is; print this string. */
1634 goto tryline; /* It isn't; give up on this string. */
1635 buf[i++] = c; /* String continues; store it all. */
1638 /* If we get here, the string is all printable and null-terminated,
1639 so print it. It is all in `buf' and `i' is its length. */
1641 if (output_address_fmt_string != NULL)
1643 printf ("%s ", format_address (address - i - 1));
1645 for (i = 0; (c = buf[i]); i++)
1650 fputs ("\\a", stdout);
1654 fputs ("\\b", stdout);
1658 fputs ("\\f", stdout);
1662 fputs ("\\n", stdout);
1666 fputs ("\\r", stdout);
1670 fputs ("\\t", stdout);
1674 fputs ("\\v", stdout);
1684 /* We reach this point only if we search through
1685 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1689 err |= check_and_close ();
1702 unsigned int address_pad_len;
1703 unsigned long int desired_width;
1704 int width_specified = 0;
1707 /* The old-style `pseudo starting address' to be printed in parentheses
1708 after any true address. */
1709 long int pseudo_start;
1711 #ifdef lint /* Suppress `used before initialized' warning. */
1715 program_name = argv[0];
1718 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1719 integral_type_size[i] = NO_SIZE;
1721 integral_type_size[sizeof (char)] = CHAR;
1722 integral_type_size[sizeof (short int)] = SHORT;
1723 integral_type_size[sizeof (int)] = INT;
1724 integral_type_size[sizeof (long int)] = LONG;
1726 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1727 fp_type_size[i] = NO_SIZE;
1729 fp_type_size[sizeof (float)] = FP_SINGLE;
1730 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1731 so that if `long double' is the same type or if long double isn't
1732 supported FP_LONG_DOUBLE will never be used. */
1733 fp_type_size[sizeof (LONG_DOUBLE)] = FP_LONG_DOUBLE;
1734 fp_type_size[sizeof (double)] = FP_DOUBLE;
1737 n_specs_allocated = 5;
1738 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1740 output_address_fmt_string = "%07o";
1741 format_address = format_address_std;
1742 address_pad_len = 7;
1743 flag_dump_strings = 0;
1745 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1746 long_options, (int *) 0))
1749 strtoul_error s_err;
1760 output_address_fmt_string = "%07d";
1761 format_address = format_address_std;
1762 address_pad_len = 7;
1765 output_address_fmt_string = "%07o";
1766 format_address = format_address_std;
1767 address_pad_len = 7;
1770 output_address_fmt_string = "%06x";
1771 format_address = format_address_std;
1772 address_pad_len = 6;
1775 output_address_fmt_string = NULL;
1776 format_address = format_address_none;
1777 address_pad_len = 0;
1781 "invalid output address radix `%c'; it must be one character from [doxn]",
1788 s_err = my_strtoul (optarg, 0, &n_bytes_to_skip, 1);
1789 if (s_err != UINT_OK)
1790 uint_fatal_error (optarg, "skip argument", s_err);
1794 limit_bytes_to_format = 1;
1796 s_err = my_strtoul (optarg, 0, &max_bytes_to_format, 1);
1797 if (s_err != UINT_OK)
1798 uint_fatal_error (optarg, "limit argument", s_err);
1806 s_err = my_strtoul (optarg, 0, &string_min, 1);
1807 if (s_err != UINT_OK)
1808 uint_fatal_error (optarg, "minimum string length", s_err);
1810 ++flag_dump_strings;
1814 if (decode_format_string (optarg))
1815 error (2, 0, "invalid type string `%s'", optarg);
1819 abbreviate_duplicate_blocks = 0;
1826 /* The next several cases map the old, pre-POSIX format
1827 specification options to the corresponding POSIX format
1828 specs. GNU od accepts any combination of old- and
1829 new-style options. Format specification options accumulate. */
1831 #define CASE_OLD_ARG(old_char,new_string) \
1835 tmp = decode_format_string (new_string); \
1836 assert (tmp == 0); \
1840 CASE_OLD_ARG ('a', "a");
1841 CASE_OLD_ARG ('b', "oC");
1842 CASE_OLD_ARG ('c', "c");
1843 CASE_OLD_ARG ('d', "u2");
1844 CASE_OLD_ARG ('f', "fF");
1845 CASE_OLD_ARG ('h', "x2");
1846 CASE_OLD_ARG ('i', "d2");
1847 CASE_OLD_ARG ('l', "d4");
1848 CASE_OLD_ARG ('o', "o2");
1849 CASE_OLD_ARG ('x', "x2");
1854 width_specified = 1;
1861 s_err = my_strtoul (optarg, 10, &desired_width, 0);
1862 if (s_err != UINT_OK)
1863 error (2, 0, "invalid width specification `%s'", optarg);
1875 printf ("od - %s\n", version_string);
1882 if (flag_dump_strings && n_specs > 0)
1883 error (2, 0, "no type may be specified when dumping strings");
1885 n_files = argc - optind;
1887 /* If the --backward-compatible option is used, there may be from
1888 0 to 3 remaining command line arguments; handle each case
1890 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1891 The offset and pseudo_start have the same syntax. */
1899 if ((offset = parse_old_offset (argv[optind])) >= 0)
1901 n_bytes_to_skip = offset;
1906 else if (n_files == 2)
1909 if ((o1 = parse_old_offset (argv[optind])) >= 0
1910 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1912 n_bytes_to_skip = o1;
1913 flag_pseudo_start = 1;
1918 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1920 n_bytes_to_skip = o2;
1922 argv[optind + 1] = argv[optind];
1928 "invalid second operand in compatibility mode `%s'",
1933 else if (n_files == 3)
1936 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1937 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1939 n_bytes_to_skip = o1;
1940 flag_pseudo_start = 1;
1942 argv[optind + 2] = argv[optind];
1949 "in compatibility mode the last 2 arguments must be offsets");
1956 "in compatibility mode there may be no more than 3 arguments");
1960 if (flag_pseudo_start)
1962 static char buf[10];
1964 if (output_address_fmt_string == NULL)
1966 output_address_fmt_string = "(%07o)";
1967 format_address = format_address_std;
1971 sprintf (buf, "%s (%s)",
1972 output_address_fmt_string,
1973 output_address_fmt_string);
1974 output_address_fmt_string = buf;
1975 format_address = format_address_label;
1980 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1981 for (i = 0; i < address_pad_len; i++)
1982 address_pad[i] = ' ';
1983 address_pad[address_pad_len] = '\0';
1987 int d_err = decode_one_format ("o2", NULL, &(spec[0]));
1989 assert (d_err == 0);
1994 file_list = (char const *const *) &argv[optind];
1997 /* If no files were listed on the command line, set up the
1998 global array FILE_LIST so that it contains the null-terminated
1999 list of one name: "-". */
2000 static char const *const default_file_list[] = {"-", NULL};
2002 file_list = default_file_list;
2005 err |= skip (n_bytes_to_skip);
2006 if (in_stream == NULL)
2009 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
2011 /* Compute output block length. */
2014 if (width_specified)
2016 if (desired_width != 0 && desired_width % l_c_m == 0)
2017 bytes_per_block = desired_width;
2020 error (0, 0, "warning: invalid width %d; using %d instead",
2021 desired_width, l_c_m);
2022 bytes_per_block = l_c_m;
2027 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
2028 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
2030 bytes_per_block = l_c_m;
2034 for (i = 0; i < n_specs; i++)
2036 printf ("%d: fmt=\"%s\" width=%d\n",
2037 i, spec[i].fmt_string, width_bytes[spec[i].size]);
2041 err |= (flag_dump_strings ? dump_strings () : dump ());
2045 if (have_read_stdin && fclose (stdin) == EOF)
2046 error (2, errno, "standard input");
2048 if (fclose (stdout) == EOF)
2049 error (2, errno, "write error");