builtin: getchar for unicode characters
parent
04ff9ede9f
commit
602e472b8a
|
@ -131,3 +131,52 @@ pub fn string_from_wide2(_wstr &u16, len int) string {
|
|||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate length to read from the first byte
|
||||
fn utf8_len(c byte) int {
|
||||
mut b := 0
|
||||
mut x := c
|
||||
|
||||
if ((x & 240) != 0) { //0xF0
|
||||
x >>= 4
|
||||
} else {
|
||||
b += 4
|
||||
}
|
||||
if ((x & 12) != 0) { //0x0C
|
||||
x >>= 2
|
||||
} else {
|
||||
b += 2
|
||||
}
|
||||
if ((x & 2) == 0) { //0x02
|
||||
b++
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
// Reads an utf8 character from standard input
|
||||
pub fn utf8_getchar() int {
|
||||
c := int(C.getchar())
|
||||
len := utf8_len(~c)
|
||||
|
||||
if c < 0 {
|
||||
return 0
|
||||
} else if (len == 0) {
|
||||
return c
|
||||
} else if (len == 1) {
|
||||
return -1
|
||||
} else {
|
||||
mut uc := int(c & ((1 << (7 - len)) - 1))
|
||||
for i := 0; i + 1 < len; i++ {
|
||||
c2 := int(C.getchar())
|
||||
if c2 != -1 && (c2 >> 6) == 2 {
|
||||
uc <<= 6
|
||||
uc |= int((c2 & 63))
|
||||
} else if (c2 == -1) {
|
||||
return 0
|
||||
} else {
|
||||
return -1
|
||||
}
|
||||
}
|
||||
return uc
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue