Remove major, minor signedness assumption

* src/common.h (uintmax): Remove; no longer used.
* src/list.c (simple_print_header): Don’t assume major and minor
agree in signedness.
This commit is contained in:
Paul Eggert
2024-11-01 09:40:36 -07:00
parent 2339c9106b
commit 0aa69501d3
2 changed files with 22 additions and 16 deletions

View File

@@ -650,21 +650,15 @@ char *namebuf_name (namebuf_t buf, const char *name);
const char *tar_dirname (void);
/* intmax (N) is like ((intmax_t) (N)) except without a cast so
that it is an error if N is a pointer. Similarly for uintmax. */
that it is an error if N is a pointer. */
COMMON_INLINE intmax_t
intmax (intmax_t n)
{
return n;
}
COMMON_INLINE uintmax_t
uintmax (uintmax_t n)
{
return n;
}
/* intmax should be used only with signed types, and uintmax for unsigned.
/* intmax should be used only with signed types.
To bypass this check parenthesize the function, e.g., (intmax) (n). */
#define intmax(n) verify_expr (EXPR_SIGNED (n), (intmax) (n))
#define uintmax(n) verify_expr (!EXPR_SIGNED (n), (uintmax) (n))
/* Represent N using a signed integer I such that (uintmax_t) I == N.
With a good optimizing compiler, this is equivalent to (intmax_t) i

View File

@@ -1228,14 +1228,26 @@ simple_print_header (struct tar_stat_info *st, union block *blk,
{
case CHRTYPE:
case BLKTYPE:
sizelen = ((EXPR_SIGNED (major (st->stat.st_rdev))
&& EXPR_SIGNED (minor (st->stat.st_rdev)))
? sprintf (size, "%jd,%jd",
(intmax) (major (st->stat.st_rdev)),
(intmax) (minor (st->stat.st_rdev)))
: sprintf (size, "%ju,%ju",
(uintmax) (major (st->stat.st_rdev)),
(uintmax) (minor (st->stat.st_rdev))));
if (EXPR_SIGNED (major (st->stat.st_rdev)))
{
intmax_t m = major (st->stat.st_rdev);
sizelen = sprintf (size, "%jd", m);
}
else
{
uintmax_t m = major (st->stat.st_rdev);
sizelen = sprintf (size, "%ju", m);
}
if (EXPR_SIGNED (minor (st->stat.st_rdev)))
{
intmax_t m = minor (st->stat.st_rdev);
sizelen += sprintf (size + sizelen, ",%jd", m);
}
else
{
uintmax_t m = minor (st->stat.st_rdev);
sizelen += sprintf (size + sizelen, ",%ju", m);
}
break;
default: