use std::sync::atomic::AtomicI32;
use crate::zle::zle_h::{MOD_NEG, MOD_TMULT};
use crate::zsh_h::isset;
#[allow(unused_imports)]
use crate::ported::zle::zle_h::*;
#[allow(unused_imports)]
use crate::ported::zle::zle_main::*;
#[allow(unused_imports)]
use crate::ported::zle::zle_hist::*;
#[allow(unused_imports)]
use crate::ported::zle::zle_move::*;
#[allow(unused_imports)]
use crate::ported::zle::zle_word::*;
#[allow(unused_imports)]
use crate::ported::zle::zle_params::*;
#[allow(unused_imports)]
use crate::ported::zle::zle_vi::*;
#[allow(unused_imports)]
use crate::ported::zle::zle_utils::*;
#[allow(unused_imports)]
use crate::ported::zle::zle_refresh::*;
#[allow(unused_imports)]
use crate::ported::zle::zle_tricky::*;
#[allow(unused_imports)]
use crate::ported::zle::textobjects::*;
#[allow(unused_imports)]
use crate::ported::zle::deltochar::*;
pub static DONE: AtomicI32 = AtomicI32::new(0);
pub static MARK: AtomicI32 = AtomicI32::new(0);
pub static SUFFIXLEN: AtomicI32 = AtomicI32::new(0);
#[derive(Debug, Clone, Default)]
#[allow(non_camel_case_types)]
pub struct suffixset { pub tp: i32,
pub flags: i32,
pub chars: Vec<char>,
pub lenstr: i32,
pub lensuf: i32,
}
pub static SUFFIXLIST: std::sync::OnceLock<std::sync::Mutex<Vec<suffixset>>>
= std::sync::OnceLock::new();
fn suffixlist() -> &'static std::sync::Mutex<Vec<suffixset>> {
SUFFIXLIST.get_or_init(|| std::sync::Mutex::new(Vec::new()))
}
pub static SUFFIXNOINSREM: AtomicI32 = AtomicI32::new(0);
pub static VFINDCHAR: AtomicI32 = AtomicI32::new(0);
pub static VFINDDIR: AtomicI32 = AtomicI32::new(0); pub static TAILADD: AtomicI32 = AtomicI32::new(0);
pub static KCT: AtomicI32 = AtomicI32::new(-1);
pub static YANKCS: AtomicI32 = AtomicI32::new(0);
pub static NAMEDCMDAMBIG: AtomicI32 = AtomicI32::new(0);
pub static PREDISPLAY: std::sync::OnceLock<std::sync::Mutex<String>> = std::sync::OnceLock::new();
pub static POSTDISPLAY: std::sync::OnceLock<std::sync::Mutex<String>> = std::sync::OnceLock::new();
pub static PREVIOUS_SEARCH: std::sync::OnceLock<std::sync::Mutex<String>> = std::sync::OnceLock::new();
pub static PREVIOUS_ABORTED_SEARCH: std::sync::OnceLock<std::sync::Mutex<String>> = std::sync::OnceLock::new();
pub fn self_insert(c: char) { crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), c);
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLELL.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn accept_line() -> String { crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect()
}
pub fn accept_and_hold() -> String {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect()
}
pub fn kill_buffer() {
if !crate::ported::zle::zle_main::ZLELINE.lock().unwrap().is_empty() {
let text: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(..).collect();
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_front(text);
if crate::ported::zle::zle_main::KILLRING.lock().unwrap().len() > crate::ported::zle::zle_main::KILLRINGMAX.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_back();
}
crate::ported::zle::zle_main::ZLELL.store(0, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(0, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::MARK.store(0, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
}
pub fn kill_whole_line() {
kill_buffer();
}
pub fn exchange_point_and_mark() {
std::mem::swap(&mut crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), &mut crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst));
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn set_mark_here() {
crate::ported::zle::zle_main::MARK.store(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
}
pub fn kill_region() { let (start, end) = if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) {
(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst))
} else {
(crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst), crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst))
};
let text: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(start..end).collect();
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_front(text);
if crate::ported::zle::zle_main::KILLRING.lock().unwrap().len() > crate::ported::zle::zle_main::KILLRINGMAX.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_back();
}
crate::ported::zle::zle_main::ZLELL.fetch_sub(end - start, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(start, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::MARK.store(start, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn yank() { if let Some(text) = crate::ported::zle::zle_main::KILLRING.lock().unwrap().front() {
crate::ported::zle::zle_main::MARK.store(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
for &c in text {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), c);
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLELL.store(crate::ported::zle::zle_main::ZLELINE.lock().unwrap().len(), std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::YANKLAST.store(true, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
}
pub fn yank_pop() { if !crate::ported::zle::zle_main::YANKLAST.load(std::sync::atomic::Ordering::SeqCst) || crate::ported::zle::zle_main::KILLRING.lock().unwrap().is_empty() {
return;
}
let prev_len = crate::ported::zle::zle_main::KILLRING.lock().unwrap().front().map(|v| v.len()).unwrap_or(0);
let start = crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst);
for _ in 0..prev_len {
if start < crate::ported::zle::zle_main::ZLELINE.lock().unwrap().len() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().remove(start);
}
}
crate::ported::zle::zle_main::ZLECS.store(start, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLELL.store(crate::ported::zle::zle_main::ZLELINE.lock().unwrap().len(), std::sync::atomic::Ordering::SeqCst);
if let Some(front) = crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_front() {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_back(front);
}
if let Some(text) = crate::ported::zle::zle_main::KILLRING.lock().unwrap().front() {
for &c in text {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), c);
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLELL.store(crate::ported::zle::zle_main::ZLELINE.lock().unwrap().len(), std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn transpose_chars() {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) == 0 || crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) < 2 {
return;
}
let pos = if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) == crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1
} else {
crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)
};
if pos > 0 {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().swap(pos - 1, pos);
crate::ported::zle::zle_main::ZLECS.store(pos + 1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
}
pub fn capitalize_word() {
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && !crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)].is_alphanumeric() {
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)].is_alphabetic() {
{ let mut __g = crate::ported::zle::zle_main::ZLELINE.lock().unwrap(); __g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)] = __g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)]
.to_uppercase()
.next()
.unwrap_or(__g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)]); }
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)].is_alphanumeric() {
{ let mut __g = crate::ported::zle::zle_main::ZLELINE.lock().unwrap(); __g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)] = __g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)]
.to_lowercase()
.next()
.unwrap_or(__g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)]); }
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn downcase_word() {
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && !crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)].is_alphanumeric() {
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)].is_alphanumeric() {
{ let mut __g = crate::ported::zle::zle_main::ZLELINE.lock().unwrap(); __g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)] = __g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)]
.to_lowercase()
.next()
.unwrap_or(__g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)]); }
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn upcase_word() {
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && !crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)].is_alphanumeric() {
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)].is_alphanumeric() {
{ let mut __g = crate::ported::zle::zle_main::ZLELINE.lock().unwrap(); __g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)] = __g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)]
.to_uppercase()
.next()
.unwrap_or(__g[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)]); }
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn transpose_words() {
if crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) < 3 {
return;
}
let mut end2 = crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst);
while end2 < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[end2].is_alphanumeric() {
end2 += 1;
}
while end2 < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && !crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[end2].is_alphanumeric() {
end2 += 1;
}
while end2 < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[end2].is_alphanumeric() {
end2 += 1;
}
let mut start2 = end2;
while start2 > 0 && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[start2 - 1].is_alphanumeric() {
start2 -= 1;
}
let mut end1 = start2;
while end1 > 0 && !crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[end1 - 1].is_alphanumeric() {
end1 -= 1;
}
let mut start1 = end1;
while start1 > 0 && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[start1 - 1].is_alphanumeric() {
start1 -= 1;
}
if start1 < end1 && start2 < end2 {
let word1: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[start1..end1].to_vec();
let word2: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[start2..end2].to_vec();
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(start2..end2);
for (i, c) in word1.iter().enumerate() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(start2 + i, *c);
}
let new_end1 = end1 - (end2 - start2) + word1.len();
let _new_start1 = start1;
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(start1..end1);
for (i, c) in word2.iter().enumerate() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(start1 + i, *c);
}
crate::ported::zle::zle_main::ZLELL.store(crate::ported::zle::zle_main::ZLELINE.lock().unwrap().len(), std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(new_end1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
}
pub fn quote_line() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(0, '\'');
crate::ported::zle::zle_main::ZLELL.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().push('\'');
crate::ported::zle::zle_main::ZLELL.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn quote_region() {
let (start, end) = if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) {
(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst))
} else {
(crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst), crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst))
};
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(end, '\'');
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(start, '\'');
crate::ported::zle::zle_main::ZLELL.fetch_add(2, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(end + 2, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::MARK.store(start, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn what_cursor_position() -> String {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) >= crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
return format!("point={} of {} (EOL)", crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst));
}
let c = crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)];
let code = c as u32;
format!(
"Char: {} (0{:o}, {:?}, 0x{:x}) point {} of {} ({}%)",
c,
code,
code,
code,
crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst),
crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst),
(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) * 100).checked_div(crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst)).unwrap_or(0)
)
}
pub fn digit_argument(digit: u8) {
if crate::ported::zle::zle_main::MULT.load(std::sync::atomic::Ordering::SeqCst) == 1 && !crate::ported::zle::zle_main::NEG_ARG.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::MULT.store(0, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::MULT.store(crate::ported::zle::zle_main::MULT.load(std::sync::atomic::Ordering::SeqCst).saturating_mul(10).saturating_add(digit as i32), std::sync::atomic::Ordering::SeqCst);
}
pub fn neg_argument() {
crate::ported::zle::zle_main::NEG_ARG.store(!crate::ported::zle::zle_main::NEG_ARG.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
}
pub fn undefined_key() {
print!("\x07"); }
pub fn send_break() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().clear();
crate::ported::zle::zle_main::ZLELL.store(0, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(0, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::MARK.store(0, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn vi_put_after() {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
yank();
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
crate::ported::zle::zle_main::ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
}
}
pub fn vi_put_before() {
yank();
}
pub fn overwrite_mode() {
crate::ported::zle::zle_main::INSMODE.fetch_xor(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn copy_prev_word() {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) == 0 {
return;
}
let mut end = crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst);
while end > 0 && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[end - 1].is_whitespace() {
end -= 1;
}
let mut start = end;
while start > 0 && !crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[start - 1].is_whitespace() {
start -= 1;
}
if start < end {
let word: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[start..end].to_vec();
for c in word {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), c);
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLELL.store(crate::ported::zle::zle_main::ZLELINE.lock().unwrap().len(), std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
}
pub fn copy_prev_shell_word() {
copy_prev_word();
}
pub fn pound_insert() {
if !crate::ported::zle::zle_main::ZLELINE.lock().unwrap().is_empty() && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[0] == '#' {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().remove(0);
crate::ported::zle::zle_main::ZLELL.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
crate::ported::zle::zle_main::ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
}
} else {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(0, '#');
crate::ported::zle::zle_main::ZLELL.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn acceptandhold() -> i32 { use std::sync::atomic::Ordering;
let line_str: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().take(crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst)).collect();
crate::ported::zle::zle_main::BUFSTACK.lock().unwrap().insert(0, line_str.clone()); crate::ported::zle::zle_main::STACKCS.store(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst); let line: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().take(crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst)).copied().collect();
if !line.is_empty() {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_front(line);
if crate::ported::zle::zle_main::KILLRING.lock().unwrap().len() > crate::ported::zle::zle_main::KILLRINGMAX.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_back();
}
}
DONE.store(1, Ordering::SeqCst); 0 }
pub fn acceptline() -> i32 { use std::sync::atomic::Ordering;
DONE.store(1, Ordering::SeqCst); 0 }
pub fn addsuffix(tp: i32, flags: i32, chars: Vec<char>, lenstr: i32, lensuf: i32) { suffixlist().lock().unwrap().push(suffixset {
tp, flags, chars, lenstr, lensuf,
});
}
pub fn addsuffixstring(tp: i32, flags: i32, chars: &str, lensuf: i32) { let chars_vec: Vec<char> = chars.chars().collect();
let slen = chars_vec.len() as i32;
addsuffix(tp, flags, chars_vec, slen, lensuf);
}
pub fn argumentbase(args: &[String]) -> i32 { use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
let multbase = if let Some(arg) = args.first() {
let s = arg.as_str();
if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) {
i32::from_str_radix(hex, 16).unwrap_or(0)
} else if s.starts_with('0') && s.len() > 1 {
i32::from_str_radix(&s[1..], 8).unwrap_or(0)
} else {
s.parse::<i32>().unwrap_or(0)
}
} else {
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult };
if multbase < 2 || multbase > 36 {
return 1;
}
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = multbase; crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags = 0;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = 1;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult = 1;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().vibuf = 0;
crate::ported::zle::zle_main::PREFIXFLAG.store(1, std::sync::atomic::Ordering::SeqCst);
0 }
pub fn backwarddeletechar() -> i32 { let n = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult;
if n < 0 {
let saved = n;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = -n;
let ret = deletechar();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = saved;
return ret;
}
let count = (n as usize).min(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst));
for _ in 0..count {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
crate::ported::zle::zle_main::ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().remove(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst));
crate::ported::zle::zle_main::ZLELL.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
}
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0 }
pub fn backwardkillline() -> i32 { let n = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult;
if n < 0 {
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = -n;
let ret = killline();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = n;
return ret;
}
let mut nn = n;
let mut i = 0_usize;
while nn > 0 {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1] == '\n' {
crate::ported::zle::zle_main::ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
i += 1;
} else {
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1] != '\n' {
crate::ported::zle::zle_main::ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
i += 1;
}
}
nn -= 1;
}
if i > 0 {
let text: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)..crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + i).collect();
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_front(text);
if crate::ported::zle::zle_main::KILLRING.lock().unwrap().len() > crate::ported::zle::zle_main::KILLRINGMAX.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_back();
}
crate::ported::zle::zle_main::ZLELL.fetch_sub(i, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0 }
pub fn bracketedpaste(args: &[String]) -> i32 { use crate::ported::utils::quotestring;
let pbuf = bracketedstring(); if let Some(name) = args.first() { std::env::set_var(name, &pbuf);
return 0;
}
let payload = if crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult == 1 { pbuf.clone()
} else {
quotestring(&pbuf, crate::ported::zsh_h::QT_SINGLE_OPTIONAL) };
let wpaste: Vec<char> = payload.chars().collect();
use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
if !crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_VIBUF != 0 {
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = 1; if crate::ported::zle::zle_main::REGION_ACTIVE.load(std::sync::atomic::Ordering::SeqCst) != 0 {
let _ = killregion();
}
for c in wpaste.iter().copied() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), c);
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLELL.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
0 }
pub fn bracketedstring() -> String { use std::sync::atomic::Ordering;
use std::io::Read;
let fd = crate::ported::init::SHTTY.load(Ordering::Relaxed);
if fd < 0 {
return String::new();
}
const ENDESC: &[u8] = b"\x1b[201~"; let mut pbuf: Vec<u8> = Vec::with_capacity(64); let mut endpos: usize = 0;
let mut stdin = std::io::stdin();
let deadline_per_byte = std::time::Duration::from_secs(1);
while endpos < ENDESC.len() { let mut buf = [0u8; 1];
let start = std::time::Instant::now();
let next: u8 = loop {
match stdin.read(&mut buf) {
Ok(1) => break buf[0], Ok(_) => return String::from_utf8_lossy(&pbuf).into_owned(), Err(_) if start.elapsed() < deadline_per_byte => {
std::thread::sleep(std::time::Duration::from_millis(10));
continue;
}
Err(_) => return String::from_utf8_lossy(&pbuf).into_owned(),
}
};
if endpos == 0 || next != ENDESC[endpos] {
endpos = if next == ENDESC[0] { 1 } else { 0 };
} else {
endpos += 1;
}
if (next & 0x80) != 0 && next != 0xff { pbuf.push(0x83); pbuf.push(next ^ 32); } else if next == b'\r' { pbuf.push(b'\n'); } else {
pbuf.push(next); }
}
let strip = endpos.min(pbuf.len());
pbuf.truncate(pbuf.len() - strip);
String::from_utf8_lossy(&pbuf).into_owned()
}
pub fn copyprevshellword() -> i32 { let mut t1 = crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst);
while t1 > 0 && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[t1 - 1].is_whitespace() {
t1 -= 1;
}
let mut t0 = t1;
while t0 > 0 && !crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[t0 - 1].is_whitespace() {
t0 -= 1;
}
if t0 == t1 { return 1; }
let copied: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[t0..t1].to_vec();
for (i, &c) in copied.iter().enumerate() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + i, c);
}
crate::ported::zle::zle_main::ZLECS.fetch_add(copied.len(), std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLELL.fetch_add(copied.len(), std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0
}
pub fn copyprevword() -> i32 { let n = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult;
if n <= 0 { return 1; }
let is_word = |c: char| c.is_alphanumeric() || c == '_';
let mut t0 = crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst);
for _ in 0..n {
while t0 > 0 && !is_word(crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[t0 - 1]) {
t0 -= 1;
}
while t0 > 0 && is_word(crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[t0 - 1]) {
t0 -= 1;
}
}
let mut t1 = t0;
while t1 < crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) && is_word(crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[t1]) {
t1 += 1;
}
let len = t1 - t0;
if len == 0 { return 1; }
let copied: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[t0..t1].to_vec();
for (i, &c) in copied.iter().enumerate() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + i, c);
}
crate::ported::zle::zle_main::ZLECS.fetch_add(len, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLELL.fetch_add(len, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0
}
pub fn copyregionaskill(args: &[String]) -> i32 { if let Some(arg) = args.first() {
let text: Vec<char> = arg.chars().collect();
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_front(text);
if crate::ported::zle::zle_main::KILLRING.lock().unwrap().len() > crate::ported::zle::zle_main::KILLRINGMAX.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_back();
}
return 0;
}
if crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) > crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::MARK.store(crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
}
let (start, end) = if crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) > crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) {
(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst))
} else {
(crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst), crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst))
};
let text: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[start..end].to_vec();
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_front(text);
if crate::ported::zle::zle_main::KILLRING.lock().unwrap().len() > crate::ported::zle::zle_main::KILLRINGMAX.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_back();
}
0
}
pub fn deletechar() -> i32 { let mut n = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult;
if n < 0 {
let saved = n;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = -n;
let ret = backwarddeletechar();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = saved;
return ret;
}
n = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult;
while n > 0 {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) == crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
return 1;
}
crate::ported::zle::zle_move::inccs();
n -= 1;
}
let count = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult.max(0) as usize;
for _ in 0..count {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
crate::ported::zle::zle_main::ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELINE.lock().unwrap().len() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().remove(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst));
crate::ported::zle::zle_main::ZLELL.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
}
}
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0 }
pub fn digitargument() -> i32 { use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
let sign: i32 = if crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult < 0 { -1 } else { 1 };
let newdigit = parsedigit(crate::ported::zle::compcore::LASTCHAR.load(std::sync::atomic::Ordering::SeqCst));
if newdigit < 0 { return 1; }
if !crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_TMULT != 0 {
crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult = 0;
}
if crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_NEG != 0 {
crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult = sign * newdigit;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags &= !MOD_NEG;
} else {
let mut __g_zmod = crate::ported::zle::zle_main::ZMOD.lock().unwrap();
__g_zmod.tmult = __g_zmod.tmult * __g_zmod.base + sign * newdigit;
}
crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags |= MOD_TMULT; crate::ported::zle::zle_main::PREFIXFLAG.store(1, std::sync::atomic::Ordering::SeqCst); 0 }
pub fn doinsert(zstr: &[char]) { let m = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult.unsigned_abs() as usize;
let neg = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult < 0;
for _ in 0..m {
for (i, &c) in zstr.iter().enumerate() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + i, c);
}
if !neg {
crate::ported::zle::zle_main::ZLECS.fetch_add(zstr.len(), std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLELL.fetch_add(zstr.len(), std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub const NAMLEN: usize = 60;
pub fn executenamedcommand(prompt: &str) -> Option<String> { let _ = prompt;
crate::ported::params::getsparam("REPLY") .filter(|s| !s.is_empty())
}
pub fn fixsuffix() { use std::sync::atomic::Ordering;
suffixlist().lock().unwrap().clear();
SUFFIXLEN.store(0, Ordering::SeqCst);
}
pub fn fixunmeta() { crate::ported::zle::compcore::LASTCHAR.fetch_and((0x7f) as i32, std::sync::atomic::Ordering::SeqCst);
if crate::ported::zle::compcore::LASTCHAR.load(std::sync::atomic::Ordering::SeqCst) == b'\r' as i32 {
crate::ported::zle::compcore::LASTCHAR.store((b'\n' as i32) as i32, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::LASTCHAR_WIDE.store((crate::ported::zle::compcore::LASTCHAR.load(std::sync::atomic::Ordering::SeqCst)) as i32, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::LASTCHAR_WIDE_VALID.store(1, std::sync::atomic::Ordering::SeqCst);
}
pub fn gosmacstransposechars() -> i32 { if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < 2 || crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
let twice = crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) == 0 || crate::ported::zle::zle_main::ZLELINE.lock().unwrap().get(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst).saturating_sub(1)) == Some(&'\n');
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) >= crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) || crate::ported::zle::zle_main::ZLELINE.lock().unwrap().get(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)) == Some(&'\n') {
return 1;
}
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
if twice {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) >= crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) || crate::ported::zle::zle_main::ZLELINE.lock().unwrap().get(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)) == Some(&'\n') {
return 1;
}
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
}
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) >= 2 && crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) <= crate::ported::zle::zle_main::ZLELINE.lock().unwrap().len() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().swap(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 2, crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
}
0
}
pub fn iremovesuffix(c: i32, keep: i32) -> i32 { use std::sync::atomic::Ordering;
use crate::ported::zle::compcore::{ZLELINE, ZLECS, ZLELL};
let sf = SUFFIXFUNC.get_or_init(|| std::sync::Mutex::new(String::new()))
.lock().map(|g| g.clone()).unwrap_or_default();
if !sf.is_empty() { let _exists = crate::ported::utils::getshfunc(&sf);
if let Ok(mut g) = SUFFIXFUNC.get_or_init(
|| std::sync::Mutex::new(String::new())
).lock() {
g.clear();
}
}
let list = suffixlist().lock().map(|g| g.clone()).unwrap_or_default();
let mut sl: i32 = 0;
let ch = c as u32;
for entry in list.iter() { let matched = entry.chars.iter().any(|&x| x as u32 == ch);
if matched { if keep == 0 { sl = entry.lensuf; } break;
}
}
if sl > 0 && keep == 0 {
let cs = ZLECS.load(Ordering::Relaxed) as usize;
let drop_n = (sl as usize).min(cs);
let new_cs = cs - drop_n;
if let Ok(mut g) = ZLELINE.get_or_init(
|| std::sync::Mutex::new(String::new())
).lock() {
if new_cs <= g.len() && drop_n <= cs {
g.drain(new_cs..cs);
}
ZLELL.store(g.len() as i32, Ordering::Relaxed);
}
ZLECS.store(new_cs as i32, Ordering::Relaxed);
}
fixsuffix();
0 }
pub static SUFFIXFUNC: std::sync::OnceLock<std::sync::Mutex<String>>
= std::sync::OnceLock::new();
pub fn killbuffer() -> i32 { crate::ported::zle::zle_main::ZLECS.store(0, std::sync::atomic::Ordering::SeqCst);
if !crate::ported::zle::zle_main::ZLELINE.lock().unwrap().is_empty() {
let text: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(..).collect();
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_front(text);
if crate::ported::zle::zle_main::KILLRING.lock().unwrap().len() > crate::ported::zle::zle_main::KILLRINGMAX.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_back();
}
crate::ported::zle::zle_main::ZLELL.store(0, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0 }
pub fn killline() -> i32 { let n_orig = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult;
if n_orig < 0 {
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = -n_orig;
let ret = backwardkillline();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = n_orig;
return ret;
}
let mut n = n_orig;
let start = crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst);
let mut i = 0_usize;
while n > 0 {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELINE.lock().unwrap().len() && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)] == '\n' {
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
i += 1;
} else {
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) != crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)] != '\n' {
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
i += 1;
}
}
n -= 1;
}
if i > 0 {
let text: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(start..start + i).collect();
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_front(text);
if crate::ported::zle::zle_main::KILLRING.lock().unwrap().len() > crate::ported::zle::zle_main::KILLRINGMAX.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_back();
}
crate::ported::zle::zle_main::ZLELL.fetch_sub(i, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(start, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0 }
pub fn killregion() -> i32 { if crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) > crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::MARK.store(crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
}
let (start, end) = if crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) > crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) {
(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst))
} else {
(crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst), crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst))
};
if start < end {
let text: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(start..end).collect();
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_front(text);
if crate::ported::zle::zle_main::KILLRING.lock().unwrap().len() > crate::ported::zle::zle_main::KILLRINGMAX.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_back();
}
crate::ported::zle::zle_main::ZLELL.fetch_sub(end - start, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(start, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::MARK.store(start, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0
}
pub fn killwholeline() -> i32 { let mut n = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult;
if n < 0 { return 1; }
while n > 0 { let _fg = crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 && crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) == crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst);
if _fg {
crate::ported::zle::zle_main::ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
}
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1] != '\n' {
crate::ported::zle::zle_main::ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
}
let mut i = crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst);
while i != crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[i] != '\n' {
i += 1;
}
let drop = i - crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + (if i != crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) { 1 } else { 0 });
if drop > 0 {
let text: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)..crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + drop).collect();
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_front(text);
if crate::ported::zle::zle_main::KILLRING.lock().unwrap().len() > crate::ported::zle::zle_main::KILLRINGMAX.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_back();
}
crate::ported::zle::zle_main::ZLELL.fetch_sub(drop, std::sync::atomic::Ordering::SeqCst);
}
n -= 1;
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0 }
pub fn makeparamsuffix(br: i32, n: i32) { let charstr: Vec<char> = ":[#%?-+=".chars().collect();
let kshcheck = !crate::ported::zsh_h::isset(crate::ported::zsh_h::KSHARRAYS);
let lenstr = if br != 0 || kshcheck { 2 } else { charstr.len() as i32 };
let prefix: Vec<char> = charstr.iter().take(lenstr as usize).copied().collect();
addsuffix(0, 0, prefix, lenstr, n);
}
pub fn makequote(s: &[char]) -> Vec<char> { let qtct = s.iter().filter(|&&c| c == '\'').count();
let mut out = Vec::<char>::with_capacity(s.len() + 2 + qtct * 3);
out.push('\''); for &c in s { if c == '\'' {
out.push('\'');
out.push('\\');
out.push('\'');
out.push('\'');
} else {
out.push(c);
}
}
out.push('\''); out
}
pub fn makesuffix(n: i32) { let suffix_chars = crate::ported::params::getsparam("ZLE_REMOVE_SUFFIX_CHARS")
.unwrap_or_else(|| " \t\n;&|".to_string()); addsuffixstring(0, 0, &suffix_chars, n); }
pub fn makesuffixstr(f: Option<&str>, s: Option<&str>, n: i32) { if let Some(s) = s {
addsuffixstring(0, 0, s, n);
}
}
pub fn negargument() -> i32 { use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
if crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_TMULT != 0 { return 1; }
crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult = -1; crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags |= MOD_TMULT | MOD_NEG; crate::ported::zle::zle_main::PREFIXFLAG.store(1, std::sync::atomic::Ordering::SeqCst); 0 }
pub fn overwritemode() -> i32 { crate::ported::zle::zle_main::INSMODE.fetch_xor(1, std::sync::atomic::Ordering::SeqCst); 0 }
pub fn parsedigit(inkey: i32) -> i32 { let inkey = inkey & 0x7f;
let base = crate::ported::zle::zle_main::ZMOD.lock().unwrap().base;
if base > 10 {
if (b'a' as i32..b'a' as i32 + base - 10).contains(&inkey) {
return inkey - b'a' as i32 + 10; }
if (b'A' as i32..b'A' as i32 + base - 10).contains(&inkey) {
return inkey - b'A' as i32 + 10; }
if (b'0' as i32..=b'9' as i32).contains(&inkey) { return inkey - b'0' as i32;
}
return -1; }
if (b'0' as i32..b'0' as i32 + base).contains(&inkey) {
return inkey - b'0' as i32;
}
-1 }
pub fn pastebuf(buf: &[char], mult: i32, position: i32) -> i32 { if buf.is_empty() {
return 0;
}
if position == 1 && crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::YANKB.store(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
let mut n = mult;
while n > 0 {
for (i, &c) in buf.iter().enumerate() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + i, c);
}
crate::ported::zle::zle_main::ZLECS.fetch_add(buf.len(), std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLELL.fetch_add(buf.len(), std::sync::atomic::Ordering::SeqCst);
n -= 1;
}
crate::ported::zle::zle_main::YANKE.store(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 && *crate::ported::zle::zle_keymap::curkeymapname() == "vicmd" {
crate::ported::zle::zle_main::ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0
}
pub fn poundinsert() -> i32 { use std::sync::atomic::Ordering;
use crate::ported::zle::zle_move::vifirstnonblank;
crate::ported::zle::zle_main::ZLECS.store(0, std::sync::atomic::Ordering::SeqCst); vifirstnonblank(); let at_pound = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().get(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)) == Some(&'#');
if !at_pound {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), '#');
crate::ported::zle::zle_main::ZLELL.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(crate::ported::zle::zle_utils::findeol(), std::sync::atomic::Ordering::SeqCst);
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) != crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
vifirstnonblank();
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), '#');
crate::ported::zle::zle_main::ZLELL.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(crate::ported::zle::zle_utils::findeol(), std::sync::atomic::Ordering::SeqCst);
}
} else {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().remove(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst));
crate::ported::zle::zle_main::ZLELL.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(crate::ported::zle::zle_utils::findeol(), std::sync::atomic::Ordering::SeqCst);
while crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) != crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
vifirstnonblank();
if crate::ported::zle::zle_main::ZLELINE.lock().unwrap().get(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)) == Some(&'#') {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().remove(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst));
crate::ported::zle::zle_main::ZLELL.fetch_sub(1, std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLECS.store(crate::ported::zle::zle_utils::findeol(), std::sync::atomic::Ordering::SeqCst);
}
}
DONE.store(1, Ordering::SeqCst); crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0 }
pub fn putreplaceselection() -> i32 { use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
use crate::ported::zle::zle_vi::startvichange;
let n = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult; let mut pos = 2; startvichange(-1); if n < 0 || crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_NULL != 0 {
return 1; }
let prevbuf: Vec<char> = if crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_VIBUF != 0 {
let idx = crate::ported::zle::zle_main::ZMOD.lock().unwrap().vibuf as usize;
if idx >= crate::ported::zle::zle_main::vibuf().lock().unwrap().len() {
return 1;
}
crate::ported::zle::zle_main::vibuf().lock().unwrap()[idx].clone() } else {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().front().cloned().unwrap_or_default() };
if prevbuf.is_empty() {
return 1; }
crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags = 0; if crate::ported::zle::zle_main::REGION_ACTIVE.load(std::sync::atomic::Ordering::SeqCst) == 2 { pos = if crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) == crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) { 1 } else { 0 };
}
let _ = killregion(); pastebuf(&prevbuf, n, pos) }
pub fn quotedinsert() -> i32 { let _ = getfullchar(false);
if crate::ported::zle::compcore::LASTCHAR.load(std::sync::atomic::Ordering::SeqCst) < 0 { return 1;
}
selfinsert() }
pub fn quoteline() -> i32 { let quoted = makequote(&crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[..crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst)]);
let len = quoted.len();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = quoted;
crate::ported::zle::zle_main::ZLELL.store(len, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(len, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0 }
pub fn quoteregion() -> i32 { let mut extra = *crate::ported::zle::zle_keymap::curkeymapname() == "vicmd";
if crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) > crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::MARK.store(crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
}
if crate::ported::zle::zle_main::REGION_ACTIVE.load(std::sync::atomic::Ordering::SeqCst) == 2 {
let (a, b) = regionlines();
crate::ported::zle::zle_main::ZLECS.store(a, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::MARK.store(b, std::sync::atomic::Ordering::SeqCst);
extra = false;
} else if crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) {
std::mem::swap(&mut crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst), &mut crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst));
}
if extra && crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
crate::ported::zle::zle_main::MARK.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
let region: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)..crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst)].to_vec();
let len = region.len();
let quoted = makequote(®ion);
let qlen = quoted.len();
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)..crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + len);
crate::ported::zle::zle_main::ZLELL.fetch_sub(len, std::sync::atomic::Ordering::SeqCst);
for (i, &c) in quoted.iter().enumerate() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + i, c);
}
crate::ported::zle::zle_main::ZLELL.fetch_add(qlen, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::MARK.store(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.fetch_add(qlen, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0
}
pub fn regionlines() -> (usize, usize) { use crate::ported::zle::zle_utils::{findbol, findeol};
let origcs = crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst);
let start;
let end;
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) < crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) { start = findbol();
crate::ported::zle::zle_main::ZLECS.store(if crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) > crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) { crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) } else { crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst) }, std::sync::atomic::Ordering::SeqCst);
end = findeol();
} else {
end = findeol();
crate::ported::zle::zle_main::ZLECS.store(crate::ported::zle::zle_main::MARK.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
start = findbol();
}
crate::ported::zle::zle_main::ZLECS.store(origcs, std::sync::atomic::Ordering::SeqCst);
(start, end)
}
pub static namedcmdstr: std::sync::Mutex<String> = std::sync::Mutex::new(String::new());
pub static namedcmdll: std::sync::Mutex<Vec<String>> = std::sync::Mutex::new(Vec::new());
pub static namedcmdambig: std::sync::atomic::AtomicUsize = std::sync::atomic::AtomicUsize::new(0);
pub fn scancompcmd(name: &str) -> i32 { use std::sync::atomic::Ordering;
let prefix = namedcmdstr.lock().unwrap().clone();
if !name.starts_with(&prefix) { return 0; }
let mut ll = namedcmdll.lock().unwrap();
let first = ll.first().cloned();
ll.push(name.to_string()); if let Some(f) = first {
let l = f.bytes().zip(name.bytes()).take_while(|(a, b)| a == b).count();
if l < namedcmdambig.load(Ordering::Relaxed) {
namedcmdambig.store(l, Ordering::Relaxed); }
} else {
namedcmdambig.store(name.len(), Ordering::Relaxed);
}
0
}
pub fn selfinsert() -> i32 { if !(crate::ported::zle::zle_main::LASTCHAR_WIDE_VALID.load(std::sync::atomic::Ordering::SeqCst) != 0) { crate::ported::zle::zle_main::LASTCHAR_WIDE.store((crate::ported::zle::compcore::LASTCHAR.load(std::sync::atomic::Ordering::SeqCst)) as i32, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::LASTCHAR_WIDE_VALID.store(1, std::sync::atomic::Ordering::SeqCst);
}
if let Some(c) = char::from_u32(crate::ported::zle::zle_main::LASTCHAR_WIDE.load(std::sync::atomic::Ordering::SeqCst) as u32) {
self_insert(c);
}
0 }
pub fn selfinsertunmeta() -> i32 { fixunmeta();
selfinsert()
}
pub fn sendbreak() -> i32 { crate::ported::utils::errflag.fetch_or(
crate::ported::zsh_h::ERRFLAG_ERROR | crate::ported::zsh_h::ERRFLAG_INT,
std::sync::atomic::Ordering::Relaxed,
);
1 }
pub fn transpose_swap(start: usize, middle: usize, end: usize) { let len1 = middle - start; let len2 = end - middle; let first: Vec<char> = crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[start..middle].to_vec();
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().copy_within(middle..end, start);
for (i, &ch) in first.iter().enumerate() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[start + len2 + i] = ch;
}
let _ = len1;
}
pub fn transposechars() -> i32 { use crate::ported::zle::zle_move::{deccs, decpos, inccs, incpos};
let mut n = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult;
let neg = n < 0; if neg {
n = -n; }
while n > 0 { n -= 1;
let mut ct = crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst); if ct == 0 || crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1] == '\n' { if crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) == crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) || crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)] == '\n' { return 1;
}
if !neg {
inccs(); }
incpos(&mut ct); }
if neg {
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1] != '\n' { deccs(); if ct > 1 && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[ct - 2] != '\n' { decpos(&mut ct); }
}
} else if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) != crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) && crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)] != '\n' {
inccs(); }
if ct == crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) || crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[ct] == '\n' { decpos(&mut ct); }
if ct < 1 || crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[ct - 1] == '\n' { return 1;
}
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().swap(ct - 1, ct);
}
0
}
pub fn undefinedkey() -> i32 { 1
}
pub fn universalargument(args: &[String]) -> i32 { use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
if let Some(a) = args.first() {
if let Ok(n) = a.parse::<i32>() {
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = n;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags |= MOD_MULT;
return 0;
}
}
let digcnt = 0;
if digcnt == 0 {
crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult = crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult.saturating_mul(4); }
crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags |= MOD_TMULT; crate::ported::zle::zle_main::PREFIXFLAG.store(1, std::sync::atomic::Ordering::SeqCst); 0
}
pub fn viputafter() -> i32 { use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
use crate::ported::zle::zle_vi::startvichange;
let n = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult; startvichange(-1); if n < 0 {
return 1; }
if crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_NULL != 0 {
return 0; }
let buf: Vec<char> = if crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_VIBUF != 0 {
let idx = crate::ported::zle::zle_main::ZMOD.lock().unwrap().vibuf as usize;
if idx >= crate::ported::zle::zle_main::vibuf().lock().unwrap().len() {
return 1;
}
crate::ported::zle::zle_main::vibuf().lock().unwrap()[idx].clone() } else {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().front().cloned().unwrap_or_default() };
if buf.is_empty() {
return 1; }
pastebuf(&buf, n, 1) }
pub fn viputbefore() -> i32 { use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
use crate::ported::zle::zle_vi::startvichange;
let n = crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult; startvichange(-1); if n < 0 {
return 1; }
if crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_NULL != 0 {
return 0; }
let buf: Vec<char> = if crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_VIBUF != 0 {
let idx = crate::ported::zle::zle_main::ZMOD.lock().unwrap().vibuf as usize;
if idx >= crate::ported::zle::zle_main::vibuf().lock().unwrap().len() {
return 1;
}
crate::ported::zle::zle_main::vibuf().lock().unwrap()[idx].clone() } else {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().front().cloned().unwrap_or_default() };
if buf.is_empty() {
return 1; }
pastebuf(&buf, n, 0) }
pub fn whatcursorposition() -> i32 { use crate::ported::zle::zle_utils::findbol;
let bol = findbol(); let mut msg = String::with_capacity(100);
if crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) == crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) { msg.push_str("EOF"); } else {
msg.push_str("Char: "); let c = crate::ported::zle::zle_main::ZLELINE.lock().unwrap()[crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst)]; match c {
' ' => msg.push_str("SPC"), '\t' => msg.push_str("TAB"), '\n' => msg.push_str("LFD"), _ => msg.push(c), }
let cu = c as u32;
msg.push_str(&format!(" (0{:o}, {}, 0x{:x})", cu, cu, cu)); }
let pct = if crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) > 0 { 100 * crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) / crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) } else { 0 };
msg.push_str(&format!(
" point {} of {}({}%) column {}",
crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + 1,
crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst) + 1,
pct,
crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) - bol,
)); crate::ported::zle::zle_utils::showmsg(&msg);
0
}
pub fn yankpop() -> i32 { let last = crate::ported::zle::zle_main::LASTCMD.load(std::sync::atomic::Ordering::SeqCst) as i32;
if (last & ZLE_YANK) == 0 || crate::ported::zle::zle_main::KILLRING.lock().unwrap().is_empty() {
return 1;
}
let prev_start = crate::ported::zle::zle_main::YANKB.load(std::sync::atomic::Ordering::SeqCst);
let prev_end = crate::ported::zle::zle_main::YANKE.load(std::sync::atomic::Ordering::SeqCst);
if prev_end > prev_start && prev_end <= crate::ported::zle::zle_main::ZLELINE.lock().unwrap().len() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().drain(prev_start..prev_end);
crate::ported::zle::zle_main::ZLELL.fetch_sub(prev_end - prev_start, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(prev_start, std::sync::atomic::Ordering::SeqCst);
}
if let Some(top) = crate::ported::zle::zle_main::KILLRING.lock().unwrap().pop_front() {
crate::ported::zle::zle_main::KILLRING.lock().unwrap().push_back(top);
}
if let Some(next) = crate::ported::zle::zle_main::KILLRING.lock().unwrap().front().cloned() {
for (i, &c) in next.iter().enumerate() {
crate::ported::zle::zle_main::ZLELINE.lock().unwrap().insert(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst) + i, c);
}
crate::ported::zle::zle_main::YANKB.store(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.fetch_add(next.len(), std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLELL.fetch_add(next.len(), std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::YANKE.store(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), std::sync::atomic::Ordering::SeqCst);
}
crate::ported::zle::zle_main::ZLE_RESET_NEEDED.store(1, std::sync::atomic::Ordering::SeqCst);
0
}
pub fn processcmd(_args: &[String]) -> i32 { 0
}
pub fn zgetline(_args: &[String]) -> i32 { 0
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::atomic::Ordering;
#[test]
fn acceptline_sets_done() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
DONE.store(0, Ordering::SeqCst);
let r = acceptline();
assert_eq!(r, 0);
assert_eq!(DONE.load(Ordering::SeqCst), 1);
}
#[test]
fn undefinedkey_returns_one() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(undefinedkey(), 1);
}
#[test]
fn sendbreak_sets_errflag_and_returns_one() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
use crate::ported::zsh_h::{ERRFLAG_ERROR, ERRFLAG_INT};
use std::sync::atomic::Ordering;
crate::ported::utils::errflag.store(0, Ordering::Relaxed);
let r = sendbreak();
assert_eq!(r, 1);
let f = crate::ported::utils::errflag.load(Ordering::Relaxed);
assert!(f & ERRFLAG_ERROR != 0);
assert!(f & ERRFLAG_INT != 0);
crate::ported::utils::errflag.store(0, Ordering::Relaxed);
}
#[test]
fn sendbreak_preserves_existing_errflag_bits() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
use std::sync::atomic::Ordering;
crate::ported::utils::errflag.store(0x1000, Ordering::Relaxed); sendbreak();
let f = crate::ported::utils::errflag.load(Ordering::Relaxed);
assert!(f & 0x1000 != 0);
assert!(f & crate::ported::zsh_h::ERRFLAG_ERROR != 0);
assert!(f & crate::ported::zsh_h::ERRFLAG_INT != 0);
crate::ported::utils::errflag.store(0, Ordering::Relaxed);
}
#[test]
fn negargument_sets_tmult_neg_prefix() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult = 1;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags = 0;
crate::ported::zle::zle_main::PREFIXFLAG.store(0, std::sync::atomic::Ordering::SeqCst);
let r = negargument();
assert_eq!(r, 0);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult, -1);
assert!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_TMULT != 0);
assert!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_NEG != 0);
assert!(crate::ported::zle::zle_main::PREFIXFLAG.load(std::sync::atomic::Ordering::SeqCst) != 0);
}
#[test]
fn negargument_refuses_when_tmult_in_flight() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags |= MOD_TMULT;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult = 7; let r = negargument();
assert_eq!(r, 1);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult, 7);
}
#[test]
fn overwritemode_toggles_insmode() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::INSMODE.store(1, std::sync::atomic::Ordering::SeqCst);
overwritemode();
assert_eq!(crate::ported::zle::zle_main::INSMODE.load(std::sync::atomic::Ordering::SeqCst), 0);
overwritemode();
assert_eq!(crate::ported::zle::zle_main::INSMODE.load(std::sync::atomic::Ordering::SeqCst), 1);
}
#[test]
fn argumentbase_with_arg_sets_base() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
let r = argumentbase(&["8".to_string()]);
assert_eq!(r, 0);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().base, 8);
assert!(crate::ported::zle::zle_main::PREFIXFLAG.load(std::sync::atomic::Ordering::SeqCst) != 0);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult, 1);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult, 1);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().vibuf, 0);
}
#[test]
fn argumentbase_no_arg_uses_zmod_mult() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = 16;
argumentbase(&[]);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().base, 16);
}
#[test]
fn argumentbase_rejects_below_two() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 10;
let r = argumentbase(&["1".to_string()]);
assert_eq!(r, 1);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().base, 10); }
#[test]
fn argumentbase_rejects_above_36() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 10;
let r = argumentbase(&["100".to_string()]);
assert_eq!(r, 1);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().base, 10);
}
#[test]
fn argumentbase_hex_prefix() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
argumentbase(&["0x10".to_string()]);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().base, 16);
}
#[test]
fn argumentbase_octal_prefix() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
argumentbase(&["010".to_string()]);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().base, 8);
}
#[test]
fn parsedigit_decimal_base() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 10;
assert_eq!(parsedigit(b'0' as i32), 0);
assert_eq!(parsedigit(b'5' as i32), 5);
assert_eq!(parsedigit(b'9' as i32), 9);
assert_eq!(parsedigit(b'a' as i32), -1);
}
#[test]
fn parsedigit_octal_base() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 8;
assert_eq!(parsedigit(b'7' as i32), 7);
assert_eq!(parsedigit(b'8' as i32), -1);
}
#[test]
fn parsedigit_hex_lowercase() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 16;
assert_eq!(parsedigit(b'a' as i32), 10);
assert_eq!(parsedigit(b'f' as i32), 15);
assert_eq!(parsedigit(b'g' as i32), -1);
}
#[test]
fn parsedigit_hex_uppercase() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 16;
assert_eq!(parsedigit(b'A' as i32), 10);
assert_eq!(parsedigit(b'F' as i32), 15);
}
#[test]
fn parsedigit_hex_digits_still_work() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 16;
assert_eq!(parsedigit(b'7' as i32), 7);
}
#[test]
fn parsedigit_strips_meta_bit() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 10;
assert_eq!(parsedigit(0x80 | (b'5' as i32)), 5);
}
#[test]
fn digitargument_first_digit_no_tmult() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags = 0;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 10;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = 1; crate::ported::zle::compcore::LASTCHAR.store((b'5' as i32) as i32, std::sync::atomic::Ordering::SeqCst);
let r = digitargument();
assert_eq!(r, 0);
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult, 5);
assert!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_TMULT != 0);
assert!(crate::ported::zle::zle_main::PREFIXFLAG.load(std::sync::atomic::Ordering::SeqCst) != 0);
}
#[test]
fn digitargument_second_digit_accumulates() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags = MOD_TMULT;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult = 5;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 10;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = 1; crate::ported::zle::compcore::LASTCHAR.store((b'7' as i32) as i32, std::sync::atomic::Ordering::SeqCst);
digitargument();
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult, 57);
}
#[test]
fn digitargument_invalid_returns_one() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 10;
crate::ported::zle::compcore::LASTCHAR.store((b'a' as i32) as i32, std::sync::atomic::Ordering::SeqCst); assert_eq!(digitargument(), 1);
}
#[test]
fn digitargument_neg_flag_replaces_tmult() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
use crate::ported::zle::zle_h::{MOD_MULT, MOD_TMULT, MOD_VIBUF, MOD_VIAPP, MOD_NEG, MOD_NULL, MOD_CHAR, MOD_LINE, MOD_PRI, MOD_CLIP, MOD_OSSEL};
crate::ported::zle::zle_main::zle_reset();
crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags = MOD_TMULT | MOD_NEG;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult = -1; crate::ported::zle::zle_main::ZMOD.lock().unwrap().base = 10;
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = -1; crate::ported::zle::compcore::LASTCHAR.store((b'3' as i32) as i32, std::sync::atomic::Ordering::SeqCst);
digitargument();
assert_eq!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().tmult, -3);
assert!(!crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_NEG != 0);
assert!(crate::ported::zle::zle_main::ZMOD.lock().unwrap().flags & MOD_TMULT != 0);
}
#[test]
fn transpose_swap_equal_halves() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "abcdef".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(6, std::sync::atomic::Ordering::SeqCst);
transpose_swap(0, 2, 4);
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "cdabef");
}
#[test]
fn transpose_swap_unequal_halves() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "abcdef".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(6, std::sync::atomic::Ordering::SeqCst);
transpose_swap(0, 1, 4);
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "bcdaef");
}
#[test]
fn transpose_swap_first_longer() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "abcdef".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(6, std::sync::atomic::Ordering::SeqCst);
transpose_swap(0, 3, 4);
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "dabcef");
}
#[test]
fn transpose_swap_mid_buffer() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::zle_main::zle_reset();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "0123456789".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(10, std::sync::atomic::Ordering::SeqCst);
transpose_swap(3, 5, 7);
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "0125634789");
}
#[test]
fn fixunmeta_strips_meta_and_normalizes_cr() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
crate::ported::zle::compcore::LASTCHAR.store((0x80 | b'a' as i32) as i32, std::sync::atomic::Ordering::SeqCst);
fixunmeta();
assert_eq!(crate::ported::zle::compcore::LASTCHAR.load(std::sync::atomic::Ordering::SeqCst), b'a' as i32);
crate::ported::zle::compcore::LASTCHAR.store((b'\r' as i32) as i32, std::sync::atomic::Ordering::SeqCst);
fixunmeta();
assert_eq!(crate::ported::zle::compcore::LASTCHAR.load(std::sync::atomic::Ordering::SeqCst), b'\n' as i32);
}
#[test]
fn selfinsert_inserts_lastchar() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "abc".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(3, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::compcore::LASTCHAR.store((b'X' as i32) as i32, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::LASTCHAR_WIDE_VALID.store(0, std::sync::atomic::Ordering::SeqCst);
selfinsert();
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "aXbc");
}
#[test]
fn selfinsertunmeta_chains_fixunmeta_and_selfinsert() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "ab".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(2, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::compcore::LASTCHAR.store((0x80 | b'X' as i32) as i32, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::LASTCHAR_WIDE_VALID.store(0, std::sync::atomic::Ordering::SeqCst);
selfinsertunmeta();
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "aXb");
}
#[test]
fn deletechar_removes_n_chars() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "hello".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(5, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(0, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = 2;
let r = deletechar();
assert_eq!(r, 0);
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "llo");
}
#[test]
fn deletechar_returns_one_at_eol() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "ab".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(2, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(2, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = 1;
assert_eq!(deletechar(), 1);
}
#[test]
fn backwarddeletechar_clamps_to_zlecs() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "abc".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(3, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(2, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = 99;
backwarddeletechar();
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "c");
assert_eq!(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), 0);
}
#[test]
fn killline_kills_to_eol_and_pushes_killring() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "hello world".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(11, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(6, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = 1;
killline();
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "hello ");
assert_eq!(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), 6);
assert_eq!(crate::ported::zle::zle_main::KILLRING.lock().unwrap().front().map(|v| v.iter().collect::<String>()),
Some("world".to_string()));
}
#[test]
fn killbuffer_clears_and_pushes() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "abc".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(3, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(2, std::sync::atomic::Ordering::SeqCst);
killbuffer();
assert!(crate::ported::zle::zle_main::ZLELINE.lock().unwrap().is_empty());
assert_eq!(crate::ported::zle::zle_main::ZLELL.load(std::sync::atomic::Ordering::SeqCst), 0);
assert_eq!(crate::ported::zle::zle_main::ZLECS.load(std::sync::atomic::Ordering::SeqCst), 0);
assert_eq!(crate::ported::zle::zle_main::KILLRING.lock().unwrap().front().map(|v| v.iter().collect::<String>()),
Some("abc".to_string()));
}
#[test]
fn killwholeline_drops_one_line() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "abc\ndef\nghi".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(11, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(5, std::sync::atomic::Ordering::SeqCst); crate::ported::zle::zle_main::ZMOD.lock().unwrap().mult = 1;
killwholeline();
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "abc\nghi");
}
#[test]
fn copyregionaskill_copies_between_point_mark() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "hello".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(5, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(0, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::MARK.store(3, std::sync::atomic::Ordering::SeqCst);
copyregionaskill(&[]);
assert_eq!(crate::ported::zle::zle_main::KILLRING.lock().unwrap().front().map(|v| v.iter().collect::<String>()),
Some("hel".to_string()));
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "hello");
}
#[test]
fn regionlines_returns_bol_eol_around_region() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "abc\ndef\nghi".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(11, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::MARK.store(5, std::sync::atomic::Ordering::SeqCst);
let (start, end) = regionlines();
assert_eq!(start, 0);
assert_eq!(end, 7);
}
#[test]
fn killregion_drains_between_mark_and_cursor() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "abcdef".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(6, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(1, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::MARK.store(4, std::sync::atomic::Ordering::SeqCst);
killregion();
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "aef");
assert_eq!(crate::ported::zle::zle_main::KILLRING.lock().unwrap().front().map(|v| v.iter().collect::<String>()),
Some("bcd".to_string()));
}
#[test]
fn quoteline_wraps_in_single_quotes() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "abc".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(3, std::sync::atomic::Ordering::SeqCst);
quoteline();
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "'abc'");
}
#[test]
fn quoteline_escapes_internal_quote() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "it's".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(4, std::sync::atomic::Ordering::SeqCst);
quoteline();
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "'it'\\''s'");
}
#[test]
fn makequote_handles_no_quotes() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let s: Vec<char> = "abc".chars().collect();
let q = makequote(&s);
assert_eq!(q.iter().collect::<String>(), "'abc'");
}
#[test]
fn makequote_escapes_quotes() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let s: Vec<char> = "a'b".chars().collect();
let q = makequote(&s);
assert_eq!(q.iter().collect::<String>(), "'a'\\''b'");
}
#[test]
fn pastebuf_inserts_at_cursor_position_zero() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "foo".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(3, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(1, std::sync::atomic::Ordering::SeqCst);
let buf: Vec<char> = "XX".chars().collect();
pastebuf(&buf, 1, 0);
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "fXXoo");
}
#[test]
fn pastebuf_inserts_after_cursor_position_one() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
*crate::ported::zle::zle_main::ZLELINE.lock().unwrap() = "foo".chars().collect();
crate::ported::zle::zle_main::ZLELL.store(3, std::sync::atomic::Ordering::SeqCst);
crate::ported::zle::zle_main::ZLECS.store(1, std::sync::atomic::Ordering::SeqCst);
let buf: Vec<char> = "XX".chars().collect();
pastebuf(&buf, 1, 1);
let s: String = crate::ported::zle::zle_main::ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "foXXo");
}
#[test]
fn yankpop_returns_one_when_lastcmd_not_yank() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(yankpop(), 1);
}
#[test]
fn zle_usable_when_active_and_no_compfunc() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
use crate::ported::builtins::sched::zleactive;
use crate::ported::zle::complete::INCOMPFUNC;
use std::sync::atomic::Ordering;
zleactive.store(1, Ordering::SeqCst);
INCOMPFUNC.store(0, Ordering::SeqCst);
assert_eq!(super::super::zle_thingy::zle_usable(), 1);
INCOMPFUNC.store(1, Ordering::SeqCst);
assert_eq!(super::super::zle_thingy::zle_usable(), 0);
INCOMPFUNC.store(0, Ordering::SeqCst);
zleactive.store(0, Ordering::SeqCst);
assert_eq!(super::super::zle_thingy::zle_usable(), 0);
}
}