]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add fr_box() generic
authorAlan T. DeKok <aland@freeradius.org>
Thu, 20 Jul 2023 11:49:41 +0000 (07:49 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 20 Jul 2023 11:49:41 +0000 (07:49 -0400)
which only works for some leaf types, as there string / octets
types need also to deal with length and talloc issues.  Other types
like ipaddr need to check the contents of the source.

src/lib/util/value.h

index 233c3431357ce9f6d06c03c74411bb1804367f5b..0745d405e0b568ae3859c6796a3d31a4d692d50d 100644 (file)
@@ -251,6 +251,22 @@ typedef enum {
 
 #define _fr_box(_type, _field, _val) (&(fr_value_box_t){ .type = _type, _field = (_val) })
 
+#define fr_box(_val) _Generic((_val), \
+               bool     : _fr_box(FR_TYPE_BOOL, .vb_bool, _val), \
+               int8_t   : _fr_box(FR_TYPE_INT8, .vb_int8, _val), \
+               int16_t  : _fr_box(FR_TYPE_INT16, .vb_int16, _val), \
+               int32_t  : _fr_box(FR_TYPE_INT32, .vb_int32, _val), \
+               int64_t  : _fr_box(FR_TYPE_INT64, .vb_int64, _val), \
+               uint8_t  : _fr_box(FR_TYPE_UINT8, .vb_uint8, _val), \
+               uint16_t : _fr_box(FR_TYPE_UINT16, .vb_uint16, _val), \
+               uint32_t : _fr_box(FR_TYPE_UINT32, .vb_uint32, _val), \
+               uint64_t : _fr_box(FR_TYPE_UINT64, .vb_uint64, _val), \
+               size_t   : _fr_box(FR_TYPE_SIZE, .vb_size, _val), \
+               float  : _fr_box(FR_TYPE_FLOAT32, .vb_float32, _val), \
+               double  : _fr_box(FR_TYPE_FLOAT64, .vb_float64, _val), \
+               char *  : _fr_box_with_len(FR_TYPE_STRING, .vb_strvalue, _val, strlen(_val)) \
+               default  : (void) 0)
+
 #define fr_box_ipaddr(_val)                    _fr_box((((_val).af == AF_INET) ? \
                                                        (((_val).prefix == 32) ?        FR_TYPE_IPV4_ADDR : \
                                                                                FR_TYPE_IPV4_PREFIX) : \