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 #define alloca __builtin_alloca
23 #else /* not __GNUC__ */
26 #else /* not HAVE_ALLOCA_H */
32 #endif /* not HAVE_ALLOCA_H */
33 #endif /* not __GNUC__ */
38 #include <sys/types.h>
41 #if defined(__GNUC__) || defined(STDC_HEADERS)
46 typedef long double LONG_DOUBLE;
48 typedef double LONG_DOUBLE;
58 #define SHRT_MAX 32767
61 #define ULONG_MAX ((unsigned long) ~(unsigned long) 0)
64 #define STREQ(a,b) (strcmp((a), (b)) == 0)
67 #define MAX(a, b) ((a) > (b) ? (a) : (b))
71 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
74 /* The default number of input bytes per output line. */
75 #define DEFAULT_BYTES_PER_BLOCK 16
77 /* The number of decimal digits of precision in a float. */
82 /* The number of decimal digits of precision in a double. */
87 /* The number of decimal digits of precision in a long double. */
89 #define LDBL_DIG DBL_DIG
121 UINT_OK, UINT_INVALID, UINT_INVALID_SUFFIX_CHAR, UINT_OVERFLOW
123 typedef enum strtoul_error strtoul_error;
125 /* Each output format specification (from POSIX `-t spec' or from
126 old-style options) is represented by one of these structures. */
129 enum output_format fmt;
131 void (*print_function) ();
135 /* Convert the number of 8-bit bytes of a binary representation to
136 the number of characters (digits + sign if the type is signed)
137 required to represent the same quantity in the specified base/type.
138 For example, a 32-bit (4-byte) quantity may require a field width
139 as wide as the following for these types:
143 8 unsigned hexadecimal */
145 static const unsigned int bytes_to_oct_digits[] =
146 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
148 static const unsigned int bytes_to_signed_dec_digits[] =
149 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
151 static const unsigned int bytes_to_unsigned_dec_digits[] =
152 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
154 static const unsigned int bytes_to_hex_digits[] =
155 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
157 /* Convert enum size_spec to the size of the named type. */
158 static const int width_bytes[] =
170 /* Names for some non-printing characters. */
171 static const char *const charname[33] =
173 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
174 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
175 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
176 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
180 /* A printf control string for printing a file offset. */
181 static const char *output_address_fmt_string;
183 /* FIXME: make this the number of octal digits in an unsigned long. */
184 #define MAX_ADDRESS_LENGTH 13
185 static char address_fmt_buffer[MAX_ADDRESS_LENGTH + 1];
186 static char address_pad[MAX_ADDRESS_LENGTH + 1];
188 static unsigned long int string_min;
189 static unsigned long int flag_dump_strings;
191 /* The number of input bytes to skip before formatting and writing. */
192 static unsigned long int n_bytes_to_skip = 0;
194 /* When non-zero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
195 to be read and formatted. Otherwise all input is formatted. */
196 static int limit_bytes_to_format = 0;
198 /* The maximum number of bytes that will be formatted. This
199 value is used only when LIMIT_BYTES_TO_FORMAT is non-zero. */
200 static unsigned long int max_bytes_to_format;
202 /* When non-zero and two or more consecutive blocks are equal, format
203 only the first block and output an asterisk alone on the following
204 line to indicate that identical blocks have been elided. */
205 static int abbreviate_duplicate_blocks = 1;
207 /* An array of specs describing how to format each input block. */
208 static struct tspec *spec;
210 /* The number of format specs. */
211 static unsigned int n_specs;
213 /* The allocated length of SPEC. */
214 static unsigned int n_specs_allocated;
216 /* The number of input bytes formatted per output line. It must be
217 a multiple of the least common multiple of the sizes associated with
218 the specified output types. It should be as large as possible, but
219 no larger than 16 -- unless specified with the -w option. */
220 static unsigned int bytes_per_block;
222 /* Human-readable representation of *file_list (for error messages).
223 It differs from *file_list only when *file_list is "-". */
224 static char const *input_filename;
226 /* A NULL-terminated list of the file-arguments from the command line.
227 If no file-arguments were specified, this variable is initialized
229 static char const *const *file_list;
231 /* The input stream associated with the current file. */
232 static FILE *in_stream;
234 /* If non-zero, at least one of the files we read was standard input. */
235 static int have_read_stdin;
237 #define LONGEST_INTEGRAL_TYPE long int
239 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
240 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
242 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
243 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
245 static struct option const long_options[] =
248 {"skip-bytes", required_argument, NULL, 'j'},
249 {"address-radix", required_argument, NULL, 'A'},
250 {"read-bytes", required_argument, NULL, 'N'},
251 {"format", required_argument, NULL, 't'},
252 {"output-duplicates", no_argument, NULL, 'v'},
254 /* non-POSIX options. */
255 {"strings", optional_argument, NULL, 's'},
256 {"width", optional_argument, NULL, 'w'},
260 /* The name this program was run with. */
267 Usage: %s [-abcdfhiloxv] [-s[bytes]] [-w[bytes]] [-A radix] [-j bytes]\n\
268 [-N bytes] [-t type] [--skip-bytes=bytes] [--address-radix=radix]\n\
269 [--read-bytes=bytes] [--format=type] [--output-duplicates]\n\
270 [--strings[=bytes]] [--width[=bytes]] [file...]\n",
275 /* Compute the greatest common denominator of U and V
276 using Euclid's algorithm. */
293 /* Compute the least common multiple of U and V. */
300 unsigned int t = gcd (u, v);
307 my_strtoul (s, base, val, allow_bkm_suffix)
310 long unsigned int *val;
311 int allow_bkm_suffix;
314 unsigned long int tmp;
316 assert (0 <= base && base <= 36);
318 tmp = strtoul (s, &p, base);
320 return UINT_OVERFLOW;
323 if (!allow_bkm_suffix)
331 return UINT_INVALID_SUFFIX_CHAR;
339 #define BKM_SCALE(x,scale_factor) \
342 if (x > (double) ULONG_MAX / scale_factor) \
343 return UINT_OVERFLOW; \
349 BKM_SCALE (tmp, 512);
353 BKM_SCALE (tmp, 1024);
357 BKM_SCALE (tmp, 1024 * 1024);
361 return UINT_INVALID_SUFFIX_CHAR;
370 uint_fatal_error (str, argument_type_string, err)
372 const char *argument_type_string;
381 error (2, 0, "invalid %s `%s'", argument_type_string, str);
384 case UINT_INVALID_SUFFIX_CHAR:
385 error (2, 0, "invalid character following %s `%s'",
386 argument_type_string, str);
390 error (2, 0, "%s `%s' larger than maximum unsigned long",
391 argument_type_string, str);
397 print_s_char (n_bytes, block, fmt_string)
398 long unsigned int n_bytes;
400 const char *fmt_string;
403 for (i = n_bytes; i > 0; i--)
405 int tmp = (unsigned) *(const signed char *) block;
406 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
407 block += sizeof (unsigned char);
412 print_char (n_bytes, block, fmt_string)
413 long unsigned int n_bytes;
415 const char *fmt_string;
418 for (i = n_bytes; i > 0; i--)
420 unsigned int tmp = *(const unsigned char *) block;
421 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
422 block += sizeof (unsigned char);
427 print_s_short (n_bytes, block, fmt_string)
428 long unsigned int n_bytes;
430 const char *fmt_string;
433 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
435 int tmp = (unsigned) *(const signed short *) block;
436 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
437 block += sizeof (unsigned short);
442 print_short (n_bytes, block, fmt_string)
443 long unsigned int n_bytes;
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 (n_bytes, block, fmt_string)
458 long unsigned int n_bytes;
460 const char *fmt_string;
463 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
465 unsigned int tmp = *(const unsigned int *) block;
466 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
467 block += sizeof (unsigned int);
472 print_long (n_bytes, block, fmt_string)
473 long unsigned int n_bytes;
475 const char *fmt_string;
478 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
480 unsigned long tmp = *(const unsigned long *) block;
481 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
482 block += sizeof (unsigned long);
487 print_float (n_bytes, block, fmt_string)
488 long unsigned int n_bytes;
490 const char *fmt_string;
493 for (i = n_bytes / sizeof (float); i > 0; i--)
495 float tmp = *(const float *) block;
496 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
497 block += sizeof (float);
502 print_double (n_bytes, block, fmt_string)
503 long unsigned int n_bytes;
505 const char *fmt_string;
508 for (i = n_bytes / sizeof (double); i > 0; i--)
510 double tmp = *(const double *) block;
511 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
512 block += sizeof (double);
518 print_long_double (n_bytes, block, fmt_string)
519 long unsigned int n_bytes;
521 const char *fmt_string;
524 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
526 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
527 printf (fmt_string, tmp, (i == 1 ? '\n' : ' '));
528 block += sizeof (LONG_DOUBLE);
535 print_named_ascii (n_bytes, block, unused_fmt_string)
536 long unsigned int n_bytes;
538 const char *unused_fmt_string;
541 for (i = n_bytes; i > 0; i--)
543 unsigned int c = *(const unsigned char *) block;
544 unsigned int masked_c = (0x7f & c);
550 else if (masked_c <= 040)
551 s = charname[masked_c];
554 sprintf (buf, " %c", masked_c);
558 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
559 block += sizeof (unsigned char);
564 print_ascii (n_bytes, block, unused_fmt_string)
565 long unsigned int n_bytes;
567 const char *unused_fmt_string;
570 for (i = n_bytes; i > 0; i--)
572 unsigned int c = *(const unsigned char *) block;
611 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
612 s = (const char *) buf;
615 printf ("%3s%c", s, (i == 1 ? '\n' : ' '));
616 block += sizeof (unsigned char);
620 /* Convert a null-terminated (possibly zero-length) string S to an
621 unsigned long integer value. If S points to a non-digit set *P to S,
622 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
623 the string of digits. If the string of digits represents a value
624 larger than ULONG_MAX, don't modify *VAL or *P and return non-zero.
625 Otherwise, advance *P to the first non-digit after S, set *VAL to
626 the result of the conversion and return zero. */
629 simple_strtoul (s, p, val)
632 long unsigned int *val;
634 unsigned long int sum;
639 unsigned int c = *s++ - '0';
640 if (sum > (ULONG_MAX - c) / 10)
649 /* If S points to a single valid POSIX-style od format string, put a
650 description of that format in *TSPEC, make *NEXT point at the character
651 following the just-decoded format (if *NEXT is non-NULL), and return
652 zero. If S is not valid, don't modify *NEXT or *TSPEC and return
653 non-zero. For example, if S were "d4afL" *NEXT would be set to "afL"
656 fmt = SIGNED_DECIMAL;
657 size = INT or LONG; (whichever integral_type_size[4] resolves to)
658 print_function = print_int; (assuming size == INT)
659 fmt_string = "%011d%c";
664 decode_one_format (s, next, tspec)
669 enum size_spec size_spec;
670 unsigned long int size;
671 enum output_format fmt;
672 const char *pre_fmt_string;
674 void (*print_function) ();
678 assert (tspec != NULL);
692 size = sizeof (char);
697 size = sizeof (short);
707 size = sizeof (long int);
711 if (simple_strtoul (s, &p, &size) != 0)
717 if (size > MAX_INTEGRAL_TYPE_SIZE
718 || integral_type_size[size] == NO_SIZE)
725 #define FMT_BYTES_ALLOCATED 9
726 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
728 size_spec = integral_type_size[size];
733 fmt = SIGNED_DECIMAL;
734 sprintf (fmt_string, "%%0%u%sd%%c",
735 bytes_to_signed_dec_digits[size],
736 (size_spec == LONG ? "l" : ""));
741 sprintf (fmt_string, "%%0%u%so%%c",
742 bytes_to_oct_digits[size],
743 (size_spec == LONG ? "l" : ""));
747 fmt = UNSIGNED_DECIMAL;
748 sprintf (fmt_string, "%%0%u%su%%c",
749 bytes_to_unsigned_dec_digits[size],
750 (size_spec == LONG ? "l" : ""));
755 sprintf (fmt_string, "%%0%u%sx%%c",
756 bytes_to_hex_digits[size],
757 (size_spec == LONG ? "l" : ""));
764 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
769 print_function = (fmt == SIGNED_DECIMAL
775 print_function = (fmt == SIGNED_DECIMAL
781 print_function = print_int;
785 print_function = print_long;
794 fmt = FLOATING_POINT;
800 size = sizeof (float);
805 size = sizeof (double);
810 size = sizeof (LONG_DOUBLE);
814 if (simple_strtoul (s, &p, &size) != 0)
817 size = sizeof (double);
820 if (size > MAX_FP_TYPE_SIZE
821 || fp_type_size[size] == NO_SIZE)
827 size_spec = fp_type_size[size];
832 print_function = print_float;
833 /* Don't use %#e; not all systems support it. */
834 pre_fmt_string = "%%%d.%de%%c";
835 fmt_string = xmalloc (strlen (pre_fmt_string));
836 sprintf (fmt_string, pre_fmt_string,
837 FLT_DIG + 8, FLT_DIG);
841 print_function = print_double;
842 pre_fmt_string = "%%%d.%de%%c";
843 fmt_string = xmalloc (strlen (pre_fmt_string));
844 sprintf (fmt_string, pre_fmt_string,
845 DBL_DIG + 8, DBL_DIG);
850 print_function = print_long_double;
851 pre_fmt_string = "%%%d.%dle%%c";
852 fmt_string = xmalloc (strlen (pre_fmt_string));
853 sprintf (fmt_string, pre_fmt_string,
854 LDBL_DIG + 8, LDBL_DIG);
865 fmt = NAMED_CHARACTER;
868 print_function = print_named_ascii;
876 print_function = print_ascii;
883 tspec->size = size_spec;
885 tspec->print_function = print_function;
886 tspec->fmt_string = fmt_string;
894 /* Decode the POSIX-style od format string S. Append the decoded
895 representation to the global array SPEC, reallocating SPEC if
896 necessary. Return zero if S is valid, non-zero otherwise. */
899 decode_format_string (s)
909 if (decode_one_format (s, &next, &tspec))
915 if (n_specs >= n_specs_allocated)
917 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
918 spec = (struct tspec *) xrealloc (spec, (n_specs_allocated
919 * sizeof (struct tspec)));
922 bcopy ((char *) &tspec, (char *) &spec[n_specs], sizeof (struct tspec));
929 /* Given a list of one or more input filenames FILE_LIST, set the global
930 file pointer IN_STREAM to position N_SKIP in the concatenation of
931 those files. If any file operation fails or if there are fewer than
932 N_SKIP bytes in the combined input, give an error message and exit.
933 When possible, use seek- rather than read operations to advance
934 IN_STREAM. A file name of "-" is interpreted as standard input. */
938 long unsigned int n_skip;
943 for ( /* empty */ ; *file_list != NULL; ++file_list)
945 struct stat file_stats;
948 if (STREQ (*file_list, "-"))
950 input_filename = "standard input";
956 input_filename = *file_list;
957 in_stream = fopen (input_filename, "r");
958 if (in_stream == NULL)
960 error (0, errno, "%s", input_filename);
969 /* First try using fseek. For large offsets, this extra work is
970 worthwhile. If the offset is below some threshold it may be
971 more efficient to move the pointer by reading. There are two
972 issues when trying to use fseek:
973 - the file must be seekable.
974 - before seeking to the specified position, make sure
975 that the new position is in the current file.
976 Try to do that by getting file's size using stat().
977 But that will work only for regular files and dirs. */
979 if (fstat (fileno (in_stream), &file_stats))
981 error (0, errno, "%s", input_filename);
986 /* The st_size field is valid only for regular files and
987 directories. FIXME: is the preceding true?
988 If the number of bytes left to skip is at least as large as
989 the size of the current file, we can decrement
990 n_skip and go on to the next file. */
991 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
993 if (n_skip >= file_stats.st_size)
995 n_skip -= file_stats.st_size;
996 if (in_stream != stdin && fclose (in_stream))
998 error (0, errno, "%s", input_filename);
1005 if (fseek (in_stream, n_skip, SEEK_SET) == 0)
1013 /* fseek didn't work or wasn't attempted; do it the slow way. */
1015 for (j = n_skip / BUFSIZ; j >= 0; j--)
1018 size_t n_bytes_to_read = (j > 0
1021 size_t n_bytes_read;
1022 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1023 n_skip -= n_bytes_read;
1024 if (n_bytes_read != n_bytes_to_read)
1033 error (2, 0, "cannot skip past end of combined input");
1039 format_address (address)
1040 long unsigned int address;
1042 const char *address_string;
1044 if (output_address_fmt_string == NULL)
1045 address_string = "";
1048 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1049 address_string = address_fmt_buffer;
1051 return address_string;
1054 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1055 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1056 CURR_BLOCK in the concatenation of input files, and it is printed
1057 (optionally) only before the output line associated with the first
1058 format spec. When duplicate blocks are being abbreviated, the output
1059 for a sequence of identical input blocks is the output for the first
1060 block followed by an asterisk alone on a line. It is valid to compare
1061 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1062 That condition may be false only for the last input block -- and then
1063 only when it has not been padded to length BYTES_PER_BLOCK. */
1066 write_block (current_offset, n_bytes, prev_block, curr_block)
1067 long unsigned int current_offset;
1068 long unsigned int n_bytes;
1069 const char *prev_block;
1070 const char *curr_block;
1072 static int first = 1;
1073 static int prev_pair_equal = 0;
1075 #define EQUAL_BLOCKS(b1, b2) (bcmp ((b1), (b2), bytes_per_block) == 0)
1077 if (abbreviate_duplicate_blocks
1078 && !first && n_bytes == bytes_per_block
1079 && EQUAL_BLOCKS (prev_block, curr_block))
1081 if (prev_pair_equal)
1083 /* The two preceding blocks were equal, and the current
1084 block is the same as the last one, so print nothing. */
1089 prev_pair_equal = 1;
1096 prev_pair_equal = 0;
1097 for (i = 0; i < n_specs; i++)
1099 printf ("%s ", (i == 0
1100 ? format_address (current_offset)
1102 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1108 /* Test whether there have been errors on in_stream, and close it if
1109 it is not standard input. Return non-zero if there has been an error
1110 on in_stream or stdout; return zero otherwise. This function will
1111 report more than one error only if both a read and a write error
1120 if (ferror (in_stream))
1122 error (0, errno, "%s", input_filename);
1123 if (in_stream != stdin)
1127 else if (in_stream != stdin && fclose (in_stream) == EOF)
1129 error (0, errno, "%s", input_filename);
1133 if (ferror (stdout))
1135 error (0, errno, "standard output");
1142 /* Read a single byte into *C from the concatenation of the input files
1143 named in the global array FILE_LIST. On the first call to this
1144 function, the global variable IN_STREAM is expected to be an open
1145 stream associated with the input file *FILE_LIST. If IN_STREAM is
1146 at end-of-file, close it and update the global variables IN_STREAM,
1147 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1148 the list. Then try to read a byte from the newly opened file.
1149 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1150 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1151 calls do likewise. The return value is non-zero if any errors
1152 occured, zero otherwise. */
1160 if (*file_list == NULL)
1169 *c = fgetc (in_stream);
1174 err |= check_and_close ();
1179 if (*file_list == NULL)
1182 if (STREQ (*file_list, "-"))
1184 input_filename = "standard input";
1186 have_read_stdin = 1;
1190 input_filename = *file_list;
1191 in_stream = fopen (input_filename, "r");
1192 if (in_stream == NULL)
1194 error (0, errno, "%s", input_filename);
1199 while (in_stream == NULL);
1203 /* Read N bytes into BLOCK from the concatenation of the input files
1204 named in the global array FILE_LIST. On the first call to this
1205 function, the global variable IN_STREAM is expected to be an open
1206 stream associated with the input file *FILE_LIST. On subsequent
1207 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1208 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1209 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1210 Then try to read the remaining bytes from the newly opened file.
1211 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1212 to the number of bytes read. If an error occurs, it will be detected
1213 through ferror when the stream is about to be closed. If there is an
1214 error, give a message but continue reading as usual and return non-zero.
1215 Otherwise return zero. */
1218 read_block (n, block, n_bytes_in_buffer)
1221 size_t *n_bytes_in_buffer;
1225 assert (n > 0 && n <= bytes_per_block);
1227 *n_bytes_in_buffer = 0;
1232 if (*file_list == NULL)
1233 return 0; /* EOF. */
1241 n_needed = n - *n_bytes_in_buffer;
1242 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1244 *n_bytes_in_buffer += n_read;
1246 if (n_read == n_needed)
1249 err |= check_and_close ();
1254 if (*file_list == NULL)
1257 if (STREQ (*file_list, "-"))
1259 input_filename = "standard input";
1261 have_read_stdin = 1;
1265 input_filename = *file_list;
1266 in_stream = fopen (input_filename, "r");
1267 if (in_stream == NULL)
1269 error (0, errno, "%s", input_filename);
1274 while (in_stream == NULL);
1278 /* Return the least common multiple of the sizes associated
1279 with the format specs. */
1287 for (i = 0; i < n_specs; i++)
1288 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1292 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1293 formatted block to standard output, and repeat until the specified
1294 maximum number of bytes has been read or until all input has been
1295 processed. If the last block read is smaller than BYTES_PER_BLOCK
1296 and its size is not a multiple of the size associated with a format
1297 spec, extend the input block with zero bytes until its length is a
1298 multiple of all format spec sizes. Write the final block. Finally,
1299 write on a line by itself the offset of the byte after the last byte
1300 read. Accumulate return values from calls to read_block and
1301 check_and_close, and if any was non-zero, return non-zero.
1302 Otherwise, return zero. */
1308 unsigned long int current_offset;
1311 size_t n_bytes_read;
1314 block[0] = (char *) alloca (bytes_per_block);
1315 block[1] = (char *) alloca (bytes_per_block);
1317 current_offset = n_bytes_to_skip;
1321 if (limit_bytes_to_format)
1323 end_offset = n_bytes_to_skip + max_bytes_to_format;
1326 while (current_offset < end_offset)
1329 n_needed = MIN (end_offset - current_offset, bytes_per_block);
1330 err |= read_block (n_needed, block[idx], &n_bytes_read);
1331 if (n_bytes_read < bytes_per_block)
1333 assert (n_bytes_read == bytes_per_block);
1334 write_block (current_offset, n_bytes_read,
1335 block[!idx], block[idx]);
1336 current_offset += n_bytes_read;
1344 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1345 if (n_bytes_read < bytes_per_block)
1347 assert (n_bytes_read == bytes_per_block);
1348 write_block (current_offset, n_bytes_read,
1349 block[!idx], block[idx]);
1350 current_offset += n_bytes_read;
1355 if (n_bytes_read > 0)
1358 size_t bytes_to_write;
1362 /* Make bytes_to_write the smallest multiple of l_c_m that
1363 is at least as large as n_bytes_read. */
1364 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1366 bzero (block[idx] + n_bytes_read, bytes_to_write - n_bytes_read);
1367 write_block (current_offset, bytes_to_write,
1368 block[!idx], block[idx]);
1369 current_offset += n_bytes_read;
1372 if (output_address_fmt_string != NULL)
1373 printf ("%s\n", format_address (current_offset));
1375 if (limit_bytes_to_format && current_offset > end_offset)
1376 err |= check_and_close ();
1381 /* STRINGS mode. Find each "string constant" in the input.
1382 A string constant is a run of at least `string_min' ASCII
1383 graphic (or formatting) characters terminated by a null.
1384 Based on a function written by Richard Stallman for a
1385 pre-POSIX version of od. Return non-zero if an error
1386 occurs. Otherwise, return zero. */
1391 int bufsize = MAX (100, string_min);
1392 char *buf = xmalloc (bufsize);
1393 unsigned long address = n_bytes_to_skip;
1402 /* See if the next `string_min' chars are all printing chars. */
1405 if (limit_bytes_to_format
1406 && address >= (n_bytes_to_skip + max_bytes_to_format - string_min))
1409 for (i = 0; i < string_min; i++)
1411 err |= read_char (&c);
1419 /* Found a non-printing. Try again starting with next char. */
1424 /* We found a run of `string_min' printable characters.
1425 Now see if it is terminated with a null byte. */
1426 while (!limit_bytes_to_format
1427 || address < n_bytes_to_skip + max_bytes_to_format)
1431 bufsize = 1 + 3 * bufsize / 2;
1432 buf = xrealloc (buf, bufsize);
1434 err |= read_char (&c);
1442 break; /* It is; print this string. */
1444 goto tryline; /* It isn't; give up on this string. */
1445 buf[i++] = c; /* String continues; store it all. */
1448 /* If we get here, the string is all printable and null-terminated,
1449 so print it. It is all in `buf' and `i' is its length. */
1451 if (output_address_fmt_string != NULL)
1453 printf ("%s ", format_address (address - i - 1));
1455 for (i = 0; (c = buf[i]); i++)
1460 fputs ("\\a", stdout);
1464 fputs ("\\b", stdout);
1468 fputs ("\\f", stdout);
1472 fputs ("\\n", stdout);
1476 fputs ("\\r", stdout);
1480 fputs ("\\t", stdout);
1484 fputs ("\\v", stdout);
1494 /* We reach this point only if we search through
1495 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1499 err |= check_and_close ();
1512 unsigned int address_pad_len;
1513 unsigned long int desired_width;
1514 int width_specified = 0;
1517 program_name = argv[0];
1520 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1521 integral_type_size[i] = NO_SIZE;
1523 integral_type_size[sizeof (char)] = CHAR;
1524 integral_type_size[sizeof (short int)] = SHORT;
1525 integral_type_size[sizeof (int)] = INT;
1526 integral_type_size[sizeof (long int)] = LONG;
1528 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1529 fp_type_size[i] = NO_SIZE;
1531 fp_type_size[sizeof (float)] = FP_SINGLE;
1532 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1533 so that if `long double' is the same type or if long double isn't
1534 supported FP_LONG_DOUBLE will never be used. */
1535 fp_type_size[sizeof (LONG_DOUBLE)] = FP_LONG_DOUBLE;
1536 fp_type_size[sizeof (double)] = FP_DOUBLE;
1539 n_specs_allocated = 5;
1540 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1542 output_address_fmt_string = "%07o";
1543 address_pad_len = 7;
1544 flag_dump_strings = 0;
1546 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1547 long_options, (int *) 0))
1550 strtoul_error s_err;
1558 output_address_fmt_string = "%07d";
1559 address_pad_len = 7;
1562 output_address_fmt_string = "%07o";
1563 address_pad_len = 7;
1566 output_address_fmt_string = "%06x";
1567 address_pad_len = 6;
1570 output_address_fmt_string = NULL;
1571 address_pad_len = 0;
1575 "invalid output address radix `%c'; it must be one character from [doxn]",
1582 s_err = my_strtoul (optarg, 0, &n_bytes_to_skip, 1);
1583 if (s_err != UINT_OK)
1584 uint_fatal_error (optarg, "skip argument", s_err);
1588 limit_bytes_to_format = 1;
1590 s_err = my_strtoul (optarg, 0, &max_bytes_to_format, 1);
1591 if (s_err != UINT_OK)
1592 uint_fatal_error (optarg, "limit argument", s_err);
1600 s_err = my_strtoul (optarg, 0, &string_min, 1);
1601 if (s_err != UINT_OK)
1602 uint_fatal_error (optarg, "minimum string length", s_err);
1604 ++flag_dump_strings;
1608 if (decode_format_string (optarg))
1609 error (2, 0, "invalid type string `%s'", optarg);
1613 abbreviate_duplicate_blocks = 0;
1616 /* The next several cases map the old, pre-POSIX format
1617 specification options to the corresponding POSIX format
1618 specs. GNU od accepts any combination of old- and
1619 new-style options. Format specification options accumulate. */
1621 #define CASE_OLD_ARG(old_char,new_string) \
1625 tmp = decode_format_string (new_string); \
1626 assert (tmp == 0); \
1630 CASE_OLD_ARG ('a', "a");
1631 CASE_OLD_ARG ('b', "oC");
1632 CASE_OLD_ARG ('c', "c");
1633 CASE_OLD_ARG ('d', "u2");
1634 CASE_OLD_ARG ('f', "fF");
1635 CASE_OLD_ARG ('h', "x2");
1636 CASE_OLD_ARG ('i', "d2");
1637 CASE_OLD_ARG ('l', "d4");
1638 CASE_OLD_ARG ('o', "o2");
1639 CASE_OLD_ARG ('x', "x2");
1644 width_specified = 1;
1651 s_err = my_strtoul (optarg, 10, &desired_width, 0);
1652 if (s_err != UINT_OK)
1653 error (2, 0, "invalid width specification `%s'", optarg);
1663 if (flag_dump_strings && n_specs > 0)
1664 error (2, 0, "no type may be specified when dumping strings");
1666 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1667 for (i = 0; i < address_pad_len; i++)
1668 address_pad[i] = ' ';
1669 address_pad[address_pad_len] = '\0';
1673 int d_err = decode_one_format ("o2", NULL, &(spec[0]));
1675 assert (d_err == 0);
1679 n_files = argc - optind;
1681 file_list = (char const *const *) &argv[optind];
1684 /* If no files were listed on the command line, set up the
1685 global array FILE_LIST so that it contains the null-terminated
1686 list of one name: "-". */
1687 static char const *const default_file_list[] = {"-", NULL};
1689 file_list = default_file_list;
1692 err |= skip (n_bytes_to_skip);
1694 /* Compute output block length. */
1697 if (width_specified)
1699 if (desired_width != 0 && desired_width % l_c_m == 0)
1700 bytes_per_block = desired_width;
1703 error (0, 0, "warning: invalid width %d; using %d instead",
1704 desired_width, l_c_m);
1705 bytes_per_block = l_c_m;
1710 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1711 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1713 bytes_per_block = l_c_m;
1717 for (i = 0; i < n_specs; i++)
1719 printf ("%d: fmt=\"%s\" width=%d\n",
1720 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1724 err |= (flag_dump_strings ? dump_strings () : dump ());
1726 if (have_read_stdin && fclose (stdin) == EOF)
1727 error (2, errno, "standard input");
1729 if (fclose (stdout) == EOF)
1730 error (2, errno, "write error");