*** empty log message ***
[coreutils.git] / src / od.c
blob3a356b3bb83f99609d38ead43f84586a8cc494c4
1 /* od -- dump files in octal and other formats
2 Copyright (C) 92, 1995-1999 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 "xstrtol.h"
30 /* The official name of this program (e.g., no `g' prefix). */
31 #define PROGRAM_NAME "od"
33 #define AUTHORS "Jim Meyering"
35 #if defined(__GNUC__) || defined(STDC_HEADERS)
36 # include <float.h>
37 #endif
39 #ifdef HAVE_LONG_DOUBLE
40 typedef long double LONG_DOUBLE;
41 #else
42 typedef double LONG_DOUBLE;
43 #endif
45 #if HAVE_VALUES_H
46 # include <values.h>
47 #endif
49 /* The default number of input bytes per output line. */
50 #define DEFAULT_BYTES_PER_BLOCK 16
52 /* The number of decimal digits of precision in a float. */
53 #ifndef FLT_DIG
54 # define FLT_DIG 7
55 #endif
57 /* The number of decimal digits of precision in a double. */
58 #ifndef DBL_DIG
59 # define DBL_DIG 15
60 #endif
62 /* The number of decimal digits of precision in a long double. */
63 #ifndef LDBL_DIG
64 # define LDBL_DIG DBL_DIG
65 #endif
67 #if !HAVE_FSEEKO
68 # undef fseeko
69 # define fseeko(Stream, Offset, Whence) (-1)
70 #endif
72 enum size_spec
74 NO_SIZE,
75 CHAR,
76 SHORT,
77 INT,
78 LONG,
79 FLOAT_SINGLE,
80 FLOAT_DOUBLE,
81 FLOAT_LONG_DOUBLE
84 enum output_format
86 SIGNED_DECIMAL,
87 UNSIGNED_DECIMAL,
88 OCTAL,
89 HEXADECIMAL,
90 FLOATING_POINT,
91 NAMED_CHARACTER,
92 CHARACTER
95 /* Each output format specification (from POSIX `-t spec' or from
96 old-style options) is represented by one of these structures. */
97 struct tspec
99 enum output_format fmt;
100 enum size_spec size;
101 void (*print_function) ();
102 char *fmt_string;
103 int hexl_mode_trailer;
104 int field_width;
107 /* The name this program was run with. */
108 char *program_name;
110 /* Convert the number of 8-bit bytes of a binary representation to
111 the number of characters (digits + sign if the type is signed)
112 required to represent the same quantity in the specified base/type.
113 For example, a 32-bit (4-byte) quantity may require a field width
114 as wide as the following for these types:
115 11 unsigned octal
116 11 signed decimal
117 10 unsigned decimal
118 8 unsigned hexadecimal */
120 static const unsigned int bytes_to_oct_digits[] =
121 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
123 static const unsigned int bytes_to_signed_dec_digits[] =
124 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
126 static const unsigned int bytes_to_unsigned_dec_digits[] =
127 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
129 static const unsigned int bytes_to_hex_digits[] =
130 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
132 /* Convert enum size_spec to the size of the named type. */
133 static const int width_bytes[] =
136 sizeof (char),
137 sizeof (short int),
138 sizeof (int),
139 sizeof (long int),
140 sizeof (float),
141 sizeof (double),
142 sizeof (LONG_DOUBLE)
145 /* Names for some non-printing characters. */
146 static const char *const charname[33] =
148 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
149 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
150 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
151 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
152 "sp"
155 /* A printf control string for printing a file offset. */
156 static const char *output_address_fmt_string;
158 /* FIXME: make this the number of octal digits in an unsigned long. */
159 #define MAX_ADDRESS_LENGTH 13
161 /* Space for a normal address, a space, a pseudo address, parentheses
162 around the pseudo address, and a trailing zero byte. */
163 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
164 static char address_pad[MAX_ADDRESS_LENGTH + 1];
166 static unsigned long int string_min;
167 static unsigned long int flag_dump_strings;
169 /* Non-zero if we should recognize the pre-POSIX non-option arguments
170 that specified at most one file and optional arguments specifying
171 offset and pseudo-start address. */
172 static int traditional;
174 /* Non-zero if an old-style `pseudo-address' was specified. */
175 static long int flag_pseudo_start;
177 /* The difference between the old-style pseudo starting address and
178 the number of bytes to skip. */
179 static long int pseudo_offset;
181 /* Function to format an address and optionally an additional parenthesized
182 pseudo-address; it returns the formatted string. */
183 static const char *(*format_address) PARAMS ((long unsigned int));
185 /* The number of input bytes to skip before formatting and writing. */
186 static off_t n_bytes_to_skip = 0;
188 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
189 to be read and formatted. Otherwise all input is formatted. */
190 static int limit_bytes_to_format = 0;
192 /* The maximum number of bytes that will be formatted. This
193 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
194 static off_t max_bytes_to_format;
196 /* When nonzero and two or more consecutive blocks are equal, format
197 only the first block and output an asterisk alone on the following
198 line to indicate that identical blocks have been elided. */
199 static int abbreviate_duplicate_blocks = 1;
201 /* An array of specs describing how to format each input block. */
202 static struct tspec *spec;
204 /* The number of format specs. */
205 static unsigned int n_specs;
207 /* The allocated length of SPEC. */
208 static unsigned int n_specs_allocated;
210 /* The number of input bytes formatted per output line. It must be
211 a multiple of the least common multiple of the sizes associated with
212 the specified output types. It should be as large as possible, but
213 no larger than 16 -- unless specified with the -w option. */
214 static unsigned int bytes_per_block;
216 /* Human-readable representation of *file_list (for error messages).
217 It differs from *file_list only when *file_list is "-". */
218 static char const *input_filename;
220 /* A NULL-terminated list of the file-arguments from the command line.
221 If no file-arguments were specified, this variable is initialized
222 to { "-", NULL }. */
223 static char const *const *file_list;
225 /* The input stream associated with the current file. */
226 static FILE *in_stream;
228 /* If nonzero, at least one of the files we read was standard input. */
229 static int have_read_stdin;
231 #define LONGEST_INTEGRAL_TYPE long int
233 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
234 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
236 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
237 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
239 static struct option const long_options[] =
241 /* POSIX options. */
242 {"skip-bytes", required_argument, NULL, 'j'},
243 {"address-radix", required_argument, NULL, 'A'},
244 {"read-bytes", required_argument, NULL, 'N'},
245 {"format", required_argument, NULL, 't'},
246 {"output-duplicates", no_argument, NULL, 'v'},
248 /* non-POSIX options. */
249 {"strings", optional_argument, NULL, 's'},
250 {"traditional", no_argument, NULL, 'B'},
251 {"width", optional_argument, NULL, 'w'},
253 {GETOPT_HELP_OPTION_DECL},
254 {GETOPT_VERSION_OPTION_DECL},
255 {NULL, 0, NULL, 0}
258 void
259 usage (int status)
261 if (status != 0)
262 fprintf (stderr, _("Try `%s --help' for more information.\n"),
263 program_name);
264 else
266 printf (_("\
267 Usage: %s [OPTION]... [FILE]...\n\
268 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
270 program_name, program_name);
271 printf (_("\
272 Write an unambiguous representation, octal bytes by default, of FILE\n\
273 to standard output. With no FILE, or when FILE is -, read standard input.\n\
275 -A, --address-radix=RADIX decide how file offsets are printed\n\
276 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
277 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
278 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
279 -t, --format=TYPE select output format or formats\n\
280 -v, --output-duplicates do not use * to mark line suppression\n\
281 -w, --width[=BYTES] output BYTES bytes per output line\n\
282 --traditional accept arguments in pre-POSIX form\n\
283 --help display this help and exit\n\
284 --version output version information and exit\n\
286 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
287 -a same as -t a, select named characters\n\
288 -b same as -t oC, select octal bytes\n\
289 -c same as -t c, select ASCII characters or backslash escapes\n\
290 -d same as -t u2, select unsigned decimal shorts\n\
291 -f same as -t fF, select floats\n\
292 -h same as -t x2, select hexadecimal shorts\n\
293 -i same as -t d2, select decimal shorts\n\
294 -l same as -t d4, select decimal longs\n\
295 -o same as -t o2, select octal shorts\n\
296 -x same as -t x2, select hexadecimal shorts\n\
297 "));
298 printf (_("\
300 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
301 is the pseudo-address at first byte printed, incremented when dump is\n\
302 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
303 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
305 TYPE is made up of one or more of these specifications:\n\
307 a named character\n\
308 c ASCII character or backslash escape\n\
309 d[SIZE] signed decimal, SIZE bytes per integer\n\
310 f[SIZE] floating point, SIZE bytes per integer\n\
311 o[SIZE] octal, SIZE bytes per integer\n\
312 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
313 x[SIZE] hexadecimal, SIZE bytes per integer\n\
315 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
316 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
317 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
318 for sizeof(double) or L for sizeof(long double).\n\
320 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
321 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
322 with b suffix, by 1024 with k and by 1048576 with m. Adding a z suffix to\n\
323 any type adds a display of printable characters to the end of each line\n\
324 of output. -s without a number implies 3. -w without a number implies 32.\n\
325 By default, od uses -A o -t d2 -w 16.\n\
326 "));
327 puts (_("\nReport bugs to <bug-textutils@gnu.org>."));
329 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
332 /* Compute the greatest common denominator of U and V
333 using Euclid's algorithm. */
335 static unsigned int
336 gcd (unsigned int u, unsigned int v)
338 unsigned int t;
339 while (v != 0)
341 t = u % v;
342 u = v;
343 v = t;
345 return u;
348 /* Compute the least common multiple of U and V. */
350 static unsigned int
351 lcm (unsigned int u, unsigned int v)
353 unsigned int t = gcd (u, v);
354 if (t == 0)
355 return 0;
356 return u * v / t;
359 static void
360 print_s_char (long unsigned int n_bytes, const char *block,
361 const char *fmt_string)
363 int i;
364 for (i = n_bytes; i > 0; i--)
366 int tmp = (unsigned) *(const unsigned char *) block;
367 if (tmp > SCHAR_MAX)
368 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
369 assert (tmp <= SCHAR_MAX);
370 printf (fmt_string, tmp);
371 block += sizeof (unsigned char);
375 static void
376 print_char (long unsigned int n_bytes, const char *block,
377 const char *fmt_string)
379 int i;
380 for (i = n_bytes; i > 0; i--)
382 unsigned int tmp = *(const unsigned char *) block;
383 printf (fmt_string, tmp);
384 block += sizeof (unsigned char);
388 static void
389 print_s_short (long unsigned int n_bytes, const char *block,
390 const char *fmt_string)
392 int i;
393 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
395 int tmp = (unsigned) *(const unsigned short *) block;
396 if (tmp > SHRT_MAX)
397 tmp -= SHRT_MAX - SHRT_MIN + 1;
398 assert (tmp <= SHRT_MAX);
399 printf (fmt_string, tmp);
400 block += sizeof (unsigned short);
404 static void
405 print_short (long unsigned int n_bytes, const char *block,
406 const char *fmt_string)
408 int i;
409 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
411 unsigned int tmp = *(const unsigned short *) block;
412 printf (fmt_string, tmp);
413 block += sizeof (unsigned short);
417 static void
418 print_int (long unsigned int n_bytes, const char *block,
419 const char *fmt_string)
421 int i;
422 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
424 unsigned int tmp = *(const unsigned int *) block;
425 printf (fmt_string, tmp);
426 block += sizeof (unsigned int);
430 static void
431 print_long (long unsigned int n_bytes, const char *block,
432 const char *fmt_string)
434 int i;
435 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
437 unsigned long tmp = *(const unsigned long *) block;
438 printf (fmt_string, tmp);
439 block += sizeof (unsigned long);
443 static void
444 print_float (long unsigned int n_bytes, const char *block,
445 const char *fmt_string)
447 int i;
448 for (i = n_bytes / sizeof (float); i > 0; i--)
450 float tmp = *(const float *) block;
451 printf (fmt_string, tmp);
452 block += sizeof (float);
456 static void
457 print_double (long unsigned int n_bytes, const char *block,
458 const char *fmt_string)
460 int i;
461 for (i = n_bytes / sizeof (double); i > 0; i--)
463 double tmp = *(const double *) block;
464 printf (fmt_string, tmp);
465 block += sizeof (double);
469 #ifdef HAVE_LONG_DOUBLE
470 static void
471 print_long_double (long unsigned int n_bytes, const char *block,
472 const char *fmt_string)
474 int i;
475 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
477 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
478 printf (fmt_string, tmp);
479 block += sizeof (LONG_DOUBLE);
483 #endif
485 static void
486 dump_hexl_mode_trailer (long unsigned int n_bytes, const char *block)
488 int i;
489 fputs (" >", stdout);
490 for (i = n_bytes; i > 0; i--)
492 unsigned int c = *(const unsigned char *) block;
493 unsigned int c2 = (ISPRINT(c) ? c : '.');
494 putchar (c2);
495 block += sizeof (unsigned char);
497 putchar ('<');
500 static void
501 print_named_ascii (long unsigned int n_bytes, const char *block,
502 const char *unused_fmt_string)
504 int i;
505 for (i = n_bytes; i > 0; i--)
507 unsigned int c = *(const unsigned char *) block;
508 unsigned int masked_c = (0x7f & c);
509 const char *s;
510 char buf[5];
512 if (masked_c == 127)
513 s = "del";
514 else if (masked_c <= 040)
515 s = charname[masked_c];
516 else
518 sprintf (buf, " %c", masked_c);
519 s = buf;
522 printf (" %3s", s);
523 block += sizeof (unsigned char);
527 static void
528 print_ascii (long unsigned int n_bytes, const char *block,
529 const char *unused_fmt_string)
531 int i;
532 for (i = n_bytes; i > 0; i--)
534 unsigned int c = *(const unsigned char *) block;
535 const char *s;
536 char buf[5];
538 switch (c)
540 case '\0':
541 s = " \\0";
542 break;
544 case '\007':
545 s = " \\a";
546 break;
548 case '\b':
549 s = " \\b";
550 break;
552 case '\f':
553 s = " \\f";
554 break;
556 case '\n':
557 s = " \\n";
558 break;
560 case '\r':
561 s = " \\r";
562 break;
564 case '\t':
565 s = " \\t";
566 break;
568 case '\v':
569 s = " \\v";
570 break;
572 default:
573 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
574 s = (const char *) buf;
577 printf (" %3s", s);
578 block += sizeof (unsigned char);
582 /* Convert a null-terminated (possibly zero-length) string S to an
583 unsigned long integer value. If S points to a non-digit set *P to S,
584 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
585 the string of digits. If the string of digits represents a value
586 larger than ULONG_MAX, don't modify *VAL or *P and return nonzero.
587 Otherwise, advance *P to the first non-digit after S, set *VAL to
588 the result of the conversion and return zero. */
590 static int
591 simple_strtoul (const char *s, const char **p, long unsigned int *val)
593 unsigned long int sum;
595 sum = 0;
596 while (ISDIGIT (*s))
598 unsigned int c = *s++ - '0';
599 if (sum > (ULONG_MAX - c) / 10)
600 return 1;
601 sum = sum * 10 + c;
603 *p = s;
604 *val = sum;
605 return 0;
608 /* If S points to a single valid POSIX-style od format string, put
609 a description of that format in *TSPEC, make *NEXT point at the
610 character following the just-decoded format (if *NEXT is non-NULL),
611 and return zero. If S is not valid, don't modify *NEXT or *TSPEC,
612 give a diagnostic, and return nonzero. For example, if S were
613 "d4afL" *NEXT would be set to "afL" and *TSPEC would be
615 fmt = SIGNED_DECIMAL;
616 size = INT or LONG; (whichever integral_type_size[4] resolves to)
617 print_function = print_int; (assuming size == INT)
618 fmt_string = "%011d%c";
620 S_ORIG is solely for reporting errors. It should be the full format
621 string argument.
624 static int
625 decode_one_format (const char *s_orig, const char *s, const char **next,
626 struct tspec *tspec)
628 enum size_spec size_spec;
629 unsigned long int size;
630 enum output_format fmt;
631 const char *pre_fmt_string;
632 char *fmt_string;
633 void (*print_function) ();
634 const char *p;
635 unsigned int c;
636 unsigned int field_width = 0;
638 assert (tspec != NULL);
640 switch (*s)
642 case 'd':
643 case 'o':
644 case 'u':
645 case 'x':
646 c = *s;
647 ++s;
648 switch (*s)
650 case 'C':
651 ++s;
652 size = sizeof (char);
653 break;
655 case 'S':
656 ++s;
657 size = sizeof (short);
658 break;
660 case 'I':
661 ++s;
662 size = sizeof (int);
663 break;
665 case 'L':
666 ++s;
667 size = sizeof (long int);
668 break;
670 default:
671 if (simple_strtoul (s, &p, &size) != 0)
673 /* The integer at P in S would overflow an unsigned long.
674 A digit string that long is sufficiently odd looking
675 that the following diagnostic is sufficient. */
676 error (0, 0, _("invalid type string `%s'"), s_orig);
677 return 1;
679 if (p == s)
680 size = sizeof (int);
681 else
683 if (size > MAX_INTEGRAL_TYPE_SIZE
684 || integral_type_size[size] == NO_SIZE)
686 error (0, 0, _("invalid type string `%s';\n\
687 this system doesn't provide a %lu-byte integral type"), s_orig, size);
688 return 1;
690 s = p;
692 break;
695 #define FMT_BYTES_ALLOCATED 9
696 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
698 size_spec = integral_type_size[size];
700 switch (c)
702 case 'd':
703 fmt = SIGNED_DECIMAL;
704 sprintf (fmt_string, " %%%u%sd",
705 (field_width = bytes_to_signed_dec_digits[size]),
706 (size_spec == LONG ? "l" : ""));
707 break;
709 case 'o':
710 fmt = OCTAL;
711 sprintf (fmt_string, " %%0%u%so",
712 (field_width = bytes_to_oct_digits[size]),
713 (size_spec == LONG ? "l" : ""));
714 break;
716 case 'u':
717 fmt = UNSIGNED_DECIMAL;
718 sprintf (fmt_string, " %%%u%su",
719 (field_width = bytes_to_unsigned_dec_digits[size]),
720 (size_spec == LONG ? "l" : ""));
721 break;
723 case 'x':
724 fmt = HEXADECIMAL;
725 sprintf (fmt_string, " %%0%u%sx",
726 (field_width = bytes_to_hex_digits[size]),
727 (size_spec == LONG ? "l" : ""));
728 break;
730 default:
731 abort ();
734 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
736 switch (size_spec)
738 case CHAR:
739 print_function = (fmt == SIGNED_DECIMAL
740 ? print_s_char
741 : print_char);
742 break;
744 case SHORT:
745 print_function = (fmt == SIGNED_DECIMAL
746 ? print_s_short
747 : print_short);
748 break;
750 case INT:
751 print_function = print_int;
752 break;
754 case LONG:
755 print_function = print_long;
756 break;
758 default:
759 abort ();
761 break;
763 case 'f':
764 fmt = FLOATING_POINT;
765 ++s;
766 switch (*s)
768 case 'F':
769 ++s;
770 size = sizeof (float);
771 break;
773 case 'D':
774 ++s;
775 size = sizeof (double);
776 break;
778 case 'L':
779 ++s;
780 size = sizeof (LONG_DOUBLE);
781 break;
783 default:
784 if (simple_strtoul (s, &p, &size) != 0)
786 /* The integer at P in S would overflow an unsigned long.
787 A digit string that long is sufficiently odd looking
788 that the following diagnostic is sufficient. */
789 error (0, 0, _("invalid type string `%s'"), s_orig);
790 return 1;
792 if (p == s)
793 size = sizeof (double);
794 else
796 if (size > MAX_FP_TYPE_SIZE
797 || fp_type_size[size] == NO_SIZE)
799 error (0, 0, _("invalid type string `%s';\n\
800 this system doesn't provide a %lu-byte floating point type"), s_orig, size);
801 return 1;
803 s = p;
805 break;
807 size_spec = fp_type_size[size];
809 switch (size_spec)
811 case FLOAT_SINGLE:
812 print_function = print_float;
813 /* Don't use %#e; not all systems support it. */
814 pre_fmt_string = " %%%d.%de";
815 fmt_string = xmalloc (strlen (pre_fmt_string));
816 sprintf (fmt_string, pre_fmt_string,
817 (field_width = FLT_DIG + 8), FLT_DIG);
818 break;
820 case FLOAT_DOUBLE:
821 print_function = print_double;
822 pre_fmt_string = " %%%d.%de";
823 fmt_string = xmalloc (strlen (pre_fmt_string));
824 sprintf (fmt_string, pre_fmt_string,
825 (field_width = DBL_DIG + 8), DBL_DIG);
826 break;
828 #ifdef HAVE_LONG_DOUBLE
829 case FLOAT_LONG_DOUBLE:
830 print_function = print_long_double;
831 pre_fmt_string = " %%%d.%dLe";
832 fmt_string = xmalloc (strlen (pre_fmt_string));
833 sprintf (fmt_string, pre_fmt_string,
834 (field_width = LDBL_DIG + 8), LDBL_DIG);
835 break;
836 #endif
838 default:
839 abort ();
841 break;
843 case 'a':
844 ++s;
845 fmt = NAMED_CHARACTER;
846 size_spec = CHAR;
847 fmt_string = NULL;
848 print_function = print_named_ascii;
849 field_width = 3;
850 break;
852 case 'c':
853 ++s;
854 fmt = CHARACTER;
855 size_spec = CHAR;
856 fmt_string = NULL;
857 print_function = print_ascii;
858 field_width = 3;
859 break;
861 default:
862 error (0, 0, _("invalid character `%c' in type string `%s'"),
863 *s, s_orig);
864 return 1;
867 tspec->size = size_spec;
868 tspec->fmt = fmt;
869 tspec->print_function = print_function;
870 tspec->fmt_string = fmt_string;
872 tspec->field_width = field_width;
873 tspec->hexl_mode_trailer = (*s == 'z');
874 if (tspec->hexl_mode_trailer)
875 s++;
877 if (next != NULL)
878 *next = s;
880 return 0;
883 /* Decode the POSIX-style od format string S. Append the decoded
884 representation to the global array SPEC, reallocating SPEC if
885 necessary. Return zero if S is valid, nonzero otherwise. */
887 static int
888 decode_format_string (const char *s)
890 const char *s_orig = s;
891 assert (s != NULL);
893 while (*s != '\0')
895 struct tspec tspec;
896 const char *next;
898 if (decode_one_format (s_orig, s, &next, &tspec))
899 return 1;
901 assert (s != next);
902 s = next;
904 if (n_specs >= n_specs_allocated)
906 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
907 spec = (struct tspec *) xrealloc ((char *) spec,
908 (n_specs_allocated
909 * sizeof (struct tspec)));
912 memcpy ((char *) &spec[n_specs], (char *) &tspec,
913 sizeof (struct tspec));
914 ++n_specs;
917 return 0;
920 /* Given a list of one or more input filenames FILE_LIST, set the global
921 file pointer IN_STREAM to position N_SKIP in the concatenation of
922 those files. If any file operation fails or if there are fewer than
923 N_SKIP bytes in the combined input, give an error message and return
924 nonzero. When possible, use seek- rather than read operations to
925 advance IN_STREAM. A file name of "-" is interpreted as standard
926 input. */
928 static int
929 skip (off_t n_skip)
931 int err;
933 err = 0;
934 for ( /* empty */ ; *file_list != NULL; ++file_list)
936 struct stat file_stats;
937 int j;
939 if (STREQ (*file_list, "-"))
941 input_filename = _("standard input");
942 in_stream = stdin;
943 have_read_stdin = 1;
945 else
947 input_filename = *file_list;
948 in_stream = fopen (input_filename, "r");
949 if (in_stream == NULL)
951 error (0, errno, "%s", input_filename);
952 err = 1;
953 continue;
956 SET_BINARY (fileno (in_stream));
958 if (n_skip == 0)
959 break;
961 /* First try using fseek. For large offsets, this extra work is
962 worthwhile. If the offset is below some threshold it may be
963 more efficient to move the pointer by reading. There are two
964 issues when trying to use fseek:
965 - the file must be seekable.
966 - before seeking to the specified position, make sure
967 that the new position is in the current file.
968 Try to do that by getting file's size using fstat().
969 But that will work only for regular files and dirs. */
971 if (fstat (fileno (in_stream), &file_stats))
973 error (0, errno, "%s", input_filename);
974 err = 1;
975 continue;
978 /* The st_size field is valid only for regular files and
979 directories. FIXME: is the preceding true?
980 If the number of bytes left to skip is at least as large as
981 the size of the current file, we can decrement
982 n_skip and go on to the next file. */
983 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
985 if (n_skip >= file_stats.st_size)
987 n_skip -= file_stats.st_size;
988 if (in_stream != stdin && fclose (in_stream) == EOF)
990 error (0, errno, "%s", input_filename);
991 err = 1;
993 continue;
995 else
997 /* Try fseeko if available, fseek otherwise. */
998 if (fseeko (in_stream, n_skip, SEEK_SET) == 0
999 || (n_skip <= LONG_MAX
1000 && fseek (in_stream, (long) n_skip, SEEK_SET) == 0))
1002 n_skip = 0;
1003 break;
1008 /* Seek didn't work or wasn't attempted; position the file pointer
1009 by reading. */
1011 for (j = n_skip / BUFSIZ; j >= 0; j--)
1013 char buf[BUFSIZ];
1014 size_t n_bytes_to_read = (j > 0
1015 ? BUFSIZ
1016 : n_skip % BUFSIZ);
1017 size_t n_bytes_read;
1018 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1019 n_skip -= n_bytes_read;
1020 if (n_bytes_read != n_bytes_to_read)
1021 break;
1024 if (n_skip == 0)
1025 break;
1028 if (n_skip != 0)
1029 error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1031 return err;
1034 static const char *
1035 format_address_none (long unsigned int address)
1037 return "";
1040 static const char *
1041 format_address_std (long unsigned int address)
1043 const char *address_string;
1045 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1046 address_string = address_fmt_buffer;
1047 return address_string;
1050 static const char *
1051 format_address_label (long unsigned int address)
1053 const char *address_string;
1054 assert (output_address_fmt_string != NULL);
1056 sprintf (address_fmt_buffer, output_address_fmt_string,
1057 address, address + pseudo_offset);
1058 address_string = address_fmt_buffer;
1059 return address_string;
1062 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1063 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1064 CURR_BLOCK in the concatenation of input files, and it is printed
1065 (optionally) only before the output line associated with the first
1066 format spec. When duplicate blocks are being abbreviated, the output
1067 for a sequence of identical input blocks is the output for the first
1068 block followed by an asterisk alone on a line. It is valid to compare
1069 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1070 That condition may be false only for the last input block -- and then
1071 only when it has not been padded to length BYTES_PER_BLOCK. */
1073 static void
1074 write_block (long unsigned int current_offset, long unsigned int n_bytes,
1075 const char *prev_block, const char *curr_block)
1077 static int first = 1;
1078 static int prev_pair_equal = 0;
1080 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1082 if (abbreviate_duplicate_blocks
1083 && !first && n_bytes == bytes_per_block
1084 && EQUAL_BLOCKS (prev_block, curr_block))
1086 if (prev_pair_equal)
1088 /* The two preceding blocks were equal, and the current
1089 block is the same as the last one, so print nothing. */
1091 else
1093 printf ("*\n");
1094 prev_pair_equal = 1;
1097 else
1099 unsigned int i;
1101 prev_pair_equal = 0;
1102 for (i = 0; i < n_specs; i++)
1104 const char *addr_or_pad = (i == 0
1105 ? format_address (current_offset)
1106 : address_pad);
1108 fputs (addr_or_pad, stdout);
1109 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1110 if (spec[i].hexl_mode_trailer)
1112 /* space-pad out to full line width, then dump the trailer */
1113 int datum_width = width_bytes[spec[i].size];
1114 int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1115 int field_width = spec[i].field_width + 1;
1116 printf ("%*s", blank_fields * field_width, "");
1117 dump_hexl_mode_trailer (n_bytes, curr_block);
1119 putchar ('\n');
1122 first = 0;
1125 /* Test whether there have been errors on in_stream, and close it if
1126 it is not standard input. Return nonzero if there has been an error
1127 on in_stream or stdout; return zero otherwise. This function will
1128 report more than one error only if both a read and a write error
1129 have occurred. */
1131 static int
1132 check_and_close (void)
1134 int err;
1136 err = 0;
1137 if (ferror (in_stream))
1139 error (0, errno, "%s", input_filename);
1140 if (in_stream != stdin)
1141 fclose (in_stream);
1142 err = 1;
1144 else if (in_stream != stdin && fclose (in_stream) == EOF)
1146 error (0, errno, "%s", input_filename);
1147 err = 1;
1150 if (ferror (stdout))
1152 error (0, errno, _("standard output"));
1153 err = 1;
1156 return err;
1159 /* Read a single byte into *C from the concatenation of the input files
1160 named in the global array FILE_LIST. On the first call to this
1161 function, the global variable IN_STREAM is expected to be an open
1162 stream associated with the input file *FILE_LIST. If IN_STREAM is
1163 at end-of-file, close it and update the global variables IN_STREAM,
1164 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1165 the list. Then try to read a byte from the newly opened file.
1166 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1167 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1168 calls do likewise. The return value is nonzero if any errors
1169 occured, zero otherwise. */
1171 static int
1172 read_char (int *c)
1174 int err;
1176 if (*file_list == NULL)
1178 *c = EOF;
1179 return 0;
1182 err = 0;
1183 while (1)
1185 *c = fgetc (in_stream);
1187 if (*c != EOF)
1188 return err;
1190 err |= check_and_close ();
1194 ++file_list;
1195 if (*file_list == NULL)
1196 return err;
1198 if (STREQ (*file_list, "-"))
1200 input_filename = _("standard input");
1201 in_stream = stdin;
1202 have_read_stdin = 1;
1204 else
1206 input_filename = *file_list;
1207 in_stream = fopen (input_filename, "r");
1208 if (in_stream == NULL)
1210 error (0, errno, "%s", input_filename);
1211 err = 1;
1214 SET_BINARY (fileno (in_stream));
1216 while (in_stream == NULL);
1220 /* Read N bytes into BLOCK from the concatenation of the input files
1221 named in the global array FILE_LIST. On the first call to this
1222 function, the global variable IN_STREAM is expected to be an open
1223 stream associated with the input file *FILE_LIST. On subsequent
1224 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1225 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1226 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1227 Then try to read the remaining bytes from the newly opened file.
1228 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1229 to the number of bytes read. If an error occurs, it will be detected
1230 through ferror when the stream is about to be closed. If there is an
1231 error, give a message but continue reading as usual and return nonzero.
1232 Otherwise return zero. */
1234 static int
1235 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1237 int err;
1239 assert (n > 0 && n <= bytes_per_block);
1241 *n_bytes_in_buffer = 0;
1243 if (n == 0)
1244 return 0;
1246 if (*file_list == NULL)
1247 return 0; /* EOF. */
1249 err = 0;
1250 while (1)
1252 size_t n_needed;
1253 size_t n_read;
1255 n_needed = n - *n_bytes_in_buffer;
1256 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1258 *n_bytes_in_buffer += n_read;
1260 if (n_read == n_needed)
1261 return err;
1263 err |= check_and_close ();
1267 ++file_list;
1268 if (*file_list == NULL)
1269 return err;
1271 if (STREQ (*file_list, "-"))
1273 input_filename = _("standard input");
1274 in_stream = stdin;
1275 have_read_stdin = 1;
1277 else
1279 input_filename = *file_list;
1280 in_stream = fopen (input_filename, "r");
1281 if (in_stream == NULL)
1283 error (0, errno, "%s", input_filename);
1284 err = 1;
1287 SET_BINARY (fileno (in_stream));
1289 while (in_stream == NULL);
1293 /* Return the least common multiple of the sizes associated
1294 with the format specs. */
1296 static int
1297 get_lcm (void)
1299 unsigned int i;
1300 int l_c_m = 1;
1302 for (i = 0; i < n_specs; i++)
1303 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1304 return l_c_m;
1307 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1308 return the offset it denotes. Otherwise, return -1. */
1310 off_t
1311 parse_old_offset (const char *s)
1313 int radix;
1314 off_t offset;
1315 enum strtol_error s_err;
1316 long unsigned int tmp;
1318 if (*s == '\0')
1319 return -1;
1321 /* Skip over any leading '+'. */
1322 if (s[0] == '+')
1323 ++s;
1325 /* Determine the radix we'll use to interpret S. If there is a `.',
1326 it's decimal, otherwise, if the string begins with `0X'or `0x',
1327 it's hexadecimal, else octal. */
1328 if (strchr (s, '.') != NULL)
1329 radix = 10;
1330 else
1332 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1333 radix = 16;
1334 else
1335 radix = 8;
1338 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1339 if (s_err != LONGINT_OK)
1341 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1342 return -1;
1344 offset = tmp;
1345 return offset;
1348 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1349 formatted block to standard output, and repeat until the specified
1350 maximum number of bytes has been read or until all input has been
1351 processed. If the last block read is smaller than BYTES_PER_BLOCK
1352 and its size is not a multiple of the size associated with a format
1353 spec, extend the input block with zero bytes until its length is a
1354 multiple of all format spec sizes. Write the final block. Finally,
1355 write on a line by itself the offset of the byte after the last byte
1356 read. Accumulate return values from calls to read_block and
1357 check_and_close, and if any was nonzero, return nonzero.
1358 Otherwise, return zero. */
1360 static int
1361 dump (void)
1363 char *block[2];
1364 off_t current_offset;
1365 off_t end_offset;
1366 int idx;
1367 int err;
1368 size_t n_bytes_read;
1370 #ifdef lint /* Suppress `used before initialized' warning. */
1371 end_offset = 0;
1372 #endif
1374 block[0] = (char *) alloca (bytes_per_block);
1375 block[1] = (char *) alloca (bytes_per_block);
1377 current_offset = n_bytes_to_skip;
1379 idx = 0;
1380 err = 0;
1381 if (limit_bytes_to_format)
1383 end_offset = n_bytes_to_skip + max_bytes_to_format;
1385 while (1)
1387 size_t n_needed;
1388 if (current_offset >= end_offset)
1390 n_bytes_read = 0;
1391 break;
1393 n_needed = MIN (end_offset - current_offset,
1394 (off_t) bytes_per_block);
1395 err |= read_block (n_needed, block[idx], &n_bytes_read);
1396 if (n_bytes_read < bytes_per_block)
1397 break;
1398 assert (n_bytes_read == bytes_per_block);
1399 write_block (current_offset, n_bytes_read,
1400 block[!idx], block[idx]);
1401 current_offset += n_bytes_read;
1402 idx = !idx;
1405 else
1407 while (1)
1409 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1410 if (n_bytes_read < bytes_per_block)
1411 break;
1412 assert (n_bytes_read == bytes_per_block);
1413 write_block (current_offset, n_bytes_read,
1414 block[!idx], block[idx]);
1415 current_offset += n_bytes_read;
1416 idx = !idx;
1420 if (n_bytes_read > 0)
1422 int l_c_m;
1423 size_t bytes_to_write;
1425 l_c_m = get_lcm ();
1427 /* Make bytes_to_write the smallest multiple of l_c_m that
1428 is at least as large as n_bytes_read. */
1429 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1431 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1432 write_block (current_offset, bytes_to_write,
1433 block[!idx], block[idx]);
1434 current_offset += n_bytes_read;
1437 if (output_address_fmt_string != NULL)
1438 printf ("%s\n", format_address (current_offset));
1440 if (limit_bytes_to_format && current_offset > end_offset)
1441 err |= check_and_close ();
1443 return err;
1446 /* STRINGS mode. Find each "string constant" in the input.
1447 A string constant is a run of at least `string_min' ASCII
1448 graphic (or formatting) characters terminated by a null.
1449 Based on a function written by Richard Stallman for a
1450 pre-POSIX version of od. Return nonzero if an error
1451 occurs. Otherwise, return zero. */
1453 static int
1454 dump_strings (void)
1456 size_t bufsize = MAX (100, string_min);
1457 char *buf = xmalloc (bufsize);
1458 off_t address = n_bytes_to_skip;
1459 int err;
1461 err = 0;
1462 while (1)
1464 unsigned int i;
1465 int c;
1467 /* See if the next `string_min' chars are all printing chars. */
1468 tryline:
1470 if (limit_bytes_to_format
1471 && address >= (n_bytes_to_skip + max_bytes_to_format -
1472 (off_t) string_min))
1473 break;
1475 for (i = 0; i < string_min; i++)
1477 err |= read_char (&c);
1478 address++;
1479 if (c < 0)
1481 free (buf);
1482 return err;
1484 if (!ISPRINT (c))
1485 /* Found a non-printing. Try again starting with next char. */
1486 goto tryline;
1487 buf[i] = c;
1490 /* We found a run of `string_min' printable characters.
1491 Now see if it is terminated with a null byte. */
1492 while (!limit_bytes_to_format
1493 || address < n_bytes_to_skip + max_bytes_to_format)
1495 if (i == bufsize)
1497 bufsize = 1 + 3 * bufsize / 2;
1498 buf = xrealloc (buf, bufsize);
1500 err |= read_char (&c);
1501 address++;
1502 if (c < 0)
1504 free (buf);
1505 return err;
1507 if (c == '\0')
1508 break; /* It is; print this string. */
1509 if (!ISPRINT (c))
1510 goto tryline; /* It isn't; give up on this string. */
1511 buf[i++] = c; /* String continues; store it all. */
1514 /* If we get here, the string is all printable and null-terminated,
1515 so print it. It is all in `buf' and `i' is its length. */
1516 buf[i] = 0;
1517 if (output_address_fmt_string != NULL)
1519 printf ("%s ", format_address (address - i - 1));
1521 for (i = 0; (c = buf[i]); i++)
1523 switch (c)
1525 case '\007':
1526 fputs ("\\a", stdout);
1527 break;
1529 case '\b':
1530 fputs ("\\b", stdout);
1531 break;
1533 case '\f':
1534 fputs ("\\f", stdout);
1535 break;
1537 case '\n':
1538 fputs ("\\n", stdout);
1539 break;
1541 case '\r':
1542 fputs ("\\r", stdout);
1543 break;
1545 case '\t':
1546 fputs ("\\t", stdout);
1547 break;
1549 case '\v':
1550 fputs ("\\v", stdout);
1551 break;
1553 default:
1554 putc (c, stdout);
1557 putchar ('\n');
1560 /* We reach this point only if we search through
1561 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1563 free (buf);
1565 err |= check_and_close ();
1566 return err;
1570 main (int argc, char **argv)
1572 int c;
1573 int n_files;
1574 unsigned int i;
1575 unsigned int l_c_m;
1576 unsigned int address_pad_len;
1577 unsigned long int desired_width;
1578 int width_specified = 0;
1579 int n_failed_decodes = 0;
1580 int err;
1582 /* The old-style `pseudo starting address' to be printed in parentheses
1583 after any true address. */
1584 long int pseudo_start;
1586 #ifdef lint /* Suppress `used before initialized' warning. */
1587 pseudo_start = 0;
1588 #endif
1590 program_name = argv[0];
1591 setlocale (LC_ALL, "");
1592 bindtextdomain (PACKAGE, LOCALEDIR);
1593 textdomain (PACKAGE);
1595 err = 0;
1597 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1598 integral_type_size[i] = NO_SIZE;
1600 integral_type_size[sizeof (char)] = CHAR;
1601 integral_type_size[sizeof (short int)] = SHORT;
1602 integral_type_size[sizeof (int)] = INT;
1603 integral_type_size[sizeof (long int)] = LONG;
1605 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1606 fp_type_size[i] = NO_SIZE;
1608 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1609 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1610 so that if `long double' is the same type or if long double isn't
1611 supported FLOAT_LONG_DOUBLE will never be used. */
1612 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1613 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1615 n_specs = 0;
1616 n_specs_allocated = 5;
1617 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1619 output_address_fmt_string = "%07o";
1620 format_address = format_address_std;
1621 address_pad_len = 7;
1622 flag_dump_strings = 0;
1624 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1625 long_options, NULL)) != -1)
1627 unsigned long int tmp;
1628 enum strtol_error s_err;
1630 switch (c)
1632 case 0:
1633 break;
1635 case 'A':
1636 switch (optarg[0])
1638 case 'd':
1639 output_address_fmt_string = "%07d";
1640 format_address = format_address_std;
1641 address_pad_len = 7;
1642 break;
1643 case 'o':
1644 output_address_fmt_string = "%07o";
1645 format_address = format_address_std;
1646 address_pad_len = 7;
1647 break;
1648 case 'x':
1649 output_address_fmt_string = "%06x";
1650 format_address = format_address_std;
1651 address_pad_len = 6;
1652 break;
1653 case 'n':
1654 output_address_fmt_string = NULL;
1655 format_address = format_address_none;
1656 address_pad_len = 0;
1657 break;
1658 default:
1659 error (EXIT_FAILURE, 0,
1660 _("invalid output address radix `%c'; \
1661 it must be one character from [doxn]"),
1662 optarg[0]);
1663 break;
1665 break;
1667 case 'j':
1668 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1669 n_bytes_to_skip = tmp;
1670 if (s_err != LONGINT_OK)
1671 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1672 break;
1674 case 'N':
1675 limit_bytes_to_format = 1;
1677 /* FIXME: if off_t is long long and that's an 8-byte type,
1678 use xstrtouq here. */
1679 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1680 max_bytes_to_format = tmp;
1681 if (s_err != LONGINT_OK)
1682 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1684 if (tmp > LONG_MAX)
1685 error (EXIT_FAILURE, 0,
1686 _("specified number of bytes `%s' is larger than \
1687 the maximum\nrepresentable value of type `long'"), optarg);
1688 break;
1690 case 's':
1691 if (optarg == NULL)
1692 string_min = 3;
1693 else
1695 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1696 if (s_err != LONGINT_OK)
1697 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1699 ++flag_dump_strings;
1700 break;
1702 case 't':
1703 if (decode_format_string (optarg))
1704 ++n_failed_decodes;
1705 break;
1707 case 'v':
1708 abbreviate_duplicate_blocks = 0;
1709 break;
1711 case 'B':
1712 traditional = 1;
1713 break;
1715 /* The next several cases map the old, pre-POSIX format
1716 specification options to the corresponding POSIX format
1717 specs. GNU od accepts any combination of old- and
1718 new-style options. Format specification options accumulate. */
1720 #define CASE_OLD_ARG(old_char,new_string) \
1721 case old_char: \
1723 if (decode_format_string (new_string)) \
1724 ++n_failed_decodes; \
1726 break
1728 CASE_OLD_ARG ('a', "a");
1729 CASE_OLD_ARG ('b', "oC");
1730 CASE_OLD_ARG ('c', "c");
1731 CASE_OLD_ARG ('d', "u2");
1732 CASE_OLD_ARG ('f', "fF");
1733 CASE_OLD_ARG ('h', "x2");
1734 CASE_OLD_ARG ('i', "d2");
1735 CASE_OLD_ARG ('l', "d4");
1736 CASE_OLD_ARG ('o', "o2");
1737 CASE_OLD_ARG ('x', "x2");
1739 #undef CASE_OLD_ARG
1741 case 'w':
1742 width_specified = 1;
1743 if (optarg == NULL)
1745 desired_width = 32;
1747 else
1749 s_err = xstrtoul (optarg, NULL, 10, &desired_width, "");
1750 if (s_err != LONGINT_OK)
1751 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1753 break;
1755 case_GETOPT_HELP_CHAR;
1757 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1759 default:
1760 usage (1);
1761 break;
1765 if (n_failed_decodes > 0)
1766 exit (EXIT_FAILURE);
1768 if (flag_dump_strings && n_specs > 0)
1769 error (EXIT_FAILURE, 0,
1770 _("no type may be specified when dumping strings"));
1772 n_files = argc - optind;
1774 /* If the --backward-compatible option is used, there may be from
1775 0 to 3 remaining command line arguments; handle each case
1776 separately.
1777 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1778 The offset and pseudo_start have the same syntax. */
1780 if (traditional)
1782 off_t offset;
1784 if (n_files == 1)
1786 if ((offset = parse_old_offset (argv[optind])) >= 0)
1788 n_bytes_to_skip = offset;
1789 --n_files;
1790 ++argv;
1793 else if (n_files == 2)
1795 off_t o1, o2;
1796 if ((o1 = parse_old_offset (argv[optind])) >= 0
1797 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1799 n_bytes_to_skip = o1;
1800 flag_pseudo_start = 1;
1801 pseudo_start = o2;
1802 argv += 2;
1803 n_files -= 2;
1805 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1807 n_bytes_to_skip = o2;
1808 --n_files;
1809 argv[optind + 1] = argv[optind];
1810 ++argv;
1812 else
1814 error (0, 0,
1815 _("invalid second operand in compatibility mode `%s'"),
1816 argv[optind + 1]);
1817 usage (1);
1820 else if (n_files == 3)
1822 off_t o1, o2;
1823 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1824 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1826 n_bytes_to_skip = o1;
1827 flag_pseudo_start = 1;
1828 pseudo_start = o2;
1829 argv[optind + 2] = argv[optind];
1830 argv += 2;
1831 n_files -= 2;
1833 else
1835 error (0, 0,
1836 _("in compatibility mode, the last two arguments must be offsets"));
1837 usage (1);
1840 else if (n_files > 3)
1842 error (0, 0,
1843 _("compatibility mode supports at most three arguments"));
1844 usage (1);
1847 if (flag_pseudo_start)
1849 static char buf[10];
1851 if (output_address_fmt_string == NULL)
1853 output_address_fmt_string = "(%07o)";
1854 format_address = format_address_std;
1856 else
1858 sprintf (buf, "%s (%s)",
1859 output_address_fmt_string,
1860 output_address_fmt_string);
1861 output_address_fmt_string = buf;
1862 format_address = format_address_label;
1867 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1868 for (i = 0; i < address_pad_len; i++)
1869 address_pad[i] = ' ';
1870 address_pad[address_pad_len] = '\0';
1872 if (n_specs == 0)
1874 if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1876 /* This happens on Cray systems that don't have a 2-byte
1877 integral type. */
1878 exit (EXIT_FAILURE);
1881 n_specs = 1;
1884 if (n_files > 0)
1885 file_list = (char const *const *) &argv[optind];
1886 else
1888 /* If no files were listed on the command line, set up the
1889 global array FILE_LIST so that it contains the null-terminated
1890 list of one name: "-". */
1891 static char const *const default_file_list[] = {"-", NULL};
1893 file_list = default_file_list;
1896 err |= skip (n_bytes_to_skip);
1897 if (in_stream == NULL)
1898 goto cleanup;
1900 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1902 /* Compute output block length. */
1903 l_c_m = get_lcm ();
1905 if (width_specified)
1907 if (desired_width != 0 && desired_width % l_c_m == 0)
1908 bytes_per_block = desired_width;
1909 else
1911 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1912 desired_width, l_c_m);
1913 bytes_per_block = l_c_m;
1916 else
1918 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1919 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1920 else
1921 bytes_per_block = l_c_m;
1924 #ifdef DEBUG
1925 for (i = 0; i < n_specs; i++)
1927 printf (_("%d: fmt=\"%s\" width=%d\n"),
1928 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1930 #endif
1932 err |= (flag_dump_strings ? dump_strings () : dump ());
1934 cleanup:;
1936 if (have_read_stdin && fclose (stdin) == EOF)
1937 error (EXIT_FAILURE, errno, _("standard input"));
1939 if (fclose (stdout) == EOF)
1940 error (EXIT_FAILURE, errno, _("write error"));
1942 exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);