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