This source file includes following definitions.
- u8_uctomb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <config.h>
19
20 #if defined IN_LIBUNISTRING
21
22 # include "unistring-notinline.h"
23 #endif
24
25
26 #include "unistr.h"
27
28 #include "attribute.h"
29
30 #if !HAVE_INLINE
31
32 int
33 u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n)
34 {
35 if (uc < 0x80)
36 {
37 if (n > 0)
38 {
39 s[0] = uc;
40 return 1;
41 }
42
43 }
44 else
45 {
46 int count;
47
48 if (uc < 0x800)
49 count = 2;
50 else if (uc < 0x10000)
51 {
52 if (uc < 0xd800 || uc >= 0xe000)
53 count = 3;
54 else
55 return -1;
56 }
57 else if (uc < 0x110000)
58 count = 4;
59 else
60 return -1;
61
62 if (n >= count)
63 {
64 switch (count)
65 {
66 case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
67 FALLTHROUGH;
68 case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
69 FALLTHROUGH;
70 case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
71 s[0] = uc;
72 }
73 return count;
74 }
75 }
76 return -2;
77 }
78
79 #endif