diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c index a117d4280..fb680d96d 100644 --- a/src/NetworkManagerUtils.c +++ b/src/NetworkManagerUtils.c @@ -1880,6 +1880,45 @@ nm_utils_flags2str (const NMUtilsFlags2StrDesc *descs, /*****************************************************************************/ +const char * +nm_utils_enum2str (const NMUtilsEnum2StrDesc *descs, + gsize n_descs, + int val, + char *buf, + gsize len) +{ + gsize i; + +#if NM_MORE_ASSERTS > 10 + nm_assert (descs); + nm_assert (n_descs > 0); + for (i = 0; i < n_descs; i++) { + gsize j; + + nm_assert (descs[i].name && descs[i].name[0]); + for (j = 0; j < i; j++) + nm_assert (descs[j].value != descs[i].value); + } +#endif + + nm_utils_to_string_buffer_init (&buf, &len); + + if (!len) + return buf; + + for (i = 0; i < n_descs; i++) { + if (val == descs[i].value) { + g_strlcpy (buf, descs[i].name, len); + return buf; + } + } + + g_snprintf (buf, len, "(%d)", val); + return buf; +}; + +/*****************************************************************************/ + /** * nm_utils_get_shared_wifi_permission: * @connection: the NMConnection to lookup the permission. diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h index a34d113d7..acd3d55a0 100644 --- a/src/NetworkManagerUtils.h +++ b/src/NetworkManagerUtils.h @@ -229,6 +229,37 @@ const char *nm_utils_flags2str (const NMUtilsFlags2StrDesc *descs, /*****************************************************************************/ +typedef struct { + int value; + const char *name; +} NMUtilsEnum2StrDesc; + +#define NM_UTILS_ENUM2STR(v, n) { .value = v, .name = ""n, } + +#define _NM_UTILS_ENUM2STR_DEFINE(scope, fcn_name, enum_type, ...) \ +scope const char * \ +fcn_name (enum_type val, char *buf, gsize len) \ +{ \ + static const NMUtilsEnum2StrDesc descs[] = { \ + __VA_ARGS__ \ + }; \ + G_STATIC_ASSERT (sizeof (enum_type) <= sizeof (int)); \ + return nm_utils_enum2str (descs, G_N_ELEMENTS (descs), val, buf, len); \ +} + +#define NM_UTILS_ENUM2STR_DEFINE(fcn_name, enum_type, ...) \ + _NM_UTILS_ENUM2STR_DEFINE (, fcn_name, enum_type, __VA_ARGS__) +#define NM_UTILS_ENUM2STR_DEFINE_STATIC(fcn_name, enum_type, ...) \ + _NM_UTILS_ENUM2STR_DEFINE (static, fcn_name, enum_type, __VA_ARGS__) + +const char *nm_utils_enum2str (const NMUtilsEnum2StrDesc *descs, + gsize n_descs, + int val, + char *buf, + gsize len); + +/*****************************************************************************/ + #define _NM_UTILS_STRING_LOOKUP_TABLE_DEFINE(scope, fcn_name, lookup_type, unknown_val, ...) \ scope const char * \ fcn_name (lookup_type idx) \