Module Name:    src
Committed By:   riastradh
Date:           Sat Aug 17 21:24:54 UTC 2024

Modified Files:
        src/include: uchar.h
        src/lib/libc/include: namespace.h
        src/lib/libc/locale: c16rtomb.c c32rtomb.c c8rtomb.c mbrtoc16.c
            mbrtoc32.c mbrtoc8.c

Log Message:
libc: Add _l variants of the cNrtomb and mbrtocN functions.

These accept an explicit locale parameter, rather than using the
current locale.

Visible under _NETBSD_SOURCE, not exposed otherwise.

NOTE: This adds libc symbols.  Riding the libc minor bump for the
non-_l variants of these from two days ago -- hope that's not pushing
it too far.

PR lib/58613: c*rtomb, mbrtoc* should have locale-parametric _l
variants


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/include/uchar.h
cvs rdiff -u -r1.204 -r1.205 src/lib/libc/include/namespace.h
cvs rdiff -u -r1.4 -r1.5 src/lib/libc/locale/c16rtomb.c
cvs rdiff -u -r1.2 -r1.3 src/lib/libc/locale/c32rtomb.c
cvs rdiff -u -r1.3 -r1.4 src/lib/libc/locale/c8rtomb.c \
    src/lib/libc/locale/mbrtoc8.c
cvs rdiff -u -r1.5 -r1.6 src/lib/libc/locale/mbrtoc16.c \
    src/lib/libc/locale/mbrtoc32.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/uchar.h
diff -u src/include/uchar.h:1.2 src/include/uchar.h:1.3
--- src/include/uchar.h:1.2	Thu Aug 15 21:19:45 2024
+++ src/include/uchar.h	Sat Aug 17 21:24:53 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: uchar.h,v 1.2 2024/08/15 21:19:45 riastradh Exp $	*/
+/*	$NetBSD: uchar.h,v 1.3 2024/08/17 21:24:53 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -108,6 +108,22 @@ size_t	mbrtoc32(char32_t *__restrict, co
 	    mbstate_t *__restrict);
 size_t	c32rtomb(char *__restrict, char32_t, mbstate_t *__restrict);
 
+#ifdef _NETBSD_SOURCE
+struct _locale;
+size_t	mbrtoc8_l(char8_t *__restrict, const char *__restrict, size_t,
+	    mbstate_t *__restrict, struct _locale *__restrict);
+size_t	c8rtomb_l(char *__restrict, char8_t, mbstate_t *__restrict,
+	    struct _locale *__restrict);
+size_t	mbrtoc16_l(char16_t *__restrict, const char *__restrict, size_t,
+	    mbstate_t *__restrict, struct _locale *__restrict);
+size_t	c16rtomb_l(char *__restrict, char16_t, mbstate_t *__restrict,
+	    struct _locale *__restrict);
+size_t	mbrtoc32_l(char32_t *__restrict, const char *__restrict, size_t,
+	    mbstate_t *__restrict, struct _locale *__restrict);
+size_t	c32rtomb_l(char *__restrict, char32_t, mbstate_t *__restrict,
+	    struct _locale *__restrict);
+#endif
+
 __END_DECLS
 
 #endif	/* _UCHAR_H */

