]> git.proxmox.com Git - rustc.git/blob - src/vendor/utf8-ranges-0.1.3/src/char_utf8.rs
New upstream version 1.19.0+dfsg1
[rustc.git] / src / vendor / utf8-ranges-0.1.3 / src / char_utf8.rs
1 // Pulled from std::char until encode_utf8 stabilizes. ---AG
2
3 // UTF-8 ranges and tags for encoding characters
4 const TAG_CONT: u8 = 0b1000_0000;
5 const TAG_TWO_B: u8 = 0b1100_0000;
6 const TAG_THREE_B: u8 = 0b1110_0000;
7 const TAG_FOUR_B: u8 = 0b1111_0000;
8 const MAX_ONE_B: u32 = 0x80;
9 const MAX_TWO_B: u32 = 0x800;
10 const MAX_THREE_B: u32 = 0x10000;
11
12 #[inline]
13 pub fn encode_utf8(character: char, dst: &mut [u8]) -> Option<usize> {
14 let code = character as u32;
15 if code < MAX_ONE_B && !dst.is_empty() {
16 dst[0] = code as u8;
17 Some(1)
18 } else if code < MAX_TWO_B && dst.len() >= 2 {
19 dst[0] = (code >> 6 & 0x1F) as u8 | TAG_TWO_B;
20 dst[1] = (code & 0x3F) as u8 | TAG_CONT;
21 Some(2)
22 } else if code < MAX_THREE_B && dst.len() >= 3 {
23 dst[0] = (code >> 12 & 0x0F) as u8 | TAG_THREE_B;
24 dst[1] = (code >> 6 & 0x3F) as u8 | TAG_CONT;
25 dst[2] = (code & 0x3F) as u8 | TAG_CONT;
26 Some(3)
27 } else if dst.len() >= 4 {
28 dst[0] = (code >> 18 & 0x07) as u8 | TAG_FOUR_B;
29 dst[1] = (code >> 12 & 0x3F) as u8 | TAG_CONT;
30 dst[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT;
31 dst[3] = (code & 0x3F) as u8 | TAG_CONT;
32 Some(4)
33 } else {
34 None
35 }
36 }