diff --git a/lib/alloc/calloc.h b/lib/alloc/calloc.h index db10a685bb..a9b64a2a29 100644 --- a/lib/alloc/calloc.h +++ b/lib/alloc/calloc.h @@ -10,16 +10,12 @@ #include +#include "cast.h" #include "exit_if_null.h" -#include "sizeof.h" // calloc_T - calloc type-safe -#define calloc_T(n, T) calloc_T_(n, typeas(T)) -#define calloc_T_(n, T) \ -({ \ - (T *){calloc(n, sizeof(T))}; \ -}) +#define calloc_T(n, T) ptr_cast(T, calloc(n, sizeof(T))) // xcalloc_T - exit-on-error calloc type-safe diff --git a/lib/alloc/malloc.c b/lib/alloc/malloc.c index 97557a7fc4..31ed42814f 100644 --- a/lib/alloc/malloc.c +++ b/lib/alloc/malloc.c @@ -1,16 +1,7 @@ -// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh -// SPDX-FileCopyrightText: 1996-1998, Marek Michałkiewicz -// SPDX-FileCopyrightText: 2003-2006, Tomasz Kłoczko -// SPDX-FileCopyrightText: 2008 , Nicolas François -// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar +// SPDX-FileCopyrightText: 2023-2026, Alejandro Colomar // SPDX-License-Identifier: BSD-3-Clause #include "config.h" #include "alloc/malloc.h" - -#include - - -extern inline void *mallocarray(size_t nmemb, size_t size); diff --git a/lib/alloc/malloc.h b/lib/alloc/malloc.h index 1e3a69291a..e3b7d132a8 100644 --- a/lib/alloc/malloc.h +++ b/lib/alloc/malloc.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023-2025, Alejandro Colomar +// SPDX-FileCopyrightText: 2023-2026, Alejandro Colomar // SPDX-License-Identifier: BSD-3-Clause @@ -10,17 +10,12 @@ #include -#include "attr.h" +#include "cast.h" #include "exit_if_null.h" -#include "sizeof.h" // malloc_T - malloc type-safe -#define malloc_T(n, T) malloc_T_(n, typeas(T)) -#define malloc_T_(n, T) \ -({ \ - (T *){mallocarray(n, sizeof(T))}; \ -}) +#define malloc_T(n, T) ptr_cast(T, mallocarray(n, sizeof(T))) // xmalloc_T - exit-on-error malloc type-safe @@ -28,16 +23,7 @@ // mallocarray - malloc array -ATTR_ALLOC_SIZE(1, 2) -ATTR_MALLOC(free) -inline void *mallocarray(size_t nmemb, size_t size); - - -inline void * -mallocarray(size_t nmemb, size_t size) -{ - return reallocarray(NULL, nmemb, size); -} +#define mallocarray(...) reallocarray(NULL, __VA_ARGS__) #endif // include guard diff --git a/lib/alloc/realloc.h b/lib/alloc/realloc.h index ac9f046ec6..8102617131 100644 --- a/lib/alloc/realloc.h +++ b/lib/alloc/realloc.h @@ -10,6 +10,7 @@ #include +#include "cast.h" #include "exit_if_null.h" #include "sizeof.h" @@ -17,10 +18,10 @@ // realloc_T - realloc type-safe #define realloc_T(p, n, T) realloc_T_(p, n, typeas(T)) #define realloc_T_(p, n, T) \ -({ \ - _Generic(p, T *: (void)0); \ - (T *){reallocarray_(p, n, sizeof(T))}; \ -}) +( \ + _Generic(p, T *: (void)0), \ + ptr_cast(T, reallocarray_(p, n, sizeof(T))) \ +) #define reallocarray_(p, n, size) reallocarray(p, (n) ?: 1, (size) ?: 1) diff --git a/lib/alloc/reallocf.h b/lib/alloc/reallocf.h index c3522829d6..70342b81ce 100644 --- a/lib/alloc/reallocf.h +++ b/lib/alloc/reallocf.h @@ -12,16 +12,17 @@ #include #include "attr.h" +#include "cast.h" #include "sizeof.h" // reallocf_T - realloc free-on-error type-safe #define reallocf_T(p, n, T) reallocf_T_(p, n, typeas(T)) #define reallocf_T_(p, n, T) \ -({ \ - _Generic(p, T *: (void)0); \ - (T *){reallocarrayf_(p, n, sizeof(T))}; \ -}) +( \ + _Generic(p, T *: (void)0), \ + ptr_cast(T, reallocarrayf_(p, n, sizeof(T))) \ +) #define reallocarrayf_(p, n, size) reallocarrayf(p, (n) ?: 1, (size) ?: 1) diff --git a/lib/cast.h b/lib/cast.h index e8e42e1a0b..d00252fd52 100644 --- a/lib/cast.h +++ b/lib/cast.h @@ -8,8 +8,13 @@ #include "config.h" +#include "sizeof.h" + #define const_cast(T, p) _Generic(p, const T: (T) (p)) +#define ptr_cast(T, p) rvalue((typeas(T) *){(p)}) + +#define rvalue(lv) ((void)0, (lv)) #endif // include guard diff --git a/lib/search/l/lfind.h b/lib/search/l/lfind.h index 7bbd16e0e3..513e811346 100644 --- a/lib/search/l/lfind.h +++ b/lib/search/l/lfind.h @@ -11,6 +11,7 @@ #include #include +#include "cast.h" #include "search/cmp/cmp.h" #include "sizeof.h" @@ -18,11 +19,11 @@ // lfind_T - linear find type-safe #define lfind_T(T, ...) lfind_T_(typeas(T), __VA_ARGS__) #define lfind_T_(T, k, a, n, cmp) \ -({ \ - _Generic(k, T *: (void)0, const T *: (void)0); \ - _Generic(a, T *: (void)0, const T *: (void)0); \ - (T *){lfind_(k, a, n, sizeof(T), cmp)}; \ -}) +( \ + _Generic(k, T *: (void)0, const T *: (void)0), \ + _Generic(a, T *: (void)0, const T *: (void)0), \ + ptr_cast(T, lfind_(k, a, n, sizeof(T), cmp)) \ +) #define LFIND(T, ...) lfind_T(T, __VA_ARGS__, CMP(T)) diff --git a/lib/sizeof.h b/lib/sizeof.h index 1fc38873dd..e9aa343a0b 100644 --- a/lib/sizeof.h +++ b/lib/sizeof.h @@ -14,10 +14,12 @@ #endif #include +#include "cast.h" + #define typeas(T) typeof((T){0}) -#define ssizeof(x) ({(ssize_t){sizeof(x)};}) +#define ssizeof(x) rvalue((ssize_t){sizeof(x)}) #define memberof(T, member) ((T){}.member) #define WIDTHOF(x) (sizeof(x) * CHAR_BIT)