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;