summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-01-10 12:38:16 +0100
committerThomas Haller <thaller@redhat.com>2019-01-10 13:01:19 +0100
commit2bec3706215dd3793b82a20e8b185e8a3618c539 (patch)
treeba2ac415bf8e4bfbcd359e8a5c56110f619fef5d
parent6558c898dfca81675a3b0684604c515fecada122 (diff)
downloadNetworkManager-th/alloca-fixes.tar.gz
shared: add nm_strdup_int_a() macroth/alloca-fixes
-rw-r--r--shared/nm-utils/nm-shared-utils.h25
-rw-r--r--shared/nm-utils/tests/test-shared-general.c47
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 ();
}