1 /* od -- dump in octal (and other formats) the contents of files
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__ */
39 #include <sys/types.h>
42 #if defined(__GNUC__) || defined(STDC_HEADERS)
47 typedef long double LONG_DOUBLE;
49 typedef double LONG_DOUBLE;
59 #define SHRT_MAX 32767
62 #define ULONG_MAX ((unsigned long) ~(unsigned long) 0)
65 #define STREQ(a,b) (strcmp((a), (b)) == 0)
68 #define MAX(a, b) ((a) > (b) ? (a) : (b))
72 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
75 /* The default number of input bytes per output line. */
76 #define DEFAULT_BYTES_PER_BLOCK 16
78 /* The number of decimal digits of precision in a float. */
83 /* The number of decimal digits of precision in a double. */
88 /* The number of decimal digits of precision in a long double. */
90 #define LDBL_DIG DBL_DIG
122 UINT_OK, UINT_INVALID, UINT_INVALID_SUFFIX_CHAR, UINT_OVERFLOW
124 typedef enum strtoul_error strtoul_error;
126 /* Each output format specification (from POSIX `-t spec' or from
127 old-style options) is represented by one of these structures. */
130 enum output_format fmt;
132 void (*print_function) ();
136 /* Convert the number of 8-bit bytes of a binary representation to
137 the number of characters (digits + sign if the type is signed)
138 required to represent the same quantity in the specified base/type.
139 For example, a 32-bit (4-byte) quantity may require a field width
140 as wide as the following for these types:
144 8 unsigned hexadecimal */
146 static const unsigned int bytes_to_oct_digits[] =
147 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
149 static const unsigned int bytes_to_signed_dec_digits[] =
150 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
152 static const unsigned int bytes_to_unsigned_dec_digits[] =
153 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
155 static const unsigned int bytes_to_hex_digits[] =
156 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
158 /* Convert enum size_spec to the size of the named type. */
159 static const int width_bytes[] =
171 /* Names for some non-printing characters. */
172 static const char *const charname[33] =
174 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
175 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
176 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
177 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
181 /* A printf control string for printing a file offset. */
182 static const char *output_address_fmt_string;
184 /* FIXME: make this the number of octal digits in an unsigned long. */
185 #define MAX_ADDRESS_LENGTH 13
186 static char address_fmt_buffer[MAX_ADDRESS_LENGTH + 1];
187 static char address_pad[MAX_ADDRESS_LENGTH + 1];
189 static unsigned long int string_min;
190 static unsigned long int flag_dump_strings;
192 /* The number of input bytes to skip before formatting and writing. */
193 static unsigned long int n_bytes_to_skip = 0;
195 /* When non-zero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
196 to be read and formatted. Otherwise all input is formatted. */
197 static int limit_bytes_to_format = 0;
199 /* The maximum number of bytes that will be formatted. This
200 value is used only when LIMIT_BYTES_TO_FORMAT is non-zero. */
201 static unsigned long int max_bytes_to_format;
203 /* When non-zero and two or more consecutive blocks are equal, format
204 only the first block and output an asterisk alone on the following
205 line to indicate that identical blocks have been elided. */
206 static int abbreviate_duplicate_blocks = 1;
208 /* An array of specs describing how to format each input block. */
209 static struct tspec *spec;
211 /* The number of format specs. */
212 static unsigned int n_specs;
214 /* The allocated length of SPEC. */
215 static unsigned int n_specs_allocated;
217 /* The number of input bytes formatted per output line. It must be
218 a multiple of the least common multiple of the sizes associated with
219 the specified output types. It should be as large as possible, but
220 no larger than 16 -- unless specified with the -w option. */
221 static unsigned int bytes_per_block;
223 /* Human-readable representation of *file_list (for error messages).
224 It differs from *file_list only when *file_list is "-". */
225 static char const *input_filename;
227 /* A NULL-terminated list of the file-arguments from the command line.
228 If no file-arguments were specified, this variable is initialized
230 static char const *const *file_list;
232 /* The input stream associated with the current file. */
233 static FILE *in_stream;
235 #define LONGEST_INTEGRAL_TYPE long int
237 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
238 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
240 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
241 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
243 static struct option long_options[] =
246 {"skip-bytes", 1, NULL, 'j'},
247 {"address-radix", 1, NULL, 'A'},
248 {"read-bytes", 1, NULL, 'N'},
249 {"format", 1, NULL, 't'},
250 {"output-duplicates", 0, NULL, 'v'},
252 /* non-POSIX options. */
253 {"strings", 2, NULL, 's'},
254 {"width", 2, NULL, 'w'},
258 /* The name this program was run with. */
265 Usage: %s [-abcdfhiloxv] [-s[bytes]] [-w[bytes]] [-A radix] [-j bytes]\n\
266 [-N bytes] [-t type] [--skip-bytes=bytes] [--address-radix=radix]\n\
267 [--read-bytes=bytes] [--format=type] [--output-duplicates]\n\
268 [--strings[=bytes]] [--width[=bytes]] [file...]\n",
273 /* Compute the greatest common denominator of U and V
274 using Euclid's algorithm. */
291 /* Compute the least common multiple of U and V. */
298 unsigned int t = gcd (u, v);
305 my_strtoul (s, base, val, allow_bkm_suffix)
308 long unsigned int *val;
309 int allow_bkm_suffix;
312 unsigned long int tmp;
314 assert (0 <= base && base <= 36);
316 tmp = strtoul (s, &p, base);
318 return UINT_OVERFLOW;
321 if (!allow_bkm_suffix)
329 return UINT_INVALID_SUFFIX_CHAR;
337 #define BKM_SCALE(x,scale_factor) \
340 if (x > (double) ULONG_MAX / scale_factor) \
341 return UINT_OVERFLOW; \
347 BKM_SCALE (tmp, 512);
351 BKM_SCALE (tmp, 1024);
355 BKM_SCALE (tmp, 1024 * 1024);
359 return UINT_INVALID_SUFFIX_CHAR;
368 uint_fatal_error (str, argument_type_string, err)
370 const char *argument_type_string;
379 error (2, 0, "invalid %s `%s'", argument_type_string, str);
382 case UINT_INVALID_SUFFIX_CHAR:
383 error (2, 0, "invalid character following %s `%s'",
384 argument_type_string, str);
388 error (2, 0, "%s `%s' larger than maximum unsigned long",
389 argument_type_string, str);
395 print_s_char (n_bytes, block, fmt_string)
396 long unsigned int n_bytes;
398 const char *fmt_string;
402 for (i = n_bytes; i > 0; i--)
404 int tmp = (unsigned) *(unsigned char *) block;
406 tmp = (SCHAR_MAX - tmp);
407 assert (tmp <= SCHAR_MAX);
408 err |= (printf (fmt_string, tmp, (i == 1 ? '\n' : ' ')) == EOF);
409 block += sizeof (unsigned char);
412 error (2, errno, "standard output");
416 print_char (n_bytes, block, fmt_string)
417 long unsigned int n_bytes;
419 const char *fmt_string;
423 for (i = n_bytes; i > 0; i--)
425 unsigned int tmp = *(unsigned char *) block;
426 err |= (printf (fmt_string, tmp, (i == 1 ? '\n' : ' ')) == EOF);
427 block += sizeof (unsigned char);
430 error (2, errno, "standard output");
434 print_s_short (n_bytes, block, fmt_string)
435 long unsigned int n_bytes;
437 const char *fmt_string;
441 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
443 int tmp = (unsigned) *(unsigned short *) block;
445 tmp = (SHRT_MAX - tmp);
446 assert (tmp <= SHRT_MAX);
447 err |= (printf (fmt_string, tmp, (i == 1 ? '\n' : ' ')) == EOF);
448 block += sizeof (unsigned short);
451 error (2, errno, "standard output");
455 print_short (n_bytes, block, fmt_string)
456 long unsigned int n_bytes;
458 const char *fmt_string;
462 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
464 unsigned int tmp = *(unsigned short *) block;
465 err |= (printf (fmt_string, tmp, (i == 1 ? '\n' : ' ')) == EOF);
466 block += sizeof (unsigned short);
469 error (2, errno, "standard output");
473 print_int (n_bytes, block, fmt_string)
474 long unsigned int n_bytes;
476 const char *fmt_string;
480 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
482 unsigned int tmp = *(unsigned int *) block;
483 err |= (printf (fmt_string, tmp, (i == 1 ? '\n' : ' ')) == EOF);
484 block += sizeof (unsigned int);
487 error (2, errno, "standard output");
491 print_long (n_bytes, block, fmt_string)
492 long unsigned int n_bytes;
494 const char *fmt_string;
498 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
500 unsigned long tmp = *(unsigned long *) block;
501 err |= (printf (fmt_string, tmp, (i == 1 ? '\n' : ' ')) == EOF);
502 block += sizeof (unsigned long);
505 error (2, errno, "standard output");
509 print_float (n_bytes, block, fmt_string)
510 long unsigned int n_bytes;
512 const char *fmt_string;
516 for (i = n_bytes / sizeof (float); i > 0; i--)
518 float tmp = *(float *) block;
519 err |= (printf (fmt_string, tmp, (i == 1 ? '\n' : ' ')) == EOF);
520 block += sizeof (float);
523 error (2, errno, "standard output");
527 print_double (n_bytes, block, fmt_string)
528 long unsigned int n_bytes;
530 const char *fmt_string;
534 for (i = n_bytes / sizeof (double); i > 0; i--)
536 double tmp = *(double *) block;
537 err |= (printf (fmt_string, tmp, (i == 1 ? '\n' : ' ')) == EOF);
538 block += sizeof (double);
541 error (2, errno, "standard output");
546 print_long_double (n_bytes, block, fmt_string)
547 long unsigned int n_bytes;
549 const char *fmt_string;
553 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
555 LONG_DOUBLE tmp = *(LONG_DOUBLE *) block;
556 err |= (printf (fmt_string, tmp, (i == 1 ? '\n' : ' ')) == EOF);
557 block += sizeof (LONG_DOUBLE);
560 error (2, errno, "standard output");
566 print_named_ascii (n_bytes, block, unused_fmt_string)
567 long unsigned int n_bytes;
569 const char *unused_fmt_string;
572 for (i = n_bytes; i > 0; i--)
574 unsigned int c = *(unsigned char *) block;
575 unsigned int masked_c = (0x7f & c);
581 else if (masked_c <= 040)
582 s = charname[masked_c];
585 sprintf (buf, " %c", masked_c);
589 if (printf ("%3s%c", s, (i == 1 ? '\n' : ' ')) == EOF)
590 error (2, errno, "standard output");
591 block += sizeof (unsigned char);
596 print_ascii (n_bytes, block, unused_fmt_string)
597 long unsigned int n_bytes;
599 const char *unused_fmt_string;
602 for (i = n_bytes; i > 0; i--)
604 unsigned int c = *(unsigned char *) block;
643 sprintf (buf, (isprint (c) ? " %c" : "%03o"), c);
644 s = (const char *) buf;
647 if (printf ("%3s%c", s, (i == 1 ? '\n' : ' ')) == EOF)
648 error (2, errno, "standard output");
649 block += sizeof (unsigned char);
653 /* Convert a null-terminated (possibly zero-length) string S to an
654 unsigned long integer value. If S points to a non-digit set *P to S,
655 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
656 the string of digits. If the string of digits represents a value
657 larger than ULONG_MAX, don't modify *VAL or *P and return non-zero.
658 Otherwise, advance *P to the first non-digit after S, set *VAL to
659 the result of the conversion and return zero. */
662 simple_strtoul (s, p, val)
665 long unsigned int *val;
667 unsigned long int sum;
672 unsigned int c = *s++ - '0';
673 if (sum > (ULONG_MAX - c) / 10)
682 /* If S points to a single valid POSIX-style od format string, put a
683 description of that format in *TSPEC, make *NEXT point at the character
684 following the just-decoded format (if *NEXT is non-NULL), and return
685 zero. If S is not valid, don't modify *NEXT or *TSPEC and return
686 non-zero. For example, if S were "d4afL" *NEXT would be set to "afL"
689 fmt = SIGNED_DECIMAL;
690 size = INT or LONG; (whichever integral_type_size[4] resolves to)
691 print_function = print_int; (assuming size == INT)
692 fmt_string = "%011d%c";
697 decode_one_format (s, next, tspec)
702 enum size_spec size_spec;
703 unsigned long int size;
704 enum output_format fmt;
705 const char *pre_fmt_string;
707 void (*print_function) ();
711 assert (tspec != NULL);
725 size = sizeof (char);
730 size = sizeof (short);
740 size = sizeof (long int);
744 if (simple_strtoul (s, &p, &size) != 0)
750 if (size > MAX_INTEGRAL_TYPE_SIZE
751 || integral_type_size[size] == NO_SIZE)
758 #define FMT_BYTES_ALLOCATED 9
759 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
761 size_spec = integral_type_size[size];
766 fmt = SIGNED_DECIMAL;
767 sprintf (fmt_string, "%%0%u%sd%%c",
768 bytes_to_signed_dec_digits[size],
769 (size_spec == LONG ? "l" : ""));
774 sprintf (fmt_string, "%%0%u%so%%c",
775 bytes_to_oct_digits[size],
776 (size_spec == LONG ? "l" : ""));
780 fmt = UNSIGNED_DECIMAL;
781 sprintf (fmt_string, "%%0%u%su%%c",
782 bytes_to_unsigned_dec_digits[size],
783 (size_spec == LONG ? "l" : ""));
788 sprintf (fmt_string, "%%0%u%sx%%c",
789 bytes_to_hex_digits[size],
790 (size_spec == LONG ? "l" : ""));
797 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
802 print_function = (fmt == SIGNED_DECIMAL
808 print_function = (fmt == SIGNED_DECIMAL
814 print_function = print_int;
818 print_function = print_long;
827 fmt = FLOATING_POINT;
833 size = sizeof (float);
838 size = sizeof (double);
843 size = sizeof (LONG_DOUBLE);
847 if (simple_strtoul (s, &p, &size) != 0)
850 size = sizeof (double);
853 if (size > MAX_FP_TYPE_SIZE
854 || fp_type_size[size] == NO_SIZE)
860 size_spec = fp_type_size[size];
865 print_function = print_float;
866 pre_fmt_string = "%%%d.%d#e%%c";
867 fmt_string = xmalloc (strlen (pre_fmt_string));
868 sprintf (fmt_string, pre_fmt_string,
869 FLT_DIG + 8, FLT_DIG);
873 print_function = print_double;
874 pre_fmt_string = "%%%d.%d#e%%c";
875 fmt_string = xmalloc (strlen (pre_fmt_string));
876 sprintf (fmt_string, pre_fmt_string,
877 DBL_DIG + 8, DBL_DIG);
882 print_function = print_long_double;
883 pre_fmt_string = "%%%d.%d#le%%c";
884 fmt_string = xmalloc (strlen (pre_fmt_string));
885 sprintf (fmt_string, pre_fmt_string,
886 LDBL_DIG + 8, LDBL_DIG);
897 fmt = NAMED_CHARACTER;
900 print_function = print_named_ascii;
908 print_function = print_ascii;
915 tspec->size = size_spec;
917 tspec->print_function = print_function;
918 tspec->fmt_string = fmt_string;
926 /* Decode the POSIX-style od format string S. Append the decoded
927 representation to the global array SPEC, reallocating SPEC if
928 necessary. Return zero if S is valid, non-zero otherwise. */
931 decode_format_string (s)
941 if (decode_one_format (s, &next, &tspec))
947 if (n_specs >= n_specs_allocated)
949 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
950 spec = (struct tspec *) xrealloc (spec, (n_specs_allocated
951 * sizeof (struct tspec)));
954 bcopy ((char *) &tspec, (char *) &spec[n_specs], sizeof (struct tspec));
961 /* Given a list of one or more input filenames FILE_LIST, set the global
962 file pointer IN_STREAM to position N_SKIP in the concatenation of
963 those files. If any file operation fails or if there are fewer than
964 N_SKIP bytes in the combined input, give an error message and exit.
965 When possible, use seek- rather than read operations to advance
966 IN_STREAM. A file name of "-" is interpreted as standard input. */
970 long unsigned int n_skip;
972 for ( /*empty */ ; *file_list != NULL; ++file_list)
974 struct stat file_stats;
977 if (STREQ (*file_list, "-"))
979 input_filename = "standard input";
984 input_filename = *file_list;
985 in_stream = fopen (input_filename, "r");
986 if (in_stream == NULL)
987 error (2, errno, "%s", input_filename);
993 /* First try using fseek. For large offsets, all this work is
994 worthwhile. If the offset is below some threshold it may be
995 more efficient to move the pointer by reading. There are two
996 issues when trying to use fseek:
997 - the file must be seekable.
998 - before seeking to the specified position, make sure
999 that the new position is in the current file.
1000 Try to do that by getting file's size using stat().
1001 But that will work only for regular files and dirs. */
1003 if (fstat (fileno (in_stream), &file_stats))
1004 error (2, errno, "%s", input_filename);
1006 /* The st_size field is valid only for regular files and
1007 directories. FIXME: is the preceding true?
1008 If the number of bytes left to skip is at least as large as
1009 the size of the current file, we can decrement
1010 n_skip and go on to the next file. */
1011 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
1013 if (n_skip >= file_stats.st_size)
1015 n_skip -= file_stats.st_size;
1016 if (in_stream != stdin)
1018 if (fclose (in_stream))
1019 error (2, errno, "%s", input_filename);
1025 if (fseek (in_stream, n_skip, SEEK_SET) == 0)
1033 /* fseek didn't work or wasn't attempted; do it the slow way. */
1035 for (j = n_skip / BUFSIZ; j >= 0; j--)
1038 size_t n_bytes_to_read = (j > 0
1041 size_t n_bytes_read;
1042 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1043 n_skip -= n_bytes_read;
1044 if (n_bytes_read != n_bytes_to_read)
1046 if (ferror (in_stream))
1047 error (2, errno, "%s", input_filename);
1058 error (2, 0, "cannot skip past end of combined input");
1062 format_address (address)
1063 long unsigned int address;
1065 const char *address_string;
1067 if (output_address_fmt_string == NULL)
1068 address_string = "";
1071 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1072 address_string = address_fmt_buffer;
1074 return address_string;
1077 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1078 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1079 CURR_BLOCK in the concatenation of input files, and it is printed
1080 (optionally) only before the output line associated with the first
1081 format spec. When duplicate blocks are being abbreviated, the output
1082 for a sequence of identical input blocks is the output for the first
1083 block followed by an asterisk alone on a line. It is valid to compare
1084 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1085 That condition may be false only for the last input block -- and then
1086 only when it has not been padded to length BYTES_PER_BLOCK. */
1089 write_block (current_offset, n_bytes, prev_block, curr_block)
1090 long unsigned int current_offset;
1091 long unsigned int n_bytes;
1092 const char *prev_block;
1093 const char *curr_block;
1095 static int first = 1;
1096 static int prev_pair_equal = 0;
1098 #define EQUAL_BLOCKS(b1, b2) (bcmp ((b1), (b2), bytes_per_block) == 0)
1100 if (abbreviate_duplicate_blocks
1101 && !first && n_bytes == bytes_per_block
1102 && EQUAL_BLOCKS (prev_block, curr_block))
1104 if (prev_pair_equal)
1106 /* The two preceding blocks were equal, and the current
1107 block is the same as the last one, so print nothing. */
1112 prev_pair_equal = 1;
1119 prev_pair_equal = 0;
1120 for (i = 0; i < n_specs; i++)
1122 if (printf ("%s ", (i == 0
1123 ? format_address (current_offset)
1126 error (2, errno, "standard output");
1127 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1133 /* Read and return a single byte from the concatenation of the input
1134 files named in the global array FILE_LIST. On the first call to this
1135 function, the global variable IN_STREAM is expected to be an open
1136 stream associated with the input file *FILE_LIST. If IN_STREAM is
1137 at end-of-file, close it and update the global variables IN_STREAM,
1138 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1139 the list. Then try to read a byte from the newly opened file.
1140 Repeat if necessary until *FILE_LIST is NULL. Upon any read-, open-,
1141 or close error give a message and exit. When EOF is reached for the
1142 last file in FILE_LIST, return EOF. Any subsequent calls return EOF. */
1147 if (*file_list == NULL)
1154 c = fgetc (in_stream);
1160 error (2, errno, "%s", input_filename);
1162 if (in_stream != stdin)
1163 if (fclose (in_stream) == EOF)
1164 error (2, errno, "%s", input_filename);
1167 if (*file_list == NULL)
1170 if (STREQ (*file_list, "-"))
1172 input_filename = "standard input";
1177 input_filename = *file_list;
1178 in_stream = fopen (input_filename, "r");
1179 if (in_stream == NULL)
1180 error (2, errno, "%s", input_filename);
1185 /* Read N bytes into BLOCK from the concatenation of the input files
1186 named in the global array FILE_LIST. On the first call to this
1187 function, the global variable IN_STREAM is expected to be an open
1188 stream associated with the input file *FILE_LIST. On subsequent
1189 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1190 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1191 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1192 Then try to read the remaining bytes from the newly opened file.
1193 Repeat if necessary until *FILE_LIST is NULL. Upon any read-, open-,
1194 or close error give a message and exit. Otherwise, return the number
1197 static unsigned long int
1198 read_block (n, block)
1202 unsigned long int n_bytes_in_buffer;
1204 assert (n > 0 && n <= bytes_per_block);
1208 n_bytes_in_buffer = 0;
1210 if (*file_list == NULL)
1211 return 0; /* EOF. */
1218 n_needed = n - n_bytes_in_buffer;
1219 n_read = fread (block + n_bytes_in_buffer, 1, n_needed, in_stream);
1221 if (ferror (in_stream))
1222 error (2, errno, "%s", input_filename);
1224 if (n_read == n_needed)
1227 n_bytes_in_buffer += n_read;
1229 if (in_stream != stdin)
1230 if (fclose (in_stream) == EOF)
1231 error (2, errno, "%s", input_filename);
1234 if (*file_list == NULL)
1235 return n_bytes_in_buffer;
1237 if (STREQ (*file_list, "-"))
1239 input_filename = "standard input";
1244 input_filename = *file_list;
1245 in_stream = fopen (input_filename, "r");
1246 if (in_stream == NULL)
1247 error (2, errno, "%s", input_filename);
1252 /* Return the least common multiple of the sizes associated
1253 with the format specs. */
1261 for (i = 0; i < n_specs; i++)
1262 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1266 /* Read chunks of size BYTES_PER_BLOCK from the input files, write the
1267 formatted block to standard output, and repeat until the specified
1268 maximum number of bytes has been read or until all input has been
1269 processed. If the last block read is smaller than BYTES_PER_BLOCK
1270 and its size is not a multiple of the size associated with a format
1271 spec, extend the input block with zero bytes until its length is a
1272 multiple of all format spec sizes. Write the final block. Finally,
1273 write on a line by itself the offset of the byte after the last byte
1280 unsigned long int current_offset;
1282 size_t n_bytes_read;
1284 block[0] = (char *) alloca (bytes_per_block);
1285 block[1] = (char *) alloca (bytes_per_block);
1287 current_offset = n_bytes_to_skip;
1289 if (limit_bytes_to_format)
1291 size_t end_offset = n_bytes_to_skip + max_bytes_to_format;
1294 while (current_offset < end_offset)
1297 n_needed = MIN (end_offset - current_offset, bytes_per_block);
1298 n_bytes_read = read_block (n_needed, block[idx]);
1299 if (n_bytes_read < bytes_per_block)
1301 assert (n_bytes_read == bytes_per_block);
1302 write_block (current_offset, n_bytes_read,
1303 block[!idx], block[idx]);
1304 current_offset += n_bytes_read;
1312 n_bytes_read = read_block (bytes_per_block, block[idx]);
1313 if (n_bytes_read < bytes_per_block)
1315 assert (n_bytes_read == bytes_per_block);
1316 write_block (current_offset, n_bytes_read,
1317 block[!idx], block[idx]);
1318 current_offset += n_bytes_read;
1323 if (n_bytes_read > 0)
1326 size_t bytes_to_write;
1330 /* Make bytes_to_write the smallest multiple of l_c_m that
1331 is at least as large as n_bytes_read. */
1332 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1334 bzero (block[idx] + n_bytes_read, bytes_to_write - n_bytes_read);
1335 write_block (current_offset, bytes_to_write,
1336 block[!idx], block[idx]);
1337 current_offset += n_bytes_read;
1340 if (output_address_fmt_string != NULL)
1342 if (printf ("%s\n", format_address (current_offset)) == EOF)
1343 error (2, errno, "standard output");
1347 /* STRINGS mode. Find each "string constant" in the file.
1348 A string constant is a run of at least `string_min' ASCII graphic
1349 (or formatting) characters terminated by a null. Based on a
1350 function written by Richard Stallman for a pre-POSIX
1356 int bufsize = MAX (100, string_min);
1357 char *buf = xmalloc (bufsize);
1358 unsigned long address = n_bytes_to_skip;
1365 /* See if the next `string_min' chars are all printing chars. */
1368 if (limit_bytes_to_format
1369 && address >= (n_bytes_to_skip + max_bytes_to_format - string_min))
1372 for (i = 0; i < string_min; i++)
1379 /* Found a non-printing. Try again starting with next char. */
1384 /* We found a run of `string_min' printable characters.
1385 Now see if it is terminated with a null byte. */
1386 while (!limit_bytes_to_format
1387 || address < n_bytes_to_skip + max_bytes_to_format)
1391 bufsize = 1 + 3 * bufsize / 2;
1392 buf = xrealloc (buf, bufsize);
1399 break; /* It is; print this string. */
1401 goto tryline; /* It isn't; give up on this string. */
1402 buf[i++] = c; /* String continues; store it all. */
1405 /* If we get here, the string is all printable and null-terminated,
1406 so print it. It is all in `buf' and `i' is its length. */
1408 if (output_address_fmt_string != NULL)
1410 if (printf ("%s ", format_address (address - i - 1)) == EOF)
1411 error (2, errno, "standard output");
1413 for (i = 0; (c = buf[i]); i++)
1419 err = fputs ("\\a", stdout);
1423 err = fputs ("\\b", stdout);
1427 err = fputs ("\\f", stdout);
1431 err = fputs ("\\n", stdout);
1435 err = fputs ("\\r", stdout);
1439 err = fputs ("\\t", stdout);
1443 err = fputs ("\\v", stdout);
1450 error (2, errno, "standard output");
1452 if (putchar ('\n') == EOF)
1453 error (2, errno, "standard output");
1467 unsigned int address_pad_len;
1468 unsigned long int desired_width;
1469 int width_specified = 0;
1471 program_name = argv[0];
1473 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1474 integral_type_size[i] = NO_SIZE;
1476 integral_type_size[sizeof (char)] = CHAR;
1477 integral_type_size[sizeof (short int)] = SHORT;
1478 integral_type_size[sizeof (int)] = INT;
1479 integral_type_size[sizeof (long int)] = LONG;
1481 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1482 fp_type_size[i] = NO_SIZE;
1484 fp_type_size[sizeof (float)] = FP_SINGLE;
1485 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1486 so that if `long double' is the same type or if long double isn't
1487 supported FP_LONG_DOUBLE will never be used. */
1488 fp_type_size[sizeof (LONG_DOUBLE)] = FP_LONG_DOUBLE;
1489 fp_type_size[sizeof (double)] = FP_DOUBLE;
1492 n_specs_allocated = 5;
1493 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1495 output_address_fmt_string = "%07o";
1496 address_pad_len = 7;
1497 flag_dump_strings = 0;
1499 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1500 long_options, (int *) 0))
1511 output_address_fmt_string = "%07d";
1512 address_pad_len = 7;
1515 output_address_fmt_string = "%07o";
1516 address_pad_len = 7;
1519 output_address_fmt_string = "%06x";
1520 address_pad_len = 6;
1523 output_address_fmt_string = NULL;
1524 address_pad_len = 0;
1528 "invalid output address radix `%c'; it must be one character from [doxn]",
1535 err = my_strtoul (optarg, 0, &n_bytes_to_skip, 1);
1537 uint_fatal_error (optarg, "skip argument", err);
1541 limit_bytes_to_format = 1;
1543 err = my_strtoul (optarg, 0, &max_bytes_to_format, 1);
1545 uint_fatal_error (optarg, "limit argument", err);
1553 err = my_strtoul (optarg, 0, &string_min, 1);
1555 uint_fatal_error (optarg, "minimum string length", err);
1557 ++flag_dump_strings;
1561 if (decode_format_string (optarg))
1562 error (2, 0, "invalid type string `%s'", optarg);
1566 abbreviate_duplicate_blocks = 0;
1569 /* The next several cases map the old, pre-POSIX format
1570 specification options to the corresponding POSIX format
1571 specs. GNU od accepts any combination of old- and
1572 new-style options. If only POSIX format specs are used
1573 and more than one is used, they are accumulated. If only
1574 old-style options are used, all but the last are ignored.
1575 If both types of specs are used in the same command, the
1576 last old-style option and any POSIX specs following it
1577 are accumulated. To illustrate, `od -c -t a' is the same
1578 as `od -t ca', but `od -t a -c' is the same as `od -c'. */
1580 #define CASE_OLD_ARG(old_char,new_string) \
1585 assert (n_specs_allocated >= 1); \
1586 tmp = decode_one_format (new_string, &next, &(spec[0])); \
1588 assert (tmp == 0); \
1589 assert (*next == '\0'); \
1593 CASE_OLD_ARG ('a', "a");
1594 CASE_OLD_ARG ('b', "oC");
1595 CASE_OLD_ARG ('c', "c");
1596 CASE_OLD_ARG ('d', "u2");
1597 CASE_OLD_ARG ('f', "fF");
1598 CASE_OLD_ARG ('h', "x2");
1599 CASE_OLD_ARG ('i', "d2");
1600 CASE_OLD_ARG ('l', "d4");
1601 CASE_OLD_ARG ('o', "o2");
1602 CASE_OLD_ARG ('x', "x2");
1607 width_specified = 1;
1614 err = my_strtoul (optarg, 10, &desired_width, 0);
1616 error (2, 0, "invalid width specification `%s'", optarg);
1626 if (flag_dump_strings && n_specs > 0)
1627 error (2, 0, "no type may be specified when dumping strings");
1629 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1630 for (i = 0; i < address_pad_len; i++)
1631 address_pad[i] = ' ';
1632 address_pad[address_pad_len] = '\0';
1636 int err = decode_one_format ("o2", NULL, &(spec[0]));
1642 n_files = argc - optind;
1644 file_list = (char const *const *) &argv[optind];
1647 /* If no files were listed on the command line, set up the
1648 global array FILE_LIST so that it contains the null-terminated
1649 list of one name: "-". */
1650 static char const * const default_file_list[] = {"-", NULL};
1652 file_list = default_file_list;
1655 skip (n_bytes_to_skip);
1657 /* Compute output block length. */
1660 if (width_specified)
1662 if (desired_width != 0 && desired_width % l_c_m == 0)
1663 bytes_per_block = desired_width;
1666 error (0, 0, "warning: invalid width %d; using %d instead",
1667 desired_width, l_c_m);
1668 bytes_per_block = l_c_m;
1673 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1674 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1676 bytes_per_block = l_c_m;
1680 for (i = 0; i < n_specs; i++)
1682 printf ("%d: fmt=\"%s\" width=%d\n",
1683 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1687 if (flag_dump_strings)