Index: src/lib/libc/include/namespace.h
diff -u src/lib/libc/include/namespace.h:1.204 src/lib/libc/include/namespace.h:1.205
--- src/lib/libc/include/namespace.h:1.204	Thu Aug 15 22:22:34 2024
+++ src/lib/libc/include/namespace.h	Sat Aug 17 21:24:53 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: namespace.h,v 1.204 2024/08/15 22:22:34 riastradh Exp $	*/
+/*	$NetBSD: namespace.h,v 1.205 2024/08/17 21:24:53 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
@@ -224,7 +224,10 @@
 #define bm_comp			_bm_comp
 #define bm_exec			_bm_exec
 #define bm_free			_bm_free
+#define c16rtomb_l		_c16rtomb_l
 #define c32rtomb		_c32rtomb
+#define c32rtomb_l		_c32rtomb_l
+#define c8rtomb_l		_c8rtomb_l
 #define callrpc			_callrpc
 #define cdbr_close		_cdbr_close
 #define cdbr_find		_cdbr_find
@@ -512,7 +515,10 @@
 #define lockf			_lockf
 #define lrand48			_lrand48
 #define lseek			_lseek
+#define mbrtoc16_l		_mbrtoc16_l
 #define mbrtoc32		_mbrtoc32
+#define mbrtoc32_l		_mbrtoc32_l
+#define mbrtoc8_l		_mbrtoc8_l
 #define membar_producer		_membar_producer
 #define mergesort		_mergesort
 #define mi_vector_hash		_mi_vector_hash

Index: src/lib/libc/locale/c16rtomb.c
diff -u src/lib/libc/locale/c16rtomb.c:1.4 src/lib/libc/locale/c16rtomb.c:1.5
--- src/lib/libc/locale/c16rtomb.c:1.4	Sat Aug 17 20:08:13 2024
+++ src/lib/libc/locale/c16rtomb.c	Sat Aug 17 21:24:53 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: c16rtomb.c,v 1.4 2024/08/17 20:08:13 christos Exp $	*/
+/*	$NetBSD: c16rtomb.c,v 1.5 2024/08/17 21:24:53 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -66,18 +66,20 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: c16rtomb.c,v 1.4 2024/08/17 20:08:13 christos Exp $");
+__RCSID("$NetBSD: c16rtomb.c,v 1.5 2024/08/17 21:24:53 riastradh Exp $");
 
 #include "namespace.h"
 
 #include <assert.h>
 #include <errno.h>
 #include <limits.h>
+#include <locale.h>
 #include <stdalign.h>
 #include <stddef.h>
 #include <uchar.h>
 
 #include "c32rtomb.h"
+#include "setlocale_local.h"
 
 struct c16rtombstate {
 	char16_t	surrogate;
@@ -88,9 +90,21 @@ __CTASSERT(sizeof(struct c32rtombstate) 
     offsetof(struct c16rtombstate, mbs));
 __CTASSERT(alignof(struct c16rtombstate) <= alignof(mbstate_t));
 
+#ifdef __weak_alias
+__weak_alias(c16rtomb_l,_c16rtomb_l)
+#endif
+
 size_t
 c16rtomb(char *restrict s, char16_t c16, mbstate_t *restrict ps)
 {
+
+	return c16rtomb_l(s, c16, ps, _current_locale());
+}
+
+size_t
+c16rtomb_l(char *restrict s, char16_t c16, mbstate_t *restrict ps,
+    locale_t loc)
+{
 	static mbstate_t psbuf;
 	char buf[MB_LEN_MAX];
 	struct c16rtombstate *S;
@@ -181,5 +195,5 @@ c16rtomb(char *restrict s, char16_t c16,
 	/*
 	 * We have a scalar value.  Output it.
 	 */
-	return c32rtomb(s, c32, &S->mbs);
+	return c32rtomb_l(s, c32, &S->mbs, loc);
 }

Index: src/lib/libc/locale/c32rtomb.c
diff -u src/lib/libc/locale/c32rtomb.c:1.2 src/lib/libc/locale/c32rtomb.c:1.3
--- src/lib/libc/locale/c32rtomb.c:1.2	Thu Aug 15 22:22:35 2024
+++ src/lib/libc/locale/c32rtomb.c	Sat Aug 17 21:24:53 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: c32rtomb.c,v 1.2 2024/08/15 22:22:35 riastradh Exp $	*/
+/*	$NetBSD: c32rtomb.c,v 1.3 2024/08/17 21:24:53 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -49,7 +49,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: c32rtomb.c,v 1.2 2024/08/15 22:22:35 riastradh Exp $");
+__RCSID("$NetBSD: c32rtomb.c,v 1.3 2024/08/17 21:24:53 riastradh Exp $");
 
 #include "namespace.h"
 
@@ -60,6 +60,7 @@ __RCSID("$NetBSD: c32rtomb.c,v 1.2 2024/
 #include <errno.h>
 #include <langinfo.h>
 #include <limits.h>
+#include <locale.h>
 #include <paths.h>
 #include <stddef.h>
 #include <stdlib.h>
@@ -70,14 +71,24 @@ __RCSID("$NetBSD: c32rtomb.c,v 1.2 2024/
 #include "citrus_module.h"	/* broken citrus_iconv.h */
 #include "citrus_hash.h"	/* broken citrus_iconv.h */
 #include "citrus_iconv.h"
