master
 1#include <stdlib.h>
 2#include <wchar.h>
 3#include <errno.h>
 4#include "internal.h"
 5
 6size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict st)
 7{
 8	if (!s) return 1;
 9	if ((unsigned)wc < 0x80) {
10		*s = wc;
11		return 1;
12	} else if (MB_CUR_MAX == 1) {
13		if (!IS_CODEUNIT(wc)) {
14			errno = EILSEQ;
15			return -1;
16		}
17		*s = wc;
18		return 1;
19	} else if ((unsigned)wc < 0x800) {
20		*s++ = 0xc0 | (wc>>6);
21		*s = 0x80 | (wc&0x3f);
22		return 2;
23	} else if ((unsigned)wc < 0xd800 || (unsigned)wc-0xe000 < 0x2000) {
24		*s++ = 0xe0 | (wc>>12);
25		*s++ = 0x80 | ((wc>>6)&0x3f);
26		*s = 0x80 | (wc&0x3f);
27		return 3;
28	} else if ((unsigned)wc-0x10000 < 0x100000) {
29		*s++ = 0xf0 | (wc>>18);
30		*s++ = 0x80 | ((wc>>12)&0x3f);
31		*s++ = 0x80 | ((wc>>6)&0x3f);
32		*s = 0x80 | (wc&0x3f);
33		return 4;
34	}
35	errno = EILSEQ;
36	return -1;
37}