xref: /titanic_52/usr/src/lib/libc/port/locale/mbrtoc32.c (revision 9a4a12bd7ce60cd60eae508b25eb7a8dae765274)
1*9a4a12bdSRobert Mustacchi /*
2*9a4a12bdSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*9a4a12bdSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*9a4a12bdSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*9a4a12bdSRobert Mustacchi  * 1.0 of the CDDL.
6*9a4a12bdSRobert Mustacchi  *
7*9a4a12bdSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*9a4a12bdSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*9a4a12bdSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*9a4a12bdSRobert Mustacchi  */
11*9a4a12bdSRobert Mustacchi 
12*9a4a12bdSRobert Mustacchi /*
13*9a4a12bdSRobert Mustacchi  * Copyright 2020 Robert Mustacchi
14*9a4a12bdSRobert Mustacchi  */
15*9a4a12bdSRobert Mustacchi 
16*9a4a12bdSRobert Mustacchi /*
17*9a4a12bdSRobert Mustacchi  * C11 mbrtoc32(3C) support.
18*9a4a12bdSRobert Mustacchi  *
19*9a4a12bdSRobert Mustacchi  * The char32_t type is designed to represent UTF-32. Conveniently, the wchar_t
20*9a4a12bdSRobert Mustacchi  * is as well. In this case, we can just pass this directly to mbrtowc_l().
21*9a4a12bdSRobert Mustacchi  */
22*9a4a12bdSRobert Mustacchi 
23*9a4a12bdSRobert Mustacchi #include <locale.h>
24*9a4a12bdSRobert Mustacchi #include <wchar.h>
25*9a4a12bdSRobert Mustacchi #include <xlocale.h>
26*9a4a12bdSRobert Mustacchi #include <uchar.h>
27*9a4a12bdSRobert Mustacchi 
28*9a4a12bdSRobert Mustacchi static mbstate_t mbrtoc32_state;
29*9a4a12bdSRobert Mustacchi 
30*9a4a12bdSRobert Mustacchi size_t
31*9a4a12bdSRobert Mustacchi mbrtoc32(char32_t *restrict pc32, const char *restrict str, size_t len,
32*9a4a12bdSRobert Mustacchi     mbstate_t *restrict ps)
33*9a4a12bdSRobert Mustacchi {
34*9a4a12bdSRobert Mustacchi 	if (ps == NULL) {
35*9a4a12bdSRobert Mustacchi 		ps = &mbrtoc32_state;
36*9a4a12bdSRobert Mustacchi 	}
37*9a4a12bdSRobert Mustacchi 
38*9a4a12bdSRobert Mustacchi 	if (str == NULL) {
39*9a4a12bdSRobert Mustacchi 		pc32 = NULL;
40*9a4a12bdSRobert Mustacchi 		str = "";
41*9a4a12bdSRobert Mustacchi 		len = 1;
42*9a4a12bdSRobert Mustacchi 	}
43*9a4a12bdSRobert Mustacchi 
44*9a4a12bdSRobert Mustacchi 	return (mbrtowc_l((wchar_t *)pc32, str, len, ps,
45*9a4a12bdSRobert Mustacchi 	    uselocale((locale_t)0)));
46*9a4a12bdSRobert Mustacchi }
47