19a4a12bdSRobert Mustacchi.\"
29a4a12bdSRobert Mustacchi.\" This file and its contents are supplied under the terms of the
39a4a12bdSRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0.
49a4a12bdSRobert Mustacchi.\" You may only use this file in accordance with the terms of version
59a4a12bdSRobert Mustacchi.\" 1.0 of the CDDL.
69a4a12bdSRobert Mustacchi.\"
79a4a12bdSRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this
89a4a12bdSRobert Mustacchi.\" source.  A copy of the CDDL is also available via the Internet at
99a4a12bdSRobert Mustacchi.\" http://www.illumos.org/license/CDDL.
109a4a12bdSRobert Mustacchi.\"
119a4a12bdSRobert Mustacchi.\"
129a4a12bdSRobert Mustacchi.\" Copyright 2020 Robert Mustacchi
139a4a12bdSRobert Mustacchi.\"
149a4a12bdSRobert Mustacchi.Dd April 23, 2020
159a4a12bdSRobert Mustacchi.Dt MBRTOC16 3C
169a4a12bdSRobert Mustacchi.Os
179a4a12bdSRobert Mustacchi.Sh NAME
189a4a12bdSRobert Mustacchi.Nm mbrtoc16 ,
199a4a12bdSRobert Mustacchi.Nm mbrtoc32 ,
209a4a12bdSRobert Mustacchi.Nm mbrtowc ,
219a4a12bdSRobert Mustacchi.Nm mbrtowc_l
229a4a12bdSRobert Mustacchi.Nd convert characters to wide characters
239a4a12bdSRobert Mustacchi.Sh SYNOPSIS
249a4a12bdSRobert Mustacchi.In wchar.h
259a4a12bdSRobert Mustacchi.Ft size_t
269a4a12bdSRobert Mustacchi.Fo mbrtowc
279a4a12bdSRobert Mustacchi.Fa "wchar_t *restrict pwc"
289a4a12bdSRobert Mustacchi.Fa "const char *restrict str"
299a4a12bdSRobert Mustacchi.Fa "size_t len"
309a4a12bdSRobert Mustacchi.Fa "mstate_t *restrict ps"
319a4a12bdSRobert Mustacchi.Fc
329a4a12bdSRobert Mustacchi.In wchar.h
339a4a12bdSRobert Mustacchi.In xlocale.h
349a4a12bdSRobert Mustacchi.Ft size_t
359a4a12bdSRobert Mustacchi.Fo mbrtowc
369a4a12bdSRobert Mustacchi.Fa "wchar_t *restrict pwc"
379a4a12bdSRobert Mustacchi.Fa "const char *restrict str"
389a4a12bdSRobert Mustacchi.Fa "size_t len"
399a4a12bdSRobert Mustacchi.Fa "mstate_t *restrict ps"
409a4a12bdSRobert Mustacchi.Fa "locale_t loc"
419a4a12bdSRobert Mustacchi.Fc
429a4a12bdSRobert Mustacchi.In uchar.h
439a4a12bdSRobert Mustacchi.Ft size_t
449a4a12bdSRobert Mustacchi.Fo mbrtoc16
459a4a12bdSRobert Mustacchi.Fa "char16_t *restrict p16c"
469a4a12bdSRobert Mustacchi.Fa "const char *restrict str"
479a4a12bdSRobert Mustacchi.Fa "size_t len"
489a4a12bdSRobert Mustacchi.Fa "mbstate_t *restrict ps"
499a4a12bdSRobert Mustacchi.Fc
509a4a12bdSRobert Mustacchi.Ft size_t
519a4a12bdSRobert Mustacchi.Fo mbrtoc32
529a4a12bdSRobert Mustacchi.Fa "char32_t *restrict p32c"
539a4a12bdSRobert Mustacchi.Fa "const char *restrict str"
549a4a12bdSRobert Mustacchi.Fa "size_t len"
559a4a12bdSRobert Mustacchi.Fa "mbstate_t *restrict ps"
569a4a12bdSRobert Mustacchi.Fc
579a4a12bdSRobert Mustacchi.Sh DESCRIPTION
589a4a12bdSRobert MustacchiThe
599a4a12bdSRobert Mustacchi.Fn mbrtoc16 ,
609a4a12bdSRobert Mustacchi.Fn mbrtoc32 ,
619a4a12bdSRobert Mustacchi.Fn mbrtowc ,
629a4a12bdSRobert Mustacchiand
639a4a12bdSRobert Mustacchi.Fn mbrtowc_l
649a4a12bdSRobert Mustacchifunctions convert character sequences, which may contain multi-byte
659a4a12bdSRobert Mustacchicharacters, into different character formats.
669a4a12bdSRobert MustacchiThe functions work in the following formats:
679a4a12bdSRobert Mustacchi.Bl -tag -width mbrtowc_l
689a4a12bdSRobert Mustacchi.It Fn mbrtoc16
699a4a12bdSRobert MustacchiA UTF-16 code sequence, where every code point is represented by one or
709a4a12bdSRobert Mustacchitwo
719a4a12bdSRobert Mustacchi.Vt char16_t .
729a4a12bdSRobert MustacchiThe UTF-16 encoding will encode certain Unicode code points as a pair of
739a4a12bdSRobert Mustacchitwo 16-bit code sequences, commonly referred to as a surrogate pair.
749a4a12bdSRobert Mustacchi.It Fn mbrtoc32
759a4a12bdSRobert MustacchiA UTF-32 code sequence, where every code point is represented by a
769a4a12bdSRobert Mustacchisingle
779a4a12bdSRobert Mustacchi.Vt char32_t .
789a4a12bdSRobert Mustacchi.It Fn mbrtowc , Fn mbrtowc_l
799a4a12bdSRobert MustacchiWide characters, being a 32-bit value where every code point is
809a4a12bdSRobert Mustacchirepresented by a single
819a4a12bdSRobert Mustacchi.Vt wchar_t .
829a4a12bdSRobert MustacchiWhile the
839a4a12bdSRobert Mustacchi.Vt wchar_t
849a4a12bdSRobert Mustacchiand
859a4a12bdSRobert Mustacchi.Vt char32_t
869a4a12bdSRobert Mustacchiare different types, in this implementation, they are similar encodings.
879a4a12bdSRobert Mustacchi.El
889a4a12bdSRobert Mustacchi.Pp
899a4a12bdSRobert MustacchiThe functions consume up to
909a4a12bdSRobert Mustacchi.Fa len
919a4a12bdSRobert Mustacchicharacters from the string
929a4a12bdSRobert Mustacchi.Fa str
939a4a12bdSRobert Mustacchiand accumulate them in
949a4a12bdSRobert Mustacchi.Fa ps
959a4a12bdSRobert Mustacchiuntil a valid character is found, which is influenced by
969a4a12bdSRobert Mustacchithe
979a4a12bdSRobert Mustacchi.Dv LC_CTYPE
989a4a12bdSRobert Mustacchicategory of the current locale.
999a4a12bdSRobert MustacchiFor example, in the
1009a4a12bdSRobert Mustacchi.Sy C
1019a4a12bdSRobert Mustacchilocale, only ASCII characters are recognized, while in a
1029a4a12bdSRobert Mustacchi.Sy UTF-8
1039a4a12bdSRobert Mustacchibased locale like
1049a4a12bdSRobert Mustacchi.Sy en_US.UTF-8 ,
1059a4a12bdSRobert MustacchiUTF-8 multi-byte character sequences that represent Unicode code points
1069a4a12bdSRobert Mustacchiare recognized.
1079a4a12bdSRobert MustacchiThe
1089a4a12bdSRobert Mustacchi.Fn mbrtowc_l
1099a4a12bdSRobert Mustacchifunction uses the locale passed in
1109a4a12bdSRobert Mustacchi.Fa loc
1119a4a12bdSRobert Mustacchirather than the locale of the current thread.
1129a4a12bdSRobert Mustacchi.Pp
1139a4a12bdSRobert MustacchiWhen a valid character sequence has been found, it is converted to
1149a4a12bdSRobert Mustacchieither a 16-bit character sequence for
1159a4a12bdSRobert Mustacchi.Fn mbrtoc16
1169a4a12bdSRobert Mustacchior a 32-bit character sequence for
1179a4a12bdSRobert Mustacchi.Fn mbrtoc32
1189a4a12bdSRobert Mustacchiand will be stored in
1199a4a12bdSRobert Mustacchi.Fa p16c
1209a4a12bdSRobert Mustacchiand
1219a4a12bdSRobert Mustacchi.Fa p32c
1229a4a12bdSRobert Mustacchirespectively.
1239a4a12bdSRobert Mustacchi.Pp
1249a4a12bdSRobert MustacchiThe
1259a4a12bdSRobert Mustacchi.Fa ps
1269a4a12bdSRobert Mustacchiargument represents a multi-byte conversion state which can be used
1279a4a12bdSRobert Mustacchiacross multiple calls to a given function
1289a4a12bdSRobert Mustacchi.Pq but not mixed between functions .
1299a4a12bdSRobert MustacchiThese allow for characters to be consumed from subsequent buffers, e.g.
1309a4a12bdSRobert Mustacchidifferent values of
1319a4a12bdSRobert Mustacchi.Fa str .
1329a4a12bdSRobert MustacchiThe functions may be called from multiple threads as long as they use
1339a4a12bdSRobert Mustacchiunique values for
1349a4a12bdSRobert Mustacchi.Fa ps .
1359a4a12bdSRobert MustacchiIf
1369a4a12bdSRobert Mustacchi.Fa ps
1379a4a12bdSRobert Mustacchiis
1389a4a12bdSRobert Mustacchi.Dv NULL ,
1399a4a12bdSRobert Mustacchithen a function-specific buffer will be used for the conversion state;
1409a4a12bdSRobert Mustacchihowever, this is stored between all threads and its use is not
1419a4a12bdSRobert Mustacchirecommended.
1429a4a12bdSRobert Mustacchi.Pp
1439a4a12bdSRobert MustacchiWhen using these functions, more than one character may be output for a
1449a4a12bdSRobert Mustacchigiven set of consumed input characters.
1459a4a12bdSRobert MustacchiAn example of this is when a given code point is represented as a set of
1469a4a12bdSRobert Mustacchisurrogate pairs in UTF-16, which require two 16-bit characters to
1479a4a12bdSRobert Mustacchirepresent a code point.
1489a4a12bdSRobert MustacchiWhen this occurs, the functions return the special return value
1499a4a12bdSRobert Mustacchi.Sy -3 .
1509a4a12bdSRobert Mustacchi.Pp
1519a4a12bdSRobert MustacchiThe functions all have a special behavior when
1529a4a12bdSRobert Mustacchi.Dv NULL
1539a4a12bdSRobert Mustacchiis passed for
1549a4a12bdSRobert Mustacchi.Fa str .
1559a4a12bdSRobert MustacchiThey instead will treat it as though
1569a4a12bdSRobert Mustacchi.Fa pwc ,
1579a4a12bdSRobert Mustacchi.Fa p16c ,
1589a4a12bdSRobert Mustacchior
1599a4a12bdSRobert Mustacchi.Fa p32c
1609a4a12bdSRobert Mustacchiwere
1619a4a12bdSRobert Mustacchi.Dv NULL ,
1629a4a12bdSRobert Mustacchi.Fa str
1639a4a12bdSRobert Mustacchihad been passed as the empty string, "" and the length,
1649a4a12bdSRobert Mustacchi.Fa len ,
1659a4a12bdSRobert Mustacchiwould appear as the value 1.
1669a4a12bdSRobert MustacchiIn other words, the functions would be called as:
1679a4a12bdSRobert Mustacchi.Bd -literal -offset indent
1689a4a12bdSRobert Mustacchimbrtowc(NULL, "", 1, ps)
1699a4a12bdSRobert Mustacchimbrtowc_l(NULL, "", 1, ps)
1709a4a12bdSRobert Mustacchimbrtoc16(NULL, "", 1, ps)
1719a4a12bdSRobert Mustacchimbrtoc32(NULL, "", 1, ps)
1729a4a12bdSRobert Mustacchi.Ed
1739a4a12bdSRobert Mustacchi.Ss Locale Details
1749a4a12bdSRobert MustacchiNot all locales in the system are Unicode based locales.
1759a4a12bdSRobert MustacchiFor example, ISO 8859 family locales have code points with values that
1769a4a12bdSRobert Mustacchido not match their counterparts in Unicode.
1779a4a12bdSRobert MustacchiWhen using these functions with non-Unicode based locales, the code
1789a4a12bdSRobert Mustacchipoints returned will be those determined by the locale.
1799a4a12bdSRobert MustacchiThey will not be converted to the corresponding Unicode code point.
1809a4a12bdSRobert MustacchiFor example, if using the Euro sign in ISO 8859-15, these functions
1819a4a12bdSRobert Mustacchimight return the code point 0xa4 and not the Unicode value 0x20ac.
1829a4a12bdSRobert Mustacchi.Pp
1839a4a12bdSRobert MustacchiRegardless of the locale, the characters returned will be encoded as
1849a4a12bdSRobert Mustacchithough the code point were the corresponding value in Unicode.
1859a4a12bdSRobert MustacchiThis means that if a locale returns a value that would be a surrogate
1869a4a12bdSRobert Mustacchipair in the UTF-16 encoding, it will still be encoded as a UTF-16
1879a4a12bdSRobert Mustacchicharacter.
1889a4a12bdSRobert Mustacchi.Pp
1899a4a12bdSRobert MustacchiThis behavior of the
1909a4a12bdSRobert Mustacchi.Fn mbrtoc16
1919a4a12bdSRobert Mustacchiand
1929a4a12bdSRobert Mustacchi.Fn mbrtoc32
1939a4a12bdSRobert Mustacchifunctions should not be relied upon, is not portable, and subject to
1949a4a12bdSRobert Mustacchichange for non-Unicode locales.
1959a4a12bdSRobert Mustacchi.Sh RETURN VALUES
1969a4a12bdSRobert MustacchiThe
1979a4a12bdSRobert Mustacchi.Fn mbrtoc16 ,
1989a4a12bdSRobert Mustacchi.Fn mbrtoc32 ,
1999a4a12bdSRobert Mustacchi.Fn mbrtowc ,
2009a4a12bdSRobert Mustacchiand
2019a4a12bdSRobert Mustacchi.Fn mbrtowc_l
2029a4a12bdSRobert Mustacchifunctions return the following values:
2039a4a12bdSRobert Mustacchi.Bl -tag -width (size_t)-3
2049a4a12bdSRobert Mustacchi.It Sy 0
2059a4a12bdSRobert Mustacchi.Fa len
2069a4a12bdSRobert Mustacchior fewer bytes of
2079a4a12bdSRobert Mustacchi.Fa str
2089a4a12bdSRobert Mustacchiwere consumed and the null wide character was written into the wide
2099a4a12bdSRobert Mustacchicharacter buffer
2109a4a12bdSRobert Mustacchi.Po
2119a4a12bdSRobert Mustacchi.Fa pwc ,
2129a4a12bdSRobert Mustacchi.Fa p16c ,
2139a4a12bdSRobert Mustacchi.Fa p32c
2149a4a12bdSRobert Mustacchi.Pc .
2159a4a12bdSRobert Mustacchi.It Sy between 1 and len
2169a4a12bdSRobert MustacchiThe specified number of bytes were consumed and a single character was
2179a4a12bdSRobert Mustacchiwritten into the wide character buffer
2189a4a12bdSRobert Mustacchi.Po
2199a4a12bdSRobert Mustacchi.Fa pwc ,
2209a4a12bdSRobert Mustacchi.Fa p16c ,
2219a4a12bdSRobert Mustacchi.Fa p32c
2229a4a12bdSRobert Mustacchi.Pc .
2239a4a12bdSRobert Mustacchi.It Sy (size_t)-1
2249a4a12bdSRobert MustacchiAn encoding error has occurred.
2259a4a12bdSRobert MustacchiThe next
2269a4a12bdSRobert Mustacchi.Fa len
2279a4a12bdSRobert Mustacchibytes of
2289a4a12bdSRobert Mustacchi.Fa str
2299a4a12bdSRobert Mustacchido not contribute to a valid character.
2309a4a12bdSRobert Mustacchi.Va errno
2319a4a12bdSRobert Mustacchihas been set to
2329a4a12bdSRobert Mustacchi.Er EILSEQ .
2339a4a12bdSRobert MustacchiNo data was written into the wide character buffer
2349a4a12bdSRobert Mustacchi.Po
2359a4a12bdSRobert Mustacchi.Fa pwc ,
2369a4a12bdSRobert Mustacchi.Fa p16c ,
2379a4a12bdSRobert Mustacchi.Fa p32c
2389a4a12bdSRobert Mustacchi.Pc .
2399a4a12bdSRobert Mustacchi.It Sy (size_t)-2
2409a4a12bdSRobert Mustacchi.Fa len
2419a4a12bdSRobert Mustacchibytes of
2429a4a12bdSRobert Mustacchi.Fa str
2439a4a12bdSRobert Mustacchiwere consumed, but a complete multi-byte character sequence has not been
2449a4a12bdSRobert Mustacchifound and no data was written into the wide character buffer
2459a4a12bdSRobert Mustacchi.Po
2469a4a12bdSRobert Mustacchi.Fa pwc ,
2479a4a12bdSRobert Mustacchi.Fa p16c ,
2489a4a12bdSRobert Mustacchi.Fa p32c
2499a4a12bdSRobert Mustacchi.Pc .
2509a4a12bdSRobert Mustacchi.It Sy (size_t)-3
2519a4a12bdSRobert MustacchiA character has been written into the wide character buffer
2529a4a12bdSRobert Mustacchi.Po
2539a4a12bdSRobert Mustacchi.Fa pwc ,
2549a4a12bdSRobert Mustacchi.Fa p16c ,
2559a4a12bdSRobert Mustacchi.Fa p32c
2569a4a12bdSRobert Mustacchi.Pc .
2579a4a12bdSRobert MustacchiThis character was from a previous call (such as another part of a
2589a4a12bdSRobert MustacchiUTF-16 surrogate pair) and no input was consumed.
2599a4a12bdSRobert MustacchiThis is limited to the
2609a4a12bdSRobert Mustacchi.Fn mbrtoc16
2619a4a12bdSRobert Mustacchiand
2629a4a12bdSRobert Mustacchi.Fn mbrtoc32
2639a4a12bdSRobert Mustacchifunctions.
2649a4a12bdSRobert Mustacchi.El
2659a4a12bdSRobert Mustacchi.Sh EXAMPLES
2669a4a12bdSRobert Mustacchi.Sy Example 1
2679a4a12bdSRobert MustacchiUsing the
2689a4a12bdSRobert Mustacchi.Fn mbrtoc32
2699a4a12bdSRobert Mustacchifunction to convert a multibyte string.
2709a4a12bdSRobert Mustacchi.Bd -literal
2719a4a12bdSRobert Mustacchi#include <locale.h>
2729a4a12bdSRobert Mustacchi#include <stdlib.h>
2739a4a12bdSRobert Mustacchi#include <string.h>
2749a4a12bdSRobert Mustacchi#include <err.h>
2759a4a12bdSRobert Mustacchi#include <stdio.h>
2769a4a12bdSRobert Mustacchi#include <uchar.h>
2779a4a12bdSRobert Mustacchi
2789a4a12bdSRobert Mustacchiint
2799a4a12bdSRobert Mustacchimain(void)
2809a4a12bdSRobert Mustacchi{
2819a4a12bdSRobert Mustacchi	mbstate_t mbs;
2829a4a12bdSRobert Mustacchi	char32_t out;
2839a4a12bdSRobert Mustacchi	size_t ret;
2849a4a12bdSRobert Mustacchi	const char *uchar_str = "\exe5\ex85\ex89";
2859a4a12bdSRobert Mustacchi
2869a4a12bdSRobert Mustacchi	(void) memset(&mbs, 0, sizeof (mbs));
2879a4a12bdSRobert Mustacchi	(void) setlocale(LC_CTYPE, "en_US.UTF-8");
2889a4a12bdSRobert Mustacchi	ret = mbrtoc32(&out, uchar_str, strlen(uchar_str), &mbs);
2899a4a12bdSRobert Mustacchi	if (ret != strlen(uchar_str)) {
2909a4a12bdSRobert Mustacchi		errx(EXIT_FAILURE, "failed to convert string, got %zd",
2919a4a12bdSRobert Mustacchi		    ret);
2929a4a12bdSRobert Mustacchi	}
2939a4a12bdSRobert Mustacchi
2949a4a12bdSRobert Mustacchi	(void) printf("Converted %zu bytes into UTF-32 character "
2959a4a12bdSRobert Mustacchi	    "0x%x\n", ret, out);
2969a4a12bdSRobert Mustacchi	return (0);
2979a4a12bdSRobert Mustacchi}
2989a4a12bdSRobert Mustacchi.Ed
2999a4a12bdSRobert Mustacchi.Pp
3009a4a12bdSRobert MustacchiWhen compiled and run, this produces:
3019a4a12bdSRobert Mustacchi.Bd -literal -offset indent
3029a4a12bdSRobert Mustacchi$ ./a.out
3039a4a12bdSRobert MustacchiConverted 3 bytes into UTF-32 character 0x5149
3049a4a12bdSRobert Mustacchi.Ed
3059a4a12bdSRobert Mustacchi.Pp
3069a4a12bdSRobert Mustacchi.Sy Example 2
3079a4a12bdSRobert MustacchiHandling surrogate pairs from the
3089a4a12bdSRobert Mustacchi.Fn mbrtoc16
3099a4a12bdSRobert Mustacchifunction.
3109a4a12bdSRobert Mustacchi.Bd -literal
3119a4a12bdSRobert Mustacchi#include <locale.h>
3129a4a12bdSRobert Mustacchi#include <stdlib.h>
3139a4a12bdSRobert Mustacchi#include <string.h>
3149a4a12bdSRobert Mustacchi#include <err.h>
3159a4a12bdSRobert Mustacchi#include <stdio.h>
3169a4a12bdSRobert Mustacchi#include <uchar.h>
3179a4a12bdSRobert Mustacchi
3189a4a12bdSRobert Mustacchiint
3199a4a12bdSRobert Mustacchimain(void)
3209a4a12bdSRobert Mustacchi{
3219a4a12bdSRobert Mustacchi        mbstate_t mbs;
3229a4a12bdSRobert Mustacchi        char16_t first, second;
3239a4a12bdSRobert Mustacchi        size_t ret;
3249a4a12bdSRobert Mustacchi        const char *uchar_str = "\exf0\ex9f\ex92\exa9";
3259a4a12bdSRobert Mustacchi
3269a4a12bdSRobert Mustacchi        (void) memset(&mbs, '\0', sizeof (mbs));
3279a4a12bdSRobert Mustacchi        (void) setlocale(LC_CTYPE, "en_US.UTF-8");
3289a4a12bdSRobert Mustacchi        ret = mbrtoc16(&first, uchar_str, strlen(uchar_str), &mbs);
3299a4a12bdSRobert Mustacchi        if (ret != strlen(uchar_str)) {
3309a4a12bdSRobert Mustacchi                errx(EXIT_FAILURE, "failed to convert string, got %zd",
3319a4a12bdSRobert Mustacchi                    ret);
3329a4a12bdSRobert Mustacchi        }
3339a4a12bdSRobert Mustacchi
3349a4a12bdSRobert Mustacchi        ret = mbrtoc16(&second, "", 0, &mbs);
3359a4a12bdSRobert Mustacchi        if (ret != (size_t)-3) {
3369a4a12bdSRobert Mustacchi                errx(EXIT_FAILURE, "didn't get second surrogate pair, "
3379a4a12bdSRobert Mustacchi                    "got %zd", ret);
3389a4a12bdSRobert Mustacchi        }
3399a4a12bdSRobert Mustacchi
3409a4a12bdSRobert Mustacchi        (void) printf("UTF-16 surrogates: 0x%x 0x%x\n", first, second);
3419a4a12bdSRobert Mustacchi        return (0);
3429a4a12bdSRobert Mustacchi}
3439a4a12bdSRobert Mustacchi.Ed
3449a4a12bdSRobert Mustacchi.Pp
3459a4a12bdSRobert MustacchiWhen compiled and run, this produces:
3469a4a12bdSRobert Mustacchi.Bd -literal -offset indent
3479a4a12bdSRobert Mustacchi$ ./a.out
3489a4a12bdSRobert MustacchiUTF-16 surrogates: 0xd83d 0xdca9
3499a4a12bdSRobert Mustacchi.Ed
3509a4a12bdSRobert Mustacchi.Sh ERRORS
3519a4a12bdSRobert MustacchiThe
3529a4a12bdSRobert Mustacchi.Fn mbrtoc16 ,
3539a4a12bdSRobert Mustacchi.Fn mbrtoc32 ,
3549a4a12bdSRobert Mustacchi.Fn mbrtowc ,
3559a4a12bdSRobert Mustacchiand
3569a4a12bdSRobert Mustacchi.Fn mbrtowc_l
3579a4a12bdSRobert Mustacchifunctions will fail if:
3589a4a12bdSRobert Mustacchi.Bl -tag -width Er
3599a4a12bdSRobert Mustacchi.It Er EINVAL
3609a4a12bdSRobert MustacchiThe conversion state in
3619a4a12bdSRobert Mustacchi.Fa ps
3629a4a12bdSRobert Mustacchiis invalid.
3639a4a12bdSRobert Mustacchi.It Er EILSEQ
3649a4a12bdSRobert MustacchiAn invalid character sequence has been detected.
3659a4a12bdSRobert Mustacchi.El
3669a4a12bdSRobert Mustacchi.Sh MT-LEVEL
3679a4a12bdSRobert MustacchiThe
3689a4a12bdSRobert Mustacchi.Fn mbrtoc16 ,
3699a4a12bdSRobert Mustacchi.Fn mbrtoc32 ,
3709a4a12bdSRobert Mustacchi.Fn mbrtowc ,
3719a4a12bdSRobert Mustacchiand
3729a4a12bdSRobert Mustacchi.Fn mbrtowc_l
3739a4a12bdSRobert Mustacchifunctions are
3749a4a12bdSRobert Mustacchi.Sy MT-Safe
3759a4a12bdSRobert Mustacchias long as different
3769a4a12bdSRobert Mustacchi.Vt mbstate_t
3779a4a12bdSRobert Mustacchistructures are passed in
3789a4a12bdSRobert Mustacchi.Fa ps .
3799a4a12bdSRobert MustacchiIf
3809a4a12bdSRobert Mustacchi.Fa ps
3819a4a12bdSRobert Mustacchiis
3829a4a12bdSRobert Mustacchi.Dv NULL
3839a4a12bdSRobert Mustacchior different threads use the same value for
3849a4a12bdSRobert Mustacchi.Fa ps ,
3859a4a12bdSRobert Mustacchithen the functions are
3869a4a12bdSRobert Mustacchi.Sy Unsafe .
3879a4a12bdSRobert Mustacchi.Sh INTERFACE STABILITY
3889a4a12bdSRobert Mustacchi.Sy Committed
3899a4a12bdSRobert Mustacchi.Sh SEE ALSO
3909a4a12bdSRobert Mustacchi.Xr c16rtomb 3C ,
3919a4a12bdSRobert Mustacchi.Xr c32rtomb 3C ,
3929a4a12bdSRobert Mustacchi.Xr newlocale 3C ,
3939a4a12bdSRobert Mustacchi.Xr setlocale 3C ,
3949a4a12bdSRobert Mustacchi.Xr uselocale 3C ,
3959a4a12bdSRobert Mustacchi.Xr wcrtomb 3C ,
3969a4a12bdSRobert Mustacchi.Xr uchar.h 3HEAD ,
3979a4a12bdSRobert Mustacchi.Xr environ 5
398