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;