use std::sync::{Mutex, MutexGuard, OnceLock};
fn lock() -> &'static Mutex<()> {
static LOCK: OnceLock<Mutex<()>> = OnceLock::new();
LOCK.get_or_init(|| Mutex::new(()))
}
pub fn global_state_lock() -> MutexGuard<'static, ()> {
let g = match lock().lock() {
Ok(g) => g,
Err(poisoned) => poisoned.into_inner(),
};
crate::ported::options::emulate("zsh", true);
crate::ported::options::opt_state_set("exec", true);
crate::ported::options::opt_state_set("promptpercent", true);
crate::ported::options::opt_state_set("promptbang", true);
crate::ported::utils::inittyptab();
crate::ported::utils::errflag.store(0, std::sync::atomic::Ordering::Relaxed);
crate::ported::options::opt_state_set("octalzeroes", false);
crate::ported::options::opt_state_set("cbases", false);
crate::ported::options::opt_state_set("ksharrays", false);
crate::ported::options::opt_state_set("casematch", true);
crate::ported::options::emulation.store(
crate::ported::zsh_h::EMULATE_ZSH,
std::sync::atomic::Ordering::Relaxed,
);
if let Ok(mut tab) = crate::ported::hashtable::reswdtab_lock().write() {
tab.enable("repeat");
}
g
}
pub fn reset_completion_state() {
use std::sync::atomic::Ordering;
let _ = crate::ported::zle::complete::finish_(std::ptr::null());
let _ = crate::ported::zle::computil::setup_();
for p in [
"PREFIX",
"SUFFIX",
"IPREFIX",
"ISUFFIX",
"QIPREFIX",
"QISUFFIX",
"curcontext",
"expl",
"_comp_tags",
"_tags_level",
"_next_tags_not",
"_sort_tags",
] {
crate::ported::params::unsetparam(p);
}
crate::ported::params::locallevel.store(0, Ordering::Relaxed);
crate::ported::zle::complete::COMPIGNORED.store(0, Ordering::Relaxed);
crate::ported::zle::complete::set_compadd_trace(false);
crate::ported::zle::complete::clear_compadd_prefix_injector();
if let Ok(mut g) = crate::ported::zle::complete::COMPADD_ARGV_SHADOW.lock() {
*g = None;
}
let ops = crate::ported::zsh_h::options {
ind: [0u8; crate::ported::zsh_h::MAX_OPS],
args: Vec::new(),
argscount: 0,
argsalloc: 0,
};
let _ = crate::ported::modules::zutil::bin_zstyle("zstyle", &["-d".to_string()], &ops, 0);
}
pub fn set_test_zstyle(context: &str, style: &str, value: &str) {
let ops = crate::ported::zsh_h::options {
ind: [0u8; crate::ported::zsh_h::MAX_OPS],
args: Vec::new(),
argscount: 0,
argsalloc: 0,
};
let _ = crate::ported::modules::zutil::bin_zstyle(
"zstyle",
&[context.to_string(), style.to_string(), value.to_string()],
&ops,
0,
);
}