+#include "setlocale_local.h"
 
 #ifdef __weak_alias
 __weak_alias(c32rtomb,_c32rtomb)
+__weak_alias(c32rtomb_l,_c32rtomb_l)
 #endif
 
 size_t
 c32rtomb(char *restrict s, char32_t c32, mbstate_t *restrict ps)
 {
+
+	return c32rtomb_l(s, c32, ps, _current_locale());
+}
+
+size_t
+c32rtomb_l(char *restrict s, char32_t c32, mbstate_t *restrict ps,
+    locale_t loc)
+{
 	char buf[MB_LEN_MAX];
 	struct _citrus_iconv *iconv = NULL;
 	char srcbuf[4];
@@ -118,7 +129,7 @@ c32rtomb(char *restrict s, char32_t c32,
 	 * multibyte output.
 	 */
 	if ((error = _citrus_iconv_open(&iconv, _PATH_ICONV, "utf-32le",
-		    nl_langinfo(CODESET))) != 0) {
+		    nl_langinfo_l(CODESET, loc))) != 0) {
 		errno = EIO; /* XXX? */
 		len = (size_t)-1;
 		goto out;

Index: src/lib/libc/locale/c8rtomb.c
diff -u src/lib/libc/locale/c8rtomb.c:1.3 src/lib/libc/locale/c8rtomb.c:1.4
--- src/lib/libc/locale/c8rtomb.c:1.3	Sat Aug 17 20:08:13 2024
+++ src/lib/libc/locale/c8rtomb.c	Sat Aug 17 21:24:53 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: c8rtomb.c,v 1.3 2024/08/17 20:08:13 christos Exp $	*/
+/*	$NetBSD: c8rtomb.c,v 1.4 2024/08/17 21:24:53 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -55,19 +55,21 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: c8rtomb.c,v 1.3 2024/08/17 20:08:13 christos Exp $");
+__RCSID("$NetBSD: c8rtomb.c,v 1.4 2024/08/17 21:24:53 riastradh Exp $");
 
 #include "namespace.h"
 
 #include <assert.h>
 #include <errno.h>
 #include <limits.h>
+#include <locale.h>
 #include <stdalign.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <uchar.h>
 
 #include "c32rtomb.h"
+#include "setlocale_local.h"
 
 struct c8rtombstate {
 	char32_t	state_c32; /* 8-bit state and 24-bit buffer */
@@ -121,9 +123,20 @@ utf8_decode_step(utf8_state_t state, cha
 	return utf8_statetab[state + class];
 }
 
+#ifdef __weak_alias
+__weak_alias(c8rtomb_l,_c8rtomb_l)
+#endif
+
 size_t
 c8rtomb(char *restrict s, char8_t c8, mbstate_t *restrict ps)
 {
+
+	return c8rtomb_l(s, c8, ps, _current_locale());
+}
+
+size_t
+c8rtomb_l(char *restrict s, char8_t c8, mbstate_t *restrict ps, locale_t loc)
+{
 	static mbstate_t psbuf;
 	char buf[MB_LEN_MAX];
 	struct c8rtombstate *S;
@@ -214,6 +227,6 @@ c8rtomb(char *restrict s, char8_t c8, mb
 		__CTASSERT(UTF8_ACCEPT == 0);
 #endif
 		S->state_c32 = 0;
-		return c32rtomb(s, c32, &S->mbs);
+		return c32rtomb_l(s, c32, &S->mbs, loc);
 	}
 }
Index: src/lib/libc/locale/mbrtoc8.c
diff -u src/lib/libc/locale/mbrtoc8.c:1.3 src/lib/libc/locale/mbrtoc8.c:1.4
--- src/lib/libc/locale/mbrtoc8.c:1.3	Sat Aug 17 20:08:13 2024
+++ src/lib/libc/locale/mbrtoc8.c	Sat Aug 17 21:24:54 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: mbrtoc8.c,v 1.3 2024/08/17 20:08:13 christos Exp $	*/
+/*	$NetBSD: mbrtoc8.c,v 1.4 2024/08/17 21:24:54 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -72,17 +72,19 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: mbrtoc8.c,v 1.3 2024/08/17 20:08:13 christos Exp $");
+__RCSID("$NetBSD: mbrtoc8.c,v 1.4 2024/08/17 21:24:54 riastradh Exp $");
 
 #include "namespace.h"
 
 #include <assert.h>
 #include <errno.h>
+#include <locale.h>
 #include <stdalign.h>
 #include <stddef.h>
 #include <uchar.h>
 
 #include "mbrtoc32.h"
+#include "setlocale_local.h"
 
 struct mbrtoc8state {
 	char8_t		nleft;
@@ -94,10 +96,22 @@ __CTASSERT(sizeof(struct mbrtoc32state) 
     offsetof(struct mbrtoc8state, mbs));
 __CTASSERT(alignof(struct mbrtoc8state) <= alignof(mbstate_t));
 
+#ifdef __weak_alias
+__weak_alias(mbrtoc8_l,_mbrtoc8_l)
+#endif
+
 size_t
 mbrtoc8(char8_t *restrict pc8, const char *restrict s, size_t n,
     mbstate_t *restrict ps)
 {
+
+	return mbrtoc8_l(pc8, s, n, ps, _current_locale());
+}
+
+size_t
+mbrtoc8_l(char8_t *restrict pc8, const char *restrict s, size_t n,
+    mbstate_t *restrict ps, locale_t restrict loc)
+{
 	static mbstate_t psbuf;
 	struct mbrtoc8state *S;
 	char32_t c32;
@@ -151,7 +165,7 @@ mbrtoc8(char8_t *restrict pc8, const cha
 	 * Consume the next scalar value.  If no full scalar value can
 	 * be obtained, stop here.
 	 */
-	len = mbrtoc32(&c32, s, n, &S->mbs);
+	len = mbrtoc32_l(&c32, s, n, &S->mbs, loc);
 	switch (len) {
 	case 0:			/* NUL */
 		if (pc8)

Index: src/lib/libc/locale/mbrtoc16.c
diff -u src/lib/libc/locale/mbrtoc16.c:1.5 src/lib/libc/locale/mbrtoc16.c:1.6
--- src/lib/libc/locale/mbrtoc16.c:1.5	Sat Aug 17 20:08:13 2024
+++ src/lib/libc/locale/mbrtoc16.c	Sat Aug 17 21:24:54 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: mbrtoc16.c,v 1.5 2024/08/17 20:08:13 christos Exp $	*/
+/*	$NetBSD: mbrtoc16.c,v 1.6 2024/08/17 21:24:54 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -73,17 +73,19 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: mbrtoc16.c,v 1.5 2024/08/17 20:08:13 christos Exp $");
+__RCSID("$NetBSD: mbrtoc16.c,v 1.6 2024/08/17 21:24:54 riastradh Exp $");
 
 #include "namespace.h"
 
 #include <assert.h>
 #include <errno.h>
+#include <locale.h>
 #include <stdalign.h>
 #include <stddef.h>
 #include <uchar.h>
 
 #include "mbrtoc32.h"
+#include "setlocale_local.h"
 
 struct mbrtoc16state {
 	char16_t	surrogate;
@@ -94,10 +96,22 @@ __CTASSERT(sizeof(struct mbrtoc32state) 
     offsetof(struct mbrtoc16state, mbs));
 __CTASSERT(alignof(struct mbrtoc16state) <= alignof(mbstate_t));
 
+#ifdef __weak_alias
+__weak_alias(mbrtoc16_l,_mbrtoc16_l)
+#endif
+
 size_t
 mbrtoc16(char16_t *restrict pc16, const char *restrict s, size_t n,
     mbstate_t *restrict ps)
 {
+
+	return mbrtoc16_l(pc16, s, n, ps, _current_locale());
+}
+
+size_t
+mbrtoc16_l(char16_t *restrict pc16, const char *restrict s, size_t n,
+    mbstate_t *restrict ps, locale_t restrict loc)
+{
 	static mbstate_t psbuf;
 	struct mbrtoc16state *S;
 	char32_t c32;
@@ -153,7 +167,7 @@ mbrtoc16(char16_t *restrict pc16, const 
 	 * Consume the next scalar value.  If no full scalar value can
 	 * be obtained, stop here.
 	 */
-	len = mbrtoc32(&c32, s, n, &S->mbs);
+	len = mbrtoc32_l(&c32, s, n, &S->mbs, loc);
 	switch (len) {
 	case 0:			/* NUL */
 		if (pc16)
Index: src/lib/libc/locale/mbrtoc32.c
diff -u src/lib/libc/locale/mbrtoc32.c:1.5 src/lib/libc/locale/mbrtoc32.c:1.6
--- src/lib/libc/locale/mbrtoc32.c:1.5	Sat Aug 17 20:08:13 2024
+++ src/lib/libc/locale/mbrtoc32.c	Sat Aug 17 21:24:54 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: mbrtoc32.c,v 1.5 2024/08/17 20:08:13 christos Exp $	*/
+/*	$NetBSD: mbrtoc32.c,v 1.6 2024/08/17 21:24:54 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: mbrtoc32.c,v 1.5 2024/08/17 20:08:13 christos Exp $");
+__RCSID("$NetBSD: mbrtoc32.c,v 1.6 2024/08/17 21:24:54 riastradh Exp $");
 
 #include "namespace.h"
 
@@ -64,6 +64,7 @@ __RCSID("$NetBSD: mbrtoc32.c,v 1.5 2024/
 #include <errno.h>
 #include <langinfo.h>
 #include <limits.h>
+#include <locale.h>
 #include <paths.h>
 #include <stdalign.h>
 #include <stddef.h>
@@ -76,6 +77,7 @@ __RCSID("$NetBSD: mbrtoc32.c,v 1.5 2024/
 #include "citrus_module.h"	/* broken citrus_iconv.h */
 #include "citrus_hash.h"	/* broken citrus_iconv.h */
 #include "citrus_iconv.h"
+#include "setlocale_local.h"
 
 #include "mbrtoc32.h"
 
@@ -84,12 +86,21 @@ __CTASSERT(alignof(struct mbrtoc32state)
 
 #ifdef __weak_alias
 __weak_alias(mbrtoc32,_mbrtoc32)
+__weak_alias(mbrtoc32_l,_mbrtoc32_l)
 #endif
 
 size_t
 mbrtoc32(char32_t *restrict pc32, const char *restrict s, size_t n,
     mbstate_t *restrict ps)
 {
+
+	return mbrtoc32_l(pc32, s, n, ps, _current_locale());
+}
+
+size_t
+mbrtoc32_l(char32_t *restrict pc32, const char *restrict s, size_t n,
+    mbstate_t *restrict ps, locale_t restrict loc)
+{
 	static mbstate_t psbuf;
 	struct mbrtoc32state *S;
 	struct _citrus_iconv *iconv = NULL;
@@ -155,7 +166,7 @@ mbrtoc32(char32_t *restrict pc32, const 
 	 * input to UTF-32LE.
 	 */
 	if ((error = _citrus_iconv_open(&iconv, _PATH_ICONV,
-		    nl_langinfo(CODESET), "utf-32le")) != 0) {
+		    nl_langinfo_l(CODESET, loc), "utf-32le")) != 0) {
 		errno = EIO; /* XXX? */
 		len = (size_t)-1;
 		goto out;

Reply via email to