From 79ef1abcca00152a7e24f5de4a79b711ce8b8b27 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 10 May 2019 11:24:32 +0200 Subject: [PATCH] shared: add nm_strcmp0() g_strcmp0() is not inlineable, so we first need to call to glib, only to call to libc. --- shared/nm-glib-aux/nm-macros-internal.h | 22 ++++++++++++++++++++++ shared/nm-glib-aux/nm-shared-utils.h | 13 ++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/shared/nm-glib-aux/nm-macros-internal.h b/shared/nm-glib-aux/nm-macros-internal.h index 0d1f206d6c..a5ac7ce782 100644 --- a/shared/nm-glib-aux/nm-macros-internal.h +++ b/shared/nm-glib-aux/nm-macros-internal.h @@ -865,6 +865,28 @@ fcn (void) \ /*****************************************************************************/ +static inline int +nm_strcmp0 (const char *s1, const char *s2) +{ + int c; + + /* like g_strcmp0(), but this is inlinable. + * + * Also, it is guaranteed to return either -1, 0, or 1. */ + if (s1 == s2) + return 0; + if (!s1) + return -1; + if (!s2) + return 1; + c = strcmp (s1, s2); + if (c < 0) + return -1; + if (c > 0) + return 1; + return 0; +} + static inline gboolean nm_streq (const char *s1, const char *s2) { diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h index eea54e7143..120c228c78 100644 --- a/shared/nm-glib-aux/nm-shared-utils.h +++ b/shared/nm-glib-aux/nm-shared-utils.h @@ -171,6 +171,13 @@ nm_ip4_addr_is_localhost (in_addr_t addr4) return _cc < 0 ? -1 : 1; \ } G_STMT_END +#define NM_CMP_RETURN_DIRECT(c) \ + G_STMT_START { \ + const int _cc = (c); \ + if (_cc) \ + return _cc; \ + } G_STMT_END + #define NM_CMP_SELF(a, b) \ G_STMT_START { \ typeof (a) _a = (a); \ @@ -197,7 +204,7 @@ nm_ip4_addr_is_localhost (in_addr_t addr4) NM_CMP_RETURN (memcmp ((a), (b), (size))) #define NM_CMP_DIRECT_STRCMP0(a, b) \ - NM_CMP_RETURN (g_strcmp0 ((a), (b))) + NM_CMP_RETURN_DIRECT (nm_strcmp0 ((a), (b))) #define NM_CMP_DIRECT_IN6ADDR(a, b) \ G_STMT_START { \ @@ -229,12 +236,12 @@ nm_ip4_addr_is_localhost (in_addr_t addr4) const char *_b = ((b)->field); \ \ if (_a != _b) { \ - NM_CMP_RETURN (g_strcmp0 (_a, _b)); \ + NM_CMP_RETURN_DIRECT (nm_strcmp0 (_a, _b)); \ } \ } G_STMT_END #define NM_CMP_FIELD_STR0(a, b, field) \ - NM_CMP_RETURN (g_strcmp0 (((a)->field), ((b)->field))) + NM_CMP_RETURN_DIRECT (nm_strcmp0 (((a)->field), ((b)->field))) #define NM_CMP_FIELD_MEMCMP_LEN(a, b, field, len) \ NM_CMP_RETURN (memcmp (&((a)->field), &((b)->field), \