Module Name:    src
Committed By:   riastradh
Date:           Fri Nov  1 18:35:12 UTC 2024

Modified Files:
        src/include: strings.h
        src/lib/libc/string: Makefile.inc
        src/tests/include/sys: Makefile t_bitops.c
Added Files:
        src/common/lib/libc/string: ffsl.c ffsll.c

Log Message:
strings.h: Spruce up for POSIX 2024.

1. Add ffsl, ffsll.
2. Hide bcmp, bcopy, bzero, index, rindex for POSIX>=2024.
3. Expose ffs only for NetBSD or POSIX>=2008 with XSI option.
4. Hide popcount* NetBSD extensions for any POSIX.
5. Sprinkle __constfunc on ffs*.

Add tests for ffs/ffsl/ffsll in tests/include/sys/t_bitops next to
ffs32/ffs64 for convenience.

XXX Still missing strcasecmp_l, strncasecmp_l, and locale_t.

PR lib/58802: missing ffsl(), ffsll() functions from POSIX 2024


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/common/lib/libc/string/ffsl.c \
    src/common/lib/libc/string/ffsll.c
cvs rdiff -u -r1.18 -r1.19 src/include/strings.h
cvs rdiff -u -r1.90 -r1.91 src/lib/libc/string/Makefile.inc
cvs rdiff -u -r1.16 -r1.17 src/tests/include/sys/Makefile
cvs rdiff -u -r1.21 -r1.22 src/tests/include/sys/t_bitops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/include/strings.h
diff -u src/include/strings.h:1.18 src/include/strings.h:1.19
--- src/include/strings.h:1.18	Mon Aug 22 01:24:15 2011
+++ src/include/strings.h	Fri Nov  1 18:35:12 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: strings.h,v 1.18 2011/08/22 01:24:15 dholland Exp $	*/
+/*	$NetBSD: strings.h,v 1.19 2024/11/01 18:35:12 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -49,17 +49,31 @@ typedef	_BSD_SIZE_T_	size_t;
 #include <machine/int_types.h>
 
 __BEGIN_DECLS
+#if defined(_NETBSD_SOURCE) || \
+    (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE - 0 < 202405L)
 int	 bcmp(const void *, const void *, size_t);
 void	 bcopy(const void *, void *, size_t);
 void	 bzero(void *, size_t);
-int	 ffs(int);
-char	*index(const char *, int);
+#endif
+#if defined(_NETBSD_SOURCE) || _XOPEN_SOURCE - 0 >= 700
+int	 ffs(int) __constfunc;
+#endif
+#if defined(_NETBSD_SOURCE) || _XOPEN_SOURCE - 0 >= 800
+int	 ffsl(long) __constfunc;
+int	 ffsll(long long) __constfunc;
+#endif
+#ifdef _NETBSD_SOURCE
 unsigned int	popcount(unsigned int) __constfunc;
 unsigned int	popcountl(unsigned long) __constfunc;
 unsigned int	popcountll(unsigned long long) __constfunc;
 unsigned int	popcount32(__uint32_t) __constfunc;
 unsigned int	popcount64(__uint64_t) __constfunc;
+#endif
+#if defined(_NETBSD_SOURCE) || \
+    (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE - 0 < 202405L)
+char	*index(const char *, int);
 char	*rindex(const char *, int);
+#endif
 int	 strcasecmp(const char *, const char *);
 int	 strncasecmp(const char *, const char *, size_t);
 __END_DECLS

Index: src/lib/libc/string/Makefile.inc
diff -u src/lib/libc/string/Makefile.inc:1.90 src/lib/libc/string/Makefile.inc:1.91
--- src/lib/libc/string/Makefile.inc:1.90	Sat Jun  8 21:35:18 2024
+++ src/lib/libc/string/Makefile.inc	Fri Nov  1 18:35:12 2024
@@ -1,5 +1,5 @@
 #	from: @(#)Makefile.inc	8.1 (Berkeley) 6/4/93
-#	$NetBSD: Makefile.inc,v 1.90 2024/06/08 21:35:18 joerg Exp $
+#	$NetBSD: Makefile.inc,v 1.91 2024/11/01 18:35:12 riastradh Exp $
 
 # string sources
 .PATH: ${ARCHDIR}/string ${.CURDIR}/string
@@ -15,7 +15,7 @@ SRCS+=	bm.c stpcpy.c stpncpy.c \
 	strtok_r.c strxfrm.c __strsignal.c strerror_r.c strndup.c \
 	stresep.c memrchr.c
 
-SRCS+=	bcmp.c bcopy.c bzero.c ffs.c memchr.c memcmp.c memset.c
+SRCS+=	bcmp.c bcopy.c bzero.c ffs.c ffsl.c ffsll.c memchr.c memcmp.c memset.c
 SRCS+=	strcat.c strcmp.c strcpy.c strcspn.c strlen.c
 SRCS+=	strncat.c strncmp.c strncpy.c strpbrk.c strsep.c
 SRCS+=	strspn.c strstr.c swab.c strnstr.c

Index: src/tests/include/sys/Makefile
diff -u src/tests/include/sys/Makefile:1.16 src/tests/include/sys/Makefile:1.17
--- src/tests/include/sys/Makefile:1.16	Sun May 31 16:36:07 2020
+++ src/tests/include/sys/Makefile	Fri Nov  1 18:35:12 2024
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.16 2020/05/31 16:36:07 kamil Exp $
+# $NetBSD: Makefile,v 1.17 2024/11/01 18:35:12 riastradh Exp $
 
 NOMAN=		# defined
 
@@ -14,6 +14,10 @@ TESTS_C+=		t_pslist
 TESTS_C+=		t_tree
 TESTS_C+=		t_types
 
+COPTS.t_bitops.c+=	-fno-builtin-ffs
+COPTS.t_bitops.c+=	-fno-builtin-ffsl
+COPTS.t_bitops.c+=	-fno-builtin-ffsll
+
 # NULL + 0 arithmetic raises LLVM UBSan warnings, specially in sys/pslist.h
 # in the type-safe macros _PSLIST_VALIDATE_PTRS and _PSLIST_VALIDATE_CONTAINER.
 # See also src/sys/rump/Makefile.rump

Index: src/tests/include/sys/t_bitops.c
diff -u src/tests/include/sys/t_bitops.c:1.21 src/tests/include/sys/t_bitops.c:1.22
--- src/tests/include/sys/t_bitops.c:1.21	Thu Jul 13 20:39:24 2023
+++ src/tests/include/sys/t_bitops.c	Fri Nov  1 18:35:12 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_bitops.c,v 1.21 2023/07/13 20:39:24 riastradh Exp $ */
+/*	$NetBSD: t_bitops.c,v 1.22 2024/11/01 18:35:12 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2011, 2012 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: t_bitops.c,v 1.21 2023/07/13 20:39:24 riastradh Exp $");
+__RCSID("$NetBSD: t_bitops.c,v 1.22 2024/11/01 18:35:12 riastradh Exp $");
 
 #include <atf-c.h>
 
@@ -40,6 +40,7 @@ __RCSID("$NetBSD: t_bitops.c,v 1.21 2023
 #include <inttypes.h>
 #include <stdlib.h>
 #include <string.h>
+#include <strings.h>
 
 static const struct {
 	uint32_t	val;
@@ -164,18 +165,65 @@ ATF_TC_BODY(ffsfls, tc)
 	uint8_t i;
 	int n, m;
 
+	ATF_CHECK_EQ_MSG((n = ffs(0)), 0x00, "n=%d", n);
+	ATF_CHECK_EQ_MSG((n = ffsl(0)), 0x00, "n=%d", n);
+	ATF_CHECK_EQ_MSG((n = ffsll(0)), 0x00, "n=%d", n);
+
 	ATF_CHECK_EQ_MSG((n = ffs32(0)), 0x00, "n=%d", n);
 	ATF_CHECK_EQ_MSG((n = fls32(0)), 0x00, "n=%d", n);
 	ATF_CHECK_EQ_MSG((n = ffs64(0)), 0x00, "n=%d", n);
 	ATF_CHECK_EQ_MSG((n = fls64(0)), 0x00, "n=%d", n);
 
+	ATF_CHECK_EQ_MSG((n = ffs(UINT_MAX)), 0x01, "n=%d\n", n);
+	ATF_CHECK_EQ_MSG((n = ffsl(ULONG_MAX)), 0x01, "n=%d\n", n);
+	ATF_CHECK_EQ_MSG((n = ffsll(ULLONG_MAX)), 0x01, "n=%d\n", n);
+
+	ATF_CHECK_EQ_MSG((n = ffs((unsigned)INT_MAX + 1)),
+	    CHAR_BIT*sizeof(int),
+	    "n=%d\n", n);
+	ATF_CHECK_EQ_MSG((n = ffsl((unsigned long)LONG_MAX + 1)),
+	    CHAR_BIT*sizeof(long),
+	    "n=%d\n", n);
+	ATF_CHECK_EQ_MSG((n = ffsll((unsigned long long)LLONG_MAX + 1)),
+	    CHAR_BIT*sizeof(long long),
+	    "n=%d\n", n);
+
 	ATF_CHECK_EQ_MSG((n = ffs32(UINT32_MAX)), 0x01, "n=%d", n);
 	ATF_CHECK_EQ_MSG((n = fls32(UINT32_MAX)), 0x20, "n=%d", n);
 	ATF_CHECK_EQ_MSG((n = ffs64(UINT64_MAX)), 0x01, "n=%d", n);
 	ATF_CHECK_EQ_MSG((n = fls64(UINT64_MAX)), 0x40, "n=%d", n);
 
+	for (i = 0; i < CHAR_BIT*sizeof(long long); i++) {
+		if (i < CHAR_BIT*sizeof(int)) {
+			ATF_CHECK_EQ_MSG((n = ffs(1U << i)), i + 1, "n=%d", n);
+		}
+		if (i < CHAR_BIT*sizeof(long)) {
+			ATF_CHECK_EQ_MSG((n = ffsl(1UL << i)), i + 1,
+			    "n=%d", n);
+		}
+		if (i < CHAR_BIT*sizeof(long long)) {
+			ATF_CHECK_EQ_MSG((n = ffsll(1ULL << i)), i + 1,
+			    "n=%d", n);
+		}
+		if (i < CHAR_BIT*sizeof(int32_t)) {
+			ATF_CHECK_EQ_MSG((n = ffs32((uint32_t)1 << i)), i + 1,
+			    "n=%d", n);
+		}
+		if (i < CHAR_BIT*sizeof(int64_t)) {
+			ATF_CHECK_EQ_MSG((n = ffs64((uint64_t)1 << i)), i + 1,
+			    "n=%d", n);
+		}
+	}
+
 	for (i = 1; i < __arraycount(bits); i++) {
 
+		ATF_CHECK_EQ_MSG((n = ffs(bits[i].val)), (m = bits[i].ffs),
+		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+		ATF_CHECK_EQ_MSG((n = ffsl(bits[i].val)), (m = bits[i].ffs),
+		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+		ATF_CHECK_EQ_MSG((n = ffsll(bits[i].val)), (m = bits[i].ffs),
+		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+
 		ATF_CHECK_EQ_MSG((n = ffs32(bits[i].val)), (m = bits[i].ffs),
 		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
 		ATF_CHECK_EQ_MSG((n = fls32(bits[i].val)), (m = bits[i].fls),
@@ -185,6 +233,16 @@ ATF_TC_BODY(ffsfls, tc)
 		ATF_CHECK_EQ_MSG((n = fls64(bits[i].val)), (m = bits[i].fls),
 		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
 
+		ATF_CHECK_EQ_MSG((n = ffs(bits[i].val << 1)),
+		    (m = bits[i].ffs + 1),
+		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+		ATF_CHECK_EQ_MSG((n = ffsl(bits[i].val << 1)),
+		    (m = bits[i].ffs + 1),
+		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+		ATF_CHECK_EQ_MSG((n = ffsll(bits[i].val << 1)),
+		    (m = bits[i].ffs + 1),
+		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+
 		ATF_CHECK_EQ_MSG((n = ffs32(bits[i].val << 1)),
 		    (m = bits[i].ffs + 1),
 		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
@@ -198,6 +256,16 @@ ATF_TC_BODY(ffsfls, tc)
 		    (m = bits[i].fls + 1),
 		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
 
+		ATF_CHECK_EQ_MSG((n = ffs(bits[i].val << 9)),
+		    (m = bits[i].ffs + 9),
+		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+		ATF_CHECK_EQ_MSG((n = ffsl(bits[i].val << 9)),
+		    (m = bits[i].ffs + 9),
+		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+		ATF_CHECK_EQ_MSG((n = ffsll(bits[i].val << 9)),
+		    (m = bits[i].ffs + 9),
+		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+
 		ATF_CHECK_EQ_MSG((n = ffs32(bits[i].val << 9)),
 		    (m = bits[i].ffs + 9),
 		    "[i=%"PRIu8"] n=%d m=%d", i, n, m);

Added files:

Index: src/common/lib/libc/string/ffsl.c
diff -u /dev/null src/common/lib/libc/string/ffsl.c:1.1
--- /dev/null	Fri Nov  1 18:35:12 2024
+++ src/common/lib/libc/string/ffsl.c	Fri Nov  1 18:35:12 2024
@@ -0,0 +1,50 @@
+/*	$NetBSD: ffsl.c,v 1.1 2024/11/01 18:35:12 riastradh Exp $	*/
+
+/*-
+ * Copyright (c) 2024 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: ffsl.c,v 1.1 2024/11/01 18:35:12 riastradh Exp $");
+
+#include <sys/bitops.h>
+
+#include <limits.h>
+#include <strings.h>
+
+#undef	ffsl			/* paranoia */
+
+int
+ffsl(long x)
+{
+
+#ifdef _LP64
+	__CTASSERT(CHAR_BIT*sizeof(x) == 64);
+	return ffs64(x);
+#else
+	__CTASSERT(CHAR_BIT*sizeof(x) == 32);
+	return ffs32(x);
+#endif
+}
Index: src/common/lib/libc/string/ffsll.c
diff -u /dev/null src/common/lib/libc/string/ffsll.c:1.1
--- /dev/null	Fri Nov  1 18:35:12 2024
+++ src/common/lib/libc/string/ffsll.c	Fri Nov  1 18:35:12 2024
@@ -0,0 +1,45 @@
+/*	$NetBSD: ffsll.c,v 1.1 2024/11/01 18:35:12 riastradh Exp $	*/
+
+/*-
+ * Copyright (c) 2024 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: ffsll.c,v 1.1 2024/11/01 18:35:12 riastradh Exp $");
+
+#include <sys/bitops.h>
+
+#include <limits.h>
+#include <strings.h>
+
+#undef	ffsll			/* paranoia */
+
+int
+ffsll(long long x)
+{
+
+	__CTASSERT(CHAR_BIT*sizeof(x) == 64);
+	return ffs64(x);
+}

Reply via email to