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:
10
src/common.h
10
src/common.h
@@ -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
|
||||
|
||||
28
src/list.c
28
src/list.c
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user