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