From c243db0b2c918f666f6510ae4b464ed88b1715b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Tue, 24 Aug 2021 17:27:32 +0200 Subject: [PATCH] XUtils: move implementation of String_contains_i out of header file The function strcasestr(3) is only available if _GNU_SOURCE is defined. If any file includes before declaring _GNU_SOURCE, e.g by including "config.h", compilation fails with the following error: In file included from ColumnsPanel.c:8: In file included from ./ColumnsPanel.h:12: In file included from ./Panel.h:13: In file included from ./CRT.h:16: In file included from ./Settings.h:17: In file included from ./Process.h:15: In file included from ./Object.h:17: ./XUtils.h:42:11: error: implicit declaration of function 'strcasestr' is invalid in C99 [-Werror,-Wimplicit-function-declaration] return strcasestr(s1, s2) != NULL; ^ ./XUtils.h:42:11: note: did you mean 'strcasecmp'? /usr/include/strings.h:116:12: note: 'strcasecmp' declared here extern int strcasecmp (const char *__s1, const char *__s2) ^ Move the implementation to avoid unnecessary includes. Since LTO is quite common and stable performance should not be impacted if used. --- XUtils.c | 4 ++++ XUtils.h | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/XUtils.c b/XUtils.c index 412a8425..13327e0f 100644 --- a/XUtils.c +++ b/XUtils.c @@ -78,6 +78,10 @@ void* xReallocArray(void* ptr, size_t nmemb, size_t size) { return xRealloc(ptr, nmemb * size); } +inline bool String_contains_i(const char* s1, const char* s2) { + return strcasestr(s1, s2) != NULL; +} + char* String_cat(const char* s1, const char* s2) { const size_t l1 = strlen(s1); const size_t l2 = strlen(s2); diff --git a/XUtils.h b/XUtils.h index bc967124..8a6ee37e 100644 --- a/XUtils.h +++ b/XUtils.h @@ -13,7 +13,6 @@ in the source distribution for its full text. #include #include // IWYU pragma: keep #include // IWYU pragma: keep -#include #include "Compat.h" #include "Macros.h" @@ -39,9 +38,7 @@ static inline bool String_startsWith(const char* s, const char* match) { return strncmp(s, match, strlen(match)) == 0; } -static inline bool String_contains_i(const char* s1, const char* s2) { - return strcasestr(s1, s2) != NULL; -} +bool String_contains_i(const char* s1, const char* s2); static inline bool String_eq(const char* s1, const char* s2) { return strcmp(s1, s2) == 0;