*** empty log message ***
[coreutils.git] / src / od.c
blobd5b6cf8a15a8183e603a88d9423bd16e031f2b2a
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 IF_LINT (= 0);
1366 int idx;
1367 int err;
1368 size_t n_bytes_read;
1370 block[0] = (char *) alloca (bytes_per_block);
1371 block[1] = (char *) alloca (bytes_per_block);
1373 current_offset = n_bytes_to_skip;
1375 idx = 0;
1376 err = 0;
1377 if (limit_bytes_to_format)
1379 end_offset = n_bytes_to_skip + max_bytes_to_format;
1381 while (1)
1383 size_t n_needed;
1384 if (current_offset >= end_offset)
1386 n_bytes_read = 0;
1387 break;
1389 n_needed = MIN (end_offset - current_offset,
1390 (off_t) bytes_per_block);
1391 err |= read_block (n_needed, block[idx], &n_bytes_read);
1392 if (n_bytes_read < bytes_per_block)
1393 break;
1394 assert (n_bytes_read == bytes_per_block);
1395 write_block (current_offset, n_bytes_read,
1396 block[!idx], block[idx]);
1397 current_offset += n_bytes_read;
1398 idx = !idx;
1401 else
1403 while (1)
1405 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1406 if (n_bytes_read < bytes_per_block)
1407 break;
1408 assert (n_bytes_read == bytes_per_block);
1409 write_block (current_offset, n_bytes_read,
1410 block[!idx], block[idx]);
1411 current_offset += n_bytes_read;
1412 idx = !idx;
1416 if (n_bytes_read > 0)
1418 int l_c_m;
1419 size_t bytes_to_write;
1421 l_c_m = get_lcm ();
1423 /* Make bytes_to_write the smallest multiple of l_c_m that
1424 is at least as large as n_bytes_read. */
1425 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1427 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1428 write_block (current_offset, bytes_to_write,
1429 block[!idx], block[idx]);
1430 current_offset += n_bytes_read;
1433 if (output_address_fmt_string != NULL)
1434 printf ("%s\n", format_address (current_offset));
1436 if (limit_bytes_to_format && current_offset > end_offset)
1437 err |= check_and_close ();
1439 return err;
1442 /* STRINGS mode. Find each "string constant" in the input.
1443 A string constant is a run of at least `string_min' ASCII
1444 graphic (or formatting) characters terminated by a null.
1445 Based on a function written by Richard Stallman for a
1446 pre-POSIX version of od. Return nonzero if an error
1447 occurs. Otherwise, return zero. */
1449 static int
1450 dump_strings (void)
1452 size_t bufsize = MAX (100, string_min);
1453 char *buf = xmalloc (bufsize);
1454 off_t address = n_bytes_to_skip;
1455 int err;
1457 err = 0;
1458 while (1)
1460 unsigned int i;
1461 int c;
1463 /* See if the next `string_min' chars are all printing chars. */
1464 tryline:
1466 if (limit_bytes_to_format
1467 && address >= (n_bytes_to_skip + max_bytes_to_format -
1468 (off_t) string_min))
1469 break;
1471 for (i = 0; i < string_min; i++)
1473 err |= read_char (&c);
1474 address++;
1475 if (c < 0)
1477 free (buf);
1478 return err;
1480 if (!ISPRINT (c))
1481 /* Found a non-printing. Try again starting with next char. */
1482 goto tryline;
1483 buf[i] = c;
1486 /* We found a run of `string_min' printable characters.
1487 Now see if it is terminated with a null byte. */
1488 while (!limit_bytes_to_format
1489 || address < n_bytes_to_skip + max_bytes_to_format)
1491 if (i == bufsize)
1493 bufsize = 1 + 3 * bufsize / 2;
1494 buf = xrealloc (buf, bufsize);
1496 err |= read_char (&c);
1497 address++;
1498 if (c < 0)
1500 free (buf);
1501 return err;
1503 if (c == '\0')
1504 break; /* It is; print this string. */
1505 if (!ISPRINT (c))
1506 goto tryline; /* It isn't; give up on this string. */
1507 buf[i++] = c; /* String continues; store it all. */
1510 /* If we get here, the string is all printable and null-terminated,
1511 so print it. It is all in `buf' and `i' is its length. */
1512 buf[i] = 0;
1513 if (output_address_fmt_string != NULL)
1515 printf ("%s ", format_address (address - i - 1));
1517 for (i = 0; (c = buf[i]); i++)
1519 switch (c)
1521 case '\007':
1522 fputs ("\\a", stdout);
1523 break;
1525 case '\b':
1526 fputs ("\\b", stdout);
1527 break;
1529 case '\f':
1530 fputs ("\\f", stdout);
1531 break;
1533 case '\n':
1534 fputs ("\\n", stdout);
1535 break;
1537 case '\r':
1538 fputs ("\\r", stdout);
1539 break;
1541 case '\t':
1542 fputs ("\\t", stdout);
1543 break;
1545 case '\v':
1546 fputs ("\\v", stdout);
1547 break;
1549 default:
1550 putc (c, stdout);
1553 putchar ('\n');
1556 /* We reach this point only if we search through
1557 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1559 free (buf);
1561 err |= check_and_close ();
1562 return err;
1566 main (int argc, char **argv)
1568 int c;
1569 int n_files;
1570 unsigned int i;
1571 unsigned int l_c_m;
1572 unsigned int address_pad_len;
1573 unsigned long int desired_width;
1574 int width_specified = 0;
1575 int n_failed_decodes = 0;
1576 int err;
1578 /* The old-style `pseudo starting address' to be printed in parentheses
1579 after any true address. */
1580 long int pseudo_start IF_LINT (= 0);
1582 program_name = argv[0];
1583 setlocale (LC_ALL, "");
1584 bindtextdomain (PACKAGE, LOCALEDIR);
1585 textdomain (PACKAGE);
1587 err = 0;
1589 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1590 integral_type_size[i] = NO_SIZE;
1592 integral_type_size[sizeof (char)] = CHAR;
1593 integral_type_size[sizeof (short int)] = SHORT;
1594 integral_type_size[sizeof (int)] = INT;
1595 integral_type_size[sizeof (long int)] = LONG;
1597 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1598 fp_type_size[i] = NO_SIZE;
1600 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1601 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1602 so that if `long double' is the same type or if long double isn't
1603 supported FLOAT_LONG_DOUBLE will never be used. */
1604 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1605 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1607 n_specs = 0;
1608 n_specs_allocated = 5;
1609 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1611 output_address_fmt_string = "%07o";
1612 format_address = format_address_std;
1613 address_pad_len = 7;
1614 flag_dump_strings = 0;
1616 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1617 long_options, NULL)) != -1)
1619 unsigned long int tmp;
1620 enum strtol_error s_err;
1622 switch (c)
1624 case 0:
1625 break;
1627 case 'A':
1628 switch (optarg[0])
1630 case 'd':
1631 output_address_fmt_string = "%07d";
1632 format_address = format_address_std;
1633 address_pad_len = 7;
1634 break;
1635 case 'o':
1636 output_address_fmt_string = "%07o";
1637 format_address = format_address_std;
1638 address_pad_len = 7;
1639 break;
1640 case 'x':
1641 output_address_fmt_string = "%06x";
1642 format_address = format_address_std;
1643 address_pad_len = 6;
1644 break;
1645 case 'n':
1646 output_address_fmt_string = NULL;
1647 format_address = format_address_none;
1648 address_pad_len = 0;
1649 break;
1650 default:
1651 error (EXIT_FAILURE, 0,
1652 _("invalid output address radix `%c'; \
1653 it must be one character from [doxn]"),
1654 optarg[0]);
1655 break;
1657 break;
1659 case 'j':
1660 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1661 n_bytes_to_skip = tmp;
1662 if (s_err != LONGINT_OK)
1663 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1664 break;
1666 case 'N':
1667 limit_bytes_to_format = 1;
1669 /* FIXME: if off_t is long long and that's an 8-byte type,
1670 use xstrtouq here. */
1671 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1672 max_bytes_to_format = tmp;
1673 if (s_err != LONGINT_OK)
1674 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1676 if (tmp > LONG_MAX)
1677 error (EXIT_FAILURE, 0,
1678 _("specified number of bytes `%s' is larger than \
1679 the maximum\nrepresentable value of type `long'"), optarg);
1680 break;
1682 case 's':
1683 if (optarg == NULL)
1684 string_min = 3;
1685 else
1687 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1688 if (s_err != LONGINT_OK)
1689 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1691 ++flag_dump_strings;
1692 break;
1694 case 't':
1695 if (decode_format_string (optarg))
1696 ++n_failed_decodes;
1697 break;
1699 case 'v':
1700 abbreviate_duplicate_blocks = 0;
1701 break;
1703 case 'B':
1704 traditional = 1;
1705 break;
1707 /* The next several cases map the old, pre-POSIX format
1708 specification options to the corresponding POSIX format
1709 specs. GNU od accepts any combination of old- and
1710 new-style options. Format specification options accumulate. */
1712 #define CASE_OLD_ARG(old_char,new_string) \
1713 case old_char: \
1715 if (decode_format_string (new_string)) \
1716 ++n_failed_decodes; \
1718 break
1720 CASE_OLD_ARG ('a', "a");
1721 CASE_OLD_ARG ('b', "oC");
1722 CASE_OLD_ARG ('c', "c");
1723 CASE_OLD_ARG ('d', "u2");
1724 CASE_OLD_ARG ('f', "fF");
1725 CASE_OLD_ARG ('h', "x2");
1726 CASE_OLD_ARG ('i', "d2");
1727 CASE_OLD_ARG ('l', "d4");
1728 CASE_OLD_ARG ('o', "o2");
1729 CASE_OLD_ARG ('x', "x2");
1731 #undef CASE_OLD_ARG
1733 case 'w':
1734 width_specified = 1;
1735 if (optarg == NULL)
1737 desired_width = 32;
1739 else
1741 s_err = xstrtoul (optarg, NULL, 10, &desired_width, "");
1742 if (s_err != LONGINT_OK)
1743 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1745 break;
1747 case_GETOPT_HELP_CHAR;
1749 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1751 default:
1752 usage (1);
1753 break;
1757 if (n_failed_decodes > 0)
1758 exit (EXIT_FAILURE);
1760 if (flag_dump_strings && n_specs > 0)
1761 error (EXIT_FAILURE, 0,
1762 _("no type may be specified when dumping strings"));
1764 n_files = argc - optind;
1766 /* If the --backward-compatible option is used, there may be from
1767 0 to 3 remaining command line arguments; handle each case
1768 separately.
1769 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1770 The offset and pseudo_start have the same syntax. */
1772 if (traditional)
1774 off_t offset;
1776 if (n_files == 1)
1778 if ((offset = parse_old_offset (argv[optind])) >= 0)
1780 n_bytes_to_skip = offset;
1781 --n_files;
1782 ++argv;
1785 else if (n_files == 2)
1787 off_t o1, o2;
1788 if ((o1 = parse_old_offset (argv[optind])) >= 0
1789 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1791 n_bytes_to_skip = o1;
1792 flag_pseudo_start = 1;
1793 pseudo_start = o2;
1794 argv += 2;
1795 n_files -= 2;
1797 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1799 n_bytes_to_skip = o2;
1800 --n_files;
1801 argv[optind + 1] = argv[optind];
1802 ++argv;
1804 else
1806 error (0, 0,
1807 _("invalid second operand in compatibility mode `%s'"),
1808 argv[optind + 1]);
1809 usage (1);
1812 else if (n_files == 3)
1814 off_t o1, o2;
1815 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1816 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1818 n_bytes_to_skip = o1;
1819 flag_pseudo_start = 1;
1820 pseudo_start = o2;
1821 argv[optind + 2] = argv[optind];
1822 argv += 2;
1823 n_files -= 2;
1825 else
1827 error (0, 0,
1828 _("in compatibility mode, the last two arguments must be offsets"));
1829 usage (1);
1832 else if (n_files > 3)
1834 error (0, 0,
1835 _("compatibility mode supports at most three arguments"));
1836 usage (1);
1839 if (flag_pseudo_start)
1841 static char buf[10];
1843 if (output_address_fmt_string == NULL)
1845 output_address_fmt_string = "(%07o)";
1846 format_address = format_address_std;
1848 else
1850 sprintf (buf, "%s (%s)",
1851 output_address_fmt_string,
1852 output_address_fmt_string);
1853 output_address_fmt_string = buf;
1854 format_address = format_address_label;
1859 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1860 for (i = 0; i < address_pad_len; i++)
1861 address_pad[i] = ' ';
1862 address_pad[address_pad_len] = '\0';
1864 if (n_specs == 0)
1866 if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1868 /* This happens on Cray systems that don't have a 2-byte
1869 integral type. */
1870 exit (EXIT_FAILURE);
1873 n_specs = 1;
1876 if (n_files > 0)
1877 file_list = (char const *const *) &argv[optind];
1878 else
1880 /* If no files were listed on the command line, set up the
1881 global array FILE_LIST so that it contains the null-terminated
1882 list of one name: "-". */
1883 static char const *const default_file_list[] = {"-", NULL};
1885 file_list = default_file_list;
1888 err |= skip (n_bytes_to_skip);
1889 if (in_stream == NULL)
1890 goto cleanup;
1892 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1894 /* Compute output block length. */
1895 l_c_m = get_lcm ();
1897 if (width_specified)
1899 if (desired_width != 0 && desired_width % l_c_m == 0)
1900 bytes_per_block = desired_width;
1901 else
1903 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1904 desired_width, l_c_m);
1905 bytes_per_block = l_c_m;
1908 else
1910 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1911 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1912 else
1913 bytes_per_block = l_c_m;
1916 #ifdef DEBUG
1917 for (i = 0; i < n_specs; i++)
1919 printf (_("%d: fmt=\"%s\" width=%d\n"),
1920 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1922 #endif
1924 err |= (flag_dump_strings ? dump_strings () : dump ());
1926 cleanup:;
1928 if (have_read_stdin && fclose (stdin) == EOF)
1929 error (EXIT_FAILURE, errno, _("standard input"));
1931 if (fclose (stdout) == EOF)
1932 error (EXIT_FAILURE, errno, _("write error"));
1934 exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);