* src/dd.c (flags): noatime and nofollow now depend on
[coreutils/bo.git] / src / od.c
blob7c0b5b792e497f1b8a4e1b6bf34fbe9dca6e287a
1 /* od -- dump files in octal and other formats
2 Copyright (C) 92, 1995-2006 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)
7 any later version.
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. */
20 #include <config.h>
22 #include <stdio.h>
23 #include <assert.h>
24 #include <getopt.h>
25 #include <sys/types.h>
26 #include "system.h"
27 #include "error.h"
28 #include "quote.h"
29 #include "xstrtol.h"
31 /* The official name of this program (e.g., no `g' prefix). */
32 #define PROGRAM_NAME "od"
34 #define AUTHORS "Jim Meyering"
36 #include <float.h>
38 #ifdef HAVE_LONG_DOUBLE
39 typedef long double LONG_DOUBLE;
40 #else
41 typedef double LONG_DOUBLE;
42 #endif
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. */
48 #ifndef FLT_DIG
49 # define FLT_DIG 7
50 #endif
52 /* The number of decimal digits of precision in a double. */
53 #ifndef DBL_DIG
54 # define DBL_DIG 15
55 #endif
57 /* The number of decimal digits of precision in a long double. */
58 #ifndef LDBL_DIG
59 # define LDBL_DIG DBL_DIG
60 #endif
62 #if HAVE_UNSIGNED_LONG_LONG_INT
63 typedef unsigned long long int unsigned_long_long_int;
64 #else
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;
68 #endif
70 enum size_spec
72 NO_SIZE,
73 CHAR,
74 SHORT,
75 INT,
76 LONG,
77 LONG_LONG,
78 /* FIXME: add INTMAX support, too */
79 FLOAT_SINGLE,
80 FLOAT_DOUBLE,
81 FLOAT_LONG_DOUBLE,
82 N_SIZE_SPECS
85 enum output_format
87 SIGNED_DECIMAL,
88 UNSIGNED_DECIMAL,
89 OCTAL,
90 HEXADECIMAL,
91 FLOATING_POINT,
92 NAMED_CHARACTER,
93 CHARACTER
96 /* The maximum number of bytes needed for a format string,
97 including the trailing null. */
98 enum
100 FMT_BYTES_ALLOCATED =
101 MAX ((sizeof " %0" - 1 + INT_STRLEN_BOUND (int)
102 + MAX (sizeof "ld",
103 MAX (sizeof PRIdMAX,
104 MAX (sizeof PRIoMAX,
105 MAX (sizeof PRIuMAX,
106 sizeof PRIxMAX))))),
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. */
112 struct tspec
114 enum output_format fmt;
115 enum size_spec size;
116 void (*print_function) (size_t, void const *, char const *);
117 char fmt_string[FMT_BYTES_ALLOCATED];
118 bool hexl_mode_trailer;
119 int field_width;
122 /* The name this program was run with. */
123 char *program_name;
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:
130 11 unsigned octal
131 11 signed decimal
132 10 unsigned decimal
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[] =
164 sizeof (char),
165 sizeof (short int),
166 sizeof (int),
167 sizeof (long int),
168 sizeof (unsigned_long_long_int),
169 sizeof (float),
170 sizeof (double),
171 sizeof (LONG_DOUBLE)
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",
185 "sp"
188 /* Address base (8, 10 or 16). */
189 static int address_base;
191 /* The number of octal digits required to represent the largest
192 address value. */
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. */
278 enum
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},
296 {NULL, 0, NULL, 0}
299 void
300 usage (int status)
302 if (status != EXIT_SUCCESS)
303 fprintf (stderr, _("Try `%s --help' for more information.\n"),
304 program_name);
305 else
307 printf (_("\
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);
313 fputs (_("\n\
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\
319 "), stdout);
320 fputs (_("\
321 All arguments to long options are mandatory for short options.\n\
322 "), stdout);
323 fputs (_("\
324 -A, --address-radix=RADIX decide how file offsets are printed\n\
325 -j, --skip-bytes=BYTES skip BYTES input bytes first\n\
326 "), stdout);
327 fputs (_("\
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\
334 "), stdout);
335 fputs (HELP_OPTION_DESCRIPTION, stdout);
336 fputs (VERSION_OPTION_DESCRIPTION, stdout);
337 fputs (_("\
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\
344 "), stdout);
345 fputs (_("\
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\
352 "), stdout);
353 fputs (_("\
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\
366 "), stdout);
367 fputs (_("\
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\
373 "), stdout);
374 fputs (_("\
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\
380 "), stdout);
381 fputs (_("\
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\
387 of output. \
388 "), stdout);
389 fputs (_("\
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\
392 "), stdout);
393 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
395 exit (status);
398 /* Define the print functions. */
400 static void
401 print_s_char (size_t n_bytes, void const *block, char const *fmt_string)
403 signed char const *p = block;
404 size_t i;
405 for (i = n_bytes / sizeof *p; i != 0; i--)
406 printf (fmt_string, *p++);
409 static void
410 print_char (size_t n_bytes, void const *block, char const *fmt_string)
412 unsigned char const *p = block;
413 size_t i;
414 for (i = n_bytes / sizeof *p; i != 0; i--)
415 printf (fmt_string, *p++);
418 static void
419 print_s_short (size_t n_bytes, void const *block, char const *fmt_string)
421 short int const *p = block;
422 size_t i;
423 for (i = n_bytes / sizeof *p; i != 0; i--)
424 printf (fmt_string, *p++);
427 static void
428 print_short (size_t n_bytes, void const *block, char const *fmt_string)
430 unsigned short int const *p = block;
431 size_t i;
432 for (i = n_bytes / sizeof *p; i != 0; i--)
433 printf (fmt_string, *p++);
436 static void
437 print_int (size_t n_bytes, void const *block, char const *fmt_string)
439 unsigned int const *p = block;
440 size_t i;
441 for (i = n_bytes / sizeof *p; i != 0; i--)
442 printf (fmt_string, *p++);
445 static void
446 print_long (size_t n_bytes, void const *block, char const *fmt_string)
448 unsigned long int const *p = block;
449 size_t i;
450 for (i = n_bytes / sizeof *p; i != 0; i--)
451 printf (fmt_string, *p++);
454 static void
455 print_long_long (size_t n_bytes, void const *block, char const *fmt_string)
457 unsigned_long_long_int const *p = block;
458 size_t i;
459 for (i = n_bytes / sizeof *p; i != 0; i--)
460 printf (fmt_string, *p++);
463 static void
464 print_float (size_t n_bytes, void const *block, char const *fmt_string)
466 float const *p = block;
467 size_t i;
468 for (i = n_bytes / sizeof *p; i != 0; i--)
469 printf (fmt_string, *p++);
472 static void
473 print_double (size_t n_bytes, void const *block, char const *fmt_string)
475 double const *p = block;
476 size_t i;
477 for (i = n_bytes / sizeof *p; i != 0; i--)
478 printf (fmt_string, *p++);
481 #ifdef HAVE_LONG_DOUBLE
482 static void
483 print_long_double (size_t n_bytes, void const *block, char const *fmt_string)
485 long double const *p = block;
486 size_t i;
487 for (i = n_bytes / sizeof *p; i != 0; i--)
488 printf (fmt_string, *p++);
490 #endif
492 static void
493 dump_hexl_mode_trailer (size_t n_bytes, const char *block)
495 size_t i;
496 fputs (" >", stdout);
497 for (i = n_bytes; i > 0; i--)
499 unsigned char c = *block++;
500 unsigned char c2 = (isprint (c) ? c : '.');
501 putchar (c2);
503 putchar ('<');
506 static void
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;
511 size_t i;
512 for (i = n_bytes; i > 0; i--)
514 int masked_c = *p++ & 0x7f;
515 const char *s;
516 char buf[5];
518 if (masked_c == 127)
519 s = "del";
520 else if (masked_c <= 040)
521 s = charname[masked_c];
522 else
524 sprintf (buf, " %c", masked_c);
525 s = buf;
528 printf (" %3s", s);
532 static void
533 print_ascii (size_t n_bytes, void const *block,
534 const char *unused_fmt_string ATTRIBUTE_UNUSED)
536 unsigned char const *p = block;
537 size_t i;
538 for (i = n_bytes; i > 0; i--)
540 unsigned char c = *p++;
541 const char *s;
542 char buf[5];
544 switch (c)
546 case '\0':
547 s = " \\0";
548 break;
550 case '\a':
551 s = " \\a";
552 break;
554 case '\b':
555 s = " \\b";
556 break;
558 case '\f':
559 s = " \\f";
560 break;
562 case '\n':
563 s = " \\n";
564 break;
566 case '\r':
567 s = " \\r";
568 break;
570 case '\t':
571 s = " \\t";
572 break;
574 case '\v':
575 s = " \\v";
576 break;
578 default:
579 sprintf (buf, (isprint (c) ? " %c" : "%03o"), c);
580 s = buf;
583 printf (" %3s", s);
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. */
595 static bool
596 simple_strtoul (const char *s, const char **p, unsigned long int *val)
598 unsigned long int sum;
600 sum = 0;
601 while (ISDIGIT (*s))
603 int c = *s++ - '0';
604 if (sum > (ULONG_MAX - c) / 10)
605 return false;
606 sum = sum * 10 + c;
608 *p = s;
609 *val = sum;
610 return true;
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
626 string argument.
629 static bool
630 decode_one_format (const char *s_orig, const char *s, const char **next,
631 struct tspec *tspec)
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 *);
638 const char *p;
639 char c;
640 int field_width;
641 int precision;
643 assert (tspec != NULL);
645 switch (*s)
647 case 'd':
648 case 'o':
649 case 'u':
650 case 'x':
651 c = *s;
652 ++s;
653 switch (*s)
655 case 'C':
656 ++s;
657 size = sizeof (char);
658 break;
660 case 'S':
661 ++s;
662 size = sizeof (short int);
663 break;
665 case 'I':
666 ++s;
667 size = sizeof (int);
668 break;
670 case 'L':
671 ++s;
672 size = sizeof (long int);
673 break;
675 default:
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));
682 return false;
684 if (p == s)
685 size = sizeof (int);
686 else
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);
693 return false;
695 s = p;
697 break;
700 #define ISPEC_TO_FORMAT(Spec, Min_format, Long_format, Max_format) \
701 ((Spec) == LONG_LONG ? (Max_format) \
702 : ((Spec) == LONG ? (Long_format) \
703 : (Min_format))) \
705 size_spec = integral_type_size[size];
707 switch (c)
709 case 'd':
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));
714 break;
716 case 'o':
717 fmt = OCTAL;
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));
721 break;
723 case 'u':
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));
728 break;
730 case 'x':
731 fmt = HEXADECIMAL;
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));
735 break;
737 default:
738 abort ();
741 assert (strlen (tspec->fmt_string) < FMT_BYTES_ALLOCATED);
743 switch (size_spec)
745 case CHAR:
746 print_function = (fmt == SIGNED_DECIMAL
747 ? print_s_char
748 : print_char);
749 break;
751 case SHORT:
752 print_function = (fmt == SIGNED_DECIMAL
753 ? print_s_short
754 : print_short);
755 break;
757 case INT:
758 print_function = print_int;
759 break;
761 case LONG:
762 print_function = print_long;
763 break;
765 case LONG_LONG:
766 print_function = print_long_long;
767 break;
769 default:
770 abort ();
772 break;
774 case 'f':
775 fmt = FLOATING_POINT;
776 ++s;
777 switch (*s)
779 case 'F':
780 ++s;
781 size = sizeof (float);
782 break;
784 case 'D':
785 ++s;
786 size = sizeof (double);
787 break;
789 case 'L':
790 ++s;
791 size = sizeof (LONG_DOUBLE);
792 break;
794 default:
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));
801 return false;
803 if (p == s)
804 size = sizeof (double);
805 else
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);
813 return false;
815 s = p;
817 break;
819 size_spec = fp_type_size[size];
821 switch (size_spec)
823 case FLOAT_SINGLE:
824 print_function = print_float;
825 /* Don't use %#e; not all systems support it. */
826 pre_fmt_string = " %%%d.%de";
827 precision = FLT_DIG;
828 break;
830 case FLOAT_DOUBLE:
831 print_function = print_double;
832 pre_fmt_string = " %%%d.%de";
833 precision = DBL_DIG;
834 break;
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;
841 break;
842 #endif
844 default:
845 abort ();
848 field_width = precision + 8;
849 sprintf (tspec->fmt_string, pre_fmt_string, field_width, precision);
850 break;
852 case 'a':
853 ++s;
854 fmt = NAMED_CHARACTER;
855 size_spec = CHAR;
856 print_function = print_named_ascii;
857 field_width = 3;
858 break;
860 case 'c':
861 ++s;
862 fmt = CHARACTER;
863 size_spec = CHAR;
864 print_function = print_ascii;
865 field_width = 3;
866 break;
868 default:
869 error (0, 0, _("invalid character `%c' in type string %s"),
870 *s, quote (s_orig));
871 return false;
874 tspec->size = size_spec;
875 tspec->fmt = fmt;
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)
881 s++;
883 if (next != NULL)
884 *next = s;
886 return true;
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. */
896 static bool
897 open_next_file (void)
899 bool ok = true;
903 input_filename = *file_list;
904 if (input_filename == NULL)
905 return ok;
906 ++file_list;
908 if (STREQ (input_filename, "-"))
910 input_filename = _("standard input");
911 in_stream = stdin;
912 have_read_stdin = true;
913 if (O_BINARY && ! isatty (STDIN_FILENO))
914 freopen (NULL, "rb", stdin);
916 else
918 in_stream = fopen (input_filename, (O_BINARY ? "rb" : "r"));
919 if (in_stream == NULL)
921 error (0, errno, "%s", input_filename);
922 ok = false;
926 while (in_stream == NULL);
928 if (limit_bytes_to_format & !flag_dump_strings)
929 SETVBUF (in_stream, NULL, _IONBF, 0);
931 return ok;
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. */
941 static bool
942 check_and_close (int in_errno)
944 bool ok = true;
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], "-"))
952 fclose (in_stream);
953 ok = false;
955 else if (! STREQ (file_list[-1], "-") && fclose (in_stream) != 0)
957 error (0, errno, "%s", input_filename);
958 ok = false;
961 in_stream = NULL;
964 if (ferror (stdout))
966 error (0, 0, _("write error"));
967 ok = false;
970 return ok;
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. */
977 static bool
978 decode_format_string (const char *s)
980 const char *s_orig = s;
981 assert (s != NULL);
983 while (*s != '\0')
985 const char *next;
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]))
991 return false;
993 assert (s != next);
994 s = next;
995 ++n_specs;
998 return true;
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. */
1008 static bool
1009 skip (uintmax_t n_skip)
1011 bool ok = true;
1012 int in_errno = 0;
1014 if (n_skip == 0)
1015 return true;
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;
1043 else
1045 if (fseeko (in_stream, n_skip, SEEK_CUR) != 0)
1047 in_errno = errno;
1048 ok = false;
1050 n_skip = 0;
1054 /* If it's not a regular file with nonnegative size,
1055 position the file pointer by reading. */
1057 else
1059 char buf[BUFSIZ];
1060 size_t n_bytes_read, n_bytes_to_read = BUFSIZ;
1062 while (0 < n_skip)
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)
1070 in_errno = errno;
1071 ok = false;
1072 n_skip = 0;
1073 break;
1078 if (n_skip == 0)
1079 break;
1082 else /* cannot fstat() file */
1084 error (0, errno, "%s", input_filename);
1085 ok = false;
1088 ok &= check_and_close (in_errno);
1090 ok &= open_next_file ();
1093 if (n_skip != 0)
1094 error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1096 return ok;
1099 static void
1100 format_address_none (uintmax_t address ATTRIBUTE_UNUSED, char c ATTRIBUTE_UNUSED)
1104 static void
1105 format_address_std (uintmax_t address, char c)
1107 char buf[MAX_ADDRESS_LENGTH + 2];
1108 char *p = buf + sizeof buf;
1109 char const *pbound;
1111 *--p = '\0';
1112 *--p = c;
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)
1119 case 8:
1121 *--p = '0' + (address & 7);
1122 while ((address >>= 3) != 0);
1123 break;
1125 case 10:
1127 *--p = '0' + (address % 10);
1128 while ((address /= 10) != 0);
1129 break;
1131 case 16:
1133 *--p = "0123456789abcdef"[address & 15];
1134 while ((address >>= 4) != 0);
1135 break;
1138 while (pbound < p)
1139 *--p = '0';
1141 fputs (p, stdout);
1144 static void
1145 format_address_paren (uintmax_t address, char c)
1147 putchar ('(');
1148 format_address_std (address, ')');
1149 if (c)
1150 putchar (c);
1153 static void
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. */
1171 static void
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. */
1189 else
1191 printf ("*\n");
1192 prev_pair_equal = true;
1195 else
1197 size_t i;
1199 prev_pair_equal = false;
1200 for (i = 0; i < n_specs; i++)
1202 if (i == 0)
1203 format_address (current_offset, '\0');
1204 else
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);
1216 putchar ('\n');
1219 first = false;
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. */
1233 static bool
1234 read_char (int *c)
1236 bool ok = true;
1238 *c = EOF;
1240 while (in_stream != NULL) /* EOF. */
1242 *c = fgetc (in_stream);
1244 if (*c != EOF)
1245 break;
1247 ok &= check_and_close (errno);
1249 ok &= open_next_file ();
1252 return ok;
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. */
1269 static bool
1270 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1272 bool ok = true;
1274 assert (0 < n && n <= bytes_per_block);
1276 *n_bytes_in_buffer = 0;
1278 if (n == 0)
1279 return true;
1281 while (in_stream != NULL) /* EOF. */
1283 size_t n_needed;
1284 size_t n_read;
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)
1292 break;
1294 ok &= check_and_close (errno);
1296 ok &= open_next_file ();
1299 return ok;
1302 /* Return the least common multiple of the sizes associated
1303 with the format specs. */
1305 static int
1306 get_lcm (void)
1308 size_t i;
1309 int l_c_m = 1;
1311 for (i = 0; i < n_specs; i++)
1312 l_c_m = lcm (l_c_m, width_bytes[spec[i].size]);
1313 return l_c_m;
1316 /* If S is a valid traditional offset specification with an optional
1317 leading '+' return true and set *OFFSET to the offset it denotes. */
1319 static bool
1320 parse_old_offset (const char *s, uintmax_t *offset)
1322 int radix;
1324 if (*s == '\0')
1325 return false;
1327 /* Skip over any leading '+'. */
1328 if (s[0] == '+')
1329 ++s;
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)
1335 radix = 10;
1336 else
1338 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1339 radix = 16;
1340 else
1341 radix = 8;
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. */
1359 static bool
1360 dump (void)
1362 char *block[2];
1363 uintmax_t current_offset;
1364 bool idx = false;
1365 bool ok = true;
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)
1375 while (1)
1377 size_t n_needed;
1378 if (current_offset >= end_offset)
1380 n_bytes_read = 0;
1381 break;
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)
1387 break;
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;
1392 idx = !idx;
1395 else
1397 while (1)
1399 ok &= read_block (bytes_per_block, block[idx], &n_bytes_read);
1400 if (n_bytes_read < bytes_per_block)
1401 break;
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;
1406 idx = !idx;
1410 if (n_bytes_read > 0)
1412 int l_c_m;
1413 size_t bytes_to_write;
1415 l_c_m = get_lcm ();
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);
1432 free (block[0]);
1434 return ok;
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. */
1443 static bool
1444 dump_strings (void)
1446 size_t bufsize = MAX (100, string_min);
1447 char *buf = xmalloc (bufsize);
1448 uintmax_t address = n_bytes_to_skip;
1449 bool ok = true;
1451 while (1)
1453 size_t i;
1454 int c;
1456 /* See if the next `string_min' chars are all printing chars. */
1457 tryline:
1459 if (limit_bytes_to_format
1460 && (end_offset < string_min || end_offset - string_min <= address))
1461 break;
1463 for (i = 0; i < string_min; i++)
1465 ok &= read_char (&c);
1466 address++;
1467 if (c < 0)
1469 free (buf);
1470 return ok;
1472 if (! isprint (c))
1473 /* Found a non-printing. Try again starting with next char. */
1474 goto tryline;
1475 buf[i] = c;
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)
1482 if (i == bufsize)
1484 buf = X2REALLOC (buf, &bufsize);
1486 ok &= read_char (&c);
1487 address++;
1488 if (c < 0)
1490 free (buf);
1491 return ok;
1493 if (c == '\0')
1494 break; /* It is; print this string. */
1495 if (! isprint (c))
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. */
1502 buf[i] = 0;
1503 format_address (address - i - 1, ' ');
1505 for (i = 0; (c = buf[i]); i++)
1507 switch (c)
1509 case '\a':
1510 fputs ("\\a", stdout);
1511 break;
1513 case '\b':
1514 fputs ("\\b", stdout);
1515 break;
1517 case '\f':
1518 fputs ("\\f", stdout);
1519 break;
1521 case '\n':
1522 fputs ("\\n", stdout);
1523 break;
1525 case '\r':
1526 fputs ("\\r", stdout);
1527 break;
1529 case '\t':
1530 fputs ("\\t", stdout);
1531 break;
1533 case '\v':
1534 fputs ("\\v", stdout);
1535 break;
1537 default:
1538 putc (c, stdout);
1541 putchar ('\n');
1544 /* We reach this point only if we search through
1545 (max_bytes_to_format - string_min) bytes before reaching EOF. */
1547 free (buf);
1549 ok &= check_and_close (0);
1550 return ok;
1554 main (int argc, char **argv)
1556 int c;
1557 int n_files;
1558 size_t i;
1559 int l_c_m;
1560 size_t desired_width IF_LINT (= 0);
1561 bool modern = false;
1562 bool width_specified = false;
1563 bool ok = true;
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_INT
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;
1588 #endif
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;
1600 n_specs = 0;
1601 n_specs_allocated = 0;
1602 spec = NULL;
1604 format_address = format_address_std;
1605 address_base = 8;
1606 address_pad_len = 7;
1607 flag_dump_strings = false;
1609 while ((c = getopt_long (argc, argv, short_options, long_options, NULL))
1610 != -1)
1612 uintmax_t tmp;
1613 enum strtol_error s_err;
1615 switch (c)
1617 case 'A':
1618 modern = true;
1619 switch (optarg[0])
1621 case 'd':
1622 format_address = format_address_std;
1623 address_base = 10;
1624 address_pad_len = 7;
1625 break;
1626 case 'o':
1627 format_address = format_address_std;
1628 address_base = 8;
1629 address_pad_len = 7;
1630 break;
1631 case 'x':
1632 format_address = format_address_std;
1633 address_base = 16;
1634 address_pad_len = 6;
1635 break;
1636 case 'n':
1637 format_address = format_address_none;
1638 address_pad_len = 0;
1639 break;
1640 default:
1641 error (EXIT_FAILURE, 0,
1642 _("invalid output address radix `%c'; \
1643 it must be one character from [doxn]"),
1644 optarg[0]);
1645 break;
1647 break;
1649 case 'j':
1650 modern = true;
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);
1654 break;
1656 case 'N':
1657 modern = true;
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);
1663 break;
1665 case 'S':
1666 modern = true;
1667 if (optarg == NULL)
1668 string_min = 3;
1669 else
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. */
1677 if (SIZE_MAX < tmp)
1678 error (EXIT_FAILURE, 0, _("%s is too large"), optarg);
1680 string_min = tmp;
1682 flag_dump_strings = true;
1683 break;
1685 case 't':
1686 modern = true;
1687 ok &= decode_format_string (optarg);
1688 break;
1690 case 'v':
1691 modern = true;
1692 abbreviate_duplicate_blocks = false;
1693 break;
1695 case TRADITIONAL_OPTION:
1696 traditional = true;
1697 break;
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) \
1707 case old_char: \
1708 ok &= decode_format_string (new_string); \
1709 break
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");
1731 #undef CASE_OLD_ARG
1733 case 'w':
1734 modern = true;
1735 width_specified = true;
1736 if (optarg == NULL)
1738 desired_width = 32;
1740 else
1742 uintmax_t w_tmp;
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;
1750 break;
1752 case_GETOPT_HELP_CHAR;
1754 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1756 default:
1757 usage (EXIT_FAILURE);
1758 break;
1762 if (!ok)
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
1773 separately.
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)
1785 uintmax_t o1;
1786 uintmax_t o2;
1788 switch (n_files)
1790 case 1:
1791 if ((traditional || argv[optind][0] == '+')
1792 && parse_old_offset (argv[optind], &o1))
1794 n_bytes_to_skip = o1;
1795 --n_files;
1796 ++argv;
1798 break;
1800 case 2:
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;
1809 pseudo_start = o2;
1810 argv += 2;
1811 n_files -= 2;
1813 else
1815 n_bytes_to_skip = o2;
1816 --n_files;
1817 argv[optind + 1] = argv[optind];
1818 ++argv;
1821 break;
1823 case 3:
1824 if (traditional
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;
1830 pseudo_start = o2;
1831 argv[optind + 2] = argv[optind];
1832 argv += 2;
1833 n_files -= 2;
1835 break;
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)
1851 address_base = 8;
1852 address_pad_len = 7;
1853 format_address = format_address_paren;
1855 else
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"));
1866 if (n_specs == 0)
1867 decode_format_string ("oS");
1869 if (n_files > 0)
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];
1876 else
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)
1888 goto cleanup;
1890 /* skip over any unwanted header bytes */
1891 ok &= skip (n_bytes_to_skip);
1892 if (in_stream == NULL)
1893 goto cleanup;
1895 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1897 /* Compute output block length. */
1898 l_c_m = get_lcm ();
1900 if (width_specified)
1902 if (desired_width != 0 && desired_width % l_c_m == 0)
1903 bytes_per_block = desired_width;
1904 else
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;
1911 else
1913 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1914 bytes_per_block = l_c_m * (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1915 else
1916 bytes_per_block = l_c_m;
1919 #ifdef DEBUG
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]);
1925 #endif
1927 ok &= (flag_dump_strings ? dump_strings () : dump ());
1929 cleanup:;
1931 if (have_read_stdin && fclose (stdin) == EOF)
1932 error (EXIT_FAILURE, errno, _("standard input"));
1934 exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);