runeWidth function

int runeWidth(
  1. int rune
)

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;
}