From: Zbigniew Jędrzejewski-Szmek Date: Fri, 26 Nov 2021 10:51:12 +0000 (+0100) Subject: networkd: replace a table with log2 fields by a list X-Git-Tag: v250-rc1~125^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67b65e110463d9abf4f66847583cf106695c1044;p=thirdparty%2Fsystemd.git networkd: replace a table with log2 fields by a list The code looks a bit more complicated, but the compiler generates a simpler and more compact text. An additional advantage is that if any of the fields were repeating or not power-of-two, the compiler would warn about an overridden entry in the table. --- diff --git a/src/network/meson.build b/src/network/meson.build index 9247734c75c..cfa16a8ecf0 100644 --- a/src/network/meson.build +++ b/src/network/meson.build @@ -284,6 +284,12 @@ tests += [ [], network_includes], + [['src/network/test-networkd-util.c'], + [libnetworkd_core, + libsystemd_network], + [], + network_includes], + [['src/network/test-network.c'], [libnetworkd_core, libsystemd_network], diff --git a/src/network/networkd-util.c b/src/network/networkd-util.c index b0020efe899..6011e9b998a 100644 --- a/src/network/networkd-util.c +++ b/src/network/networkd-util.c @@ -24,25 +24,25 @@ static const char * const network_config_source_table[_NETWORK_CONFIG_SOURCE_MAX DEFINE_STRING_TABLE_LOOKUP_TO_STRING(network_config_source, NetworkConfigSource); int network_config_state_to_string_alloc(NetworkConfigState s, char **ret) { - static const struct { - NetworkConfigState state; - const char *str; - } map[] = { - { .state = NETWORK_CONFIG_STATE_PROBING, .str = "probing", }, - { .state = NETWORK_CONFIG_STATE_REQUESTING, .str = "requesting", }, - { .state = NETWORK_CONFIG_STATE_CONFIGURING, .str = "configuring", }, - { .state = NETWORK_CONFIG_STATE_CONFIGURED, .str = "configured", }, - { .state = NETWORK_CONFIG_STATE_MARKED, .str = "marked", }, - { .state = NETWORK_CONFIG_STATE_REMOVING, .str = "removing", }, + static const char* states[] = { + [LOG2U(NETWORK_CONFIG_STATE_PROBING)] = "probing", + [LOG2U(NETWORK_CONFIG_STATE_REQUESTING)] = "requesting", + [LOG2U(NETWORK_CONFIG_STATE_CONFIGURING)] = "configuring", + [LOG2U(NETWORK_CONFIG_STATE_CONFIGURED)] = "configured", + [LOG2U(NETWORK_CONFIG_STATE_MARKED)] = "marked", + [LOG2U(NETWORK_CONFIG_STATE_REMOVING)] = "removing", }; _cleanup_free_ char *buf = NULL; assert(ret); - for (size_t i = 0; i < ELEMENTSOF(map); i++) - if (FLAGS_SET(s, map[i].state) && - !strextend_with_separator(&buf, ",", map[i].str)) - return -ENOMEM; + for (size_t i = 0; i < ELEMENTSOF(states); i++) + if (FLAGS_SET(s, 1 << i)) { + assert(states[i]); + + if (!strextend_with_separator(&buf, ",", states[i])) + return -ENOMEM; + } *ret = TAKE_PTR(buf); return 0; diff --git a/src/network/test-networkd-util.c b/src/network/test-networkd-util.c new file mode 100644 index 00000000000..f29ca2cc72c --- /dev/null +++ b/src/network/test-networkd-util.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "networkd-util.h" +#include "tests.h" + +TEST(network_config_state_to_string_alloc) { + for (unsigned i = 1; i <= NETWORK_CONFIG_STATE_REMOVING; i <<= 1) { + _cleanup_free_ char *x; + + assert_se(network_config_state_to_string_alloc(i, &x) == 0); + log_debug("%u → %s", i, x); + } + + _cleanup_free_ char *x; + assert_se(network_config_state_to_string_alloc(~0u, &x) == 0); + log_debug("%u → %s", ~0u, x); +}; + +DEFINE_TEST_MAIN(LOG_DEBUG);