Commit graph

71 commits

Author SHA1 Message Date
Thomas Haller
194e29d0dc
std-aux: move nm_offsetof_end() to std-aux and add nm_offsetof()
In std-aux, we cannot use G_STRUCT_OFFSET(). I guess, we could use
offsetof() directly. Instead, add an nm_offsetof() macro. This requires
<stddef.h>.
2021-07-30 10:51:01 +02:00
Thomas Haller
91a36478f6
std-aux: move _NM_CC_SUPPORT_AUTO_TYPE, _NM_CC_SUPPORT_GENERIC to "nm-std-aux.h" 2021-07-30 10:50:56 +02:00
Thomas Haller
4547b4a893
std-aux: implement NM_PTRARRAY_LEN() macro via static function
We use NM_PTRARRAY_LEN(), and I find it a bit ugly that a macro does so
much. Maybe, it's better to have it as a function.

But the macro currently lives in "libnm-std-aux/nm-std-aux.h", which
is header-only. To add it to a C source file, we would have to move
it to another header, but "libnm-std-aux/nm-std-aux.h" is nice because
it gets included by default already.

Keep it in "libnm-std-aux/nm-std-aux.h", but implement it as an inline
function.

The macro now only does (as before) some type checking shenanigans to ensure
that the argument is a pointer to pointers.

In practice, there is probably very little difference compared to
the macro before, likely the code will anyway be inlined.
2021-07-28 23:32:47 +02:00
Thomas Haller
4e109bacab
clang-format: use "IndentPPDirectives:None" instead of "BeforeHash"
Subjectively, I think this looks better.
2021-07-09 08:49:06 +02:00
Thomas Haller
f9f453994b
glib-aux: use NM_AUTO_PROTECT_ERRNO() in nm_auto_close and nm_auto_fclose 2021-07-01 11:04:22 +02:00
Thomas Haller
2b55408cc7
std-aux/glib-aux: move NM_AUTO_PROTECT_ERRNO() to libnm-std-aux 2021-07-01 11:04:22 +02:00
Thomas Haller
2dc5b63508
std-aux: add _nm_deprecated() macro 2021-06-28 13:31:32 +02:00
Thomas Haller
1e29a7e66b
std-aux: rework NM_STATIC_ASSERT_EXPR() macro
Replace NM_STATIC_ASSERT_EXPR() by NM_STATIC_ASSERT_EXPR_1() and
NM_STATIC_ASSERT_EXPR_VOID(). NM_STATIC_ASSERT_EXPR_VOID() can be
used as an expression that returns void (that is, a simple statement).
On the other hand, NM_STATIC_ASSERT_EXPR_1() itself retuns
a compile time constant of int value 1. The latter is useful, because
we can use the 1 to combine static assertions in expressions that
are themself compile time constants, like

  #define STATIC_CHECK_AND_GET(cond, value) \
      (NM_STATIC_ASSERT_EXPR_1(cond) ? (value) : (value))

This is itself a compile time constant if value is a compile
time constant. Also, it does the compile time check that "cond"
is true.
2021-06-23 13:09:24 +02:00
Thomas Haller
c6559b04c2
std-aux/glib-aux: minor cleanup of nm_ip_addr_*()/nm_utils_addr_family_*()
- let nm_ip_addr_is_null() work for unaligned addresses.

- drop redundant nm_assert_addr_family().

- move code around.
2021-06-22 09:47:44 +02:00
Thomas Haller
ae14caf05d
std-aux: add NM_ENSURE_IS_TYPE() macro 2021-06-10 11:08:57 +02:00
Thomas Haller
cf1b7d43df
std-aux: add _nm_warn_unused_result define 2021-06-10 10:36:58 +02:00
Thomas Haller
0ed95698fd
std-aux: implement NM_IN_SET()/NM_IN_STRSET() via NM_VA_ARGS_FOREACH() 2021-06-08 08:24:11 +02:00
Thomas Haller
34a521e2d6
std-aux: add NM_VA_ARGS_JOIN() helper macro
We have variadic macros like NM_UTILS_ENUM2STR() that create a switch
statement. Their implementation relies on the way how __VA_ARGS__
gets expanded to a comma separated list. But that implementation is
not great. Let's instead add (and later use) NM_VA_ARGS_JOIN() which
can join variadic arguments by a configurable separator.
2021-06-08 08:24:11 +02:00
Thomas Haller
dadaba9ab6
std-aux: add NM_VA_ARGS_FOREACH() helper macro 2021-06-08 08:24:10 +02:00
Thomas Haller
9823ae75e5
std-aux: add _NM_MACRO_IDENTITY(), _NM_MACRO_CALL2(), _NM_MACRO_SELECT_FIRST()
_NM_MACRO_CALL2() is needed, because we cannot call _NM_MACRO_CALL() inside
_NM_MACRO_CALL().
2021-06-08 08:24:10 +02:00
Thomas Haller
2c3abc7bcb
std-aux,glib-aux: move NM_NARG() and _NM_MACRO_CALL() to lib-std-aux 2021-06-08 08:24:10 +02:00
Thomas Haller
89a10ddf89
std-aux: add NM_BIT() macro 2021-06-08 08:24:10 +02:00
Thomas Haller
21321ac736
clang-format: reformat code with clang 12
The format depends on the version of the tool. Now that Fedora 34 is
released, update to clang 12 (clang-tools-extra-12.0.0-0.3.rc1.fc34.x86_64).
2021-05-04 13:56:26 +02:00
Thomas Haller
5de552893d
glib-aux: fix compile error for g_steal_pointer() macro
Some compiler versions don't like to dereference and opaque
pointer for typeof:

gcc 8.3.1-5.1.el8 on RHEL:

    In file included from ./src/libnm-glib-aux/nm-macros-internal.h:41,
                     from ./src/libnm-glib-aux/nm-default-glib.h:68,
                     from ./src/libnm-glib-aux/nm-default-glib-i18n-lib.h:13,
                     from ./src/libnm-core-impl/nm-default-libnm-core.h:11,
                     from src/libnm-core-impl/nm-setting-8021x.c:7:
    src/libnm-core-impl/nm-setting-8021x.c: In function '_nm_setting_802_1x_cert_value_to_bytes':
    ./src/libnm-glib-aux/nm-glib.h:417:16: error: dereferencing pointer to incomplete type 'GBytes' {aka 'struct _GBytes'}
             typeof(**_pp) *const         _p            = *_pp; \
                    ^~~~~
    src/libnm-core-impl/nm-setting-8021x.c:361:12: note: in expansion of macro 'g_steal_pointer'
         return g_steal_pointer(&bytes);
                ^~~~~~~~~~~~~~~
    ./src/libnm-glib-aux/nm-glib.h:417:54: error: initialization of 'int * const' from incompatible pointer type 'GBytes *' {aka 'struct _GBytes *'} [-Werror=incompatible-pointer-types]
             typeof(**_pp) *const         _p            = *_pp; \
                                                          ^
    src/libnm-core-impl/nm-setting-8021x.c:361:12: note: in expansion of macro 'g_steal_pointer'
         return g_steal_pointer(&bytes);
                ^~~~~~~~~~~~~~~
    ./src/libnm-glib-aux/nm-glib.h:415:6: error: returning 'int * const' from a function with incompatible return type 'GBytes *' {aka 'struct _GBytes *'} [-Werror=incompatible-pointer-types]
         ({                                                     \
         ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             typeof(*(pp)) *const         _pp           = (pp); \
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             typeof(**_pp) *const         _p            = *_pp; \
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             _nm_unused const void *const _p_type_check = _p;   \
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                                \
                                                                ~
             *_pp = NULL;                                       \
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             _p;                                                \
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         })
         ~~
    src/libnm-core-impl/nm-setting-8021x.c:361:12: note: in expansion of macro 'g_steal_pointer'
         return g_steal_pointer(&bytes);
                ^~~~~~~~~~~~~~~

Fixes: 5bc511203e ('all: make nm_steal_pointer() and g_steal_pointer() more typesafe using typeof()')
2021-04-14 15:24:47 +02:00
Thomas Haller
5bc511203e
all: make nm_steal_pointer() and g_steal_pointer() more typesafe using typeof()
The previous code would always cast the argument to "void *", and thus
loose some type information.

For example,

  gulong variable = 0;

  g_steal_pointer(&variable);

would compile, when it shouldn't.

In general, we try to avoid redefining glib macros and headers. But we
really want those extra compile time checks that we can get, so let's do
it.
2021-04-13 15:01:38 +02:00
Thomas Haller
a8c34b9dcf
build: move "shared/nm-std-aux" to "src/libnm-std-aux" 2021-02-24 12:48:24 +01:00
Renamed from shared/nm-std-aux/nm-std-aux.h (Browse further)