use std::collections::HashMap;
use crate::ported::utils::{quotedzputs, zwarnnam};
use crate::ported::zle::complete::INCOMPFUNC;
use crate::ported::zle::complete::COMPQSTACK;
use crate::ported::zsh_h::OPT_ISSET;
#[allow(unused_imports)]
#[allow(unused_imports)]
use crate::ported::zle::zle_main::*;
#[allow(unused_imports)]
use crate::ported::zle::zle_misc::*;
#[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 const CRT_SIMPLE: i32 = 0; pub const CRT_DESC: i32 = 1; pub const CRT_SPEC: i32 = 2; pub const CRT_DUMMY: i32 = 3; pub const CRT_EXPL: i32 = 4;
pub const CDF_SEP: i32 = 1;
pub const CAO_NEXT: i32 = 1; pub const CAO_DIRECT: i32 = 2; pub const CAO_ODIRECT: i32 = 3; pub const CAO_EQUAL: i32 = 4; pub const CAO_OEQUAL: i32 = 5;
pub const CAA_NORMAL: i32 = 1; pub const CAA_OPT: i32 = 2; pub const CAA_REST: i32 = 3; pub const CAA_RARGS: i32 = 4; pub const CAA_RREST: i32 = 5;
pub const MAX_CACACHE: usize = 8;
pub const CVV_NOARG: i32 = 0; pub const CVV_ARG: i32 = 1; pub const CVV_OPT: i32 = 2;
pub const MAX_CVCACHE: usize = 8;
pub const MAX_TAGS: usize = 256;
pub const PATH_MAX2: usize = 8192;
pub type Cdset = Box<cdset>; pub type Cdstr = Box<cdstr>; pub type Cdrun = Box<cdrun>;
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct cdstr { pub next: Option<Box<cdstr>>, pub str: Option<String>, pub desc: Option<String>, pub r#match: Option<String>, pub sortstr: Option<String>, pub len: i32, pub width: i32, pub other: Option<Box<cdstr>>, pub kind: i32, pub set: usize, pub run: Option<Box<cdstr>>, }
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct cdrun { pub next: Option<Box<cdrun>>, pub r#type: i32, pub strs: Option<Box<cdstr>>, pub count: i32, }
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct cdset { pub next: Option<Box<cdset>>, pub opts: Option<Vec<String>>, pub strs: Option<Box<cdstr>>, pub count: i32, pub desc: i32, }
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct cdstate { pub showd: i32, pub sep: Option<String>, pub slen: i32, pub swidth: i32, pub maxmlen: i32, pub sets: Option<Box<cdset>>, pub pre: i32, pub premaxw: i32, pub suf: i32, pub maxg: i32, pub maxglen: i32, pub groups: i32, pub descs: i32, pub gprew: i32, pub runs: Option<Box<cdrun>>, }
pub static cd_state: std::sync::Mutex<cdstate> = std::sync::Mutex::new(cdstate {
showd: 0, sep: None, slen: 0, swidth: 0, maxmlen: 0,
sets: None, pre: 0, premaxw: 0, suf: 0, maxg: 0, maxglen: 0,
groups: 0, descs: 0, gprew: 0, runs: None,
});
pub static cd_parsed: std::sync::atomic::AtomicI32 = std::sync::atomic::AtomicI32::new(0);
pub fn cd_calc() { }
pub fn cd_sort(_a: *const std::ffi::c_void, _b: *const std::ffi::c_void) -> i32 { 0
}
pub fn cd_prep() -> i32 { 0
}
#[allow(clippy::too_many_arguments)]
pub fn cd_init(_nam: &str, _hide: &str, _mlen: &str, _sep: &str, _opts: &[String], _args: &[String], _disp: &[String],
_hideopt: i32) -> i32 {
0
}
pub fn cd_get(_params: &[String]) -> i32 { 0
}
pub fn cd_arrcat(a: &[String], b: &[String]) -> Vec<String> { let mut out = a.to_vec();
out.extend_from_slice(b);
out
}
pub fn cd_arrdup(a: &[String]) -> Vec<String> { a.to_vec()
}
pub fn freecdsets(mut p: Option<Box<cdset>>) { while let Some(mut set) = p { p = set.next.take(); set.opts = None;
let mut s = set.strs.take();
while let Some(mut node) = s {
s = node.next.take();
node.sortstr = None; node.str = None; node.desc = None; node.r#match = None;
drop(node); }
if let Ok(mut st) = cd_state.lock() {
let mut r = st.runs.take();
while let Some(mut run) = r {
r = run.next.take();
drop(run); }
}
drop(set); }
}
pub type Cadef = Box<cadef>; pub type Caopt = Box<caopt>; pub type Caarg = Box<caarg>;
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct caarg { pub next: Option<Box<caarg>>, pub descr: Option<String>, pub xor: Option<Vec<String>>, pub action: Option<String>, pub r#type: i32, pub end: Option<String>, pub opt: Option<String>, pub num: i32, pub min: i32, pub direct: i32, pub active: i32, pub gsname: Option<String>, }
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct caopt { pub next: Option<Box<caopt>>, pub name: Option<String>, pub descr: Option<String>, pub xor: Option<Vec<String>>, pub r#type: i32, pub args: Option<Box<caarg>>, pub active: i32, pub num: i32, pub gsname: Option<String>, pub not: i32, }
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct cadef { pub next: Option<Box<cadef>>, pub snext: Option<Box<cadef>>, pub opts: Option<Box<caopt>>, pub nopts: i32, pub ndopts: i32, pub nodopts: i32, pub args: Option<Box<caarg>>, pub rest: Option<Box<caarg>>, pub defs: Option<Vec<String>>, pub ndefs: i32, pub lastt: i64, pub single: Option<Vec<Option<Box<caopt>>>>, pub r#match: Option<String>, pub argsactive: i32, pub set: Option<String>, pub flags: i32, pub nonarg: Option<String>, }
pub fn freecaargs(mut a: Option<Box<caarg>>) { while let Some(mut node) = a { a = node.next.take(); node.descr = None; node.xor = None; node.action = None; node.end = None; node.opt = None; drop(node); }
}
pub fn freecadef(mut d: Option<Box<cadef>>) { while let Some(mut node) = d { d = node.snext.take(); node.r#match = None;
node.set = None;
node.defs = None;
let mut p = node.opts.take();
while let Some(mut popt) = p {
p = popt.next.take();
popt.name = None;
popt.descr = None;
popt.xor = None;
freecaargs(popt.args.take()); drop(popt); }
freecaargs(node.args.take()); freecaargs(node.rest.take()); node.nonarg = None; node.single = None; drop(node); }
}
pub type Castate = Box<castate>;
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct castate { pub snext: Option<Box<castate>>, pub d: Option<Box<cadef>>, pub nopts: i32, pub def: Option<Box<caarg>>, pub ddef: Option<Box<caarg>>, pub curopt: Option<Box<caopt>>, pub dopt: Option<Box<caopt>>, pub opt: i32, pub arg: i32, pub argbeg: i32, pub optbeg: i32, pub nargbeg: i32, pub restbeg: i32, pub curpos: i32, pub argend: i32, pub inopt: i32, pub inarg: i32, pub nth: i32, pub singles: i32, pub oopt: i32, pub actopts: i32, pub args: Option<Vec<String>>, pub oargs: Option<Vec<Option<Vec<String>>>>, }
pub static ca_laststate: std::sync::Mutex<castate> = std::sync::Mutex::new(castate {
snext: None, d: None, nopts: 0, def: None, ddef: None,
curopt: None, dopt: None, opt: 0, arg: 0, argbeg: 0, optbeg: 0,
nargbeg: 0, restbeg: 0, curpos: 0, argend: 0, inopt: 0,
inarg: 0, nth: 0, singles: 0, oopt: 0, actopts: 0,
args: None, oargs: None,
});
pub static ca_parsed: std::sync::atomic::AtomicI32 = std::sync::atomic::AtomicI32::new(0);
pub static ca_alloced: std::sync::atomic::AtomicI32 = std::sync::atomic::AtomicI32::new(0);
pub static ca_doff: std::sync::atomic::AtomicI32 = std::sync::atomic::AtomicI32::new(0);
pub fn freecastate(s: &mut castate) { s.args = None; s.oargs = None; }
pub type Cvdef = Box<cvdef>; pub type Cvval = Box<cvval>;
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct cvdef { pub descr: Option<String>, pub hassep: i32, pub sep: i32, pub argsep: i32, pub next: Option<Box<cvdef>>, pub vals: Option<Box<cvval>>, pub defs: Option<Vec<String>>, pub ndefs: i32, pub lastt: i64, pub words: i32, }
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct cvval { pub next: Option<Box<cvval>>, pub name: Option<String>, pub descr: Option<String>, pub xor: Option<Vec<String>>, pub r#type: i32, pub arg: Option<Box<caarg>>, pub active: i32, }
pub fn freecvdef(d: Option<Box<cvdef>>) { let Some(mut node) = d else { return; }; node.descr = None; node.defs = None; let mut p = node.vals.take();
while let Some(mut v) = p { p = v.next.take(); v.name = None; v.descr = None; v.xor = None; freecaargs(v.arg.take()); drop(v); }
drop(node); }
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct cvstate { pub d: Option<Box<cvdef>>, pub def: Option<Box<caarg>>, pub val: Option<Box<cvval>>, pub vals: Option<Vec<String>>, }
pub static cv_laststate: std::sync::Mutex<cvstate> = std::sync::Mutex::new(cvstate {
d: None, def: None, val: None, vals: None,
});
pub static cv_parsed: std::sync::atomic::AtomicI32 = std::sync::atomic::AtomicI32::new(0);
pub static cv_alloced: std::sync::atomic::AtomicI32 = std::sync::atomic::AtomicI32::new(0);
pub type Ctags = Box<ctags>; pub type Ctset = Box<ctset>;
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct ctags { pub all: Option<Vec<String>>, pub context: Option<String>, pub init: i32, pub sets: Option<Box<ctset>>, }
#[derive(Debug, Default)]
#[allow(non_camel_case_types)]
pub struct ctset { pub next: Option<Box<ctset>>, pub tags: Option<Vec<String>>, pub tag: Option<String>, pub ptr: i32, }
pub fn freectset(mut s: Option<Box<ctset>>) { while let Some(mut node) = s { s = node.next.take(); node.tags = None; node.tag = None; drop(node); }
}
pub fn freectags(t: Option<Box<ctags>>) { let Some(mut node) = t else { return; }; node.all = None; node.context = None; freectset(node.sets.take()); drop(node); }
pub fn rembslashcolon(s: &str) -> String { let bytes = s.as_bytes(); let mut out = Vec::<u8>::with_capacity(bytes.len());
let mut i = 0;
while i < bytes.len() { let drop = bytes[i] == b'\\'
&& i + 1 < bytes.len()
&& bytes[i + 1] == b':';
if !drop {
out.push(bytes[i]); }
i += 1; }
String::from_utf8(out).unwrap_or_default() }
pub fn bslashcolon(s: &str) -> String { let bytes = s.as_bytes(); let mut out = Vec::<u8>::with_capacity(2 * bytes.len() + 1);
for &b in bytes { if b == b':' { out.push(b'\\'); }
out.push(b); }
String::from_utf8(out).unwrap_or_default() }
pub fn single_index(pre: u8, opt: u8) -> i32 { if opt <= 0x20 || opt > 0x7e { return -1; }
let off: i32 = if pre == b'-' { -0x21 } else { 94 - 0x21 };
(opt as i32) + off
}
#[cfg(test)]
mod cao_caa_tests {
use super::*;
#[test]
fn cao_values_match_c_source() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(CAO_NEXT, 1);
assert_eq!(CAO_DIRECT, 2);
assert_eq!(CAO_ODIRECT, 3);
assert_eq!(CAO_EQUAL, 4);
assert_eq!(CAO_OEQUAL, 5);
}
#[test]
fn caa_values_match_c_source() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(CAA_NORMAL, 1);
assert_eq!(CAA_OPT, 2);
assert_eq!(CAA_REST, 3);
assert_eq!(CAA_RARGS, 4);
assert_eq!(CAA_RREST, 5);
}
#[test]
fn crt_values_match_c_source() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(CRT_SIMPLE, 0);
assert_eq!(CRT_DESC, 1);
assert_eq!(CRT_SPEC, 2);
assert_eq!(CRT_DUMMY, 3);
assert_eq!(CRT_EXPL, 4);
}
#[test]
fn cvv_values_match_c_source() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(CVV_NOARG, 0);
assert_eq!(CVV_ARG, 1);
assert_eq!(CVV_OPT, 2);
}
#[test]
fn cache_sizes_are_8() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(MAX_CACACHE, 8);
assert_eq!(MAX_CVCACHE, 8);
}
#[test]
fn max_tags_is_256() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(MAX_TAGS, 256);
}
#[test]
fn path_max2_is_8192() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(PATH_MAX2, 8192);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_rembslashcolon() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(rembslashcolon("a\\:b\\:c"), "a:b:c");
}
#[test]
fn test_rembslashcolon_lone_backslash_kept() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(rembslashcolon("a\\nb"), "a\\nb");
}
#[test]
fn test_rembslashcolon_trailing_backslash() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(rembslashcolon("a\\"), "a\\");
}
#[test]
fn test_rembslashcolon_unescaped_colon_passes_through() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(rembslashcolon("a:b"), "a:b");
}
#[test]
fn test_bslashcolon() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(bslashcolon("a:b:c"), "a\\:b\\:c");
}
#[test]
fn test_bslashcolon_no_colons() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(bslashcolon("hello"), "hello");
}
#[test]
fn test_bslashcolon_already_escaped_doubled() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(bslashcolon("a\\:b"), "a\\\\:b");
}
#[test]
fn test_single_index_dash_prefix() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(single_index(b'-', b'a'), 64);
assert_eq!(single_index(b'-', b'A'), 32);
assert_eq!(single_index(b'-', b'!'), 0);
assert_eq!(single_index(b'-', b'~'), 93);
}
#[test]
fn test_single_index_plus_prefix() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(single_index(b'+', b'a'), 158);
assert_eq!(single_index(b'+', b'!'), 94);
assert_eq!(single_index(b'+', b'~'), 187);
}
#[test]
fn test_single_index_out_of_range() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(single_index(b'-', 0x20), -1); assert_eq!(single_index(b'-', 0x00), -1); assert_eq!(single_index(b'-', 0x7f), -1); assert_eq!(single_index(b'+', 0xff), -1); }
#[test]
fn caarg_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let a = caarg::default();
assert!(a.next.is_none());
assert!(a.descr.is_none());
assert!(a.action.is_none());
assert_eq!(a.r#type, 0);
assert_eq!(a.num, 0);
assert_eq!(a.active, 0);
}
#[test]
fn caopt_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let o = caopt::default();
assert!(o.next.is_none());
assert!(o.name.is_none());
assert!(o.args.is_none());
assert_eq!(o.r#type, 0);
assert_eq!(o.num, 0);
assert_eq!(o.not, 0);
}
#[test]
fn cadef_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let d = cadef::default();
assert!(d.next.is_none());
assert!(d.opts.is_none());
assert!(d.args.is_none());
assert_eq!(d.nopts, 0);
assert_eq!(d.flags, 0);
}
#[test]
fn freecaargs_walks_chain() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let mut head = caarg { descr: Some("a".into()), ..Default::default() };
let mid = caarg { descr: Some("b".into()), ..Default::default() };
let tail = caarg { descr: Some("c".into()), ..Default::default() };
let mut mid_box = Box::new(mid);
mid_box.next = Some(Box::new(tail));
head.next = Some(mid_box);
freecaargs(Some(Box::new(head)));
}
#[test]
fn cao_caa_constants_match_c() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(CAO_NEXT, 1);
assert_eq!(CAO_DIRECT, 2);
assert_eq!(CAO_ODIRECT, 3);
assert_eq!(CAO_EQUAL, 4);
assert_eq!(CAO_OEQUAL, 5);
assert_eq!(CAA_NORMAL, 1);
assert_eq!(CAA_OPT, 2);
assert_eq!(CAA_REST, 3);
assert_eq!(CAA_RARGS, 4);
assert_eq!(CAA_RREST, 5);
}
#[test]
fn cdf_max_cacache_constants_match_c() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(CDF_SEP, 1);
assert_eq!(MAX_CACACHE, 8);
}
#[test]
fn crt_constants_match_c() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(CRT_SIMPLE, 0);
assert_eq!(CRT_DESC, 1);
assert_eq!(CRT_SPEC, 2);
assert_eq!(CRT_DUMMY, 3);
assert_eq!(CRT_EXPL, 4);
}
#[test]
fn cdstr_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let s = cdstr::default();
assert!(s.next.is_none());
assert!(s.str.is_none());
assert!(s.desc.is_none());
assert!(s.r#match.is_none());
assert_eq!(s.len, 0);
assert_eq!(s.width, 0);
assert_eq!(s.kind, 0);
}
#[test]
fn cdrun_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let r = cdrun::default();
assert!(r.next.is_none());
assert!(r.strs.is_none());
assert_eq!(r.r#type, 0);
assert_eq!(r.count, 0);
}
#[test]
fn cdset_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let s = cdset::default();
assert!(s.next.is_none());
assert!(s.opts.is_none());
assert!(s.strs.is_none());
assert_eq!(s.count, 0);
assert_eq!(s.desc, 0);
}
#[test]
fn cdstate_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let st = cdstate::default();
assert_eq!(st.showd, 0);
assert!(st.sep.is_none());
assert!(st.sets.is_none());
assert!(st.runs.is_none());
}
#[test]
fn freecdsets_walks_chain() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let head_str = cdstr {
str: Some("foo".into()),
desc: Some("first".into()),
..Default::default()
};
let tail_str = cdstr {
str: Some("bar".into()),
..Default::default()
};
let mut head_str_b = Box::new(head_str);
head_str_b.next = Some(Box::new(tail_str));
let set = cdset {
strs: Some(head_str_b),
count: 2,
..Default::default()
};
freecdsets(Some(Box::new(set)));
}
#[test]
fn castate_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let s = castate::default();
assert!(s.snext.is_none());
assert!(s.d.is_none());
assert!(s.def.is_none());
assert!(s.args.is_none());
assert_eq!(s.nopts, 0);
assert_eq!(s.curpos, 0);
}
#[test]
fn cvdef_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let d = cvdef::default();
assert!(d.descr.is_none());
assert!(d.vals.is_none());
assert_eq!(d.hassep, 0);
assert_eq!(d.sep, 0);
assert_eq!(d.argsep, 0);
}
#[test]
fn cvval_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let v = cvval::default();
assert!(v.next.is_none());
assert!(v.name.is_none());
assert!(v.arg.is_none());
assert_eq!(v.r#type, 0);
assert_eq!(v.active, 0);
}
#[test]
fn cvstate_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let s = cvstate::default();
assert!(s.d.is_none());
assert!(s.def.is_none());
assert!(s.val.is_none());
assert!(s.vals.is_none());
}
#[test]
fn ctags_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let t = ctags::default();
assert!(t.all.is_none());
assert!(t.context.is_none());
assert!(t.sets.is_none());
assert_eq!(t.init, 0);
}
#[test]
fn ctset_default_zero_initialized() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let s = ctset::default();
assert!(s.next.is_none());
assert!(s.tags.is_none());
assert!(s.tag.is_none());
assert_eq!(s.ptr, 0);
}
#[test]
fn cvv_constants_match_c() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(CVV_NOARG, 0);
assert_eq!(CVV_ARG, 1);
assert_eq!(CVV_OPT, 2);
}
#[test]
fn max_tags_cvcache_match_c() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
assert_eq!(MAX_TAGS, 256);
assert_eq!(MAX_CVCACHE, 8);
}
#[test]
fn freectset_walks_chain() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let mut head = ctset { tag: Some("foo".into()), ..Default::default() };
let tail = ctset { tag: Some("bar".into()), ..Default::default() };
head.next = Some(Box::new(tail));
freectset(Some(Box::new(head)));
}
#[test]
fn freectags_drops_one_node() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let t = ctags {
all: Some(vec!["a".into(), "b".into()]),
context: Some("ctx".into()),
..Default::default()
};
freectags(Some(Box::new(t)));
}
#[test]
fn freecvdef_walks_vals_chain() {
let _g = crate::ported::zle::zle_main::zle_test_setup();
let v_tail = cvval { name: Some("opt2".into()), ..Default::default() };
let mut v_head = cvval { name: Some("opt1".into()), ..Default::default() };
v_head.next = Some(Box::new(v_tail));
let d = cvdef {
descr: Some("test".into()),
vals: Some(Box::new(v_head)),
..Default::default()
};
freecvdef(Some(Box::new(d)));
}
}
pub fn alloc_cadef(_args: &[String], _single: i32, _matchstr: &str, _nonarg: &str, _flags: i32) -> i32 {
0
}
pub fn arrcontains(a: &[String], s: &str, colon: bool) -> i32 { for entry in a {
if colon {
let p = s.split(':').next().unwrap_or(s);
let q = entry.split(':').next().unwrap_or(entry);
if p == q {
return 1; }
} else if entry == s {
return 1; }
}
0 }
pub fn bin_comparguments(nam: &str, args: &[String], _ops: &crate::ported::zsh_h::options, _func: i32) -> i32 {
if INCOMPFUNC.load(std::sync::atomic::Ordering::Relaxed) != 1 { zwarnnam(nam, "can only be called from completion function");
return 1;
}
if args.is_empty() { zwarnnam(nam, "missing argument");
return 1;
}
0
}
pub fn bin_compdescribe(nam: &str, args: &[String], _ops: &crate::ported::zsh_h::options, _func: i32) -> i32 {
if INCOMPFUNC.load(std::sync::atomic::Ordering::Relaxed) != 1 { zwarnnam(nam, "can only be called from completion function");
return 1;
}
if args.is_empty() { zwarnnam(nam, "missing argument");
return 1;
}
0
}
pub fn bin_compfiles(nam: &str, args: &[String], _ops: &crate::ported::zsh_h::options, _func: i32) -> i32 {
if INCOMPFUNC.load(std::sync::atomic::Ordering::Relaxed) != 1 { zwarnnam(nam, "can only be called from completion function");
return 1;
}
if args.is_empty() { zwarnnam(nam, "missing argument");
return 1;
}
0
}
pub fn bin_compgroups(nam: &str, args: &[String], _ops: &crate::ported::zsh_h::options, _func: i32) -> i32 {
if INCOMPFUNC.load(std::sync::atomic::Ordering::Relaxed) != 1 { zwarnnam(nam, "can only be called from completion function");
return 1;
}
if args.is_empty() { zwarnnam(nam, "missing argument");
return 1;
}
0
}
pub fn boot_() -> i32 { 0
}
pub fn ca_colonlist(l: &[String]) -> String { if l.is_empty() {
return String::new(); }
let mut out = String::new();
for (i, item) in l.iter().enumerate() { if i > 0 {
out.push(':'); }
for ch in item.chars() {
if ch == ':' || ch == '\\' { out.push('\\');
}
out.push(ch);
}
}
out
}
#[allow(unused_variables)]
pub fn ca_foreign_opt(curset: i32, all: i32, option: &str) -> i32 { 0
}
#[allow(unused_variables)]
pub fn ca_get_arg(d: i32, n: i32) -> i32 { 0
}
#[allow(unused_variables)]
pub fn ca_get_opt(d: i32, line: &str, full: i32, end: &mut String) -> i32 { 0
}
pub fn ca_get_sopt(_d: i32, _line: &str, _end: &mut String) -> i32 { 0
}
pub fn ca_inactive(_d: i32, _xor: &[String]) { }
pub fn ca_nullist(l: &[String]) -> Vec<u8> { if l.is_empty() {
return Vec::new(); }
let mut out = Vec::new();
for (i, item) in l.iter().enumerate() {
if i > 0 {
out.push(0);
}
out.extend_from_slice(item.as_bytes());
}
out
}
pub fn ca_opt_arg(opt_name: &str, line: &str, equal_kind: bool) -> String { let o_bytes = opt_name.as_bytes();
let l_bytes = line.as_bytes();
let mut oi = 0usize;
let mut li = 0usize;
loop { if oi >= o_bytes.len() || li >= l_bytes.len() {
break;
}
let mut oc = o_bytes[oi];
if oc == b'\\' { oi += 1;
if oi >= o_bytes.len() {
break;
}
oc = o_bytes[oi];
}
let mut lc = l_bytes[li];
if matches!(lc, b'\\' | b'\'' | b'"') { li += 1;
if li >= l_bytes.len() {
break;
}
lc = l_bytes[li];
}
if oc != lc { break;
}
oi += 1;
li += 1;
}
let rest = &l_bytes[li..];
let mut s = String::from_utf8_lossy(rest).into_owned();
if equal_kind && s.starts_with('\\') { s.remove(0);
}
if equal_kind {
s = s.strip_prefix('=').map(|t| t.to_string()).unwrap_or(s); }
s
}
pub fn ca_parse_line(_d: i32, _multi: i32, _first: i32) -> i32 { 0
}
pub fn ca_set_data() { }
pub fn cf_ignore(names: &[String], ign: &mut Vec<String>, style: &str, path: &str) { let tpar = style.contains("parent");
if !tpar {
return;
}
for n in names {
if !n.is_empty() && path.starts_with(n.as_str()) && n != path { ign.push(n.clone());
}
}
}
pub fn cf_pats(_dirs: i32, _noopt: i32, names: &[String], accept: &[String], _skipped: &str, _matcher: &str,
_sdirs: &str, _fake: &[String], pats: &[String]) -> Vec<String> {
let mut out = Vec::with_capacity(names.len() + accept.len() + pats.len());
out.extend_from_slice(names);
out.extend_from_slice(accept);
out.extend_from_slice(pats);
out
}
pub fn cf_remove_other(names: &[String], pre: &str, amb: &mut i32) -> Vec<String> { let mut out = Vec::new();
if let Some(slash) = pre.find('/') {
let trimmed = &pre[..slash + 1]; for n in names { if n.starts_with(trimmed) { out.push(n.clone());
}
}
*amb = if out.len() > 1 { 1 } else { 0 };
} else {
out.extend_from_slice(names);
}
out
}
pub fn cfp_add_sdirs(final_list: &mut Vec<String>, orig: &[String], _skipped: &str, sdirs: &str, fake: &[String]) {
let mut add = 0;
if !sdirs.is_empty() { match sdirs {
"yes" | "true" | "on" | "1" => add = 2, ".." => add = 1, _ => {}
}
}
if add > 0 {
for f in fake {
final_list.push(f.clone());
}
for o in orig {
if !final_list.contains(o) {
final_list.push(o.clone());
}
}
}
}
pub fn cfp_bld_pats(_dirs: i32, _names: &[String], _matcher: &str, _pats: &[String]) -> Vec<String> {
Vec::new()
}
#[allow(unused_variables)]
pub fn cfp_matcher_pats(matcher: &str, add: &[String]) -> Vec<String> { Vec::new()
}
pub fn cfp_matcher_range(_ml: i32, _matcher: &str, _pat: &str) -> Vec<String> { Vec::new()
}
#[allow(unused_variables)]
pub fn cfp_opt_pats(pats: &[String], matcher: &str) -> Vec<String> { Vec::new()
}
pub fn cfp_test_exact(_names: &[String], _accept: &[String], _skipped: &str) -> Vec<String> {
Vec::new()
}
pub fn cleanup_() -> i32 { 0
}
pub fn comp_quote(str: &str, prefix: i32) -> String { let (s_eff, x) = if prefix != 0 && str.starts_with('=') { ("x".to_string() + &str[1..], true) } else {
(str.to_string(), false)
};
let qhead = COMPQSTACK.get()
.and_then(|m| m.lock().ok().and_then(|str| str.bytes().next()))
.unwrap_or(0);
let mut ret = crate::ported::zle::zle_tricky::quotename(&s_eff, qhead as i32);
if x {
if !ret.is_empty() {
ret.replace_range(0..1, "=");
}
}
ret
}
#[allow(unused_variables)]
pub fn cv_get_val(d: i32, name: &str) -> i32 { 0
}
#[allow(unused_variables)]
pub fn cv_inactive(d: i32, xor: &[String]) { }
#[allow(unused_variables)]
pub fn cv_next(d: i32, sp: &mut String, ap: &mut String) -> i32 { 0
}
#[allow(unused_variables)]
pub fn cv_parse_word(d: i32) { }
pub fn cv_quote_get_val(d: i32, name: &str) -> i32 { cv_get_val(d, name)
}
pub fn enables_() -> i32 { 0
}
pub fn features_() -> i32 { 0
}
pub fn finish_() -> i32 { 0
}
pub fn setup_() -> i32 { 0
}
#[allow(unused_variables)]
pub fn get_cadef(nam: &str, args: &[String]) -> i32 { 0
}
#[allow(unused_variables)]
pub fn get_cvdef(nam: &str, args: &[String]) -> i32 { 0
}
#[allow(unused_variables)]
pub fn parse_cvdef(nam: &str, args: &[String]) -> i32 { 0
}
pub fn set_cadef_opts() { }
pub fn settags(level: i32, tags: &[String]) { let _ = (level, tags);
}
pub fn bin_compquote(nam: &str, args: &[String], ops: &crate::ported::zsh_h::options, _func: i32) -> i32 {
if INCOMPFUNC.load(std::sync::atomic::Ordering::Relaxed) != 1 { zwarnnam(nam, "can only be called from completion function"); return 1; }
let qstack_empty = COMPQSTACK.get()
.map(|m| m.lock().map(|s| s.is_empty()).unwrap_or(true))
.unwrap_or(true);
if qstack_empty { return 0; } let _p = OPT_ISSET(ops, b'p'); for _name in args { }
0 }
pub fn bin_comptags(nam: &str, args: &[String], _ops: &crate::ported::zsh_h::options, _func: i32) -> i32 {
if INCOMPFUNC.load(std::sync::atomic::Ordering::Relaxed) != 1 { zwarnnam(nam, "can only be called from completion function"); return 1; }
if args.is_empty() { zwarnnam(nam, "missing arguments");
return 1;
}
0 }
pub fn bin_comptry(nam: &str, args: &[String], _ops: &crate::ported::zsh_h::options, _func: i32) -> i32 {
if INCOMPFUNC.load(std::sync::atomic::Ordering::Relaxed) != 1 { zwarnnam(nam, "can only be called from completion function"); return 1; }
if args.is_empty() { return 0; } 0 }
pub fn bin_compvalues(nam: &str, args: &[String], _ops: &crate::ported::zsh_h::options, _func: i32) -> i32 {
if INCOMPFUNC.load(std::sync::atomic::Ordering::Relaxed) != 1 { zwarnnam(nam, "can only be called from completion function"); return 1; }
if args.is_empty() { return 0; }
0 }