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); const char *tar_dirname (void);
/* intmax (N) is like ((intmax_t) (N)) except without a cast so /* 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 COMMON_INLINE intmax_t
intmax (intmax_t n) intmax (intmax_t n)
{ {
return n; return n;
} }
COMMON_INLINE uintmax_t /* intmax should be used only with signed types.
uintmax (uintmax_t n)
{
return n;
}
/* intmax should be used only with signed types, and uintmax for unsigned.
To bypass this check parenthesize the function, e.g., (intmax) (n). */ To bypass this check parenthesize the function, e.g., (intmax) (n). */
#define intmax(n) verify_expr (EXPR_SIGNED (n), (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. /* 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 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 CHRTYPE:
case BLKTYPE: case BLKTYPE:
sizelen = ((EXPR_SIGNED (major (st->stat.st_rdev)) if (EXPR_SIGNED (major (st->stat.st_rdev)))
&& EXPR_SIGNED (minor (st->stat.st_rdev))) {
? sprintf (size, "%jd,%jd", intmax_t m = major (st->stat.st_rdev);
(intmax) (major (st->stat.st_rdev)), sizelen = sprintf (size, "%jd", m);
(intmax) (minor (st->stat.st_rdev))) }
: sprintf (size, "%ju,%ju", else
(uintmax) (major (st->stat.st_rdev)), {
(uintmax) (minor (st->stat.st_rdev)))); 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; break;
default: default: