WCRTOMB(3) BSD Programmer's Manual WCRTOMB(3)
optu16to8, wcrtomb - converts a wide character to a multibyte character
(restartable)
#include <wchar.h>
size_t
optu16to8(char * restrict s, wchar_t wc, mbstate_t * restrict ps);
size_t
wcrtomb(char * restrict s, wchar_t wc, mbstate_t * restrict ps);
wcrtomb() converts the wide character given by wc to the corresponding
multibyte character, and stores it in the array pointed to by s unless s
is a null pointer. This function will modify the first at most MB_CUR_MAX
bytes of the array pointed by s, if ps is an initial conversion state.
Contrary to and violating Version 3 of the Single UNIX Specification,
this implementation can store more bytes in s if ps is not the initial
conversion state. Starting with MirOS #10, MB_CUR_MAX has been adjusted
to accomodate this fact, from the old value of "3" to a new value of "5"
calculated by the formula "(old-MB_CUR_MAX * 2) - 1".
The behaviour of wcrtomb() is affected by the LC_CTYPE category of the
current locale.
optu16to8() behaves similar to wcrtomb(), but always converts from
OPTU-16 to OPTU-8 encoding, independent of the current locale.
These are the special cases:
wc == 0 For state-dependent encodings, wcrtomb() stores a null byte
preceded by a special byte sequence (if any) to return to
an initial state to the array pointed by s, and the state
object pointed by ps also returned to a initial state.
s == NULL wcrtomb() just places ps into a initial state. It is
equivalent to the following call:
wcrtomb(buf, L'\0', ps);
Here, buf is a dummy buffer. In this case, wc is ignored.
ps == NULL mbrtowc() uses its own internal state object to keep the
conversion state, instead of ps mentioned in this manual
page.
Calling any other functions in libc never changes the
internal states of optu16to8() or mbrtowc(), which are ini-
tialised at startup time of the program.
optu16to8() and wcrtomb() return:
positive The number of bytes (including any shift sequences) which
are stored in the array.
(size_t)-1 wc is not a valid wide character. In this case, wcrtomb()
also sets errno to indicate error.
optu16to8() and wcrtomb() may cause an error in the following cases:
[EILSEQ] wc is not a valid wide character.
[EINVAL] ps points to an invalid or uninitialised mbstate_t object.
iswoctet(3), optu8to16(3), setlocale(3), wctomb(3)
The wcrtomb() function conforms to ISO/IEC 9899/AMD1:1995 ("ISO C90,
Amendment 1"). The restrict qualifier is added at ISO/IEC 9899/1999 ("ISO
C99").
At present, MirOS is limited to the Unicode BMP (Basic Multilingual
Plane), thus OPTU-8 is limited to the common subset of CESU-8 and UTF-8.
The optu16to8 function first appeared in MirOS #11.
Thorsten Glaser <tg@mirbsd.de> wrote the entire internationalisation im-
plementation in MirOS. He is also the steward for the OPTU encoding.
On a system whose wide character type is only 16 bits wide, as opposed to
31 bits of ISO 10646, the OPTU encoder and decoder are permitted to not
de- and recompose any surrogates encountered and pass them through as if
they were regular wide characters with no special function. Since MirOS
is such a system, the reference implementation does not care about UTF-16
surrogates (U+D800 to U+DFFF) posing as OPTU-16 characters at all; a
planes-aware Unicode application is required to handle surrogates by it-
self. For compatibility purposes, optu16to8 should always be assumed to
not treat surrogates specially; applications must ensure to not produce
invalid surrogates unless limited to the BMP.
optu16to8() does, however, correctly reject the codepoints U+FFFE and
U+FFFF as invalid.
MirOS BSD #10-current September 1, 2012 1
Generated on 2013-04-27 00:20:00 by $MirOS: src/scripts/roff2htm,v 1.77 2013/01/01 20:49:09 tg Exp $
These manual pages and other documentation are copyrighted by their respective writers;
their source is available at our CVSweb,
AnonCVS, and other mirrors. The rest is Copyright © 2002‒2013 The MirOS Project, Germany.
This product includes material
provided by Thorsten Glaser.
This manual page’s HTML representation is supposed to be valid XHTML/1.1; if not, please send a bug report – diffs preferred.