v
Зеркало из https://github.com/vlang/v
1module term
2
3// utf8_getchar returns an utf8 rune from standard input
4pub fn utf8_getchar() ?rune {
5c := input_character()
6if c == -1 {
7return none
8}
9len := utf8_len(u8(~c))
10if c < 0 {
11return 0
12} else if len == 0 {
13return c
14} else if len == 1 {
15return -1
16} else {
17mut uc := c & ((1 << (7 - len)) - 1)
18for i := 0; i + 1 < len; i++ {
19c2 := input_character()
20if c2 != -1 && (c2 >> 6) == 2 {
21uc <<= 6
22uc |= (c2 & 63)
23} else if c2 == -1 {
24return 0
25} else {
26return -1
27}
28}
29return uc
30}
31}
32
33// utf8_len calculates the length of a utf8 rune to read, according to its first byte
34pub fn utf8_len(c u8) int {
35mut b := 0
36mut x := c
37if (x & 240) != 0 {
38// 0xF0
39x >>= 4
40} else {
41b += 4
42}
43if (x & 12) != 0 {
44// 0x0C
45x >>= 2
46} else {
47b += 2
48}
49if (x & 2) == 0 {
50// 0x02
51b++
52}
53return b
54}
55