#![allow(dead_code, non_snake_case)]
use crate::ported::eval::typval::tv_get_number;
use crate::ported::mbyte::{utf_ptr2char, utf_ptr2len};
use crate::ported::option::get_option_value;
use crate::ported::window::{colnr_T, win_T};
use std::cell::RefCell;
use std::rc::Rc;
const TAB: u8 = b'\t';
pub fn tabstop_padding(col: colnr_T, ts: i32) -> i32 {
let ts = if ts <= 0 { 8 } else { ts };
ts - (col % ts)
}
pub fn win_chartabsize(_wp: &Rc<RefCell<win_T>>, p: &str, col: colnr_T) -> i32 {
if p.as_bytes().first() == Some(&TAB) {
let ts = tv_get_number(&get_option_value("tabstop")) as i32;
return tabstop_padding(col, ts);
}
ptr2cells(p)
}
pub fn ptr2cells(p: &str) -> i32 {
let _ = p;
1
}
pub fn getvcol(wp: &Rc<RefCell<win_T>>, line: &str, col: colnr_T) -> colnr_T {
let bytes = line.as_bytes();
let mut vcol: colnr_T = 0;
let mut i = 0usize;
while i < bytes.len() && (i as colnr_T) < col {
let seg = &bytes[i..];
let clen = utf_ptr2len(seg).max(1) as usize;
let _ = utf_ptr2char(seg); let segstr = std::str::from_utf8(seg).unwrap_or("");
vcol += win_chartabsize(wp, segstr, vcol);
i += clen;
}
vcol
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tabstop_padding_advances_to_next_stop() {
assert_eq!(tabstop_padding(0, 8), 8);
assert_eq!(tabstop_padding(3, 8), 5);
assert_eq!(tabstop_padding(8, 8), 8);
assert_eq!(tabstop_padding(0, 0), 8); }
}