Add tests with filenames containing newline and backslash characters.
[coreutils.git] / src / od.c
blob5ab654732db869eb67586366991e4c05070f68c6
1 /* od -- dump files in octal and other formats
2 Copyright (C) 92, 95, 96, 1997, 1998 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 "xstrtoul.h"
28 #include "error.h"
30 #if defined(__GNUC__) || defined(STDC_HEADERS)
31 # include <float.h>
32 #endif
34 #ifdef HAVE_LONG_DOUBLE
35 typedef long double LONG_DOUBLE;
36 #else
37 typedef double LONG_DOUBLE;
38 #endif
41 #if HAVE_VALUES_H
42 # include <values.h>
43 #endif
45 #ifndef MAX
46 # define MAX(a, b) ((a) > (b) ? (a) : (b))
47 #endif
49 #ifndef MIN
50 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
51 #endif
53 #if defined (_WIN32) && defined (_O_BINARY)
54 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) \
55 do \
56 { /* Turn off DOS text file modes, "rb" doesn't work on stdin. */\
57 if (_setmode (_fileno ((IN_STREAM)), _O_BINARY) == -1) \
58 { \
59 error (0, errno, "%s", (FILENAME)); \
60 err = 1; \
61 continue; \
62 } \
63 } \
64 while (0)
65 #else
66 # define WINDOWS_SETFILEMODE_BINARY(IN_STREAM, FILENAME) /* empty */
67 #endif
69 /* The default number of input bytes per output line. */
70 #define DEFAULT_BYTES_PER_BLOCK 16
72 /* The number of decimal digits of precision in a float. */
73 #ifndef FLT_DIG
74 # define FLT_DIG 7
75 #endif
77 /* The number of decimal digits of precision in a double. */
78 #ifndef DBL_DIG
79 # define DBL_DIG 15
80 #endif
82 /* The number of decimal digits of precision in a long double. */
83 #ifndef LDBL_DIG
84 # define LDBL_DIG DBL_DIG
85 #endif
87 #if !HAVE_FSEEKO
88 # undef fseeko
89 # define fseeko(Stream, Offset, Whence) (-1)
90 #endif
92 enum size_spec
94 NO_SIZE,
95 CHAR,
96 SHORT,
97 INT,
98 LONG,
99 FLOAT_SINGLE,
100 FLOAT_DOUBLE,
101 FLOAT_LONG_DOUBLE
104 enum output_format
106 SIGNED_DECIMAL,
107 UNSIGNED_DECIMAL,
108 OCTAL,
109 HEXADECIMAL,
110 FLOATING_POINT,
111 NAMED_CHARACTER,
112 CHARACTER
115 /* Each output format specification (from POSIX `-t spec' or from
116 old-style options) is represented by one of these structures. */
117 struct tspec
119 enum output_format fmt;
120 enum size_spec size;
121 void (*print_function) ();
122 char *fmt_string;
123 int hexl_mode_trailer;
124 int field_width;
127 /* The name this program was run with. */
128 char *program_name;
130 /* Convert the number of 8-bit bytes of a binary representation to
131 the number of characters (digits + sign if the type is signed)
132 required to represent the same quantity in the specified base/type.
133 For example, a 32-bit (4-byte) quantity may require a field width
134 as wide as the following for these types:
135 11 unsigned octal
136 11 signed decimal
137 10 unsigned decimal
138 8 unsigned hexadecimal */
140 static const unsigned int bytes_to_oct_digits[] =
141 {0, 3, 6, 8, 11, 14, 16, 19, 22, 25, 27, 30, 32, 35, 38, 41, 43};
143 static const unsigned int bytes_to_signed_dec_digits[] =
144 {1, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 28, 30, 33, 35, 37, 40};
146 static const unsigned int bytes_to_unsigned_dec_digits[] =
147 {0, 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39};
149 static const unsigned int bytes_to_hex_digits[] =
150 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32};
152 /* Convert enum size_spec to the size of the named type. */
153 static const int width_bytes[] =
156 sizeof (char),
157 sizeof (short int),
158 sizeof (int),
159 sizeof (long int),
160 sizeof (float),
161 sizeof (double),
162 sizeof (LONG_DOUBLE)
165 /* Names for some non-printing characters. */
166 static const char *const charname[33] =
168 "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
169 "bs", "ht", "nl", "vt", "ff", "cr", "so", "si",
170 "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
171 "can", "em", "sub", "esc", "fs", "gs", "rs", "us",
172 "sp"
175 /* A printf control string for printing a file offset. */
176 static const char *output_address_fmt_string;
178 /* FIXME: make this the number of octal digits in an unsigned long. */
179 #define MAX_ADDRESS_LENGTH 13
181 /* Space for a normal address, a space, a pseudo address, parentheses
182 around the pseudo address, and a trailing zero byte. */
183 static char address_fmt_buffer[2 * MAX_ADDRESS_LENGTH + 4];
184 static char address_pad[MAX_ADDRESS_LENGTH + 1];
186 static unsigned long int string_min;
187 static unsigned long int flag_dump_strings;
189 /* Non-zero if we should recognize the pre-POSIX non-option arguments
190 that specified at most one file and optional arguments specifying
191 offset and pseudo-start address. */
192 static int traditional;
194 /* Non-zero if an old-style `pseudo-address' was specified. */
195 static long int flag_pseudo_start;
197 /* The difference between the old-style pseudo starting address and
198 the number of bytes to skip. */
199 static long int pseudo_offset;
201 /* Function to format an address and optionally an additional parenthesized
202 pseudo-address; it returns the formatted string. */
203 static const char *(*format_address) PARAMS ((long unsigned int));
205 /* The number of input bytes to skip before formatting and writing. */
206 static off_t n_bytes_to_skip = 0;
208 /* When nonzero, MAX_BYTES_TO_FORMAT is the maximum number of bytes
209 to be read and formatted. Otherwise all input is formatted. */
210 static int limit_bytes_to_format = 0;
212 /* The maximum number of bytes that will be formatted. This
213 value is used only when LIMIT_BYTES_TO_FORMAT is nonzero. */
214 static off_t max_bytes_to_format;
216 /* When nonzero and two or more consecutive blocks are equal, format
217 only the first block and output an asterisk alone on the following
218 line to indicate that identical blocks have been elided. */
219 static int abbreviate_duplicate_blocks = 1;
221 /* An array of specs describing how to format each input block. */
222 static struct tspec *spec;
224 /* The number of format specs. */
225 static unsigned int n_specs;
227 /* The allocated length of SPEC. */
228 static unsigned int n_specs_allocated;
230 /* The number of input bytes formatted per output line. It must be
231 a multiple of the least common multiple of the sizes associated with
232 the specified output types. It should be as large as possible, but
233 no larger than 16 -- unless specified with the -w option. */
234 static unsigned int bytes_per_block;
236 /* Human-readable representation of *file_list (for error messages).
237 It differs from *file_list only when *file_list is "-". */
238 static char const *input_filename;
240 /* A NULL-terminated list of the file-arguments from the command line.
241 If no file-arguments were specified, this variable is initialized
242 to { "-", NULL }. */
243 static char const *const *file_list;
245 /* The input stream associated with the current file. */
246 static FILE *in_stream;
248 /* If nonzero, at least one of the files we read was standard input. */
249 static int have_read_stdin;
251 #define LONGEST_INTEGRAL_TYPE long int
253 #define MAX_INTEGRAL_TYPE_SIZE sizeof(LONGEST_INTEGRAL_TYPE)
254 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];
256 #define MAX_FP_TYPE_SIZE sizeof(LONG_DOUBLE)
257 static enum size_spec fp_type_size[MAX_FP_TYPE_SIZE + 1];
259 /* If nonzero, display usage information and exit. */
260 static int show_help;
262 /* If nonzero, print the version on standard output then exit. */
263 static int show_version;
265 static struct option const long_options[] =
267 /* POSIX options. */
268 {"skip-bytes", required_argument, NULL, 'j'},
269 {"address-radix", required_argument, NULL, 'A'},
270 {"read-bytes", required_argument, NULL, 'N'},
271 {"format", required_argument, NULL, 't'},
272 {"output-duplicates", no_argument, NULL, 'v'},
274 /* non-POSIX options. */
275 {"strings", optional_argument, NULL, 's'},
276 {"traditional", no_argument, NULL, 'B'},
277 {"width", optional_argument, NULL, 'w'},
278 {"help", no_argument, &show_help, 1},
279 {"version", no_argument, &show_version, 1},
280 {NULL, 0, NULL, 0}
283 static void
284 usage (int status)
286 if (status != 0)
287 fprintf (stderr, _("Try `%s --help' for more information.\n"),
288 program_name);
289 else
291 printf (_("\
292 Usage: %s [OPTION]... [FILE]...\n\
293 or: %s --traditional [FILE] [[+]OFFSET [[+]LABEL]]\n\
295 program_name, program_name);
296 printf (_("\
297 Write an unambiguous representation, octal bytes by default, of FILE\n\
298 to standard output. With no FILE, or when FILE is -, read standard input.\n\
300 -A, --address-radix=RADIX decide how file offsets are printed\n\
301 -j, --skip-bytes=BYTES skip BYTES input bytes first on each file\n\
302 -N, --read-bytes=BYTES limit dump to BYTES input bytes per file\n\
303 -s, --strings[=BYTES] output strings of at least BYTES graphic chars\n\
304 -t, --format=TYPE select output format or formats\n\
305 -v, --output-duplicates do not use * to mark line suppression\n\
306 -w, --width[=BYTES] output BYTES bytes per output line\n\
307 --traditional accept arguments in pre-POSIX form\n\
308 --help display this help and exit\n\
309 --version output version information and exit\n\
311 Pre-POSIX format specifications may be intermixed, they accumulate:\n\
312 -a same as -t a, select named characters\n\
313 -b same as -t oC, select octal bytes\n\
314 -c same as -t c, select ASCII characters or backslash escapes\n\
315 -d same as -t u2, select unsigned decimal shorts\n\
316 -f same as -t fF, select floats\n\
317 -h same as -t x2, select hexadecimal shorts\n\
318 -i same as -t d2, select decimal shorts\n\
319 -l same as -t d4, select decimal longs\n\
320 -o same as -t o2, select octal shorts\n\
321 -x same as -t x2, select hexadecimal shorts\n\
322 "));
323 printf (_("\
325 For older syntax (second call format), OFFSET means -j OFFSET. LABEL\n\
326 is the pseudo-address at first byte printed, incremented when dump is\n\
327 progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates\n\
328 hexadecimal, suffixes maybe . for octal and b multiply by 512.\n\
330 TYPE is made up of one or more of these specifications:\n\
332 a named character\n\
333 c ASCII character or backslash escape\n\
334 d[SIZE] signed decimal, SIZE bytes per integer\n\
335 f[SIZE] floating point, SIZE bytes per integer\n\
336 o[SIZE] octal, SIZE bytes per integer\n\
337 u[SIZE] unsigned decimal, SIZE bytes per integer\n\
338 x[SIZE] hexadecimal, SIZE bytes per integer\n\
340 SIZE is a number. For TYPE in doux, SIZE may also be C for\n\
341 sizeof(char), S for sizeof(short), I for sizeof(int) or L for\n\
342 sizeof(long). If TYPE is f, SIZE may also be F for sizeof(float), D\n\
343 for sizeof(double) or L for sizeof(long double).\n\
345 RADIX is d for decimal, o for octal, x for hexadecimal or n for none.\n\
346 BYTES is hexadecimal with 0x or 0X prefix, it is multiplied by 512\n\
347 with b suffix, by 1024 with k and by 1048576 with m. Adding a z suffix to\n\
348 any type adds a display of printable characters to the end of each line\n\
349 of output. -s without a number implies 3. -w without a number implies 32.\n\
350 By default, od uses -A o -t d2 -w 16.\n\
351 "));
352 puts (_("\nReport bugs to <bug-textutils@gnu.org>."));
354 exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
357 /* Compute the greatest common denominator of U and V
358 using Euclid's algorithm. */
360 static unsigned int
361 gcd (unsigned int u, unsigned int v)
363 unsigned int t;
364 while (v != 0)
366 t = u % v;
367 u = v;
368 v = t;
370 return u;
373 /* Compute the least common multiple of U and V. */
375 static unsigned int
376 lcm (unsigned int u, unsigned int v)
378 unsigned int t = gcd (u, v);
379 if (t == 0)
380 return 0;
381 return u * v / t;
384 static void
385 print_s_char (long unsigned int n_bytes, const char *block,
386 const char *fmt_string)
388 int i;
389 for (i = n_bytes; i > 0; i--)
391 int tmp = (unsigned) *(const unsigned char *) block;
392 if (tmp > SCHAR_MAX)
393 tmp -= SCHAR_MAX - SCHAR_MIN + 1;
394 assert (tmp <= SCHAR_MAX);
395 printf (fmt_string, tmp);
396 block += sizeof (unsigned char);
400 static void
401 print_char (long unsigned int n_bytes, const char *block,
402 const char *fmt_string)
404 int i;
405 for (i = n_bytes; i > 0; i--)
407 unsigned int tmp = *(const unsigned char *) block;
408 printf (fmt_string, tmp);
409 block += sizeof (unsigned char);
413 static void
414 print_s_short (long unsigned int n_bytes, const char *block,
415 const char *fmt_string)
417 int i;
418 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
420 int tmp = (unsigned) *(const unsigned short *) block;
421 if (tmp > SHRT_MAX)
422 tmp -= SHRT_MAX - SHRT_MIN + 1;
423 assert (tmp <= SHRT_MAX);
424 printf (fmt_string, tmp);
425 block += sizeof (unsigned short);
429 static void
430 print_short (long unsigned int n_bytes, const char *block,
431 const char *fmt_string)
433 int i;
434 for (i = n_bytes / sizeof (unsigned short); i > 0; i--)
436 unsigned int tmp = *(const unsigned short *) block;
437 printf (fmt_string, tmp);
438 block += sizeof (unsigned short);
442 static void
443 print_int (long unsigned int n_bytes, const char *block,
444 const char *fmt_string)
446 int i;
447 for (i = n_bytes / sizeof (unsigned int); i > 0; i--)
449 unsigned int tmp = *(const unsigned int *) block;
450 printf (fmt_string, tmp);
451 block += sizeof (unsigned int);
455 static void
456 print_long (long unsigned int n_bytes, const char *block,
457 const char *fmt_string)
459 int i;
460 for (i = n_bytes / sizeof (unsigned long); i > 0; i--)
462 unsigned long tmp = *(const unsigned long *) block;
463 printf (fmt_string, tmp);
464 block += sizeof (unsigned long);
468 static void
469 print_float (long unsigned int n_bytes, const char *block,
470 const char *fmt_string)
472 int i;
473 for (i = n_bytes / sizeof (float); i > 0; i--)
475 float tmp = *(const float *) block;
476 printf (fmt_string, tmp);
477 block += sizeof (float);
481 static void
482 print_double (long unsigned int n_bytes, const char *block,
483 const char *fmt_string)
485 int i;
486 for (i = n_bytes / sizeof (double); i > 0; i--)
488 double tmp = *(const double *) block;
489 printf (fmt_string, tmp);
490 block += sizeof (double);
494 #ifdef HAVE_LONG_DOUBLE
495 static void
496 print_long_double (long unsigned int n_bytes, const char *block,
497 const char *fmt_string)
499 int i;
500 for (i = n_bytes / sizeof (LONG_DOUBLE); i > 0; i--)
502 LONG_DOUBLE tmp = *(const LONG_DOUBLE *) block;
503 printf (fmt_string, tmp);
504 block += sizeof (LONG_DOUBLE);
508 #endif
510 static void
511 dump_hexl_mode_trailer (long unsigned int n_bytes, const char *block)
513 int i;
514 fputs (" >", stdout);
515 for (i = n_bytes; i > 0; i--)
517 unsigned int c = *(const unsigned char *) block;
518 unsigned int c2 = (ISPRINT(c) ? c : '.');
519 putchar (c2);
520 block += sizeof (unsigned char);
522 putchar ('<');
525 static void
526 print_named_ascii (long unsigned int n_bytes, const char *block,
527 const char *unused_fmt_string)
529 int i;
530 for (i = n_bytes; i > 0; i--)
532 unsigned int c = *(const unsigned char *) block;
533 unsigned int masked_c = (0x7f & c);
534 const char *s;
535 char buf[5];
537 if (masked_c == 127)
538 s = "del";
539 else if (masked_c <= 040)
540 s = charname[masked_c];
541 else
543 sprintf (buf, " %c", masked_c);
544 s = buf;
547 printf (" %3s", s);
548 block += sizeof (unsigned char);
552 static void
553 print_ascii (long unsigned int n_bytes, const char *block,
554 const char *unused_fmt_string)
556 int i;
557 for (i = n_bytes; i > 0; i--)
559 unsigned int c = *(const unsigned char *) block;
560 const char *s;
561 char buf[5];
563 switch (c)
565 case '\0':
566 s = " \\0";
567 break;
569 case '\007':
570 s = " \\a";
571 break;
573 case '\b':
574 s = " \\b";
575 break;
577 case '\f':
578 s = " \\f";
579 break;
581 case '\n':
582 s = " \\n";
583 break;
585 case '\r':
586 s = " \\r";
587 break;
589 case '\t':
590 s = " \\t";
591 break;
593 case '\v':
594 s = " \\v";
595 break;
597 default:
598 sprintf (buf, (ISPRINT (c) ? " %c" : "%03o"), c);
599 s = (const char *) buf;
602 printf (" %3s", s);
603 block += sizeof (unsigned char);
607 /* Convert a null-terminated (possibly zero-length) string S to an
608 unsigned long integer value. If S points to a non-digit set *P to S,
609 *VAL to 0, and return 0. Otherwise, accumulate the integer value of
610 the string of digits. If the string of digits represents a value
611 larger than ULONG_MAX, don't modify *VAL or *P and return nonzero.
612 Otherwise, advance *P to the first non-digit after S, set *VAL to
613 the result of the conversion and return zero. */
615 static int
616 simple_strtoul (const char *s, const char **p, long unsigned int *val)
618 unsigned long int sum;
620 sum = 0;
621 while (ISDIGIT (*s))
623 unsigned int c = *s++ - '0';
624 if (sum > (ULONG_MAX - c) / 10)
625 return 1;
626 sum = sum * 10 + c;
628 *p = s;
629 *val = sum;
630 return 0;
633 /* If S points to a single valid POSIX-style od format string, put
634 a description of that format in *TSPEC, make *NEXT point at the
635 character following the just-decoded format (if *NEXT is non-NULL),
636 and return zero. If S is not valid, don't modify *NEXT or *TSPEC,
637 give a diagnostic, and return nonzero. For example, if S were
638 "d4afL" *NEXT would be set to "afL" and *TSPEC would be
640 fmt = SIGNED_DECIMAL;
641 size = INT or LONG; (whichever integral_type_size[4] resolves to)
642 print_function = print_int; (assuming size == INT)
643 fmt_string = "%011d%c";
645 S_ORIG is solely for reporting errors. It should be the full format
646 string argument.
649 static int
650 decode_one_format (const char *s_orig, const char *s, const char **next,
651 struct tspec *tspec)
653 enum size_spec size_spec;
654 unsigned long int size;
655 enum output_format fmt;
656 const char *pre_fmt_string;
657 char *fmt_string;
658 void (*print_function) ();
659 const char *p;
660 unsigned int c;
661 unsigned int field_width = 0;
663 assert (tspec != NULL);
665 switch (*s)
667 case 'd':
668 case 'o':
669 case 'u':
670 case 'x':
671 c = *s;
672 ++s;
673 switch (*s)
675 case 'C':
676 ++s;
677 size = sizeof (char);
678 break;
680 case 'S':
681 ++s;
682 size = sizeof (short);
683 break;
685 case 'I':
686 ++s;
687 size = sizeof (int);
688 break;
690 case 'L':
691 ++s;
692 size = sizeof (long int);
693 break;
695 default:
696 if (simple_strtoul (s, &p, &size) != 0)
698 /* The integer at P in S would overflow an unsigned long.
699 A digit string that long is sufficiently odd looking
700 that the following diagnostic is sufficient. */
701 error (0, 0, _("invalid type string `%s'"), s_orig);
702 return 1;
704 if (p == s)
705 size = sizeof (int);
706 else
708 if (size > MAX_INTEGRAL_TYPE_SIZE
709 || integral_type_size[size] == NO_SIZE)
711 error (0, 0, _("invalid type string `%s';\n\
712 this system doesn't provide a %lu-byte integral type"), s_orig, size);
713 return 1;
715 s = p;
717 break;
720 #define FMT_BYTES_ALLOCATED 9
721 fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
723 size_spec = integral_type_size[size];
725 switch (c)
727 case 'd':
728 fmt = SIGNED_DECIMAL;
729 sprintf (fmt_string, " %%%u%sd",
730 (field_width = bytes_to_signed_dec_digits[size]),
731 (size_spec == LONG ? "l" : ""));
732 break;
734 case 'o':
735 fmt = OCTAL;
736 sprintf (fmt_string, " %%0%u%so",
737 (field_width = bytes_to_oct_digits[size]),
738 (size_spec == LONG ? "l" : ""));
739 break;
741 case 'u':
742 fmt = UNSIGNED_DECIMAL;
743 sprintf (fmt_string, " %%%u%su",
744 (field_width = bytes_to_unsigned_dec_digits[size]),
745 (size_spec == LONG ? "l" : ""));
746 break;
748 case 'x':
749 fmt = HEXADECIMAL;
750 sprintf (fmt_string, " %%0%u%sx",
751 (field_width = bytes_to_hex_digits[size]),
752 (size_spec == LONG ? "l" : ""));
753 break;
755 default:
756 abort ();
759 assert (strlen (fmt_string) < FMT_BYTES_ALLOCATED);
761 switch (size_spec)
763 case CHAR:
764 print_function = (fmt == SIGNED_DECIMAL
765 ? print_s_char
766 : print_char);
767 break;
769 case SHORT:
770 print_function = (fmt == SIGNED_DECIMAL
771 ? print_s_short
772 : print_short);
773 break;
775 case INT:
776 print_function = print_int;
777 break;
779 case LONG:
780 print_function = print_long;
781 break;
783 default:
784 abort ();
786 break;
788 case 'f':
789 fmt = FLOATING_POINT;
790 ++s;
791 switch (*s)
793 case 'F':
794 ++s;
795 size = sizeof (float);
796 break;
798 case 'D':
799 ++s;
800 size = sizeof (double);
801 break;
803 case 'L':
804 ++s;
805 size = sizeof (LONG_DOUBLE);
806 break;
808 default:
809 if (simple_strtoul (s, &p, &size) != 0)
811 /* The integer at P in S would overflow an unsigned long.
812 A digit string that long is sufficiently odd looking
813 that the following diagnostic is sufficient. */
814 error (0, 0, _("invalid type string `%s'"), s_orig);
815 return 1;
817 if (p == s)
818 size = sizeof (double);
819 else
821 if (size > MAX_FP_TYPE_SIZE
822 || fp_type_size[size] == NO_SIZE)
824 error (0, 0, _("invalid type string `%s';\n\
825 this system doesn't provide a %lu-byte floating point type"), s_orig, size);
826 return 1;
828 s = p;
830 break;
832 size_spec = fp_type_size[size];
834 switch (size_spec)
836 case FLOAT_SINGLE:
837 print_function = print_float;
838 /* Don't use %#e; not all systems support it. */
839 pre_fmt_string = " %%%d.%de";
840 fmt_string = xmalloc (strlen (pre_fmt_string));
841 sprintf (fmt_string, pre_fmt_string,
842 (field_width = FLT_DIG + 8), FLT_DIG);
843 break;
845 case FLOAT_DOUBLE:
846 print_function = print_double;
847 pre_fmt_string = " %%%d.%de";
848 fmt_string = xmalloc (strlen (pre_fmt_string));
849 sprintf (fmt_string, pre_fmt_string,
850 (field_width = DBL_DIG + 8), DBL_DIG);
851 break;
853 #ifdef HAVE_LONG_DOUBLE
854 case FLOAT_LONG_DOUBLE:
855 print_function = print_long_double;
856 pre_fmt_string = " %%%d.%dLe";
857 fmt_string = xmalloc (strlen (pre_fmt_string));
858 sprintf (fmt_string, pre_fmt_string,
859 (field_width = LDBL_DIG + 8), LDBL_DIG);
860 break;
861 #endif
863 default:
864 abort ();
866 break;
868 case 'a':
869 ++s;
870 fmt = NAMED_CHARACTER;
871 size_spec = CHAR;
872 fmt_string = NULL;
873 print_function = print_named_ascii;
874 field_width = 3;
875 break;
877 case 'c':
878 ++s;
879 fmt = CHARACTER;
880 size_spec = CHAR;
881 fmt_string = NULL;
882 print_function = print_ascii;
883 field_width = 3;
884 break;
886 default:
887 error (0, 0, _("invalid character `%c' in type string `%s'"),
888 *s, s_orig);
889 return 1;
892 tspec->size = size_spec;
893 tspec->fmt = fmt;
894 tspec->print_function = print_function;
895 tspec->fmt_string = fmt_string;
897 tspec->field_width = field_width;
898 tspec->hexl_mode_trailer = (*s == 'z');
899 if (tspec->hexl_mode_trailer)
900 s++;
902 if (next != NULL)
903 *next = s;
905 return 0;
908 /* Decode the POSIX-style od format string S. Append the decoded
909 representation to the global array SPEC, reallocating SPEC if
910 necessary. Return zero if S is valid, nonzero otherwise. */
912 static int
913 decode_format_string (const char *s)
915 const char *s_orig = s;
916 assert (s != NULL);
918 while (*s != '\0')
920 struct tspec tspec;
921 const char *next;
923 if (decode_one_format (s_orig, s, &next, &tspec))
924 return 1;
926 assert (s != next);
927 s = next;
929 if (n_specs >= n_specs_allocated)
931 n_specs_allocated = 1 + (3 * n_specs_allocated) / 2;
932 spec = (struct tspec *) xrealloc ((char *) spec,
933 (n_specs_allocated
934 * sizeof (struct tspec)));
937 memcpy ((char *) &spec[n_specs], (char *) &tspec,
938 sizeof (struct tspec));
939 ++n_specs;
942 return 0;
945 /* Given a list of one or more input filenames FILE_LIST, set the global
946 file pointer IN_STREAM to position N_SKIP in the concatenation of
947 those files. If any file operation fails or if there are fewer than
948 N_SKIP bytes in the combined input, give an error message and return
949 nonzero. When possible, use seek- rather than read operations to
950 advance IN_STREAM. A file name of "-" is interpreted as standard
951 input. */
953 static int
954 skip (off_t n_skip)
956 int err;
958 err = 0;
959 for ( /* empty */ ; *file_list != NULL; ++file_list)
961 struct stat file_stats;
962 int j;
964 if (STREQ (*file_list, "-"))
966 input_filename = _("standard input");
967 in_stream = stdin;
968 have_read_stdin = 1;
970 else
972 input_filename = *file_list;
973 in_stream = fopen (input_filename, "r");
974 if (in_stream == NULL)
976 error (0, errno, "%s", input_filename);
977 err = 1;
978 continue;
981 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
983 if (n_skip == 0)
984 break;
986 /* First try using fseek. For large offsets, this extra work is
987 worthwhile. If the offset is below some threshold it may be
988 more efficient to move the pointer by reading. There are two
989 issues when trying to use fseek:
990 - the file must be seekable.
991 - before seeking to the specified position, make sure
992 that the new position is in the current file.
993 Try to do that by getting file's size using fstat().
994 But that will work only for regular files and dirs. */
996 if (fstat (fileno (in_stream), &file_stats))
998 error (0, errno, "%s", input_filename);
999 err = 1;
1000 continue;
1003 /* The st_size field is valid only for regular files and
1004 directories. FIXME: is the preceding true?
1005 If the number of bytes left to skip is at least as large as
1006 the size of the current file, we can decrement
1007 n_skip and go on to the next file. */
1008 if (S_ISREG (file_stats.st_mode) || S_ISDIR (file_stats.st_mode))
1010 if (n_skip >= file_stats.st_size)
1012 n_skip -= file_stats.st_size;
1013 if (in_stream != stdin && fclose (in_stream) == EOF)
1015 error (0, errno, "%s", input_filename);
1016 err = 1;
1018 continue;
1020 else
1022 /* Try fseeko if available, fseek otherwise. */
1023 if (fseeko (in_stream, n_skip, SEEK_SET) == 0
1024 || (n_skip <= LONG_MAX
1025 && fseek (in_stream, (long) n_skip, SEEK_SET) == 0))
1027 n_skip = 0;
1028 break;
1033 /* Seek didn't work or wasn't attempted; position the file pointer
1034 by reading. */
1036 for (j = n_skip / BUFSIZ; j >= 0; j--)
1038 char buf[BUFSIZ];
1039 size_t n_bytes_to_read = (j > 0
1040 ? BUFSIZ
1041 : n_skip % BUFSIZ);
1042 size_t n_bytes_read;
1043 n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
1044 n_skip -= n_bytes_read;
1045 if (n_bytes_read != n_bytes_to_read)
1046 break;
1049 if (n_skip == 0)
1050 break;
1053 if (n_skip != 0)
1054 error (EXIT_FAILURE, 0, _("cannot skip past end of combined input"));
1056 return err;
1059 static const char *
1060 format_address_none (long unsigned int address)
1062 return "";
1065 static const char *
1066 format_address_std (long unsigned int address)
1068 const char *address_string;
1070 sprintf (address_fmt_buffer, output_address_fmt_string, address);
1071 address_string = address_fmt_buffer;
1072 return address_string;
1075 static const char *
1076 format_address_label (long unsigned int address)
1078 const char *address_string;
1079 assert (output_address_fmt_string != NULL);
1081 sprintf (address_fmt_buffer, output_address_fmt_string,
1082 address, address + pseudo_offset);
1083 address_string = address_fmt_buffer;
1084 return address_string;
1087 /* Write N_BYTES bytes from CURR_BLOCK to standard output once for each
1088 of the N_SPEC format specs. CURRENT_OFFSET is the byte address of
1089 CURR_BLOCK in the concatenation of input files, and it is printed
1090 (optionally) only before the output line associated with the first
1091 format spec. When duplicate blocks are being abbreviated, the output
1092 for a sequence of identical input blocks is the output for the first
1093 block followed by an asterisk alone on a line. It is valid to compare
1094 the blocks PREV_BLOCK and CURR_BLOCK only when N_BYTES == BYTES_PER_BLOCK.
1095 That condition may be false only for the last input block -- and then
1096 only when it has not been padded to length BYTES_PER_BLOCK. */
1098 static void
1099 write_block (long unsigned int current_offset, long unsigned int n_bytes,
1100 const char *prev_block, const char *curr_block)
1102 static int first = 1;
1103 static int prev_pair_equal = 0;
1105 #define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
1107 if (abbreviate_duplicate_blocks
1108 && !first && n_bytes == bytes_per_block
1109 && EQUAL_BLOCKS (prev_block, curr_block))
1111 if (prev_pair_equal)
1113 /* The two preceding blocks were equal, and the current
1114 block is the same as the last one, so print nothing. */
1116 else
1118 printf ("*\n");
1119 prev_pair_equal = 1;
1122 else
1124 unsigned int i;
1126 prev_pair_equal = 0;
1127 for (i = 0; i < n_specs; i++)
1129 const char *addr_or_pad = (i == 0
1130 ? format_address (current_offset)
1131 : address_pad);
1133 fputs (addr_or_pad, stdout);
1134 (*spec[i].print_function) (n_bytes, curr_block, spec[i].fmt_string);
1135 if (spec[i].hexl_mode_trailer)
1137 /* space-pad out to full line width, then dump the trailer */
1138 int datum_width = width_bytes[spec[i].size];
1139 int blank_fields = (bytes_per_block - n_bytes) / datum_width;
1140 int field_width = spec[i].field_width + 1;
1141 printf ("%*s", blank_fields * field_width, "");
1142 dump_hexl_mode_trailer (n_bytes, curr_block);
1144 putchar ('\n');
1147 first = 0;
1150 /* Test whether there have been errors on in_stream, and close it if
1151 it is not standard input. Return nonzero if there has been an error
1152 on in_stream or stdout; return zero otherwise. This function will
1153 report more than one error only if both a read and a write error
1154 have occurred. */
1156 static int
1157 check_and_close (void)
1159 int err;
1161 err = 0;
1162 if (ferror (in_stream))
1164 error (0, errno, "%s", input_filename);
1165 if (in_stream != stdin)
1166 fclose (in_stream);
1167 err = 1;
1169 else if (in_stream != stdin && fclose (in_stream) == EOF)
1171 error (0, errno, "%s", input_filename);
1172 err = 1;
1175 if (ferror (stdout))
1177 error (0, errno, _("standard output"));
1178 err = 1;
1181 return err;
1184 /* Read a single byte into *C from the concatenation of the input files
1185 named in the global array FILE_LIST. On the first call to this
1186 function, the global variable IN_STREAM is expected to be an open
1187 stream associated with the input file *FILE_LIST. If IN_STREAM is
1188 at end-of-file, close it and update the global variables IN_STREAM,
1189 FILE_LIST, and INPUT_FILENAME so they correspond to the next file in
1190 the list. Then try to read a byte from the newly opened file.
1191 Repeat if necessary until *FILE_LIST is NULL. When EOF is reached
1192 for the last file in FILE_LIST, set *C to EOF and return. Subsequent
1193 calls do likewise. The return value is nonzero if any errors
1194 occured, zero otherwise. */
1196 static int
1197 read_char (int *c)
1199 int err;
1201 if (*file_list == NULL)
1203 *c = EOF;
1204 return 0;
1207 err = 0;
1208 while (1)
1210 *c = fgetc (in_stream);
1212 if (*c != EOF)
1213 return err;
1215 err |= check_and_close ();
1219 ++file_list;
1220 if (*file_list == NULL)
1221 return err;
1223 if (STREQ (*file_list, "-"))
1225 input_filename = _("standard input");
1226 in_stream = stdin;
1227 have_read_stdin = 1;
1229 else
1231 input_filename = *file_list;
1232 in_stream = fopen (input_filename, "r");
1233 if (in_stream == NULL)
1235 error (0, errno, "%s", input_filename);
1236 err = 1;
1239 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1241 while (in_stream == NULL);
1245 /* Read N bytes into BLOCK from the concatenation of the input files
1246 named in the global array FILE_LIST. On the first call to this
1247 function, the global variable IN_STREAM is expected to be an open
1248 stream associated with the input file *FILE_LIST. On subsequent
1249 calls, if *FILE_LIST is NULL, don't modify BLOCK and return zero.
1250 If all N bytes cannot be read from IN_STREAM, close IN_STREAM and
1251 update the global variables IN_STREAM, FILE_LIST, and INPUT_FILENAME.
1252 Then try to read the remaining bytes from the newly opened file.
1253 Repeat if necessary until *FILE_LIST is NULL. Set *N_BYTES_IN_BUFFER
1254 to the number of bytes read. If an error occurs, it will be detected
1255 through ferror when the stream is about to be closed. If there is an
1256 error, give a message but continue reading as usual and return nonzero.
1257 Otherwise return zero. */
1259 static int
1260 read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
1262 int err;
1264 assert (n > 0 && n <= bytes_per_block);
1266 *n_bytes_in_buffer = 0;
1268 if (n == 0)
1269 return 0;
1271 if (*file_list == NULL)
1272 return 0; /* EOF. */
1274 err = 0;
1275 while (1)
1277 size_t n_needed;
1278 size_t n_read;
1280 n_needed = n - *n_bytes_in_buffer;
1281 n_read = fread (block + *n_bytes_in_buffer, 1, n_needed, in_stream);
1283 *n_bytes_in_buffer += n_read;
1285 if (n_read == n_needed)
1286 return err;
1288 err |= check_and_close ();
1292 ++file_list;
1293 if (*file_list == NULL)
1294 return err;
1296 if (STREQ (*file_list, "-"))
1298 input_filename = _("standard input");
1299 in_stream = stdin;
1300 have_read_stdin = 1;
1302 else
1304 input_filename = *file_list;
1305 in_stream = fopen (input_filename, "r");
1306 if (in_stream == NULL)
1308 error (0, errno, "%s", input_filename);
1309 err = 1;
1312 WINDOWS_SETFILEMODE_BINARY (in_stream, input_filename);
1314 while (in_stream == NULL);
1318 /* Return the least common multiple of the sizes associated
1319 with the format specs. */
1321 static int
1322 get_lcm (void)
1324 unsigned int i;
1325 int l_c_m = 1;
1327 for (i = 0; i < n_specs; i++)
1328 l_c_m = lcm (l_c_m, width_bytes[(int) spec[i].size]);
1329 return l_c_m;
1332 /* If S is a valid pre-POSIX offset specification with an optional leading '+'
1333 return the offset it denotes. Otherwise, return -1. */
1335 off_t
1336 parse_old_offset (const char *s)
1338 int radix;
1339 off_t offset;
1340 enum strtol_error s_err;
1341 long unsigned int tmp;
1343 if (*s == '\0')
1344 return -1;
1346 /* Skip over any leading '+'. */
1347 if (s[0] == '+')
1348 ++s;
1350 /* Determine the radix we'll use to interpret S. If there is a `.',
1351 it's decimal, otherwise, if the string begins with `0X'or `0x',
1352 it's hexadecimal, else octal. */
1353 if (strchr (s, '.') != NULL)
1354 radix = 10;
1355 else
1357 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
1358 radix = 16;
1359 else
1360 radix = 8;
1363 s_err = xstrtoul (s, NULL, radix, &tmp, "Bb");
1364 if (s_err != LONGINT_OK)
1366 STRTOL_FAIL_WARN (s, _("old-style offset"), s_err);
1367 return -1;
1369 offset = tmp;
1370 return offset;
1373 /* Read a chunk of size BYTES_PER_BLOCK from the input files, write the
1374 formatted block to standard output, and repeat until the specified
1375 maximum number of bytes has been read or until all input has been
1376 processed. If the last block read is smaller than BYTES_PER_BLOCK
1377 and its size is not a multiple of the size associated with a format
1378 spec, extend the input block with zero bytes until its length is a
1379 multiple of all format spec sizes. Write the final block. Finally,
1380 write on a line by itself the offset of the byte after the last byte
1381 read. Accumulate return values from calls to read_block and
1382 check_and_close, and if any was nonzero, return nonzero.
1383 Otherwise, return zero. */
1385 static int
1386 dump (void)
1388 char *block[2];
1389 off_t current_offset;
1390 off_t end_offset;
1391 int idx;
1392 int err;
1393 size_t n_bytes_read;
1395 #ifdef lint /* Suppress `used before initialized' warning. */
1396 end_offset = 0;
1397 #endif
1399 block[0] = (char *) alloca (bytes_per_block);
1400 block[1] = (char *) alloca (bytes_per_block);
1402 current_offset = n_bytes_to_skip;
1404 idx = 0;
1405 err = 0;
1406 if (limit_bytes_to_format)
1408 end_offset = n_bytes_to_skip + max_bytes_to_format;
1410 while (1)
1412 size_t n_needed;
1413 if (current_offset >= end_offset)
1415 n_bytes_read = 0;
1416 break;
1418 n_needed = MIN (end_offset - current_offset,
1419 (off_t) bytes_per_block);
1420 err |= read_block (n_needed, block[idx], &n_bytes_read);
1421 if (n_bytes_read < bytes_per_block)
1422 break;
1423 assert (n_bytes_read == bytes_per_block);
1424 write_block (current_offset, n_bytes_read,
1425 block[!idx], block[idx]);
1426 current_offset += n_bytes_read;
1427 idx = !idx;
1430 else
1432 while (1)
1434 err |= read_block (bytes_per_block, block[idx], &n_bytes_read);
1435 if (n_bytes_read < bytes_per_block)
1436 break;
1437 assert (n_bytes_read == bytes_per_block);
1438 write_block (current_offset, n_bytes_read,
1439 block[!idx], block[idx]);
1440 current_offset += n_bytes_read;
1441 idx = !idx;
1445 if (n_bytes_read > 0)
1447 int l_c_m;
1448 size_t bytes_to_write;
1450 l_c_m = get_lcm ();
1452 /* Make bytes_to_write the smallest multiple of l_c_m that
1453 is at least as large as n_bytes_read. */
1454 bytes_to_write = l_c_m * (int) ((n_bytes_read + l_c_m - 1) / l_c_m);
1456 memset (block[idx] + n_bytes_read, 0, bytes_to_write - n_bytes_read);
1457 write_block (current_offset, bytes_to_write,
1458 block[!idx], block[idx]);
1459 current_offset += n_bytes_read;
1462 if (output_address_fmt_string != NULL)
1463 printf ("%s\n", format_address (current_offset));
1465 if (limit_bytes_to_format && current_offset > end_offset)
1466 err |= check_and_close ();
1468 return err;
1471 /* STRINGS mode. Find each "string constant" in the input.
1472 A string constant is a run of at least `string_min' ASCII
1473 graphic (or formatting) characters terminated by a null.
1474 Based on a function written by Richard Stallman for a
1475 pre-POSIX version of od. Return nonzero if an error
1476 occurs. Otherwise, return zero. */
1478 static int
1479 dump_strings (void)
1481 size_t bufsize = MAX (100, string_min);
1482 char *buf = xmalloc (bufsize);
1483 off_t address = n_bytes_to_skip;
1484 int err;
1486 err = 0;
1487 while (1)
1489 unsigned int i;
1490 int c;
1492 /* See if the next `string_min' chars are all printing chars. */
1493 tryline:
1495 if (limit_bytes_to_format
1496 && address >= (n_bytes_to_skip + max_bytes_to_format -
1497 (off_t) string_min))
1498 break;
1500 for (i = 0; i < string_min; i++)
1502 err |= read_char (&c);
1503 address++;
1504 if (c < 0)
1506 free (buf);
1507 return err;
1509 if (!ISPRINT (c))
1510 /* Found a non-printing. Try again starting with next char. */
1511 goto tryline;
1512 buf[i] = c;
1515 /* We found a run of `string_min' printable characters.
1516 Now see if it is terminated with a null byte. */
1517 while (!limit_bytes_to_format
1518 || address < n_bytes_to_skip + max_bytes_to_format)
1520 if (i == bufsize)
1522 bufsize = 1 + 3 * bufsize / 2;
1523 buf = xrealloc (buf, bufsize);
1525 err |= read_char (&c);
1526 address++;
1527 if (c < 0)
1529 free (buf);
1530 return err;
1532 if (c == '\0')
1533 break; /* It is; print this string. */
1534 if (!ISPRINT (c))
1535 goto tryline; /* It isn't; give up on this string. */
1536 buf[i++] = c; /* String continues; store it all. */
1539 /* If we get here, the string is all printable and null-terminated,
1540 so print it. It is all in `buf' and `i' is its length. */
1541 buf[i] = 0;
1542 if (output_address_fmt_string != NULL)
1544 printf ("%s ", format_address (address - i - 1));
1546 for (i = 0; (c = buf[i]); i++)
1548 switch (c)
1550 case '\007':
1551 fputs ("\\a", stdout);
1552 break;
1554 case '\b':
1555 fputs ("\\b", stdout);
1556 break;
1558 case '\f':
1559 fputs ("\\f", stdout);
1560 break;
1562 case '\n':
1563 fputs ("\\n", stdout);
1564 break;
1566 case '\r':
1567 fputs ("\\r", stdout);
1568 break;
1570 case '\t':
1571 fputs ("\\t", stdout);
1572 break;
1574 case '\v':
1575 fputs ("\\v", stdout);
1576 break;
1578 default:
1579 putc (c, stdout);
1582 putchar ('\n');
1585 /* We reach this point only if we search through
1586 (max_bytes_to_format - string_min) bytes before reachine EOF. */
1588 free (buf);
1590 err |= check_and_close ();
1591 return err;
1595 main (int argc, char **argv)
1597 int c;
1598 int n_files;
1599 unsigned int i;
1600 unsigned int l_c_m;
1601 unsigned int address_pad_len;
1602 unsigned long int desired_width;
1603 int width_specified = 0;
1604 int n_failed_decodes = 0;
1605 int err;
1607 /* The old-style `pseudo starting address' to be printed in parentheses
1608 after any true address. */
1609 long int pseudo_start;
1611 #ifdef lint /* Suppress `used before initialized' warning. */
1612 pseudo_start = 0;
1613 #endif
1615 program_name = argv[0];
1616 setlocale (LC_ALL, "");
1617 bindtextdomain (PACKAGE, LOCALEDIR);
1618 textdomain (PACKAGE);
1620 err = 0;
1622 for (i = 0; i <= MAX_INTEGRAL_TYPE_SIZE; i++)
1623 integral_type_size[i] = NO_SIZE;
1625 integral_type_size[sizeof (char)] = CHAR;
1626 integral_type_size[sizeof (short int)] = SHORT;
1627 integral_type_size[sizeof (int)] = INT;
1628 integral_type_size[sizeof (long int)] = LONG;
1630 for (i = 0; i <= MAX_FP_TYPE_SIZE; i++)
1631 fp_type_size[i] = NO_SIZE;
1633 fp_type_size[sizeof (float)] = FLOAT_SINGLE;
1634 /* The array entry for `double' is filled in after that for LONG_DOUBLE
1635 so that if `long double' is the same type or if long double isn't
1636 supported FLOAT_LONG_DOUBLE will never be used. */
1637 fp_type_size[sizeof (LONG_DOUBLE)] = FLOAT_LONG_DOUBLE;
1638 fp_type_size[sizeof (double)] = FLOAT_DOUBLE;
1640 n_specs = 0;
1641 n_specs_allocated = 5;
1642 spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
1644 output_address_fmt_string = "%07o";
1645 format_address = format_address_std;
1646 address_pad_len = 7;
1647 flag_dump_strings = 0;
1649 while ((c = getopt_long (argc, argv, "abcdfhilos::xw::A:j:N:t:v",
1650 long_options, NULL)) != -1)
1652 unsigned long int tmp;
1653 enum strtol_error s_err;
1655 switch (c)
1657 case 0:
1658 break;
1660 case 'A':
1661 switch (optarg[0])
1663 case 'd':
1664 output_address_fmt_string = "%07d";
1665 format_address = format_address_std;
1666 address_pad_len = 7;
1667 break;
1668 case 'o':
1669 output_address_fmt_string = "%07o";
1670 format_address = format_address_std;
1671 address_pad_len = 7;
1672 break;
1673 case 'x':
1674 output_address_fmt_string = "%06x";
1675 format_address = format_address_std;
1676 address_pad_len = 6;
1677 break;
1678 case 'n':
1679 output_address_fmt_string = NULL;
1680 format_address = format_address_none;
1681 address_pad_len = 0;
1682 break;
1683 default:
1684 error (EXIT_FAILURE, 0,
1685 _("invalid output address radix `%c'; \
1686 it must be one character from [doxn]"),
1687 optarg[0]);
1688 break;
1690 break;
1692 case 'j':
1693 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1694 n_bytes_to_skip = tmp;
1695 if (s_err != LONGINT_OK)
1696 STRTOL_FATAL_ERROR (optarg, _("skip argument"), s_err);
1697 break;
1699 case 'N':
1700 limit_bytes_to_format = 1;
1702 /* FIXME: if off_t is long long and that's an 8-byte type,
1703 use xstrtouq here. */
1704 s_err = xstrtoul (optarg, NULL, 0, &tmp, "bkm");
1705 max_bytes_to_format = tmp;
1706 if (s_err != LONGINT_OK)
1707 STRTOL_FATAL_ERROR (optarg, _("limit argument"), s_err);
1709 if (tmp > LONG_MAX)
1710 error (EXIT_FAILURE, 0,
1711 _("specified number of bytes `%s' is larger than \
1712 the maximum\nrepresentable value of type `long'"), optarg);
1713 break;
1715 case 's':
1716 if (optarg == NULL)
1717 string_min = 3;
1718 else
1720 s_err = xstrtoul (optarg, NULL, 0, &string_min, "bkm");
1721 if (s_err != LONGINT_OK)
1722 STRTOL_FATAL_ERROR (optarg, _("minimum string length"), s_err);
1724 ++flag_dump_strings;
1725 break;
1727 case 't':
1728 if (decode_format_string (optarg))
1729 ++n_failed_decodes;
1730 break;
1732 case 'v':
1733 abbreviate_duplicate_blocks = 0;
1734 break;
1736 case 'B':
1737 traditional = 1;
1738 break;
1740 /* The next several cases map the old, pre-POSIX format
1741 specification options to the corresponding POSIX format
1742 specs. GNU od accepts any combination of old- and
1743 new-style options. Format specification options accumulate. */
1745 #define CASE_OLD_ARG(old_char,new_string) \
1746 case old_char: \
1748 if (decode_format_string (new_string)) \
1749 ++n_failed_decodes; \
1751 break
1753 CASE_OLD_ARG ('a', "a");
1754 CASE_OLD_ARG ('b', "oC");
1755 CASE_OLD_ARG ('c', "c");
1756 CASE_OLD_ARG ('d', "u2");
1757 CASE_OLD_ARG ('f', "fF");
1758 CASE_OLD_ARG ('h', "x2");
1759 CASE_OLD_ARG ('i', "d2");
1760 CASE_OLD_ARG ('l', "d4");
1761 CASE_OLD_ARG ('o', "o2");
1762 CASE_OLD_ARG ('x', "x2");
1764 #undef CASE_OLD_ARG
1766 case 'w':
1767 width_specified = 1;
1768 if (optarg == NULL)
1770 desired_width = 32;
1772 else
1774 s_err = xstrtoul (optarg, NULL, 10, &desired_width, "");
1775 if (s_err != LONGINT_OK)
1776 STRTOL_FATAL_ERROR (optarg, _("width specification"), s_err);
1778 break;
1780 default:
1781 usage (1);
1782 break;
1786 if (n_failed_decodes > 0)
1787 exit (EXIT_FAILURE);
1789 if (show_version)
1791 printf ("od (%s) %s\n", GNU_PACKAGE, VERSION);
1792 exit (EXIT_SUCCESS);
1795 if (show_help)
1796 usage (0);
1798 if (flag_dump_strings && n_specs > 0)
1799 error (EXIT_FAILURE, 0,
1800 _("no type may be specified when dumping strings"));
1802 n_files = argc - optind;
1804 /* If the --backward-compatible option is used, there may be from
1805 0 to 3 remaining command line arguments; handle each case
1806 separately.
1807 od [file] [[+]offset[.][b] [[+]label[.][b]]]
1808 The offset and pseudo_start have the same syntax. */
1810 if (traditional)
1812 off_t offset;
1814 if (n_files == 1)
1816 if ((offset = parse_old_offset (argv[optind])) >= 0)
1818 n_bytes_to_skip = offset;
1819 --n_files;
1820 ++argv;
1823 else if (n_files == 2)
1825 off_t o1, o2;
1826 if ((o1 = parse_old_offset (argv[optind])) >= 0
1827 && (o2 = parse_old_offset (argv[optind + 1])) >= 0)
1829 n_bytes_to_skip = o1;
1830 flag_pseudo_start = 1;
1831 pseudo_start = o2;
1832 argv += 2;
1833 n_files -= 2;
1835 else if ((o2 = parse_old_offset (argv[optind + 1])) >= 0)
1837 n_bytes_to_skip = o2;
1838 --n_files;
1839 argv[optind + 1] = argv[optind];
1840 ++argv;
1842 else
1844 error (0, 0,
1845 _("invalid second operand in compatibility mode `%s'"),
1846 argv[optind + 1]);
1847 usage (1);
1850 else if (n_files == 3)
1852 off_t o1, o2;
1853 if ((o1 = parse_old_offset (argv[optind + 1])) >= 0
1854 && (o2 = parse_old_offset (argv[optind + 2])) >= 0)
1856 n_bytes_to_skip = o1;
1857 flag_pseudo_start = 1;
1858 pseudo_start = o2;
1859 argv[optind + 2] = argv[optind];
1860 argv += 2;
1861 n_files -= 2;
1863 else
1865 error (0, 0,
1866 _("in compatibility mode, the last two arguments must be offsets"));
1867 usage (1);
1870 else if (n_files > 3)
1872 error (0, 0,
1873 _("compatibility mode supports at most three arguments"));
1874 usage (1);
1877 if (flag_pseudo_start)
1879 static char buf[10];
1881 if (output_address_fmt_string == NULL)
1883 output_address_fmt_string = "(%07o)";
1884 format_address = format_address_std;
1886 else
1888 sprintf (buf, "%s (%s)",
1889 output_address_fmt_string,
1890 output_address_fmt_string);
1891 output_address_fmt_string = buf;
1892 format_address = format_address_label;
1897 assert (address_pad_len <= MAX_ADDRESS_LENGTH);
1898 for (i = 0; i < address_pad_len; i++)
1899 address_pad[i] = ' ';
1900 address_pad[address_pad_len] = '\0';
1902 if (n_specs == 0)
1904 if (decode_one_format ("o2", "o2", NULL, &(spec[0])))
1906 /* This happens on Cray systems that don't have a 2-byte
1907 integral type. */
1908 exit (EXIT_FAILURE);
1911 n_specs = 1;
1914 if (n_files > 0)
1915 file_list = (char const *const *) &argv[optind];
1916 else
1918 /* If no files were listed on the command line, set up the
1919 global array FILE_LIST so that it contains the null-terminated
1920 list of one name: "-". */
1921 static char const *const default_file_list[] = {"-", NULL};
1923 file_list = default_file_list;
1926 err |= skip (n_bytes_to_skip);
1927 if (in_stream == NULL)
1928 goto cleanup;
1930 pseudo_offset = (flag_pseudo_start ? pseudo_start - n_bytes_to_skip : 0);
1932 /* Compute output block length. */
1933 l_c_m = get_lcm ();
1935 if (width_specified)
1937 if (desired_width != 0 && desired_width % l_c_m == 0)
1938 bytes_per_block = desired_width;
1939 else
1941 error (0, 0, _("warning: invalid width %lu; using %d instead"),
1942 desired_width, l_c_m);
1943 bytes_per_block = l_c_m;
1946 else
1948 if (l_c_m < DEFAULT_BYTES_PER_BLOCK)
1949 bytes_per_block = l_c_m * (int) (DEFAULT_BYTES_PER_BLOCK / l_c_m);
1950 else
1951 bytes_per_block = l_c_m;
1954 #ifdef DEBUG
1955 for (i = 0; i < n_specs; i++)
1957 printf (_("%d: fmt=\"%s\" width=%d\n"),
1958 i, spec[i].fmt_string, width_bytes[spec[i].size]);
1960 #endif
1962 err |= (flag_dump_strings ? dump_strings () : dump ());
1964 cleanup:;
1966 if (have_read_stdin && fclose (stdin) == EOF)
1967 error (EXIT_FAILURE, errno, _("standard input"));
1969 if (fclose (stdout) == EOF)
1970 error (EXIT_FAILURE, errno, _("write error"));
1972 exit (err == 0 ? EXIT_SUCCESS : EXIT_FAILURE);