From patchwork Sat Aug 30 06:46:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alejandro Colomar X-Patchwork-Id: 119194 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 9A4643858418 for ; Sat, 30 Aug 2025 06:47:58 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9A4643858418 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=q/Fpu8na X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from tor.source.kernel.org (tor.source.kernel.org [IPv6:2600:3c04:e001:324:0:1991:8:25]) by sourceware.org (Postfix) with ESMTPS id 1B92E3858410 for ; Sat, 30 Aug 2025 06:46:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1B92E3858410 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=kernel.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=kernel.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 1B92E3858410 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2600:3c04:e001:324:0:1991:8:25 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1756536376; cv=none; b=UbEMdu6yLXrsNe4NcGnTmna3almplC6eWaSpXMg13CQsbB36k8Pzon3IFqOoS5YlktPsepcTAHIeqvnbLsX+ubxoI+rSZDSHxIW/b9jf+gb8Jl7IFLtatzAIEODWnLXkOKEpbwPo98APzybR+ZE8clTjZDWRPOkv+jbCXMlm8Rw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1756536376; c=relaxed/simple; bh=YAy8j1CZV76H4ifB0jCUQWa+3t5MztICV16UFzIc+8o=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=Qj3D5dIpwYcWqdtzZP9PWi/ku8sva0Xx/ioqqu2R0V6EIXoNf2AP6yCzvoGRWSFaDRM65F+1qjOAzNyFzkg3u4deGE/PF3+q6LLUrad5xdHTn7QjxzabIcga9WCU9sri1e06SkoeGK1EQxbdHkiHgFMF6bz1qT9CDbDtdOMrzow= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1B92E3858410 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id C5D1760053; Sat, 30 Aug 2025 06:46:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2632BC4CEEB; Sat, 30 Aug 2025 06:46:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756536375; bh=YAy8j1CZV76H4ifB0jCUQWa+3t5MztICV16UFzIc+8o=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=q/Fpu8naLioNkht9U6Ph8UDYYb7GNseBty7iTsI+l1b6dZmS4ojzyp7Y3ZVIXu2wd MC9XnHSXck93+O/TsW+GuFl1Uk1QoNc/4q0RjlG3kNRl/msrV7hT9qpginn6FqvKLO QmlGZROTcklz+5FbIxLJ9MhLKbfXab8Zir+9inoaX4qhrWzYqlsq6GHcHXu3Dt70Bx IYDyMy6kDzGIkBNzxpt+hNbJ2cfq2BLez58ABR5xvmTZCD8NvQjFsHM+zAg9GGKOJ3 cnJ37BG/xNisbYDvLT9EGv67NFCPOyXlQLZ9K6+mEEvWWB85Qp7WDHmzza0D1uW9rB ipY4RIkFDEdSg== Date: Sat, 30 Aug 2025 08:46:10 +0200 From: Alejandro Colomar To: libc-alpha@sourceware.org Cc: Alejandro Colomar , Collin Funk , Wilco Dijkstra , Joseph Myers , Sam James Subject: [RFC v1 1/1] string: Add streq(), memeq(), wcseq(), wmemeq() Message-ID: X-Mailer: git-send-email 2.50.1 References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces~patchwork=sourceware.org@sourceware.org These inline functions serve the most common use case of the comparison functions: test for equality. It avoids the reversed return value that confuses programmers. Using these APIs will result in more readable code, which in the end means safer code. Signed-off-by: Alejandro Colomar --- string/string.h | 21 +++++++++++++++++++++ wcsmbs/wchar.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/string/string.h b/string/string.h index df4d489556..7618c209dd 100644 --- a/string/string.h +++ b/string/string.h @@ -80,6 +80,16 @@ extern int memcmp (const void *__s1, const void *__s2, size_t __n) extern int __memcmpeq (const void *__s1, const void *__s2, size_t __n) __THROW __attribute_pure__ __nonnull ((1, 2)); +#ifdef __USE_GNU +/* Compare N bytes of M1 and M2 for equality. */ +__attribute_pure__ __nonnull ((1, 2)) +static inline _Bool +memeq (const void *__m1, const void *__m2, size_t __n) +{ + return __memcmpeq(__m1, __m2, __n) == 0; +} +#endif + /* Search N bytes of S for C. */ #ifdef __CORRECT_ISO_CPP_STRING_H_PROTO extern "C++" @@ -155,6 +165,17 @@ extern char *strncat (char *__restrict __dest, const char *__restrict __src, /* Compare S1 and S2. */ extern int strcmp (const char *__s1, const char *__s2) __THROW __attribute_pure__ __nonnull ((1, 2)); + +#ifdef __USE_GNU +/* Compare S1 and S2 for equality. */ +__attribute_pure__ __nonnull ((1, 2)) +static inline _Bool +streq (const char *__s1, const char *__s2) +{ + return strcmp(__s1, __s2) == 0; +} +#endif + /* Compare N characters of S1 and S2. */ extern int strncmp (const char *__s1, const char *__s2, size_t __n) __THROW __attribute_pure__ __nonnull ((1, 2)); diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h index b31ca2d241..fe8899867f 100644 --- a/wcsmbs/wchar.h +++ b/wcsmbs/wchar.h @@ -129,6 +129,22 @@ extern wchar_t *wcsncat (wchar_t *__restrict __dest, /* Compare S1 and S2. */ extern int wcscmp (const wchar_t *__s1, const wchar_t *__s2) __THROW __attribute_pure__ __nonnull ((1, 2)); + +#ifdef __USE_GNU +/* Compare S1 and S2 for equality. */ +__attribute_pure__ __nonnull ((1, 2)) +static inline +# ifdef __cplusplus +bool +# else +_Bool +# endif +wcseq (const wchar_t *__s1, const wchar_t *__s2) +{ + return wcscmp(__s1, __s2) == 0; +} +#endif + /* Compare N wide-characters of S1 and S2. */ extern int wcsncmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n) __THROW __attribute_pure__ __nonnull ((1, 2)); @@ -283,6 +299,21 @@ extern wchar_t *wmemchr (const wchar_t *__s, wchar_t __c, size_t __n) extern int wmemcmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n) __THROW __attribute_pure__; +#ifdef __USE_GNU +/* Compare N wide characters of M1 and M2 for equality. */ +__attribute_pure__ __nonnull ((1, 2)) +static inline +# ifdef __cplusplus +bool +# else +_Bool +# endif +wmemeq (const wchar_t *__m1, const wchar_t *__m2, size_t __n) +{ + return wmemcmp(__m1, __m2, __n) == 0; +} +#endif + /* Copy N wide characters of SRC to DEST. */ extern wchar_t *wmemcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2, size_t __n) __THROW;