X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fmacro.h;h=898784ac839945ff26803a0cfb13728fd401de06;hp=0dd210afa7c419dcf362281134f325ed3542616b;hb=76877b46b652fbfcf8618458556178717b815cd8;hpb=963ddb917de3140308ee62fb642b2307a577a39e diff --git a/src/shared/macro.h b/src/shared/macro.h index 0dd210afa..898784ac8 100644 --- a/src/shared/macro.h +++ b/src/shared/macro.h @@ -46,6 +46,9 @@ #define _introspect_(x) __attribute__((section("introspect." x))) #define _alignas_(x) __attribute__((aligned(__alignof(x)))) +/* automake test harness */ +#define EXIT_TEST_SKIP 77 + #define XSTRINGIFY(x) #x #define STRINGIFY(x) XSTRINGIFY(x) @@ -92,6 +95,7 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) { #define MIN3(a,b,c) \ MIN(MIN(a,b),c) +#ifndef CLAMP #define CLAMP(x, low, high) \ __extension__ ({ \ typeof(x) _x = (x); \ @@ -99,6 +103,7 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) { typeof(high) _high = (high); \ ((_x > _high) ? _high : ((_x < _low) ? _low : _x)); \ }) +#endif #define assert_se(expr) \ do { \ @@ -119,14 +124,21 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) { log_assert_failed_unreachable(t, __FILE__, __LINE__, __PRETTY_FUNCTION__); \ } while (false) -#define assert_cc(expr) \ - do { \ - switch (0) { \ - case 0: \ - case !!(expr): \ - ; \ - } \ +#if defined(static_assert) +#define assert_cc(expr) \ + do { \ + static_assert(expr, #expr); \ } while (false) +#else +#define assert_cc(expr) \ + do { \ + switch (0) { \ + case 0: \ + case !!(expr): \ + ; \ + } \ + } while (false) +#endif #define PTR_TO_UINT(p) ((unsigned int) ((uintptr_t) (p))) #define UINT_TO_PTR(u) ((void*) ((uintptr_t) (u))) @@ -149,6 +161,8 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) { #define memzero(x,l) (memset((x), 0, (l))) #define zero(x) (memzero(&(x), sizeof(x))) +#define CHAR_TO_STR(x) ((char[2]) { x, 0 }) + #define char_array_0(x) x[sizeof(x)-1] = 0; #define IOVEC_SET_STRING(i, s) \ @@ -189,14 +203,21 @@ static inline size_t IOVEC_INCREMENT(struct iovec *i, unsigned n, size_t k) { #define _cleanup_free_ __attribute__((cleanup(freep))) #define _cleanup_fclose_ __attribute__((cleanup(fclosep))) +#define _cleanup_pclose_ __attribute__((cleanup(pclosep))) #define _cleanup_close_ __attribute__((cleanup(closep))) #define _cleanup_closedir_ __attribute__((cleanup(closedirp))) #define _cleanup_umask_ __attribute__((cleanup(umaskp))) - -#define VA_FORMAT_ADVANCE(format, ap) do { \ - int _argtypes[64]; \ +#define _cleanup_set_free_ __attribute__((cleanup(set_freep))) +#define _cleanup_set_free_free_ __attribute__((cleanup(set_free_freep))) +#define _cleanup_strv_free_ __attribute__((cleanup(strv_freep))) +#define _cleanup_journal_close_ __attribute__((cleanup(journal_closep))) + +#define VA_FORMAT_ADVANCE(format, ap) \ +do { \ + int _argtypes[128]; \ size_t _i, _k; \ _k = parse_printf_format((format), ELEMENTSOF(_argtypes), _argtypes); \ + assert(_k < ELEMENTSOF(_argtypes)); \ for (_i = 0; _i < _k; _i++) { \ if (_argtypes[_i] & PA_FLAG_PTR) { \ (void) va_arg(ap, void*); \