diff options
author | Thomas Haller <thaller@redhat.com> | 2019-01-10 12:38:16 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-01-10 13:01:19 +0100 |
commit | 2bec3706215dd3793b82a20e8b185e8a3618c539 (patch) | |
tree | ba2ac415bf8e4bfbcd359e8a5c56110f619fef5d | |
parent | 6558c898dfca81675a3b0684604c515fecada122 (diff) | |
download | NetworkManager-th/alloca-fixes.tar.gz |
shared: add nm_strdup_int_a() macroth/alloca-fixes
-rw-r--r-- | shared/nm-utils/nm-shared-utils.h | 25 | ||||
-rw-r--r-- | shared/nm-utils/tests/test-shared-general.c | 47 |
2 files changed, 72 insertions, 0 deletions
diff --git a/shared/nm-utils/nm-shared-utils.h b/shared/nm-utils/nm-shared-utils.h index 98d742a81e..71d5f0e4d9 100644 --- a/shared/nm-utils/nm-shared-utils.h +++ b/shared/nm-utils/nm-shared-utils.h @@ -304,6 +304,8 @@ _nm_strndup_a_step (char *s, const char *str, gsize len) #if _NM_CC_SUPPORT_GENERIC #define nm_strdup_int(val) \ _Generic ((val), \ + char: g_strdup_printf ("%d", (int) (val)), \ + \ gint8: g_strdup_printf ("%d", (int) (val)), \ gint16: g_strdup_printf ("%d", (int) (val)), \ gint32: g_strdup_printf ("%d", (int) (val)), \ @@ -322,6 +324,29 @@ _nm_strndup_a_step (char *s, const char *str, gsize len) : g_strdup_printf ("%"G_GINT64_FORMAT, (gint64) (val))) #endif +#if _NM_CC_SUPPORT_GENERIC +#define nm_strdup_int_a(val) \ + _Generic ((val), \ + char: nm_sprintf_bufa (24, "%d", (int) (val)), \ + \ + gint8: nm_sprintf_bufa (24, "%d", (int) (val)), \ + gint16: nm_sprintf_bufa (24, "%d", (int) (val)), \ + gint32: nm_sprintf_bufa (24, "%d", (int) (val)), \ + gint64: nm_sprintf_bufa (24, "%"G_GINT64_FORMAT, (gint64) (val)), \ + \ + guint8: nm_sprintf_bufa (24, "%u", (guint) (val)), \ + guint16: nm_sprintf_bufa (24, "%u", (guint) (val)), \ + guint32: nm_sprintf_bufa (24, "%u", (guint) (val)), \ + guint64: nm_sprintf_bufa (24, "%"G_GUINT64_FORMAT, (guint64) (val)) \ + ) +#else +#define nm_strdup_int_a(val) \ + ( ( sizeof (val) == sizeof (guint64) \ + && ((typeof (val)) -1) > 0) \ + ? nm_sprintf_bufa (24, "%"G_GUINT64_FORMAT, (guint64) (val)) \ + : nm_sprintf_bufa (24, "%"G_GINT64_FORMAT, (gint64) (val))) +#endif + /*****************************************************************************/ extern const void *const _NM_PTRARRAY_EMPTY[1]; diff --git a/shared/nm-utils/tests/test-shared-general.c b/shared/nm-utils/tests/test-shared-general.c index b10e2680f8..8ef7b23ff7 100644 --- a/shared/nm-utils/tests/test-shared-general.c +++ b/shared/nm-utils/tests/test-shared-general.c @@ -104,6 +104,52 @@ test_make_strv (void) /*****************************************************************************/ +typedef enum { + TEST_NM_STRDUP_ENUM_m1 = -1, + TEST_NM_STRDUP_ENUM_3 = 3, +} TestNMStrdupIntEnum; + +static void +test_nm_strdup_int (void) +{ +#define _NM_STRDUP_INT_TEST(type, num) \ + G_STMT_START { \ + type _num = ((type) num); \ + gs_free char *_s1 = NULL; \ + const char *_s2; \ + \ + _s1 = nm_strdup_int (_num); \ + \ + g_assert (_s1); \ + g_assert_cmpstr (_s1, ==, G_STRINGIFY (num)); \ + _s2 = nm_strdup_int_a (_num); \ + g_assert (_s2); \ + g_assert_cmpstr (_s2, ==, G_STRINGIFY (num)); \ + } G_STMT_END + + _NM_STRDUP_INT_TEST (char, 0); + _NM_STRDUP_INT_TEST (char, 1); + _NM_STRDUP_INT_TEST (guint8, 0); + _NM_STRDUP_INT_TEST (gint8, 25); + _NM_STRDUP_INT_TEST (char, 47); + _NM_STRDUP_INT_TEST (short, 47); + _NM_STRDUP_INT_TEST (int, 47); + _NM_STRDUP_INT_TEST (long, 47); + _NM_STRDUP_INT_TEST (unsigned char, 47); + _NM_STRDUP_INT_TEST (unsigned short, 47); + _NM_STRDUP_INT_TEST (unsigned, 47); + _NM_STRDUP_INT_TEST (unsigned long, 47); + _NM_STRDUP_INT_TEST (gint64, 9223372036854775807); + _NM_STRDUP_INT_TEST (gint64, -9223372036854775807); + _NM_STRDUP_INT_TEST (guint64, 0); + _NM_STRDUP_INT_TEST (guint64, 9223372036854775807); + + g_assert_cmpstr (nm_strdup_int_a (TEST_NM_STRDUP_ENUM_m1), ==, "-1"); + g_assert_cmpstr (nm_strdup_int_a (TEST_NM_STRDUP_ENUM_3), ==, "3"); +} + +/*****************************************************************************/ + NMTST_DEFINE (); int main (int argc, char **argv) @@ -113,6 +159,7 @@ int main (int argc, char **argv) g_test_add_func ("/general/test_monotonic_timestamp", test_monotonic_timestamp); g_test_add_func ("/general/test_nmhash", test_nmhash); g_test_add_func ("/general/test_nm_make_strv", test_make_strv); + g_test_add_func ("/general/test_nm_strdup_int", test_nm_strdup_int); return g_test_run (); } |