1 /* od -- dump files in octal and other formats
2 Copyright (C) 92, 1995-2005 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
18 /* Written by Jim Meyering. */
25 #include <sys/types.h>
31 /* The official name of this program (e.g., no `g' prefix). */
32 #define PROGRAM_NAME "od"
34 #define AUTHORS "Jim Meyering"
38 #ifdef HAVE_LONG_DOUBLE
39 typedef long double LONG_DOUBLE;
41 typedef double LONG_DOUBLE;
44 /* The default number of input bytes per output line. */
45 #define DEFAULT_BYTES_PER_BLOCK 16
47 /* The number of decimal digits of precision in a float. */
52 /* The number of decimal digits of precision in a double. */
57 /* The number of decimal digits of precision in a long double. */
59 # define LDBL_DIG DBL_DIG
62 #if HAVE_UNSIGNED_LONG_LONG
63 typedef unsigned long long int unsigned_long_long_int;
65 /* This is just a place-holder to avoid a few `#if' directives.
66 In this case, the type isn't actually used. */
67 typedef unsigned long int unsigned_long_long_int;
78 /* FIXME: add INTMAX support, too */
96 /* The maximum number of bytes needed for a format string,
97 including the trailing null. */
100 FMT_BYTES_ALLOCATED =
101 MAX ((sizeof " %0" - 1 + INT_STRLEN_BOUND (int)
107 sizeof " %.Le" + 2 * INT_STRLEN_BOUND (int))
110 /* Each output format specification (from `-t spec' or from
111 old-style options) is represented by one of these structures. */
114 enum output_format fmt;
116 void (*print_function) (size_t, void const *, char const *);
117 char fmt_string[FMT_BYTES_ALLOCATED];
118 bool hexl_mode_trailer;
122 /* The name this program was run with. */
125 /* Convert the number of 8-bit bytes of a binary representation to
126 the number of characters (digits + sign if the type is signed)
127 required to represent the same quantity in the specified base/type.
128 For example, a 32-bit (4-byte) quantity may require a field width
129 as wide as the following for these types:
133 8 unsigned hexadecimal */
135 static unsigned int const bytes_to_oct_digits[] =
136 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
138 static unsigned int const bytes_to_signed_dec_digits[] =
139 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
141 static unsigned int const bytes_to_unsigned_dec_digits[] =
142 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
144 static unsigned int const bytes_to_hex_digits[] =
145 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
147 #define MAX_INTEGRAL_TYPE_SIZE sizeof (unsigned_long_long_int)
149 /* It'll be a while before we see integral types wider than 16 bytes,
150 but if/when it happens, this check will catch it. Without this check,
151 a wider type would provoke a buffer overrun. */
152 verify (MAX_INTEGRAL_TYPE_SIZE
153 < sizeof bytes_to_hex_digits / sizeof *bytes_to_hex_digits);
155 /* Make sure the other arrays have the same length. */
156 verify (sizeof bytes_to_oct_digits == sizeof bytes_to_signed_dec_digits);
157 verify (sizeof bytes_to_oct_digits == sizeof bytes_to_unsigned_dec_digits);
158 verify (sizeof bytes_to_oct_digits == sizeof bytes_to_hex_digits);
160 /* Convert enum size_spec to the size of the named type. */
161 static const int width_bytes[] =
168 sizeof (unsigned_long_long_int),
174 /* Ensure that for each member of `enum size_spec' there is an
175 initializer in the width_bytes array. */
176 verify (sizeof width_bytes / sizeof width_bytes[0] == N_SIZE_SPECS);
178 /* Names for some non-printing characters. */
179 static const char *const charname[33] =
181 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
182 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
183 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
184 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
188 /* Address base (8, 10 or 16). */
189 static int address_base;
191 /* The number of octal digits required to represent the largest
193 #define MAX_ADDRESS_LENGTH \
194 ((sizeof (uintmax_t) * CHAR_BIT + CHAR_BIT - 1) / 3)
196 /* Width of a normal address. */
197 static int address_pad_len;
199 static size_t string_min;
200 static bool flag_dump_strings;
202 /* True if we should recognize the older non-option arguments
203 that specified at most one file and optional arguments specifying
204 offset and pseudo-start address. */
205 static bool traditional;
207 /* True if an old-style `pseudo-address' was specified. */
208 static bool flag_pseudo_start;
210 /* The difference between the old-style pseudo starting address and
211 the number of bytes to skip. */
212 static uintmax_t pseudo_offset;
214 /* Function that accepts an address and an optional following char,
215 and prints the address and char to stdout. */
216 static void (*format_address) (uintmax_t, char);
218 /* The number of input bytes to skip before formatting and writing. */
219 static uintmax_t n_bytes_to_skip = 0;
221 /* When false, MAX_BYTES_TO_FORMAT and END_OFFSET are ignored, and all
222 input is formatted. */
223 static bool limit_bytes_to_format = false;
225 /* The maximum number of bytes that will be formatted. */
226 static uintmax_t max_bytes_to_format;
228 /* The offset of the first byte after the last byte to be formatted. */
229 static uintmax_t end_offset;
231 /* When true and two or more consecutive blocks are equal, format
232 only the first block and output an asterisk alone on the following
233 line to indicate that identical blocks have been elided. */
234 static bool abbreviate_duplicate_blocks = true;
236 /* An array of specs describing how to format each input block. */
237 static struct tspec *spec;
239 /* The number of format specs. */
240 static size_t n_specs;
242 /* The allocated length of SPEC. */
243 static size_t n_specs_allocated;
245 /* The number of input bytes formatted per output line. It must be
246 a multiple of the least common multiple of the sizes associated with
247 the specified output types. It should be as large as possible, but
248 no larger than 16 -- unless specified with the -w option. */
249 static size_t bytes_per_block;
251 /* Human-readable representation of *file_list (for error messages).
252 It differs from file_list[-1] only when file_list[-1] is "-". */
253 static char const *input_filename;
255 /* A NULL-terminated list of the file-arguments from the command line. */
256 static char const *const *file_list;
258 /* Initializer for file_list if no file-arguments
259 were specified on the command line. */
260 static char const *const default_file_list[] = {"-", NULL};
262 /* The input stream associated with the current file. */
263 static FILE *in_stream;
265 /* If true, at least one of the files we read was standard input. */
266 static bool have_read_stdin;
268 /* Map the size in bytes to a type identifier. */
269 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
271 #define MAX_FP_TYPE_SIZE sizeof (LONG_DOUBLE)
272 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
274 static char const short_options[] = "A:aBbcDdeFfHhIij:LlN:OoS:st:vw::Xx";
276 /* For long options that have no equivalent short option, use a
277 non-character as a pseudo short option, starting with CHAR_MAX + 1. */
280 TRADITIONAL_OPTION = CHAR_MAX + 1
283 static struct option const long_options[] =
285 {"skip-bytes", required_argument, NULL, 'j'},
286 {"address-radix", required_argument, NULL, 'A'},
287 {"read-bytes", required_argument, NULL, 'N'},
288 {"format", required_argument, NULL, 't'},
289 {"output-duplicates", no_argument, NULL, 'v'},
290 {"strings", optional_argument, NULL, 'S'},
291 {"traditional", no_argument, NULL, TRADITIONAL_OPTION},
292 {"width", optional_argument, NULL, 'w'},
294 {GETOPT_HELP_OPTION_DECL},
295 {GETOPT_VERSION_OPTION_DECL},
302 if (status != EXIT_SUCCESS)
303 fprintf (stderr, _("Try `%s --help' for more information.\n"),
308 Usage: %s [OPTION]... [FILE]...\n\
309 or: %s [-abcdfilosx]... [FILE] [[+]OFFSET[.][b]]\n\
310 or: %s --traditional [OPTION]... [FILE] [[+]OFFSET[.][b] [+][LABEL][.][b]]\n\
312 program_name, program_name, program_name);
314 Write an unambiguous representation, octal bytes by default,\n\
315 of FILE to standard output. With more than one FILE argument,\n\
316 concatenate them in the listed order to form the input.\n\
317 With no FILE, or when FILE is -, read standard input.\n\
321 All arguments to long options are mandatory for short options.\n\
324 -A, --address-radix=RADIX decide how file offsets are printed\n\
325 -j, --skip-bytes=BYTES skip BYTES input bytes first\n\
328 -N, --read-bytes=BYTES limit dump to BYTES input bytes\n\
329 -S, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
330 -t, --format=TYPE select output format or formats\n\
331 -v, --output-duplicates do not use * to mark line suppression\n\
332 -w, --width[=BYTES] output BYTES bytes per output line\n\
333 --traditional accept arguments in traditional form\n\
335 fputs (HELP_OPTION_DESCRIPTION, stdout);
336 fputs (VERSION_OPTION_DESCRIPTION, stdout);
339 Traditional format specifications may be intermixed; they accumulate:\n\
340 -a same as -t a, select named characters, ignoring high-order bit\n\
341 -b same as -t o1, select octal bytes\n\
342 -c same as -t c, select ASCII characters or backslash escapes\n\
343 -d same as -t u2, select unsigned decimal 2-byte units\n\
346 -f same as -t fF, select floats\n\
347 -i same as -t dI, select decimal ints\n\
348 -l same as -t dL, select decimal longs\n\
349 -o same as -t o2, select octal 2-byte units\n\
350 -s same as -t d2, select decimal 2-byte units\n\
351 -x same as -t x2, select hexadecimal 2-byte units\n\
355 If first and second call formats both apply, the second format is assumed\n\
356 if the last operand begins with + or (if there are 2 operands) a digit.\n\
357 An OFFSET operand means -j OFFSET. LABEL is the pseudo-address\n\
358 at first byte printed, incremented when dump is progressing.\n\
359 For OFFSET and LABEL, a 0x or 0X prefix indicates hexadecimal;\n\
360 suffixes may be . for octal and b for multiply by 512.\n\
362 TYPE is made up of one or more of these specifications:\n\
364 a named character, ignoring high-order bit\n\
365 c ASCII character or backslash escape\n\
368 d[SIZE] signed decimal, SIZE bytes per integer\n\
369 f[SIZE] floating point, SIZE bytes per integer\n\
370 o[SIZE] octal, SIZE bytes per integer\n\
371 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
372 x[SIZE] hexadecimal, SIZE bytes per integer\n\
376 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
377 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
378 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
379 for sizeof(double) or L for sizeof(long double).\n\
383 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
384 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
385 with b suffix, by 1024 with k and by 1048576 with m. Adding a z suffix to\n\
386 any type adds a display of printable characters to the end of each line\n\
390 --string without a number implies 3. --width without a number\n\
391 implies 32. By default, od uses -A o -t d2 -w 16.\n\
393 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
398 /* Define the print functions. */
401 print_s_char (size_t n_bytes, void const *block, char const *fmt_string)
403 signed char const *p = block;
405 for (i = n_bytes / sizeof *p; i != 0; i--)
406 printf (fmt_string, *p++);
410 print_char (size_t n_bytes, void const *block, char const *fmt_string)
412 unsigned char const *p = block;
414 for (i = n_bytes / sizeof *p; i != 0; i--)
415 printf (fmt_string, *p++);
419 print_s_short (size_t n_bytes, void const *block, char const *fmt_string)
421 short int const *p = block;
423 for (i = n_bytes / sizeof *p; i != 0; i--)
424 printf (fmt_string, *p++);
428 print_short (size_t n_bytes, void const *block, char const *fmt_string)
430 unsigned short int const *p = block;
432 for (i = n_bytes / sizeof *p; i != 0; i--)
433 printf (fmt_string, *p++);
437 print_int (size_t n_bytes, void const *block, char const *fmt_string)
439 unsigned int const *p = block;
441 for (i = n_bytes / sizeof *p; i != 0; i--)
442 printf (fmt_string, *p++);
446 print_long (size_t n_bytes, void const *block, char const *fmt_string)
448 unsigned long int const *p = block;
450 for (i = n_bytes / sizeof *p; i != 0; i--)
451 printf (fmt_string, *p++);
455 print_long_long (size_t n_bytes, void const *block, char const *fmt_string)
457 unsigned_long_long_int const *p = block;
459 for (i = n_bytes / sizeof *p; i != 0; i--)
460 printf (fmt_string, *p++);
464 print_float (size_t n_bytes, void const *block, char const *fmt_string)
466 float const *p = block;
468 for (i = n_bytes / sizeof *p; i != 0; i--)
469 printf (fmt_string, *p++);
473 print_double (size_t n_bytes, void const *block, char const *fmt_string)
475 double const *p = block;
477 for (i = n_bytes / sizeof *p; i != 0; i--)
478 printf (fmt_string, *p++);
481 #ifdef HAVE_LONG_DOUBLE
483 print_long_double (size_t n_bytes, void const *block, char const *fmt_string)
485 long double const *p = block;
487 for (i = n_bytes / sizeof *p; i != 0; i--)
488 printf (fmt_string, *p++);
493 dump_hexl_mode_trailer (size_t n_bytes, const char *block)
496 fputs (" >", stdout);
497 for (i = n_bytes; i > 0; i--)
499 unsigned char c = *block++;
500 unsigned char c2 = (ISPRINT(c) ? c : '.');
507 print_named_ascii (size_t n_bytes, void const *block,
508 const char *unused_fmt_string ATTRIBUTE_UNUSED)
510 unsigned char const *p = block;
512 for (i = n_bytes; i > 0; i--)
514 int masked_c = *p++ & 0x7f;
520 else if (masked_c <= 040)
521 s = charname[masked_c];
524 sprintf (buf, " %c", masked_c);
533 print_ascii (size_t n_bytes, void const *block,
534 const char *unused_fmt_string ATTRIBUTE_UNUSED)
536 unsigned char const *p = block;
538 for (i = n_bytes; i > 0; i--)
540 unsigned char c = *p++;
579 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
587 /* Convert a null-terminated (possibly zero-length) string S to an
588 unsigned long integer value. If S points to a non-digit set *P to S,
589 *VAL to 0, and return true. Otherwise, accumulate the integer value of
590 the string of digits. If the string of digits represents a value
591 larger than ULONG_MAX, don't modify *VAL or *P and return false.
592 Otherwise, advance *P to the first non-digit after S, set *VAL to
593 the result of the conversion and return true. */
596 simple_strtoul (const char *s, const char **p, unsigned long int *val)
598 unsigned long int sum;
604 if (sum > (ULONG_MAX - c) / 10)
613 /* If S points to a single valid modern od format string, put
614 a description of that format in *TSPEC, make *NEXT point at the
615 character following the just-decoded format (if *NEXT is non-NULL),
616 and return true. If S is not valid, don't modify *NEXT or *TSPEC,
617 give a diagnostic, and return false. For example, if S were
618 "d4afL" *NEXT would be set to "afL" and *TSPEC would be
620 fmt = SIGNED_DECIMAL;
621 size = INT or LONG; (whichever integral_type_size[4] resolves to)
622 print_function = print_int; (assuming size == INT)
623 fmt_string = "%011d%c";
625 S_ORIG is solely for reporting errors. It should be the full format
630 decode_one_format (const char *s_orig, const char *s, const char **next,
633 enum size_spec size_spec;
634 unsigned long int size;
635 enum output_format fmt;
636 const char *pre_fmt_string;
637 void (*print_function) (size_t, void const *, char const *);
643 assert (tspec != NULL);
657 size = sizeof (char);
662 size = sizeof (short int);
672 size = sizeof (long int);
676 if (! simple_strtoul (s, &p, &size))
678 /* The integer at P in S would overflow an unsigned long int.
679 A digit string that long is sufficiently odd looking
680 that the following diagnostic is sufficient. */
681 error (0, 0, _("invalid type string %s"), quote (s_orig));
688 if (MAX_INTEGRAL_TYPE_SIZE < size
689 || integral_type_size[size] == NO_SIZE)
691 error (0, 0, _("invalid type string %s;\n\
692 this system doesn't provide a %lu-byte integral type"), quote (s_orig), size);
700 #define ISPEC_TO_FORMAT(Spec, Min_format, Long_format, Max_format) \
701 ((Spec) == LONG_LONG ? (Max_format) \
702 : ((Spec) == LONG ? (Long_format) \
705 size_spec = integral_type_size[size];
710 fmt = SIGNED_DECIMAL;
711 sprintf (tspec->fmt_string, " %%%d%s",
712 (field_width = bytes_to_signed_dec_digits[size]),
713 ISPEC_TO_FORMAT (size_spec, "d", "ld", PRIdMAX));
718 sprintf (tspec->fmt_string, " %%0%d%s",
719 (field_width = bytes_to_oct_digits[size]),
720 ISPEC_TO_FORMAT (size_spec, "o", "lo", PRIoMAX));
724 fmt = UNSIGNED_DECIMAL;
725 sprintf (tspec->fmt_string, " %%%d%s",
726 (field_width = bytes_to_unsigned_dec_digits[size]),
727 ISPEC_TO_FORMAT (size_spec, "u", "lu", PRIuMAX));
732 sprintf (tspec->fmt_string, " %%0%d%s",
733 (field_width = bytes_to_hex_digits[size]),
734 ISPEC_TO_FORMAT (size_spec, "x", "lx", PRIxMAX));
741 assert (strlen (tspec->fmt_string) < FMT_BYTES_ALLOCATED);
746 print_function = (fmt == SIGNED_DECIMAL
752 print_function = (fmt == SIGNED_DECIMAL
758 print_function = print_int;
762 print_function = print_long;
766 print_function = print_long_long;
775 fmt = FLOATING_POINT;
781 size = sizeof (float);
786 size = sizeof (double);
791 size = sizeof (LONG_DOUBLE);
795 if (! simple_strtoul (s, &p, &size))
797 /* The integer at P in S would overflow an unsigned long int.
798 A digit string that long is sufficiently odd looking
799 that the following diagnostic is sufficient. */
800 error (0, 0, _("invalid type string %s"), quote (s_orig));
804 size = sizeof (double);
807 if (size > MAX_FP_TYPE_SIZE
808 || fp_type_size[size] == NO_SIZE)
810 error (0, 0, _("invalid type string %s;\n\
811 this system doesn't provide a %lu-byte floating point type"),
812 quote (s_orig), size);
819 size_spec = fp_type_size[size];
824 print_function = print_float;
825 /* Don't use %#e; not all systems support it. */
826 pre_fmt_string = " %%%d.%de";
831 print_function = print_double;
832 pre_fmt_string = " %%%d.%de";
836 #ifdef HAVE_LONG_DOUBLE
837 case FLOAT_LONG_DOUBLE:
838 print_function = print_long_double;
839 pre_fmt_string = " %%%d.%dLe";
840 precision = LDBL_DIG;
848 field_width = precision + 8;
849 sprintf (tspec->fmt_string, pre_fmt_string, field_width, precision);
854 fmt = NAMED_CHARACTER;
856 print_function = print_named_ascii;
864 print_function = print_ascii;
869 error (0, 0, _("invalid character `%c' in type string %s"),
874 tspec->size = size_spec;
876 tspec->print_function = print_function;
878 tspec->field_width = field_width;
879 tspec->hexl_mode_trailer = (*s == 'z');
880 if (tspec->hexl_mode_trailer)
889 /* Given a list of one or more input filenames FILE_LIST, set the global
890 file pointer IN_STREAM and the global string INPUT_FILENAME to the
891 first one that can be successfully opened. Modify FILE_LIST to
892 reference the next filename in the list. A file name of "-" is
893 interpreted as standard input. If any file open fails, give an error
894 message and return false. */
897 open_next_file (void)
903 input_filename = *file_list;
904 if (input_filename == NULL)
908 if (STREQ (input_filename, "-"))
910 input_filename = _("standard input");
912 have_read_stdin = true;
913 if (O_BINARY && ! isatty (STDIN_FILENO))
914 freopen (NULL, "rb", stdin);
918 in_stream = fopen (input_filename, (O_BINARY ? "rb" : "r"));
919 if (in_stream == NULL)
921 error (0, errno, "%s", input_filename);
926 while (in_stream == NULL);
928 if (limit_bytes_to_format & !flag_dump_strings)
929 SETVBUF (in_stream, NULL, _IONBF, 0);
934 /* Test whether there have been errors on in_stream, and close it if
935 it is not standard input. Return false if there has been an error
936 on in_stream or stdout; return true otherwise. This function will
937 report more than one error only if both a read and a write error
938 have occurred. IN_ERRNO, if nonzero, is the error number
939 corresponding to the most recent action for IN_STREAM. */
942 check_and_close (int in_errno)
946 if (in_stream != NULL)
948 if (ferror (in_stream))
950 error (0, in_errno, _("%s: read error"), input_filename);
951 if (! STREQ (file_list[-1], "-"))
955 else if (! STREQ (file_list[-1], "-") && fclose (in_stream) != 0)
957 error (0, errno, "%s", input_filename);
966 error (0, 0, _("write error"));
973 /* Decode the modern od format string S. Append the decoded
974 representation to the global array SPEC, reallocating SPEC if
975 necessary. Return true if S is valid. */
978 decode_format_string (const char *s)
980 const char *s_orig = s;
987 if (n_specs_allocated <= n_specs)
988 spec = X2NREALLOC (spec, &n_specs_allocated);
990 if (! decode_one_format (s_orig, s, &next, &spec[n_specs]))
1001 /* Given a list of one or more input filenames FILE_LIST, set the global
1002 file pointer IN_STREAM to position N_SKIP in the concatenation of
1003 those files. If any file operation fails or if there are fewer than
1004 N_SKIP bytes in the combined input, give an error message and return
1005 false. When possible, use seek rather than read operations to
1006 advance IN_STREAM. */
1009 skip (uintmax_t n_skip)
1017 while (in_stream != NULL) /* EOF. */
1019 struct stat file_stats;
1021 /* First try seeking. For large offsets, this extra work is
1022 worthwhile. If the offset is below some threshold it may be
1023 more efficient to move the pointer by reading. There are two
1024 issues when trying to seek:
1025 - the file must be seekable.
1026 - before seeking to the specified position, make sure
1027 that the new position is in the current file.
1028 Try to do that by getting file's size using fstat.
1029 But that will work only for regular files. */
1031 if (fstat (fileno (in_stream), &file_stats) == 0)
1033 /* The st_size field is valid only for regular files
1034 (and for symbolic links, which cannot occur here).
1035 If the number of bytes left to skip is at least
1036 as large as the size of the current file, we can
1037 decrement n_skip and go on to the next file. */
1039 if (S_ISREG (file_stats.st_mode) && 0 <= file_stats.st_size)
1041 if ((uintmax_t) file_stats.st_size <= n_skip)
1042 n_skip -= file_stats.st_size;
1045 if (fseeko (in_stream, n_skip, SEEK_CUR) != 0)
1054 /* If it's not a regular file with nonnegative size,
1055 position the file pointer by reading. */
1060 size_t n_bytes_read, n_bytes_to_read = BUFSIZ;
1064 if (n_skip < n_bytes_to_read)
1065 n_bytes_to_read = n_skip;
1066 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1067 n_skip -= n_bytes_read;
1068 if (n_bytes_read != n_bytes_to_read)
1082 else /* cannot fstat() file */
1084 error (0, errno, "%s", input_filename);
1088 ok &= check_and_close (in_errno);
1090 ok &= open_next_file ();
1094 error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1100 format_address_none (uintmax_t address ATTRIBUTE_UNUSED, char c ATTRIBUTE_UNUSED)
1105 format_address_std (uintmax_t address, char c)
1107 char buf[MAX_ADDRESS_LENGTH + 2];
1108 char *p = buf + sizeof buf;
1113 pbound = p - address_pad_len;
1115 /* Use a special case of the code for each base. This is measurably
1116 faster than generic code. */
1117 switch (address_base)
1121 *--p = '0' + (address & 7);
1122 while ((address >>= 3) != 0);
1127 *--p = '0' + (address % 10);
1128 while ((address /= 10) != 0);
1133 *--p = "0123456789abcdef"[address & 15];
1134 while ((address >>= 4) != 0);
1145 format_address_paren (uintmax_t address, char c)
1148 format_address_std (address, ')');
1154 format_address_label (uintmax_t address, char c)
1156 format_address_std (address, ' ');
1157 format_address_paren (address + pseudo_offset, c);
1160 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1161 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1162 CURR_BLOCK in the concatenation of input files, and it is printed
1163 (optionally) only before the output line associated with the first
1164 format spec. When duplicate blocks are being abbreviated, the output
1165 for a sequence of identical input blocks is the output for the first
1166 block followed by an asterisk alone on a line. It is valid to compare
1167 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1168 That condition may be false only for the last input block -- and then
1169 only when it has not been padded to length BYTES_PER_BLOCK. */
1172 write_block (uintmax_t current_offset, size_t n_bytes,
1173 const char *prev_block, const char *curr_block)
1175 static bool first = true;
1176 static bool prev_pair_equal = false;
1178 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1180 if (abbreviate_duplicate_blocks
1181 && !first && n_bytes == bytes_per_block
1182 && EQUAL_BLOCKS (prev_block, curr_block))
1184 if (prev_pair_equal)
1186 /* The two preceding blocks were equal, and the current
1187 block is the same as the last one, so print nothing. */
1192 prev_pair_equal = true;
1199 prev_pair_equal = false;
1200 for (i = 0; i < n_specs; i++)
1203 format_address (current_offset, '\0');
1205 printf ("%*s", address_pad_len, "");
1206 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1207 if (spec[i].hexl_mode_trailer)
1209 /* space-pad out to full line width, then dump the trailer */
1210 int datum_width = width_bytes[spec[i].size];
1211 int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1212 int field_width = spec[i].field_width + 1;
1213 printf ("%*s", blank_fields * field_width, "");
1214 dump_hexl_mode_trailer (n_bytes, curr_block);
1222 /* Read a single byte into *C from the concatenation of the input files
1223 named in the global array FILE_LIST. On the first call to this
1224 function, the global variable IN_STREAM is expected to be an open
1225 stream associated with the input file INPUT_FILENAME. If IN_STREAM
1226 is at end-of-file, close it and update the global variables IN_STREAM
1227 and INPUT_FILENAME so they correspond to the next file in the list.
1228 Then try to read a byte from the newly opened file. Repeat if
1229 necessary until EOF is reached for the last file in FILE_LIST, then
1230 set *C to EOF and return. Subsequent calls do likewise. Return
1231 true if successful. */
1240 while (in_stream != NULL) /* EOF. */
1242 *c = fgetc (in_stream);
1247 ok &= check_and_close (errno);
1249 ok &= open_next_file ();
1255 /* Read N bytes into BLOCK from the concatenation of the input files
1256 named in the global array FILE_LIST. On the first call to this
1257 function, the global variable IN_STREAM is expected to be an open
1258 stream associated with the input file INPUT_FILENAME. If all N
1259 bytes cannot be read from IN_STREAM, close IN_STREAM and update
1260 the global variables IN_STREAM and INPUT_FILENAME. Then try to
1261 read the remaining bytes from the newly opened file. Repeat if
1262 necessary until EOF is reached for the last file in FILE_LIST.
1263 On subsequent calls, don't modify BLOCK and return true. Set
1264 *N_BYTES_IN_BUFFER to the number of bytes read. If an error occurs,
1265 it will be detected through ferror when the stream is about to be
1266 closed. If there is an error, give a message but continue reading
1267 as usual and return false. Otherwise return true. */
1270 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1274 assert (0 < n && n <= bytes_per_block);
1276 *n_bytes_in_buffer = 0;
1281 while (in_stream != NULL) /* EOF. */
1286 n_needed = n - *n_bytes_in_buffer;
1287 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1289 *n_bytes_in_buffer += n_read;
1291 if (n_read == n_needed)
1294 ok &= check_and_close (errno);
1296 ok &= open_next_file ();
1302 /* Return the least common multiple of the sizes associated
1303 with the format specs. */
1311 for (i = 0; i < n_specs; i++)
1312 l_c_m = lcm (l_c_m, width_bytes[spec[i].size]);
1316 /* If S is a valid traditional offset specification with an optional
1317 leading '+' return true and set *OFFSET to the offset it denotes. */
1320 parse_old_offset (const char *s, uintmax_t *offset)
1327 /* Skip over any leading '+'. */
1331 /* Determine the radix we'll use to interpret S. If there is a `.',
1332 it's decimal, otherwise, if the string begins with `0X'or `0x',
1333 it's hexadecimal, else octal. */
1334 if (strchr (s, '.') != NULL)
1338 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1344 return xstrtoumax (s, NULL, radix, offset, "Bb") == LONGINT_OK;
1347 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1348 formatted block to standard output, and repeat until the specified
1349 maximum number of bytes has been read or until all input has been
1350 processed. If the last block read is smaller than BYTES_PER_BLOCK
1351 and its size is not a multiple of the size associated with a format
1352 spec, extend the input block with zero bytes until its length is a
1353 multiple of all format spec sizes. Write the final block. Finally,
1354 write on a line by itself the offset of the byte after the last byte
1355 read. Accumulate return values from calls to read_block and
1356 check_and_close, and if any was false, return false.
1357 Otherwise, return true. */
1363 uintmax_t current_offset;
1366 size_t n_bytes_read;
1368 block[0] = xnmalloc (2, bytes_per_block);
1369 block[1] = block[0] + bytes_per_block;
1371 current_offset = n_bytes_to_skip;
1373 if (limit_bytes_to_format)
1378 if (current_offset >= end_offset)
1383 n_needed = MIN (end_offset - current_offset,
1384 (uintmax_t) bytes_per_block);
1385 ok &= read_block (n_needed, block[idx], &n_bytes_read);
1386 if (n_bytes_read < bytes_per_block)
1388 assert (n_bytes_read == bytes_per_block);
1389 write_block (current_offset, n_bytes_read,
1390 block[!idx], block[idx]);
1391 current_offset += n_bytes_read;
1399 ok &= read_block (bytes_per_block, block[idx], &n_bytes_read);
1400 if (n_bytes_read < bytes_per_block)
1402 assert (n_bytes_read == bytes_per_block);
1403 write_block (current_offset, n_bytes_read,
1404 block[!idx], block[idx]);
1405 current_offset += n_bytes_read;
1410 if (n_bytes_read > 0)
1413 size_t bytes_to_write;
1417 /* Make bytes_to_write the smallest multiple of l_c_m that
1418 is at least as large as n_bytes_read. */
1419 bytes_to_write = l_c_m * ((n_bytes_read + l_c_m - 1) / l_c_m);
1421 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1422 write_block (current_offset, bytes_to_write,
1423 block[!idx], block[idx]);
1424 current_offset += n_bytes_read;
1427 format_address (current_offset, '\n');
1429 if (limit_bytes_to_format && current_offset >= end_offset)
1430 ok &= check_and_close (0);
1437 /* STRINGS mode. Find each "string constant" in the input.
1438 A string constant is a run of at least `string_min' ASCII
1439 graphic (or formatting) characters terminated by a null.
1440 Based on a function written by Richard Stallman for a
1441 traditional version of od. Return true if successful. */
1446 size_t bufsize = MAX (100, string_min);
1447 char *buf = xmalloc (bufsize);
1448 uintmax_t address = n_bytes_to_skip;
1456 /* See if the next `string_min' chars are all printing chars. */
1459 if (limit_bytes_to_format
1460 && (end_offset < string_min || end_offset - string_min <= address))
1463 for (i = 0; i < string_min; i++)
1465 ok &= read_char (&c);
1473 /* Found a non-printing. Try again starting with next char. */
1478 /* We found a run of `string_min' printable characters.
1479 Now see if it is terminated with a null byte. */
1480 while (!limit_bytes_to_format || address < end_offset)
1484 buf = X2REALLOC (buf, &bufsize);
1486 ok &= read_char (&c);
1494 break; /* It is; print this string. */
1496 goto tryline; /* It isn't; give up on this string. */
1497 buf[i++] = c; /* String continues; store it all. */
1500 /* If we get here, the string is all printable and null-terminated,
1501 so print it. It is all in `buf' and `i' is its length. */
1503 format_address (address - i - 1, ' ');
1505 for (i = 0; (c = buf[i]); i++)
1510 fputs ("\\a", stdout);
1514 fputs ("\\b", stdout);
1518 fputs ("\\f", stdout);
1522 fputs ("\\n", stdout);
1526 fputs ("\\r", stdout);
1530 fputs ("\\t", stdout);
1534 fputs ("\\v", stdout);
1544 /* We reach this point only if we search through
1545 (max_bytes_to_format - string_min) bytes before reaching EOF. */
1549 ok &= check_and_close (0);
1554 main (int argc, char **argv)
1560 size_t desired_width IF_LINT (= 0);
1561 bool modern = false;
1562 bool width_specified = false;
1565 /* The old-style `pseudo starting address' to be printed in parentheses
1566 after any true address. */
1567 uintmax_t pseudo_start IF_LINT (= 0);
1569 initialize_main (&argc, &argv);
1570 program_name = argv[0];
1571 setlocale (LC_ALL, "");
1572 bindtextdomain (PACKAGE, LOCALEDIR);
1573 textdomain (PACKAGE);
1575 atexit (close_stdout);
1577 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1578 integral_type_size[i] = NO_SIZE;
1580 integral_type_size[sizeof (char)] = CHAR;
1581 integral_type_size[sizeof (short int)] = SHORT;
1582 integral_type_size[sizeof (int)] = INT;
1583 integral_type_size[sizeof (long int)] = LONG;
1584 #if HAVE_UNSIGNED_LONG_LONG
1585 /* If `long int' and `long long int' have the same size, it's fine
1586 to overwrite the entry for `long' with this one. */
1587 integral_type_size[sizeof (unsigned_long_long_int)] = LONG_LONG;
1590 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1591 fp_type_size[i] = NO_SIZE;
1593 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1594 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1595 so that if `long double' is the same type or if long double isn't
1596 supported FLOAT_LONG_DOUBLE will never be used. */
1597 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1598 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1601 n_specs_allocated = 0;
1604 format_address = format_address_std;
1606 address_pad_len = 7;
1607 flag_dump_strings = false;
1609 while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
1613 enum strtol_error s_err;
1622 format_address = format_address_std;
1624 address_pad_len = 7;
1627 format_address = format_address_std;
1629 address_pad_len = 7;
1632 format_address = format_address_std;
1634 address_pad_len = 6;
1637 format_address = format_address_none;
1638 address_pad_len = 0;
1641 error (EXIT_FAILURE, 0,
1642 _("invalid output address radix `%c'; \
1643 it must be one character from [doxn]"),
1651 s_err = xstrtoumax (optarg, NULL, 0, &n_bytes_to_skip, "bkm");
1652 if (s_err != LONGINT_OK)
1653 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1658 limit_bytes_to_format = true;
1660 s_err = xstrtoumax (optarg, NULL, 0, &max_bytes_to_format, "bkm");
1661 if (s_err != LONGINT_OK)
1662 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1671 s_err = xstrtoumax (optarg, NULL, 0, &tmp, "bkm");
1672 if (s_err != LONGINT_OK)
1673 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1675 /* The minimum string length may be no larger than SIZE_MAX,
1676 since we may allocate a buffer of this size. */
1678 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1682 flag_dump_strings = true;
1687 ok &= decode_format_string (optarg);
1692 abbreviate_duplicate_blocks = false;
1695 case TRADITIONAL_OPTION:
1699 /* The next several cases map the traditional format
1700 specification options to the corresponding modern format
1701 specs. GNU od accepts any combination of old- and
1702 new-style options. Format specification options accumulate.
1703 The obsolescent and undocumented formats are compatible
1704 with FreeBSD 4.10 od. */
1706 #define CASE_OLD_ARG(old_char,new_string) \
1708 ok &= decode_format_string (new_string); \
1711 CASE_OLD_ARG ('a', "a");
1712 CASE_OLD_ARG ('b', "o1");
1713 CASE_OLD_ARG ('c', "c");
1714 CASE_OLD_ARG ('D', "u4"); /* obsolescent and undocumented */
1715 CASE_OLD_ARG ('d', "u2");
1716 case 'F': /* obsolescent and undocumented alias */
1717 CASE_OLD_ARG ('e', "fD"); /* obsolescent and undocumented */
1718 CASE_OLD_ARG ('f', "fF");
1719 case 'X': /* obsolescent and undocumented alias */
1720 CASE_OLD_ARG ('H', "x4"); /* obsolescent and undocumented */
1721 CASE_OLD_ARG ('i', "dI");
1722 case 'I': case 'L': /* obsolescent and undocumented aliases */
1723 CASE_OLD_ARG ('l', "dL");
1724 CASE_OLD_ARG ('O', "o4"); /* obsolesent and undocumented */
1725 case 'B': /* obsolescent and undocumented alias */
1726 CASE_OLD_ARG ('o', "o2");
1727 CASE_OLD_ARG ('s', "d2");
1728 case 'h': /* obsolescent and undocumented alias */
1729 CASE_OLD_ARG ('x', "x2");
1735 width_specified = true;
1743 s_err = xstrtoumax (optarg, NULL, 10, &w_tmp, "");
1744 if (s_err != LONGINT_OK)
1745 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1746 if (SIZE_MAX < w_tmp)
1747 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1748 desired_width = w_tmp;
1752 case_GETOPT_HELP_CHAR;
1754 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1757 usage (EXIT_FAILURE);
1763 exit (EXIT_FAILURE);
1765 if (flag_dump_strings && n_specs > 0)
1766 error (EXIT_FAILURE, 0,
1767 _("no type may be specified when dumping strings"));
1769 n_files = argc - optind;
1771 /* If the --traditional option is used, there may be from
1772 0 to 3 remaining command line arguments; handle each case
1774 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1775 The offset and label have the same syntax.
1777 If --traditional is not given, and if no modern options are
1778 given, and if the offset begins with + or (if there are two
1779 operands) a digit, accept only this form, as per POSIX:
1780 od [file] [[+]offset[.][b]]
1783 if (!modern | traditional)
1791 if ((traditional || argv[optind][0] == '+')
1792 && parse_old_offset (argv[optind], &o1))
1794 n_bytes_to_skip = o1;
1801 if ((traditional || argv[optind + 1][0] == '+'
1802 || ISDIGIT (argv[optind + 1][0]))
1803 && parse_old_offset (argv[optind + 1], &o2))
1805 if (traditional && parse_old_offset (argv[optind], &o1))
1807 n_bytes_to_skip = o1;
1808 flag_pseudo_start = true;
1815 n_bytes_to_skip = o2;
1817 argv[optind + 1] = argv[optind];
1825 && parse_old_offset (argv[optind + 1], &o1)
1826 && parse_old_offset (argv[optind + 2], &o2))
1828 n_bytes_to_skip = o1;
1829 flag_pseudo_start = true;
1831 argv[optind + 2] = argv[optind];
1838 if (traditional && 1 < n_files)
1840 error (0, 0, _("extra operand %s"), quote (argv[optind + 1]));
1841 error (0, 0, "%s\n",
1842 _("Compatibility mode supports at most one file."));
1843 usage (EXIT_FAILURE);
1847 if (flag_pseudo_start)
1849 if (format_address == format_address_none)
1852 address_pad_len = 7;
1853 format_address = format_address_paren;
1856 format_address = format_address_label;
1859 if (limit_bytes_to_format)
1861 end_offset = n_bytes_to_skip + max_bytes_to_format;
1862 if (end_offset < n_bytes_to_skip)
1863 error (EXIT_FAILURE, 0, _("skip-bytes + read-bytes is too large"));
1867 decode_format_string ("oS");
1871 /* Set the global pointer FILE_LIST so that it
1872 references the first file-argument on the command-line. */
1874 file_list = (char const *const *) &argv[optind];
1878 /* No files were listed on the command line.
1879 Set the global pointer FILE_LIST so that it
1880 references the null-terminated list of one name: "-". */
1882 file_list = default_file_list;
1885 /* open the first input file */
1886 ok = open_next_file ();
1887 if (in_stream == NULL)
1890 /* skip over any unwanted header bytes */
1891 ok &= skip (n_bytes_to_skip);
1892 if (in_stream == NULL)
1895 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1897 /* Compute output block length. */
1900 if (width_specified)
1902 if (desired_width != 0 && desired_width % l_c_m == 0)
1903 bytes_per_block = desired_width;
1906 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1907 (unsigned long int) desired_width, l_c_m);
1908 bytes_per_block = l_c_m;
1913 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1914 bytes_per_block = l_c_m * (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1916 bytes_per_block = l_c_m;
1920 for (i = 0; i < n_specs; i++)
1922 printf (_("%d: fmt=\"%s\" width=%d\n"),
1923 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1927 ok &= (flag_dump_strings ? dump_strings () : dump ());
1931 if (have_read_stdin && fclose (stdin) == EOF)
1932 error (EXIT_FAILURE, errno, _("standard input"));
1934 exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);