xref: /titanic_52/usr/src/man/man3c/mbrtoc16.3c (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.\" Copyright 2020 Robert Mustacchi
13*9a4a12bdSRobert Mustacchi.\"
14*9a4a12bdSRobert Mustacchi.Dd April 23, 2020
15*9a4a12bdSRobert Mustacchi.Dt MBRTOC16 3C
16*9a4a12bdSRobert Mustacchi.Os
17*9a4a12bdSRobert Mustacchi.Sh NAME
18*9a4a12bdSRobert Mustacchi.Nm mbrtoc16 ,
19*9a4a12bdSRobert Mustacchi.Nm mbrtoc32 ,
20*9a4a12bdSRobert Mustacchi.Nm mbrtowc ,
21*9a4a12bdSRobert Mustacchi.Nm mbrtowc_l
22*9a4a12bdSRobert Mustacchi.Nd convert characters to wide characters
23*9a4a12bdSRobert Mustacchi.Sh SYNOPSIS
24*9a4a12bdSRobert Mustacchi.In wchar.h
25*9a4a12bdSRobert Mustacchi.Ft size_t
26*9a4a12bdSRobert Mustacchi.Fo mbrtowc
27*9a4a12bdSRobert Mustacchi.Fa "wchar_t *restrict pwc"
28*9a4a12bdSRobert Mustacchi.Fa "const char *restrict str"
29*9a4a12bdSRobert Mustacchi.Fa "size_t len"
30*9a4a12bdSRobert Mustacchi.Fa "mstate_t *restrict ps"
31*9a4a12bdSRobert Mustacchi.Fc
32*9a4a12bdSRobert Mustacchi.In wchar.h
33*9a4a12bdSRobert Mustacchi.In xlocale.h
34*9a4a12bdSRobert Mustacchi.Ft size_t
35*9a4a12bdSRobert Mustacchi.Fo mbrtowc
36*9a4a12bdSRobert Mustacchi.Fa "wchar_t *restrict pwc"
37*9a4a12bdSRobert Mustacchi.Fa "const char *restrict str"
38*9a4a12bdSRobert Mustacchi.Fa "size_t len"
39*9a4a12bdSRobert Mustacchi.Fa "mstate_t *restrict ps"
40*9a4a12bdSRobert Mustacchi.Fa "locale_t loc"
41*9a4a12bdSRobert Mustacchi.Fc
42*9a4a12bdSRobert Mustacchi.In uchar.h
43*9a4a12bdSRobert Mustacchi.Ft size_t
44*9a4a12bdSRobert Mustacchi.Fo mbrtoc16
45*9a4a12bdSRobert Mustacchi.Fa "char16_t *restrict p16c"
46*9a4a12bdSRobert Mustacchi.Fa "const char *restrict str"
47*9a4a12bdSRobert Mustacchi.Fa "size_t len"
48*9a4a12bdSRobert Mustacchi.Fa "mbstate_t *restrict ps"
49*9a4a12bdSRobert Mustacchi.Fc
50*9a4a12bdSRobert Mustacchi.Ft size_t
51*9a4a12bdSRobert Mustacchi.Fo mbrtoc32
52*9a4a12bdSRobert Mustacchi.Fa "char32_t *restrict p32c"
53*9a4a12bdSRobert Mustacchi.Fa "const char *restrict str"
54*9a4a12bdSRobert Mustacchi.Fa "size_t len"
55*9a4a12bdSRobert Mustacchi.Fa "mbstate_t *restrict ps"
56*9a4a12bdSRobert Mustacchi.Fc
57*9a4a12bdSRobert Mustacchi.Sh DESCRIPTION
58*9a4a12bdSRobert MustacchiThe
59*9a4a12bdSRobert Mustacchi.Fn mbrtoc16 ,
60*9a4a12bdSRobert Mustacchi.Fn mbrtoc32 ,
61*9a4a12bdSRobert Mustacchi.Fn mbrtowc ,
62*9a4a12bdSRobert Mustacchiand
63*9a4a12bdSRobert Mustacchi.Fn mbrtowc_l
64*9a4a12bdSRobert Mustacchifunctions convert character sequences, which may contain multi-byte
65*9a4a12bdSRobert Mustacchicharacters, into different character formats.
66*9a4a12bdSRobert MustacchiThe functions work in the following formats:
67*9a4a12bdSRobert Mustacchi.Bl -tag -width mbrtowc_l
68*9a4a12bdSRobert Mustacchi.It Fn mbrtoc16
69*9a4a12bdSRobert MustacchiA UTF-16 code sequence, where every code point is represented by one or
70*9a4a12bdSRobert Mustacchitwo
71*9a4a12bdSRobert Mustacchi.Vt char16_t .
72*9a4a12bdSRobert MustacchiThe UTF-16 encoding will encode certain Unicode code points as a pair of
73*9a4a12bdSRobert Mustacchitwo 16-bit code sequences, commonly referred to as a surrogate pair.
74*9a4a12bdSRobert Mustacchi.It Fn mbrtoc32
75*9a4a12bdSRobert MustacchiA UTF-32 code sequence, where every code point is represented by a
76*9a4a12bdSRobert Mustacchisingle
77*9a4a12bdSRobert Mustacchi.Vt char32_t .
78*9a4a12bdSRobert Mustacchi.It Fn mbrtowc , Fn mbrtowc_l
79*9a4a12bdSRobert MustacchiWide characters, being a 32-bit value where every code point is
80*9a4a12bdSRobert Mustacchirepresented by a single
81*9a4a12bdSRobert Mustacchi.Vt wchar_t .
82*9a4a12bdSRobert MustacchiWhile the
83*9a4a12bdSRobert Mustacchi.Vt wchar_t
84*9a4a12bdSRobert Mustacchiand
85*9a4a12bdSRobert Mustacchi.Vt char32_t
86*9a4a12bdSRobert Mustacchiare different types, in this implementation, they are similar encodings.
87*9a4a12bdSRobert Mustacchi.El
88*9a4a12bdSRobert Mustacchi.Pp
89*9a4a12bdSRobert MustacchiThe functions consume up to
90*9a4a12bdSRobert Mustacchi.Fa len
91*9a4a12bdSRobert Mustacchicharacters from the string
92*9a4a12bdSRobert Mustacchi.Fa str
93*9a4a12bdSRobert Mustacchiand accumulate them in
94*9a4a12bdSRobert Mustacchi.Fa ps
95*9a4a12bdSRobert Mustacchiuntil a valid character is found, which is influenced by
96*9a4a12bdSRobert Mustacchithe
97*9a4a12bdSRobert Mustacchi.Dv LC_CTYPE
98*9a4a12bdSRobert Mustacchicategory of the current locale.
99*9a4a12bdSRobert MustacchiFor example, in the
100*9a4a12bdSRobert Mustacchi.Sy C
101*9a4a12bdSRobert Mustacchilocale, only ASCII characters are recognized, while in a
102*9a4a12bdSRobert Mustacchi.Sy UTF-8
103*9a4a12bdSRobert Mustacchibased locale like
104*9a4a12bdSRobert Mustacchi.Sy en_US.UTF-8 ,
105*9a4a12bdSRobert MustacchiUTF-8 multi-byte character sequences that represent Unicode code points
106*9a4a12bdSRobert Mustacchiare recognized.
107*9a4a12bdSRobert MustacchiThe
108*9a4a12bdSRobert Mustacchi.Fn mbrtowc_l
109*9a4a12bdSRobert Mustacchifunction uses the locale passed in
110*9a4a12bdSRobert Mustacchi.Fa loc
111*9a4a12bdSRobert Mustacchirather than the locale of the current thread.
112*9a4a12bdSRobert Mustacchi.Pp
113*9a4a12bdSRobert MustacchiWhen a valid character sequence has been found, it is converted to
114*9a4a12bdSRobert Mustacchieither a 16-bit character sequence for
115*9a4a12bdSRobert Mustacchi.Fn mbrtoc16
116*9a4a12bdSRobert Mustacchior a 32-bit character sequence for
117*9a4a12bdSRobert Mustacchi.Fn mbrtoc32
118*9a4a12bdSRobert Mustacchiand will be stored in
119*9a4a12bdSRobert Mustacchi.Fa p16c
120*9a4a12bdSRobert Mustacchiand
121*9a4a12bdSRobert Mustacchi.Fa p32c
122*9a4a12bdSRobert Mustacchirespectively.
123*9a4a12bdSRobert Mustacchi.Pp
124*9a4a12bdSRobert MustacchiThe
125*9a4a12bdSRobert Mustacchi.Fa ps
126*9a4a12bdSRobert Mustacchiargument represents a multi-byte conversion state which can be used
127*9a4a12bdSRobert Mustacchiacross multiple calls to a given function
128*9a4a12bdSRobert Mustacchi.Pq but not mixed between functions .
129*9a4a12bdSRobert MustacchiThese allow for characters to be consumed from subsequent buffers, e.g.
130*9a4a12bdSRobert Mustacchidifferent values of
131*9a4a12bdSRobert Mustacchi.Fa str .
132*9a4a12bdSRobert MustacchiThe functions may be called from multiple threads as long as they use
133*9a4a12bdSRobert Mustacchiunique values for
134*9a4a12bdSRobert Mustacchi.Fa ps .
135*9a4a12bdSRobert MustacchiIf
136*9a4a12bdSRobert Mustacchi.Fa ps
137*9a4a12bdSRobert Mustacchiis
138*9a4a12bdSRobert Mustacchi.Dv NULL ,
139*9a4a12bdSRobert Mustacchithen a function-specific buffer will be used for the conversion state;
140*9a4a12bdSRobert Mustacchihowever, this is stored between all threads and its use is not
141*9a4a12bdSRobert Mustacchirecommended.
142*9a4a12bdSRobert Mustacchi.Pp
143*9a4a12bdSRobert MustacchiWhen using these functions, more than one character may be output for a
144*9a4a12bdSRobert Mustacchigiven set of consumed input characters.
145*9a4a12bdSRobert MustacchiAn example of this is when a given code point is represented as a set of
146*9a4a12bdSRobert Mustacchisurrogate pairs in UTF-16, which require two 16-bit characters to
147*9a4a12bdSRobert Mustacchirepresent a code point.
148*9a4a12bdSRobert MustacchiWhen this occurs, the functions return the special return value
149*9a4a12bdSRobert Mustacchi.Sy -3 .
150*9a4a12bdSRobert Mustacchi.Pp
151*9a4a12bdSRobert MustacchiThe functions all have a special behavior when
152*9a4a12bdSRobert Mustacchi.Dv NULL
153*9a4a12bdSRobert Mustacchiis passed for
154*9a4a12bdSRobert Mustacchi.Fa str .
155*9a4a12bdSRobert MustacchiThey instead will treat it as though
156*9a4a12bdSRobert Mustacchi.Fa pwc ,
157*9a4a12bdSRobert Mustacchi.Fa p16c ,
158*9a4a12bdSRobert Mustacchior
159*9a4a12bdSRobert Mustacchi.Fa p32c
160*9a4a12bdSRobert Mustacchiwere
161*9a4a12bdSRobert Mustacchi.Dv NULL ,
162*9a4a12bdSRobert Mustacchi.Fa str
163*9a4a12bdSRobert Mustacchihad been passed as the empty string, "" and the length,
164*9a4a12bdSRobert Mustacchi.Fa len ,
165*9a4a12bdSRobert Mustacchiwould appear as the value 1.
166*9a4a12bdSRobert MustacchiIn other words, the functions would be called as:
167*9a4a12bdSRobert Mustacchi.Bd -literal -offset indent
168*9a4a12bdSRobert Mustacchimbrtowc(NULL, "", 1, ps)
169*9a4a12bdSRobert Mustacchimbrtowc_l(NULL, "", 1, ps)
170*9a4a12bdSRobert Mustacchimbrtoc16(NULL, "", 1, ps)
171*9a4a12bdSRobert Mustacchimbrtoc32(NULL, "", 1, ps)
172*9a4a12bdSRobert Mustacchi.Ed
173*9a4a12bdSRobert Mustacchi.Ss Locale Details
174*9a4a12bdSRobert MustacchiNot all locales in the system are Unicode based locales.
175*9a4a12bdSRobert MustacchiFor example, ISO 8859 family locales have code points with values that
176*9a4a12bdSRobert Mustacchido not match their counterparts in Unicode.
177*9a4a12bdSRobert MustacchiWhen using these functions with non-Unicode based locales, the code
178*9a4a12bdSRobert Mustacchipoints returned will be those determined by the locale.
179*9a4a12bdSRobert MustacchiThey will not be converted to the corresponding Unicode code point.
180*9a4a12bdSRobert MustacchiFor example, if using the Euro sign in ISO 8859-15, these functions
181*9a4a12bdSRobert Mustacchimight return the code point 0xa4 and not the Unicode value 0x20ac.
182*9a4a12bdSRobert Mustacchi.Pp
183*9a4a12bdSRobert MustacchiRegardless of the locale, the characters returned will be encoded as
184*9a4a12bdSRobert Mustacchithough the code point were the corresponding value in Unicode.
185*9a4a12bdSRobert MustacchiThis means that if a locale returns a value that would be a surrogate
186*9a4a12bdSRobert Mustacchipair in the UTF-16 encoding, it will still be encoded as a UTF-16
187*9a4a12bdSRobert Mustacchicharacter.
188*9a4a12bdSRobert Mustacchi.Pp
189*9a4a12bdSRobert MustacchiThis behavior of the
190*9a4a12bdSRobert Mustacchi.Fn mbrtoc16
191*9a4a12bdSRobert Mustacchiand
192*9a4a12bdSRobert Mustacchi.Fn mbrtoc32
193*9a4a12bdSRobert Mustacchifunctions should not be relied upon, is not portable, and subject to
194*9a4a12bdSRobert Mustacchichange for non-Unicode locales.
195*9a4a12bdSRobert Mustacchi.Sh RETURN VALUES
196*9a4a12bdSRobert MustacchiThe
197*9a4a12bdSRobert Mustacchi.Fn mbrtoc16 ,
198*9a4a12bdSRobert Mustacchi.Fn mbrtoc32 ,
199*9a4a12bdSRobert Mustacchi.Fn mbrtowc ,
200*9a4a12bdSRobert Mustacchiand
201*9a4a12bdSRobert Mustacchi.Fn mbrtowc_l
202*9a4a12bdSRobert Mustacchifunctions return the following values:
203*9a4a12bdSRobert Mustacchi.Bl -tag -width (size_t)-3
204*9a4a12bdSRobert Mustacchi.It Sy 0
205*9a4a12bdSRobert Mustacchi.Fa len
206*9a4a12bdSRobert Mustacchior fewer bytes of
207*9a4a12bdSRobert Mustacchi.Fa str
208*9a4a12bdSRobert Mustacchiwere consumed and the null wide character was written into the wide
209*9a4a12bdSRobert Mustacchicharacter buffer
210*9a4a12bdSRobert Mustacchi.Po
211*9a4a12bdSRobert Mustacchi.Fa pwc ,
212*9a4a12bdSRobert Mustacchi.Fa p16c ,
213*9a4a12bdSRobert Mustacchi.Fa p32c
214*9a4a12bdSRobert Mustacchi.Pc .
215*9a4a12bdSRobert Mustacchi.It Sy between 1 and len
216*9a4a12bdSRobert MustacchiThe specified number of bytes were consumed and a single character was
217*9a4a12bdSRobert Mustacchiwritten into the wide character buffer
218*9a4a12bdSRobert Mustacchi.Po
219*9a4a12bdSRobert Mustacchi.Fa pwc ,
220*9a4a12bdSRobert Mustacchi.Fa p16c ,
221*9a4a12bdSRobert Mustacchi.Fa p32c
222*9a4a12bdSRobert Mustacchi.Pc .
223*9a4a12bdSRobert Mustacchi.It Sy (size_t)-1
224*9a4a12bdSRobert MustacchiAn encoding error has occurred.
225*9a4a12bdSRobert MustacchiThe next
226*9a4a12bdSRobert Mustacchi.Fa len
227*9a4a12bdSRobert Mustacchibytes of
228*9a4a12bdSRobert Mustacchi.Fa str
229*9a4a12bdSRobert Mustacchido not contribute to a valid character.
230*9a4a12bdSRobert Mustacchi.Va errno
231*9a4a12bdSRobert Mustacchihas been set to
232*9a4a12bdSRobert Mustacchi.Er EILSEQ .
233*9a4a12bdSRobert MustacchiNo data was written into the wide character buffer
234*9a4a12bdSRobert Mustacchi.Po
235*9a4a12bdSRobert Mustacchi.Fa pwc ,
236*9a4a12bdSRobert Mustacchi.Fa p16c ,
237*9a4a12bdSRobert Mustacchi.Fa p32c
238*9a4a12bdSRobert Mustacchi.Pc .
239*9a4a12bdSRobert Mustacchi.It Sy (size_t)-2
240*9a4a12bdSRobert Mustacchi.Fa len
241*9a4a12bdSRobert Mustacchibytes of
242*9a4a12bdSRobert Mustacchi.Fa str
243*9a4a12bdSRobert Mustacchiwere consumed, but a complete multi-byte character sequence has not been
244*9a4a12bdSRobert Mustacchifound and no data was written into the wide character buffer
245*9a4a12bdSRobert Mustacchi.Po
246*9a4a12bdSRobert Mustacchi.Fa pwc ,
247*9a4a12bdSRobert Mustacchi.Fa p16c ,
248*9a4a12bdSRobert Mustacchi.Fa p32c
249*9a4a12bdSRobert Mustacchi.Pc .
250*9a4a12bdSRobert Mustacchi.It Sy (size_t)-3
251*9a4a12bdSRobert MustacchiA character has been written into the wide character buffer
252*9a4a12bdSRobert Mustacchi.Po
253*9a4a12bdSRobert Mustacchi.Fa pwc ,
254*9a4a12bdSRobert Mustacchi.Fa p16c ,
255*9a4a12bdSRobert Mustacchi.Fa p32c
256*9a4a12bdSRobert Mustacchi.Pc .
257*9a4a12bdSRobert MustacchiThis character was from a previous call (such as another part of a
258*9a4a12bdSRobert MustacchiUTF-16 surrogate pair) and no input was consumed.
259*9a4a12bdSRobert MustacchiThis is limited to the
260*9a4a12bdSRobert Mustacchi.Fn mbrtoc16
261*9a4a12bdSRobert Mustacchiand
262*9a4a12bdSRobert Mustacchi.Fn mbrtoc32
263*9a4a12bdSRobert Mustacchifunctions.
264*9a4a12bdSRobert Mustacchi.El
265*9a4a12bdSRobert Mustacchi.Sh EXAMPLES
266*9a4a12bdSRobert Mustacchi.Sy Example 1
267*9a4a12bdSRobert MustacchiUsing the
268*9a4a12bdSRobert Mustacchi.Fn mbrtoc32
269*9a4a12bdSRobert Mustacchifunction to convert a multibyte string.
270*9a4a12bdSRobert Mustacchi.Bd -literal
271*9a4a12bdSRobert Mustacchi#include <locale.h>
272*9a4a12bdSRobert Mustacchi#include <stdlib.h>
273*9a4a12bdSRobert Mustacchi#include <string.h>
274*9a4a12bdSRobert Mustacchi#include <err.h>
275*9a4a12bdSRobert Mustacchi#include <stdio.h>
276*9a4a12bdSRobert Mustacchi#include <uchar.h>
277*9a4a12bdSRobert Mustacchi
278*9a4a12bdSRobert Mustacchiint
279*9a4a12bdSRobert Mustacchimain(void)
280*9a4a12bdSRobert Mustacchi{
281*9a4a12bdSRobert Mustacchi	mbstate_t mbs;
282*9a4a12bdSRobert Mustacchi	char32_t out;
283*9a4a12bdSRobert Mustacchi	size_t ret;
284*9a4a12bdSRobert Mustacchi	const char *uchar_str = "\exe5\ex85\ex89";
285*9a4a12bdSRobert Mustacchi
286*9a4a12bdSRobert Mustacchi	(void) memset(&mbs, 0, sizeof (mbs));
287*9a4a12bdSRobert Mustacchi	(void) setlocale(LC_CTYPE, "en_US.UTF-8");
288*9a4a12bdSRobert Mustacchi	ret = mbrtoc32(&out, uchar_str, strlen(uchar_str), &mbs);
289*9a4a12bdSRobert Mustacchi	if (ret != strlen(uchar_str)) {
290*9a4a12bdSRobert Mustacchi		errx(EXIT_FAILURE, "failed to convert string, got %zd",
291*9a4a12bdSRobert Mustacchi		    ret);
292*9a4a12bdSRobert Mustacchi	}
293*9a4a12bdSRobert Mustacchi
294*9a4a12bdSRobert Mustacchi	(void) printf("Converted %zu bytes into UTF-32 character "
295*9a4a12bdSRobert Mustacchi	    "0x%x\n", ret, out);
296*9a4a12bdSRobert Mustacchi	return (0);
297*9a4a12bdSRobert Mustacchi}
298*9a4a12bdSRobert Mustacchi.Ed
299*9a4a12bdSRobert Mustacchi.Pp
300*9a4a12bdSRobert MustacchiWhen compiled and run, this produces:
301*9a4a12bdSRobert Mustacchi.Bd -literal -offset indent
302*9a4a12bdSRobert Mustacchi$ ./a.out
303*9a4a12bdSRobert MustacchiConverted 3 bytes into UTF-32 character 0x5149
304*9a4a12bdSRobert Mustacchi.Ed
305*9a4a12bdSRobert Mustacchi.Pp
306*9a4a12bdSRobert Mustacchi.Sy Example 2
307*9a4a12bdSRobert MustacchiHandling surrogate pairs from the
308*9a4a12bdSRobert Mustacchi.Fn mbrtoc16
309*9a4a12bdSRobert Mustacchifunction.
310*9a4a12bdSRobert Mustacchi.Bd -literal
311*9a4a12bdSRobert Mustacchi#include <locale.h>
312*9a4a12bdSRobert Mustacchi#include <stdlib.h>
313*9a4a12bdSRobert Mustacchi#include <string.h>
314*9a4a12bdSRobert Mustacchi#include <err.h>
315*9a4a12bdSRobert Mustacchi#include <stdio.h>
316*9a4a12bdSRobert Mustacchi#include <uchar.h>
317*9a4a12bdSRobert Mustacchi
318*9a4a12bdSRobert Mustacchiint
319*9a4a12bdSRobert Mustacchimain(void)
320*9a4a12bdSRobert Mustacchi{
321*9a4a12bdSRobert Mustacchi        mbstate_t mbs;
322*9a4a12bdSRobert Mustacchi        char16_t first, second;
323*9a4a12bdSRobert Mustacchi        size_t ret;
324*9a4a12bdSRobert Mustacchi        const char *uchar_str = "\exf0\ex9f\ex92\exa9";
325*9a4a12bdSRobert Mustacchi
326*9a4a12bdSRobert Mustacchi        (void) memset(&mbs, '\0', sizeof (mbs));
327*9a4a12bdSRobert Mustacchi        (void) setlocale(LC_CTYPE, "en_US.UTF-8");
328*9a4a12bdSRobert Mustacchi        ret = mbrtoc16(&first, uchar_str, strlen(uchar_str), &mbs);
329*9a4a12bdSRobert Mustacchi        if (ret != strlen(uchar_str)) {
330*9a4a12bdSRobert Mustacchi                errx(EXIT_FAILURE, "failed to convert string, got %zd",
331*9a4a12bdSRobert Mustacchi                    ret);
332*9a4a12bdSRobert Mustacchi        }
333*9a4a12bdSRobert Mustacchi
334*9a4a12bdSRobert Mustacchi        ret = mbrtoc16(&second, "", 0, &mbs);
335*9a4a12bdSRobert Mustacchi        if (ret != (size_t)-3) {
336*9a4a12bdSRobert Mustacchi                errx(EXIT_FAILURE, "didn't get second surrogate pair, "
337*9a4a12bdSRobert Mustacchi                    "got %zd", ret);
338*9a4a12bdSRobert Mustacchi        }
339*9a4a12bdSRobert Mustacchi
340*9a4a12bdSRobert Mustacchi        (void) printf("UTF-16 surrogates: 0x%x 0x%x\n", first, second);
341*9a4a12bdSRobert Mustacchi        return (0);
342*9a4a12bdSRobert Mustacchi}
343*9a4a12bdSRobert Mustacchi.Ed
344*9a4a12bdSRobert Mustacchi.Pp
345*9a4a12bdSRobert MustacchiWhen compiled and run, this produces:
346*9a4a12bdSRobert Mustacchi.Bd -literal -offset indent
347*9a4a12bdSRobert Mustacchi$ ./a.out
348*9a4a12bdSRobert MustacchiUTF-16 surrogates: 0xd83d 0xdca9
349*9a4a12bdSRobert Mustacchi.Ed
350*9a4a12bdSRobert Mustacchi.Sh ERRORS
351*9a4a12bdSRobert MustacchiThe
352*9a4a12bdSRobert Mustacchi.Fn mbrtoc16 ,
353*9a4a12bdSRobert Mustacchi.Fn mbrtoc32 ,
354*9a4a12bdSRobert Mustacchi.Fn mbrtowc ,
355*9a4a12bdSRobert Mustacchiand
356*9a4a12bdSRobert Mustacchi.Fn mbrtowc_l
357*9a4a12bdSRobert Mustacchifunctions will fail if:
358*9a4a12bdSRobert Mustacchi.Bl -tag -width Er
359*9a4a12bdSRobert Mustacchi.It Er EINVAL
360*9a4a12bdSRobert MustacchiThe conversion state in
361*9a4a12bdSRobert Mustacchi.Fa ps
362*9a4a12bdSRobert Mustacchiis invalid.
363*9a4a12bdSRobert Mustacchi.It Er EILSEQ
364*9a4a12bdSRobert MustacchiAn invalid character sequence has been detected.
365*9a4a12bdSRobert Mustacchi.El
366*9a4a12bdSRobert Mustacchi.Sh MT-LEVEL
367*9a4a12bdSRobert MustacchiThe
368*9a4a12bdSRobert Mustacchi.Fn mbrtoc16 ,
369*9a4a12bdSRobert Mustacchi.Fn mbrtoc32 ,
370*9a4a12bdSRobert Mustacchi.Fn mbrtowc ,
371*9a4a12bdSRobert Mustacchiand
372*9a4a12bdSRobert Mustacchi.Fn mbrtowc_l
373*9a4a12bdSRobert Mustacchifunctions are
374*9a4a12bdSRobert Mustacchi.Sy MT-Safe
375*9a4a12bdSRobert Mustacchias long as different
376*9a4a12bdSRobert Mustacchi.Vt mbstate_t
377*9a4a12bdSRobert Mustacchistructures are passed in
378*9a4a12bdSRobert Mustacchi.Fa ps .
379*9a4a12bdSRobert MustacchiIf
380*9a4a12bdSRobert Mustacchi.Fa ps
381*9a4a12bdSRobert Mustacchiis
382*9a4a12bdSRobert Mustacchi.Dv NULL
383*9a4a12bdSRobert Mustacchior different threads use the same value for
384*9a4a12bdSRobert Mustacchi.Fa ps ,
385*9a4a12bdSRobert Mustacchithen the functions are
386*9a4a12bdSRobert Mustacchi.Sy Unsafe .
387*9a4a12bdSRobert Mustacchi.Sh INTERFACE STABILITY
388*9a4a12bdSRobert Mustacchi.Sy Committed
389*9a4a12bdSRobert Mustacchi.Sh SEE ALSO
390*9a4a12bdSRobert Mustacchi.Xr c16rtomb 3C ,
391*9a4a12bdSRobert Mustacchi.Xr c32rtomb 3C ,
392*9a4a12bdSRobert Mustacchi.Xr newlocale 3C ,
393*9a4a12bdSRobert Mustacchi.Xr setlocale 3C ,
394*9a4a12bdSRobert Mustacchi.Xr uselocale 3C ,
395*9a4a12bdSRobert Mustacchi.Xr wcrtomb 3C ,
396*9a4a12bdSRobert Mustacchi.Xr uchar.h 3HEAD ,
397*9a4a12bdSRobert Mustacchi.Xr environ 5
398