]> git.ipfire.org Git - thirdparty/tar.git/commitdiff
Remove major, minor signedness assumption
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 1 Nov 2024 16:40:36 +0000 (09:40 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 2 Nov 2024 06:47:23 +0000 (23:47 -0700)
* src/common.h (uintmax): Remove; no longer used.
* src/list.c (simple_print_header): Don’t assume major and minor
agree in signedness.

src/common.h
src/list.c

index 15755b7b078e99fd2364650940c73474fc8ec48f..4b25e089fd72a3437576bc1efb952a10a8a5accc 100644 (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
index f3ab4dd463e70bad4552f00d5ee076397520ec24..4eecd293f0ba13d7e8cb461e079dcf651e91b1b2 100644 (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: