github.com/afumu/libc@v0.0.6/musl/src/multibyte/c16rtomb.c (about)

     1  #include <uchar.h>
     2  #include <errno.h>
     3  #include <wchar.h>
     4  
     5  size_t c16rtomb(char *restrict s, char16_t c16, mbstate_t *restrict ps)
     6  {
     7  	static unsigned internal_state;
     8  	if (!ps) ps = (void *)&internal_state;
     9  	unsigned *x = (unsigned *)ps;
    10  	wchar_t wc;
    11  
    12  	if (!s) {
    13  		if (*x) goto ilseq;
    14  		return 1;
    15  	}
    16  
    17  	if (!*x && c16 - 0xd800u < 0x400) {
    18  		*x = c16 - 0xd7c0 << 10;
    19  		return 0;
    20  	}
    21  
    22  	if (*x) {
    23  		if (c16 - 0xdc00u >= 0x400) goto ilseq;
    24  		else wc = *x + c16 - 0xdc00;
    25  		*x = 0;
    26  	} else {
    27  		wc = c16;
    28  	}
    29  	return wcrtomb(s, wc, 0);
    30  
    31  ilseq:
    32  	*x = 0;
    33  	errno = EILSEQ;
    34  	return -1;
    35  }