From 10071e284ea4a496ab97b56d477e23cf09d972ec Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Tue, 13 Aug 2024 08:00:00 +0000 Subject: pam_inline.h: introduce zero_extend_signed_to_ull() and sign_extend_unsigned_to_ll() Import these handy macros from strace project. --- libpam/include/pam_inline.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'libpam') diff --git a/libpam/include/pam_inline.h b/libpam/include/pam_inline.h index a5aceb8a..cc302248 100644 --- a/libpam/include/pam_inline.h +++ b/libpam/include/pam_inline.h @@ -44,6 +44,26 @@ /* Evaluates to the number of elements in the specified array. */ #define PAM_ARRAY_SIZE(a_) (sizeof(a_) / sizeof((a_)[0]) + PAM_MUST_BE_ARRAY(a_)) +/* + * Zero-extend a signed integer type to unsigned long long. + */ +# define zero_extend_signed_to_ull(v_) \ + (sizeof(v_) == sizeof(char) ? (unsigned long long) (unsigned char) (v_) : \ + sizeof(v_) == sizeof(short) ? (unsigned long long) (unsigned short) (v_) : \ + sizeof(v_) == sizeof(int) ? (unsigned long long) (unsigned int) (v_) : \ + sizeof(v_) == sizeof(long) ? (unsigned long long) (unsigned long) (v_) : \ + (unsigned long long) (v_)) + +/* + * Sign-extend an unsigned integer type to long long. + */ +# define sign_extend_unsigned_to_ll(v_) \ + (sizeof(v_) == sizeof(char) ? (long long) (signed char) (v_) : \ + sizeof(v_) == sizeof(short) ? (long long) (signed short) (v_) : \ + sizeof(v_) == sizeof(int) ? (long long) (signed int) (v_) : \ + sizeof(v_) == sizeof(long) ? (long long) (signed long) (v_) : \ + (long long) (v_)) + /* * Returns NULL if STR does not start with PREFIX, * or a pointer to the first char in STR after PREFIX. -- cgit v1.2.3