Reuse wcswidth logic for rendered characters

This commit is contained in:
Johannes Altmanninger
2026-03-29 11:11:52 +08:00
parent 8194c6eb79
commit 93cbf2a0e8
3 changed files with 17 additions and 13 deletions

View File

@@ -63,15 +63,19 @@ pub fn fish_wcwidth(c: char) -> isize {
}
}
/// fish's internal versions of wcwidth and wcswidth
pub fn fish_wcswidth(s: &wstr) -> isize {
// ascii fast path; empty iterator returns true for .all()
if s.chars().all(|c| c.is_ascii() && !c.is_ascii_control()) {
fish_wcswidth_canonicalizing(s, std::convert::identity)
}
pub fn fish_wcswidth_canonicalizing(s: &wstr, canonicalize: fn(char) -> char) -> isize {
// ascii fast path
let chars = s.chars().map(canonicalize);
if chars.clone().all(|c| c.is_ascii() && !c.is_ascii_control()) {
return s.len() as isize;
}
let mut result = 0;
for c in s.chars() {
for c in chars {
let w = fish_wcwidth(c);
if w < 0 {
return -1;