[RFC v1 1/1] string: Add streq(), memeq(), wcseq(), wmemeq()

Alejandro Colomar alx@kernel.org
Mon Sep 1 14:33:32 GMT 2025


Hi Adhemerval,

On Mon, Sep 01, 2025 at 10:50:57AM -0300, Adhemerval Zanella Netto wrote:
> 
> 
> On 30/08/25 15:47, Alejandro Colomar wrote:
> > Hi,
> > 
> > On Sat, Aug 30, 2025 at 08:46:10AM +0200, Alejandro Colomar wrote:
> >> 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.
> > 
> > I've built a glibc with these inline functions, and one with these
> > implemented as macros.  The one with macros results in a smaller binary,
> > so I guess I should implement them as macros.  Also, that removes the
> > issue about bool/_Bool.
> > 
> > 
> > Have a lovely night!
> > Alex
> > 
> >>
> >> Signed-off-by: Alejandro Colomar <alx@kernel.org>
> 
> Hi Alejandro,
> 
> I am aware this is a RFC, but this patch triggered some CI issues [1], where
> some old standard modes do not support '_Bool'.

Yup, I found some issues while running 'make check', although not in
'make'.  About the issues with _Bool, they seem to come from C++, not
old versions of C.  AFAIK, _Bool is supported in GCC in every language
version (except in pedantic C89 maybe?).

How would you proceed about bool?  I could add a macro, which would
evaluate to an int instead of a bool, and would sovle this issue.
However, I'm worried that this might burn that return type in stone,
not allowing us to improve it.  I say a macro, because at least with
a macro we'd have more chances of retrofitting a bool in the future,
since there would be no function pointers around.

Should I do a bunch of #ifdef to check for __plusplus, or do you have
a better way?  Ideally, I'd like to include <stdbool.h> form <string.h>,
but the standard doesn't allow it.  (Note to self: propose to fix that
in ISO C; standard headers should be allowed to include other standard
headers.)  I think GCC should accept _Bool in C++ mode.  It would save
us trouble.

Maybe a macro is fine for now?  Being a macro, we have more chances of
improving it later.

> This is not a complete review, I am still not sure about these new functions.
> 
> [1] https://www.delorie.com/trybots/32bit/51346/ 

I think that's not the right link, is it?


Have a lovely day!
Alex

> 
> >> ---
> >>  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;
> >> -- 
> >> 2.50.1
> >>
> > 
> 

-- 
<https://www.alejandro-colomar.es>
Use port 80 (that is, <...:80/>).
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20250901/4b88cd3a/attachment.sig>


More information about the Libc-alpha mailing list