1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| | #include <uchar.h>
#include <wchar.h>
__attribute__((__noinline__))
static size_t c8rtomb_slow(char *__restrict s, unsigned char c8, mbstate_t *__restrict st)
{
// We need an internal state different from mbrtowc.
static mbstate_t internal_state;
if (!st) st = &internal_state;
wchar_t wc;
// mbrtowc has return values -2, -1, 0, 1.
size_t res = mbrtowc(&wc, (char const*)&c8, 1, st);
switch (res) {
// our implementation of wcrtomb ignores the state
case 1: res = wcrtomb(s, wc, 0); break;
case 0: res = 1; if (s) *s = 0; break;
}
return res;
}
static size_t __c8rtomb(char *__restrict s, unsigned char c8, mbstate_t *__restrict st)
{
if (st && !*(unsigned*)st && (c8 < 0x80)) {
if (s) *s = c8;
return 1;
}
return c8rtomb_slow(s, c8, st);
}
weak_alias(__c8rtomb, c8rtomb);
|