Prefer int to idx_t for some small sizes

* src/create.c (max_octal_val, to_octal, tar_copy_str)
(tar_name_copy_str, to_base256, to_chars_subst, to_chars)
(gid_to_chars, major_to_chars, minor_to_chars, mode_to_chars)
(off_to_chars, time_to_chars, uid_to_chars, string_to_chars)
(split_long_name, write_ustar_long_name, simple_finish_header):
* src/list.c (from_header, gid_from_header, major_from_header)
(minor_from_header, mode_from_header, off_from_header)
(time_from_header, uid_from_header):
Prefer int to idx_t where either will do because the buffer sizes
are known to be small, as this can be a performance win on 32-bit
platforms.  Also, in a few cases the values were negative, whereas
idx_t is supposed to be nonnegative.
This commit is contained in:
Paul Eggert
2024-11-01 10:37:39 -07:00
parent 967f5f52f7
commit bde3e8d663
3 changed files with 47 additions and 46 deletions

View File

@@ -529,8 +529,8 @@ enum exclusion_tag_type check_exclusion_tags (struct tar_stat_info const *st,
#define OFF_TO_CHARS(val, where) off_to_chars (val, where, sizeof (where))
#define TIME_TO_CHARS(val, where) time_to_chars (val, where, sizeof (where))
bool off_to_chars (off_t off, char *buf, idx_t size);
bool time_to_chars (time_t t, char *buf, idx_t size);
bool off_to_chars (off_t off, char *buf, int size);
bool time_to_chars (time_t t, char *buf, int size);
/* Module diffarch.c. */
@@ -616,7 +616,7 @@ void transform_stat_info (int typeflag, struct tar_stat_info *stat_info);
char const *tartime (struct timespec t, bool full_time);
#define OFF_FROM_HEADER(where) off_from_header (where, sizeof (where))
off_t off_from_header (const char *buf, idx_t size);
off_t off_from_header (const char *buf, int size);
void list_archive (void);
void test_archive_label (void);

View File

@@ -132,7 +132,7 @@ max_val_with_digits (int digits, int bits_per_digit)
/* The maximum uintmax_t value that can be represented with octal
digits and a trailing NUL in a buffer of size BUFSIZE. */
static uintmax_t
max_octal_val (idx_t bufsize)
max_octal_val (int bufsize)
{
return max_val_with_digits (bufsize - 1, LG_8);
}
@@ -142,10 +142,10 @@ max_octal_val (idx_t bufsize)
The result is undefined if SIZE is 0 or if VALUE is too large to fit. */
static void
to_octal (uintmax_t value, char *where, idx_t size)
to_octal (uintmax_t value, char *where, int size)
{
uintmax_t v = value;
idx_t i = size;
int i = size;
do
{
@@ -159,9 +159,9 @@ to_octal (uintmax_t value, char *where, idx_t size)
NUL unless SRC is LEN or more bytes long. */
static void
tar_copy_str (char *dst, const char *src, idx_t len)
tar_copy_str (char *dst, const char *src, int len)
{
for (idx_t i = 0; i < len; i++)
for (int i = 0; i < len; i++)
if (! (dst[i] = src[i]))
break;
}
@@ -170,11 +170,11 @@ tar_copy_str (char *dst, const char *src, idx_t len)
is OLDGNU format */
static void
tar_name_copy_str (char *dst, const char *src, idx_t len)
tar_name_copy_str (char *dst, const char *src, int len)
{
tar_copy_str (dst, src, len);
if (archive_format == OLDGNU_FORMAT)
dst[len-1] = 0;
dst[len - 1] = 0;
}
/* Convert NEGATIVE VALUE to a base-256 representation suitable for
@@ -184,12 +184,12 @@ tar_name_copy_str (char *dst, const char *src, idx_t len)
fit. */
static void
to_base256 (bool negative, uintmax_t value, char *where, idx_t size)
to_base256 (bool negative, uintmax_t value, char *where, int size)
{
uintmax_t v = value;
uintmax_t sign_bits = - negative;
uintmax_t propagated_sign_bits = sign_bits << (UINTMAX_WIDTH - LG_256);
idx_t i = size;
int i = size;
do
{
@@ -209,14 +209,14 @@ to_base256 (bool negative, uintmax_t value, char *where, idx_t size)
#define GNAME_TO_CHARS(name, buf) string_to_chars (name, buf, sizeof (buf))
static bool
to_chars (bool negative, uintmax_t value, idx_t valsize,
to_chars (bool negative, uintmax_t value, int valsize,
uintmax_t (*substitute) (bool *),
char *where, idx_t size, const char *type);
char *where, int size, const char *type);
static bool
to_chars_subst (bool negative, bool gnu_format, uintmax_t value, idx_t valsize,
to_chars_subst (bool negative, bool gnu_format, uintmax_t value, int valsize,
uintmax_t (*substitute) (bool *),
char *where, idx_t size, const char *type)
char *where, int size, const char *type)
{
uintmax_t maxval = (gnu_format
? max_val_with_digits (size - 1, LG_256)
@@ -267,9 +267,9 @@ to_chars_subst (bool negative, bool gnu_format, uintmax_t value, idx_t valsize,
substitute value is negative. */
static bool
to_chars (bool negative, uintmax_t value, idx_t valsize,
to_chars (bool negative, uintmax_t value, int valsize,
uintmax_t (*substitute) (bool *),
char *where, idx_t size, const char *type)
char *where, int size, const char *type)
{
bool gnu_format = (archive_format == GNU_FORMAT
|| archive_format == OLDGNU_FORMAT);
@@ -340,25 +340,25 @@ gid_substitute (bool *negative)
}
static bool
gid_to_chars (gid_t v, char *p, idx_t s)
gid_to_chars (gid_t v, char *p, int s)
{
return to_chars (v < 0, v, sizeof v, gid_substitute, p, s, "gid_t");
}
static bool
major_to_chars (major_t v, char *p, idx_t s)
major_to_chars (major_t v, char *p, int s)
{
return to_chars (v < 0, v, sizeof v, 0, p, s, "major_t");
}
static bool
minor_to_chars (minor_t v, char *p, idx_t s)
minor_to_chars (minor_t v, char *p, int s)
{
return to_chars (v < 0, v, sizeof v, 0, p, s, "minor_t");
}
static bool
mode_to_chars (mode_t v, char *p, idx_t s)
mode_to_chars (mode_t v, char *p, int s)
{
/* In the common case where the internal and external mode bits are the same,
and we are not using POSIX or GNU format,
@@ -398,13 +398,13 @@ mode_to_chars (mode_t v, char *p, idx_t s)
}
bool
off_to_chars (off_t v, char *p, idx_t s)
off_to_chars (off_t v, char *p, int s)
{
return to_chars (v < 0, v, sizeof v, 0, p, s, "off_t");
}
bool
time_to_chars (time_t v, char *p, idx_t s)
time_to_chars (time_t v, char *p, int s)
{
return to_chars (v < 0, v, sizeof v, 0, p, s, "time_t");
}
@@ -426,13 +426,13 @@ uid_substitute (bool *negative)
}
static bool
uid_to_chars (uid_t v, char *p, idx_t s)
uid_to_chars (uid_t v, char *p, int s)
{
return to_chars (v < 0, v, sizeof v, uid_substitute, p, s, "uid_t");
}
static void
string_to_chars (char const *str, char *p, idx_t s)
string_to_chars (char const *str, char *p, int s)
{
tar_copy_str (p, str, s);
p[s - 1] = '\0';
@@ -552,10 +552,10 @@ write_gnu_long_link (struct tar_stat_info *st, const char *p, char type)
set_next_block_after (header + (size - 1) / BLOCKSIZE);
}
static idx_t
static int
split_long_name (const char *name, idx_t length)
{
idx_t i;
int i;
if (length > PREFIX_FIELD_SIZE + 1)
length = PREFIX_FIELD_SIZE + 1;
@@ -580,8 +580,9 @@ write_ustar_long_name (const char *name)
return NULL;
}
idx_t i = split_long_name (name, length), nlen;
if (i == 0 || (nlen = length - i - 1) > NAME_FIELD_SIZE || nlen == 0)
int i = split_long_name (name, length);
idx_t nlen = length - i - 1;
if (i == 0 || ! (0 < nlen && nlen <= NAME_FIELD_SIZE))
{
paxerror (0, _("%s: file name is too long (cannot be split); not dumped"),
quotearg_colon (name));
@@ -952,7 +953,7 @@ simple_finish_header (union block *header)
int sum = 0;
char *p = header->buffer;
for (idx_t i = sizeof *header; i-- != 0; )
for (int i = sizeof *header; i-- != 0; )
/* We can't use unsigned char here because of old compilers, e.g. V7. */
sum += 0xFF & *p++;

View File

@@ -42,13 +42,13 @@ static union block *recent_global_header; /* Recent global header block */
#define TIME_FROM_HEADER(where) time_from_header (where, sizeof (where))
#define UID_FROM_HEADER(where) uid_from_header (where, sizeof (where))
static gid_t gid_from_header (const char *buf, idx_t size);
static major_t major_from_header (const char *buf, idx_t size);
static minor_t minor_from_header (const char *buf, idx_t size);
static mode_t mode_from_header (const char *buf, idx_t size, bool *hbits);
static time_t time_from_header (const char *buf, idx_t size);
static uid_t uid_from_header (const char *buf, idx_t size);
static intmax_t from_header (const char *, idx_t, const char *,
static gid_t gid_from_header (const char *buf, int size);
static major_t major_from_header (const char *buf, int size);
static minor_t minor_from_header (const char *buf, int size);
static mode_t mode_from_header (const char *buf, int size, bool *hbits);
static time_t time_from_header (const char *buf, int size);
static uid_t uid_from_header (const char *buf, int size);
static intmax_t from_header (const char *, int, const char *,
intmax_t, uintmax_t, bool, bool);
/* Table of base-64 digit values + 1, indexed by unsigned chars.
@@ -722,7 +722,7 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
numbers instead of the other GNU extensions. Return -1 on error,
diagnosing the error if TYPE is nonnull and if !SILENT. */
static intmax_t
from_header (char const *where0, idx_t digs, char const *type,
from_header (char const *where0, int digs, char const *type,
intmax_t minval, uintmax_t maxval,
bool octal_only, bool silent)
{
@@ -943,7 +943,7 @@ from_header (char const *where0, idx_t digs, char const *type,
}
static gid_t
gid_from_header (const char *p, idx_t s)
gid_from_header (const char *p, int s)
{
return from_header (p, s, "gid_t",
TYPE_MINIMUM (gid_t), TYPE_MAXIMUM (gid_t),
@@ -951,7 +951,7 @@ gid_from_header (const char *p, idx_t s)
}
static major_t
major_from_header (const char *p, idx_t s)
major_from_header (const char *p, int s)
{
return from_header (p, s, "major_t",
TYPE_MINIMUM (major_t), TYPE_MAXIMUM (major_t),
@@ -959,7 +959,7 @@ major_from_header (const char *p, idx_t s)
}
static minor_t
minor_from_header (const char *p, idx_t s)
minor_from_header (const char *p, int s)
{
return from_header (p, s, "minor_t",
TYPE_MINIMUM (minor_t), TYPE_MAXIMUM (minor_t),
@@ -969,7 +969,7 @@ minor_from_header (const char *p, idx_t s)
/* Convert P to the file mode, as understood by tar.
Set *HBITS if there are any unrecognized bits. */
static mode_t
mode_from_header (const char *p, idx_t s, bool *hbits)
mode_from_header (const char *p, int s, bool *hbits)
{
intmax_t u = from_header (p, s, "mode_t",
INTMAX_MIN, UINTMAX_MAX,
@@ -991,7 +991,7 @@ mode_from_header (const char *p, idx_t s, bool *hbits)
}
off_t
off_from_header (const char *p, idx_t s)
off_from_header (const char *p, int s)
{
/* Negative offsets are not allowed in tar files, so invoke
from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
@@ -1001,7 +1001,7 @@ off_from_header (const char *p, idx_t s)
}
static time_t
time_from_header (const char *p, idx_t s)
time_from_header (const char *p, int s)
{
return from_header (p, s, "time_t",
TYPE_MINIMUM (time_t), TYPE_MAXIMUM (time_t),
@@ -1009,7 +1009,7 @@ time_from_header (const char *p, idx_t s)
}
static uid_t
uid_from_header (const char *p, idx_t s)
uid_from_header (const char *p, int s)
{
return from_header (p, s, "uid_t",
TYPE_MINIMUM (uid_t), TYPE_MAXIMUM (uid_t),