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