runeWidth function
Columns taken by rune: 0 for control and combining characters, 2 for
wide East Asian characters and most emoji, 1 otherwise.
Implementation
int runeWidth(int rune) {
if (rune < 0x20 || (rune >= 0x7F && rune < 0xA0)) {
return 0;
}
if ((rune >= 0x0300 && rune <= 0x036F) || (rune >= 0x200B && rune <= 0x200F) || (rune >= 0xFE00 && rune <= 0xFE0F)) {
return 0;
}
if ((rune >= 0x1100 && rune <= 0x115F) ||
(rune >= 0x2E80 && rune <= 0x303E) ||
(rune >= 0x3041 && rune <= 0x33FF) ||
(rune >= 0x3400 && rune <= 0x4DBF) ||
(rune >= 0x4E00 && rune <= 0x9FFF) ||
(rune >= 0xA000 && rune <= 0xA4CF) ||
(rune >= 0xAC00 && rune <= 0xD7A3) ||
(rune >= 0xF900 && rune <= 0xFAFF) ||
(rune >= 0xFE30 && rune <= 0xFE4F) ||
(rune >= 0xFF00 && rune <= 0xFF60) ||
(rune >= 0xFFE0 && rune <= 0xFFE6) ||
(rune >= 0x1F300 && rune <= 0x1F64F) ||
(rune >= 0x1F900 && rune <= 0x1F9FF) ||
(rune >= 0x20000 && rune <= 0x3FFFD)) {
return 2;
}
return 1;
}