1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-07-25 10:16:53 +02:00

Make od print valid addresses for offsets of 2^32 and larger.

(format_address): Use off_t, not long unsigned_int as the
parameter type.
(format_address_none): Likewise.  Mark parameter as unused.
(format_address_std): Likewise.
(format_address_label): Likewise.
(print_ascii): Mark format string parameter as unused.
(write_block): Use off_t, not long unsigned_int as offset type.
(expand_address_fmt): New function.
(main): Use it to expand each address format string template.
Reported by Mark Nudelman, via Andreas Jaeger.
This commit is contained in:
Jim Meyering
2000-12-03 08:44:12 +00:00
parent ce861b2cb3
commit a1ca60f4e5
+32 -12
View File
@@ -178,7 +178,7 @@ static long int pseudo_offset;
/* Function to format an address and optionally an additional parenthesized
pseudo-address; it returns the formatted string. */
static const char *(*format_address) PARAMS ((long unsigned int));
static const char *(*format_address) PARAMS ((off_t));
/* The number of input bytes to skip before formatting and writing. */
static off_t n_bytes_to_skip = 0;
@@ -516,7 +516,7 @@ dump_hexl_mode_trailer (long unsigned int n_bytes, const char *block)
static void
print_named_ascii (long unsigned int n_bytes, const char *block,
const char *unused_fmt_string)
const char *unused_fmt_string ATTRIBUTE_UNUSED)
{
int i;
for (i = n_bytes; i > 0; i--)
@@ -543,7 +543,7 @@ print_named_ascii (long unsigned int n_bytes, const char *block,
static void
print_ascii (long unsigned int n_bytes, const char *block,
const char *unused_fmt_string)
const char *unused_fmt_string ATTRIBUTE_UNUSED)
{
int i;
for (i = n_bytes; i > 0; i--)
@@ -1052,13 +1052,13 @@ skip (off_t n_skip)
}
static const char *
format_address_none (long unsigned int address)
format_address_none (off_t address ATTRIBUTE_UNUSED)
{
return "";
}
static const char *
format_address_std (long unsigned int address)
format_address_std (off_t address)
{
const char *address_string;
@@ -1068,7 +1068,7 @@ format_address_std (long unsigned int address)
}
static const char *
format_address_label (long unsigned int address)
format_address_label (off_t address)
{
const char *address_string;
assert (output_address_fmt_string != NULL);
@@ -1091,7 +1091,7 @@ format_address_label (long unsigned int address)
only when it has not been padded to length BYTES_PER_BLOCK. */
static void
write_block (long unsigned int current_offset, long unsigned int n_bytes,
write_block (off_t current_offset, long unsigned int n_bytes,
const char *prev_block, const char *curr_block)
{
static int first = 1;
@@ -1582,6 +1582,26 @@ dump_strings (void)
return err;
}
/* There must be exactly one %s format specifier in FORMAT_TEMPLATE.
Return the just-malloc'd result of using sprintf to insert
OFF_T_PRINTF_FORMAT_STRING into FORMAT_TEMPLATE.
Technically, the caller should free this memory, but IMHO it's not
worth it in this case. */
static char *
expand_address_fmt (char const *format_template)
{
size_t len = strlen (format_template);
char *fmt = xmalloc (len + 1);
/* Ensure that the literal we're inserting is no longer than the two-byte
string `%s' it's replacing. There's also the %%, so technically we don't
even need the `+ 1' above. */
assert (OFF_T_PRINTF_FORMAT_STRING[0] == 0
|| OFF_T_PRINTF_FORMAT_STRING[1] == 0
|| OFF_T_PRINTF_FORMAT_STRING[2] == 0);
sprintf (fmt, format_template, OFF_T_PRINTF_FORMAT_STRING);
return fmt;
}
int
main (int argc, char **argv)
{
@@ -1633,7 +1653,7 @@ main (int argc, char **argv)
n_specs_allocated = 5;
spec = (struct tspec *) xmalloc (n_specs_allocated * sizeof (struct tspec));
output_address_fmt_string = "%07o";
output_address_fmt_string = expand_address_fmt ("%%07%so");
format_address = format_address_std;
address_pad_len = 7;
flag_dump_strings = 0;
@@ -1653,17 +1673,17 @@ main (int argc, char **argv)
switch (optarg[0])
{
case 'd':
output_address_fmt_string = "%07d";
output_address_fmt_string = expand_address_fmt ("%%07%sd");
format_address = format_address_std;
address_pad_len = 7;
break;
case 'o':
output_address_fmt_string = "%07o";
output_address_fmt_string = expand_address_fmt ("%%07%so");
format_address = format_address_std;
address_pad_len = 7;
break;
case 'x':
output_address_fmt_string = "%06x";
output_address_fmt_string = expand_address_fmt ("%%06%sx");
format_address = format_address_std;
address_pad_len = 6;
break;
@@ -1867,7 +1887,7 @@ the maximum\nrepresentable value of type `long'"), optarg);
if (output_address_fmt_string == NULL)
{
output_address_fmt_string = "(%07o)";
output_address_fmt_string = expand_address_fmt ("(%%07%so)");
format_address = format_address_std;
}
else