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