35# if __STDC_VERSION__ < 202000
36# define static_assert _Static_assert
49#ifdef __clang_analyzer__
50#define STATIC_ANALYZER 1
53#define STATIC_ANALYZER 1
62# define WITH_VERIFY_PTR 1
69#ifndef __SANITIZE_ADDRESS__
71#if __has_feature(address_sanitizer)
72#define __SANITIZE_ADDRESS__ (1)
93#if (defined(__EMSCRIPTEN__) && defined(__EMSCRIPTEN_PTHREADS__)) || !defined(__EMSCRIPTEN__) && defined(HAVE_PTHREAD_H)
94# define HAVE_PTHREADS 1
113typedef enum : int8_t {
122#define CMP_PREFER_SMALLER(_a,_b) ((fr_cmp_ret_t)(((_a) > (_b)) - ((_a) < (_b))))
126#define CMP_PREFER_LARGER(_a,_b) ((fr_cmp_ret_t)(((_a) < (_b)) - ((_a) > (_b))))
130#define CMP(_a, _b) CMP_PREFER_SMALLER(_a, _b)
139#define CMP_RETURN(_a, _b, _field) \
141 fr_cmp_ret_t _ret = CMP((_a)->_field, (_b)->_field); \
142 if (_ret != 0) return _ret; \
161 if (!a_len && b_len)
return CMP_LT;
162 if (a_len && !b_len)
return CMP_GT;
163 if (!a_len && !b_len)
return CMP_EQ;
165 cmp_len = (a_len < b_len) ? a_len : b_len;
167 ret =
CMP(memcmp(a, b, cmp_len), 0);
168 if (ret != 0)
return ret;
170 return CMP(a_len, b_len);
181#define MEMCMP_RETURN(_a, _b, _field, _len_field) \
183 fr_cmp_ret_t _ret = memcmp_return((_a)->_field, (_b)->_field, (_a)->_len_field, (_b)->_len_field); \
184 if (_ret != 0) return _ret; \
195#define MEMCMP_FIELDS(_a, _b, _field, _len_field) \
196 memcmp_return((_a)->_field, (_b)->_field, (_a)->_len_field, (_b)->_len_field)
203#define UNCONST(_type, _ptr) ((_type)((uintptr_t)(_ptr)))
210#define typeof_field(_type, _field) __typeof__(((_type *)NULL)->_field)
216# define XHEXIFY4(b1,b2,b3,b4) (0x ## b1 ## b2 ## b3 ## b4)
217# define HEXIFY4(b1,b2,b3,b4) XHEXIFY4(b1, b2, b3, b4)
219# define XHEXIFY3(b1,b2,b3) (0x ## b1 ## b2 ## b3)
220# define HEXIFY3(b1,b2,b3) XHEXIFY3(b1, b2, b3)
222# define XHEXIFY2(b1,b2) (0x ## b1 ## b2)
223# define HEXIFY2(b1,b2) XHEXIFY2(b1, b2)
225# define XHEXIFY(b1) (0x ## b1)
226# define HEXIFY(b1) XHEXIFY(b1)
232#define XSTRINGIFY(x) #x
233#define STRINGIFY(x) XSTRINGIFY(x)
234#define JOINSTR(x,y) XSTRINGIFY(x ## y)
240#define _JOIN(x,y) x ## y
241#define JOIN(x,y) _JOIN(x,y)
245#define L(_str) { _str, sizeof(_str) - 1 }
249#define F1(_idx, _val) [_idx] = _val
250#define F2(_idx, _val) F1(_idx, _val), F1(_idx + 1, _val)
251#define F4(_idx, _val) F2(_idx, _val), F2(_idx + 2, _val)
252#define F8(_idx, _val) F4(_idx, _val), F4(_idx + 4, _val)
253#define F16(_idx, _val) F8(_idx, _val), F8(_idx + 8, _val)
254#define F32(_idx, _val) F16(_idx, _val), F16(_idx + 16, _val)
255#define F64(_idx, _val) F32(_idx, _val), F32(_idx + 32, _val)
256#define F128(_idx, _val) F64(_idx, _val), F64(_idx + 64, _val)
257#define F256(_idx, _val) F128(_idx, _val), F128(_idx + 128, _val)
269 _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
270 _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
271 _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
272 _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
273 _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
274 _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
279 59,58,57,56,55,54,53,52,51,50, \
280 49,48,47,46,45,44,43,42,41,40, \
281 39,38,37,36,35,34,33,32,31,30, \
282 29,28,27,26,25,24,23,22,21,20, \
283 19,18,17,16,15,14,13,12,11,10, \
286#define _VA_NARG(...) VA_ARG_N(__VA_ARGS__)
292#define VA_NARG(...) _VA_NARG(__VA_ARGS__, VA_RSEQ_N())
299#define _VA_EXPAND(...) _VA_EXPAND4(_VA_EXPAND4(_VA_EXPAND4(_VA_EXPAND4(__VA_ARGS__))))
300#define _VA_EXPAND4(...) _VA_EXPAND3(_VA_EXPAND3(_VA_EXPAND3(_VA_EXPAND3(__VA_ARGS__))))
301#define _VA_EXPAND3(...) _VA_EXPAND2(_VA_EXPAND2(_VA_EXPAND2(_VA_EXPAND2(__VA_ARGS__))))
302#define _VA_EXPAND2(...) _VA_EXPAND1(_VA_EXPAND1(_VA_EXPAND1(_VA_EXPAND1(__VA_ARGS__))))
303#define _VA_EXPAND1(...) __VA_ARGS__
323#define VA_FOR_EACH(_macro, ...) \
324 __VA_OPT__(_VA_EXPAND(_VA_FOR_EACH(_macro, __VA_ARGS__)))
325#define _VA_FOR_EACH(_macro, _a, ...) \
326 _macro(_a) __VA_OPT__(, _VA_FOR_EACH_AGAIN _VA_PARENS (_macro, __VA_ARGS__))
327#define _VA_FOR_EACH_AGAIN() _VA_FOR_EACH
338#define VA_FOR_EACH_ARG(_macro, _arg, ...) \
339 __VA_OPT__(_VA_EXPAND(_VA_FOR_EACH_ARG(_macro, _arg, __VA_ARGS__)))
340#define _VA_FOR_EACH_ARG(_macro, _arg, _a, ...) \
341 _macro(_arg, _a) __VA_OPT__(, _VA_FOR_EACH_ARG_AGAIN _VA_PARENS (_macro, _arg, __VA_ARGS__))
342#define _VA_FOR_EACH_ARG_AGAIN() _VA_FOR_EACH_ARG
344#define _VA_STRINGIFY_ONE(_a) #_a
354#define VA_STRINGIFY(...) VA_FOR_EACH(_VA_STRINGIFY_ONE, __VA_ARGS__)
361# define NDEBUG_LOCATION_ARGS char const *file, int line,
362# define NDEBUG_LOCATION_VALS file, line,
363# define NDEBUG_LOCATION_FMT "%s[%d]: "
364# define NDEBUG_LOCATION_EXP __FILE__, __LINE__,
365# define NDEBUG_LOCATION_NONNULL(_num) ((_num) + 2)
367# define NDEBUG_LOCATION_ARGS
368# define NDEBUG_LOCATION_VALS
369# define NDEBUG_LOCATION_FMT ""
370# define NDEBUG_LOCATION_EXP
371# define NDEBUG_LOCATION_NONNULL(_num) (_num)
379#define IS_CONST(_type, _var) \
395#define IS_TYPE(_type, _var) \
403#define UNUSED_VAR(_x) ((void)_x)
408#define PAD(_x, _y) (_y - ((_x) % _y))
413#define NEVER_RETURNS _Noreturn
414#define HIDDEN CC_HINT(visibility("hidden"))
415#define UNUSED CC_HINT(unused)
419#if (defined(__clang__) && (__clang_major__ >= 10)) || (defined(__GNUC__) && __GNUC__ >= 7)
420# define FALL_THROUGH CC_HINT(fallthrough)
422# define FALL_THROUGH ((void)0)
426# define NDEBUG_UNUSED
428# define NDEBUG_UNUSED UNUSED
431#define BLANK_FORMAT " "
436#define SIZEOF_MEMBER(_t, _m) sizeof(((_t *)0)->_m)
437#define NUM_ELEMENTS(_t) (sizeof((_t)) / sizeof((_t)[0]))
444#define NUM_PTR_ELEMENTS(_t) (sizeof((_t)) / sizeof(void *))
457#define IS_COMPATIBLE(_x, _t) _Generic(_x, _t:1, default: 0)
467#define IS_FIELD_COMPATIBLE(_s, _f, _t) _Generic(((_s *)0)->_f, _t:1, default: 0)
474# define CC_HINT(...) __attribute__((__VA_ARGS__))
475# define likely(_x) __builtin_expect((_x), 1)
476# define unlikely(_x) __builtin_expect((_x), 0)
477# define unpredictable(_x) __builtin_unpredictable((_x))
479# define assume(_x) __builtin_assume(_x)
481# define assume(_x) do { if (!_x) __builtin_unreachable(); } while (0)
485# define likely(_x) _x
486# define unlikely(_x) _x
487# define unpredictable(_x) _x
495 #ifndef __GNUC_PREREQ__
496 #define __GNUC_PREREQ__(x, y) \
497 ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \
501 #define __GNUC_PREREQ__(x, y) 0
508#define PRAGMA(_x) _Pragma(#_x)
513#if defined(__clang__) && (__clang_major__ >= 13)
514# define CC_ACQUIRE_HANDLE(_tag) CC_HINT(acquire_handle(_tag))
515# define CC_USE_HANDLE(_tag) CC_HINT(use_handle(_tag))
516# define CC_RELEASE_HANDLE(_tag) CC_HINT(release_handle(_tag))
518# define CC_ACQUIRE_HANDLE(_tag)
519# define CC_USE_HANDLE(_tag)
520# define CC_RELEASE_HANDLE(_tag)
527# define __has_feature(_x) 0
529#if defined(__clang__) && __has_feature(undefined_behavior_sanitizer)
530# define CC_NO_UBSAN(_sanitize) __attribute__((no_sanitize(STRINGIFY(_sanitize))))
531#elif __GNUC_PREREQ__(4, 9) && defined(__SANITIZE_UNDEFINED__)
532# define CC_NO_UBSAN(_sanitize) __attribute__((no_sanitize_undefined))
534# define CC_NO_UBSAN(_sanitize)
540#if defined(__clang__)
541# define CC_NO_SANITIZE_UNDEFINED(_what) CC_HINT(no_sanitize(_what))
543# define CC_NO_SANITIZE_UNDEFINED(_what)
558#if defined(__clang__) && ((__clang_major__ * 100) + __clang_minor__ >= 208)
559# define DIAG_PRAGMA(_x) PRAGMA(clang diagnostic _x)
560# define DIAG_OFF(_x) DIAG_PRAGMA(ignored JOINSTR(-W,_x))
561# define DIAG_ON(_x) DIAG_PRAGMA(warning JOINSTR(-W,_x))
562# define DIAG_OFF_OPTIONAL(_x) DIAG_OFF(unknown-warning-option) DIAG_OFF(_x) DIAG_ON(unknown-warning-option)
563# define DIAG_ON_OPTIONAL(_x) DIAG_OFF(unknown-warning-option) DIAG_ON(_x) DIAG_ON(unknown-warning-option)
564# define DIAG_PUSH() DIAG_PRAGMA(push)
565# define DIAG_POP() DIAG_PRAGMA(pop)
566#elif !defined(__clang__) && defined(__GNUC__) && ((__GNUC__ * 100) + __GNUC_MINOR__) >= 402
567# define DIAG_PRAGMA(_x) PRAGMA(GCC diagnostic _x)
568# define DIAG_OFF(_x) DIAG_PRAGMA(ignored JOINSTR(-W,_x))
569# define DIAG_ON(_x) DIAG_PRAGMA(warning JOINSTR(-W,_x))
570# define DIAG_OFF_OPTIONAL(_x) DIAG_OFF(pragmas) DIAG_OFF(_x) DIAG_ON(pragmas)
571# define DIAG_ON_OPTIONAL(_x) DIAG_OFF(pragmas) DIAG_ON(_x) DIAG_ON(pragmas)
572# define DIAG_PUSH() DIAG_PRAGMA(push)
573# define DIAG_POP() DIAG_PRAGMA(pop)
577# define DIAG_OFF_OPTIONAL(_x)
578# define DIAG_ON_OPTIONAL(_x)
587# define USES_APPLE_DEPRECATED_API DIAG_OFF(deprecated-declarations)
588# define USES_APPLE_RST DIAG_ON(deprecated-declarations)
590# define USES_APPLE_DEPRECATED_API
591# define USES_APPLE_RST
596# define RCSID(id) static char const rcsid[] __attribute__ ((used)) = id;
597# define RCSIDH(h, id) static char const rcsid_ ## h [] __attribute__ ((used)) = id;
598#elif defined(__SUNPRO_C)
600# define RCSID(id) PRAGMA(sun ident id)
601# define RCSIDH(h, id) PRAGMA(sun ident id)
604# define RCSIDH(h, id)
627#define IGNORE(_expr, _type) \
629 _type ignored UNUSED = (_expr); \
637#define strncpy(_dst, _src, _len) dont_use_strncpy()
static fr_cmp_ret_t memcmp_return(void const *a, void const *b, size_t a_len, size_t b_len)
memcmp function which has similar behaviour as strncmp
char * dont_use_strncpy(char *dst, char const *src, size_t len)
Force a compilation error if strncpy() is used.
#define CMP(_a, _b)
Same as CMP_PREFER_SMALLER use when you don't really care about ordering, you just want an ordering.
fr_cmp_ret_t
Result of an ordering comparison.
@ CMP_ERR
comparison failed
static fr_sbuff_err_t char size_t * len