wcrtomb.c - scc - simple c99 compiler
(HTM) git clone git://git.simple-cc.org/scc
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
wcrtomb.c (454B)
---
1 #include <errno.h>
2 #include <wchar.h>
3
4 #include "../libc.h"
5
6 #undef wcrtomb
7
8 size_t
9 wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict ps)
10 {
11 int i, n;
12 unsigned long c = wc;
13
14 if (!s)
15 return 1;
16
17 if (c < 0x80) {
18 *s = wc;
19 return 1;
20 }
21
22 if (!_validutf8(wc, &n)) {
23 errno = EILSEQ;
24 return -1;
25 }
26 n--;
27
28 *s = 0x80;
29 for (i = 0; i < n; i++) {
30 *s >>= 1;
31 *s |= 0x80;
32
33 s[n-i] = 0x80 | (c & 0x3f);
34 c >>= 6;
35 }
36 *s |= c;
37
38 return n+1;
39 }