use super::zle_h::MOD_MULT;
#[allow(unused_imports)]
use crate::ported::zle::{
deltochar::*, textobjects::*, zle_hist::*, zle_main::*, zle_misc::*, zle_move::*,
zle_params::*, zle_refresh::*, zle_tricky::*, zle_utils::*, zle_vi::*,
};
#[allow(unused_imports)]
#[allow(unused_imports)]
#[inline]
fn zc_iword(c: char) -> bool {
crate::ported::zle::zle_h::ZC_iword(c)
}
#[inline]
fn zc_ialnum(c: char) -> bool {
crate::ported::zle::zle_h::ZC_ialnum(c)
}
#[inline]
fn zc_ialpha(c: char) -> bool {
crate::ported::zle::zle_h::ZC_ialpha(c)
}
#[inline]
fn zc_iblank(c: char) -> bool {
crate::ported::zle::zle_h::ZC_iblank(c)
}
#[inline]
fn zc_inblank(c: char) -> bool {
crate::ported::zle::zle_h::ZC_inblank(c)
}
#[inline]
fn zc_ipunct(c: char) -> bool {
crate::ported::zle::zle_h::ZC_ipunct(c)
}
pub fn forwardword(args: &[String]) -> i32 {
let n = if ZMOD.lock().unwrap().flags & MOD_MULT != 0 {
ZMOD.lock().unwrap().mult
} else {
1
}; if n < 0 {
let saved = n;
ZMOD.lock().unwrap().mult = -n;
ZMOD.lock().unwrap().flags |= MOD_MULT; let ret = backwardword(args); ZMOD.lock().unwrap().mult = saved;
ZMOD.lock().unwrap().flags |= MOD_MULT; return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& zc_iword(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); }
if WORDFLAG.load(std::sync::atomic::Ordering::Relaxed) != 0
&& n == 0
{
return 0; }
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& !zc_iword(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); }
}
0 }
pub fn wordclass(x: char) -> i32 {
if zc_iblank(x) {
0
} else if zc_ialnum(x) || x == '_' {
1
} else if zc_ipunct(x) {
2
} else {
3
}
}
pub fn viforwardword(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = vibackwardword(args); let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
let cc =
wordclass(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)]); while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& wordclass(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
== cc
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); }
if WORDFLAG.load(std::sync::atomic::Ordering::Relaxed) != 0
&& n == 0
{
return 0;
} let mut nl = if ZLECS.load(std::sync::atomic::Ordering::SeqCst)
< ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)] == '\n'
{
1
} else {
0
}; while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& nl < 2
&& zc_inblank(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); if ZLECS.load(std::sync::atomic::Ordering::SeqCst)
< ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)] == '\n'
{
nl += 1;
} }
}
0 }
pub fn viforwardblankword(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = vibackwardblankword(args);
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& !zc_inblank(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
if WORDFLAG.load(std::sync::atomic::Ordering::Relaxed) != 0
&& n == 0
{
return 0;
} let mut nl = if ZLECS.load(std::sync::atomic::Ordering::SeqCst)
< ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)] == '\n'
{
1
} else {
0
};
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& nl < 2
&& zc_inblank(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
if ZLECS.load(std::sync::atomic::Ordering::SeqCst)
< ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)] == '\n'
{
nl += 1;
}
}
}
0
}
pub fn emacsforwardword(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = emacsbackwardword(args); let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& !zc_iword(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
if WORDFLAG.load(std::sync::atomic::Ordering::Relaxed) != 0
&& n == 0
{
return 0;
} while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& zc_iword(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
}
0
}
pub fn viforwardblankwordend(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = vibackwardblankwordend(args);
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
{
let pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst) + 1; if pos > ZLELL.load(std::sync::atomic::Ordering::SeqCst)
|| !zc_inblank(
ZLELINE.lock().unwrap()[pos.min(
ZLELL
.load(std::sync::atomic::Ordering::SeqCst)
.saturating_sub(1),
)],
)
{
break;
}
ZLECS.store(pos, std::sync::atomic::Ordering::SeqCst); }
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
{
let pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst) + 1; if pos > ZLELL.load(std::sync::atomic::Ordering::SeqCst)
|| zc_inblank(
ZLELINE.lock().unwrap()[pos.min(
ZLELL
.load(std::sync::atomic::Ordering::SeqCst)
.saturating_sub(1),
)],
)
{
break;
}
ZLECS.store(pos, std::sync::atomic::Ordering::SeqCst); }
}
if ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& false
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); }
0
}
pub fn viforwardwordend(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = vibackwardwordend(args);
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
{
let pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst) + 1; if pos > ZLELL.load(std::sync::atomic::Ordering::SeqCst)
|| !zc_inblank(
ZLELINE.lock().unwrap()[pos.min(
ZLELL
.load(std::sync::atomic::Ordering::SeqCst)
.saturating_sub(1),
)],
)
{
break;
}
ZLECS.store(pos, std::sync::atomic::Ordering::SeqCst); }
if ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
{
let mut pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst) + 1; let cc = if pos < ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
wordclass(ZLELINE.lock().unwrap()[pos])
} else {
0
}; loop {
ZLECS.store(
pos.min(ZLELL.load(std::sync::atomic::Ordering::SeqCst)),
std::sync::atomic::Ordering::SeqCst,
); if ZLECS.load(std::sync::atomic::Ordering::SeqCst)
== ZLELL.load(std::sync::atomic::Ordering::SeqCst)
{
break;
} pos += 1; if pos > ZLELL.load(std::sync::atomic::Ordering::SeqCst)
|| wordclass(
ZLELINE.lock().unwrap()[pos.min(
ZLELL
.load(std::sync::atomic::Ordering::SeqCst)
.saturating_sub(1),
)],
) != cc
{
break; }
}
}
}
if ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& false
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); }
0
}
pub fn backwardword(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = forwardword(args); let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
let pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1; if zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} ZLECS.store(pos, std::sync::atomic::Ordering::SeqCst); }
while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
let pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1; if !zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} ZLECS.store(pos, std::sync::atomic::Ordering::SeqCst); }
}
0
}
pub fn vibackwardword(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = viforwardword(args);
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
let mut nl: i32 = 0; while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst); if !zc_inblank(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
break;
} if ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)] == '\n' {
nl += 1;
} if nl == 2 {
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); break; }
}
if ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
let mut pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst); let cc = wordclass(ZLELINE.lock().unwrap()[pos]); loop {
ZLECS.store(pos, std::sync::atomic::Ordering::SeqCst); if ZLECS.load(std::sync::atomic::Ordering::SeqCst) == 0 {
break;
} pos -= 1; if {
let __c = ZLELINE.lock().unwrap()[pos];
wordclass(__c) != cc || zc_inblank(__c)
} {
break; }
}
}
}
0
}
pub fn vibackwardblankword(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = viforwardblankword(args);
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
let mut nl: i32 = 0; while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
let pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1; if !zc_inblank(ZLELINE.lock().unwrap()[pos]) {
break;
} if ZLELINE.lock().unwrap()[pos] == '\n' {
nl += 1;
} if nl == 2 {
break;
} ZLECS.store(pos, std::sync::atomic::Ordering::SeqCst); }
while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
let pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1; if zc_inblank(ZLELINE.lock().unwrap()[pos]) {
break;
} ZLECS.store(pos, std::sync::atomic::Ordering::SeqCst); }
}
0
}
pub fn vibackwardwordend(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = viforwardwordend(args);
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 && ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 1 {
n -= 1;
let cc = wordclass(
ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst).min(
ZLELL
.load(std::sync::atomic::Ordering::SeqCst)
.saturating_sub(1),
)],
); ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst); while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
if {
let __c = ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)];
wordclass(__c) != cc || zc_iblank(__c)
} {
break;
}
ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst); }
while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0
&& zc_iblank(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst); }
}
0
}
pub fn vibackwardblankwordend(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = viforwardblankwordend(args);
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0
&& !zc_inblank(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst); }
while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0
&& zc_inblank(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_sub(1, std::sync::atomic::Ordering::SeqCst); }
}
0
}
pub fn emacsbackwardword(args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = emacsforwardword(args); let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
let pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1; if zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} ZLECS.store(pos, std::sync::atomic::Ordering::SeqCst); }
while ZLECS.load(std::sync::atomic::Ordering::SeqCst) > 0 {
let pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst) - 1; if !zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} ZLECS.store(pos, std::sync::atomic::Ordering::SeqCst); }
}
0
}
pub fn backwarddeleteword(args: &[String]) -> i32 {
let mut x = ZLECS.load(std::sync::atomic::Ordering::SeqCst); let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = deleteword(args); let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while x > 0 {
let pos = x - 1; if zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} x = pos;
}
while x > 0 {
let pos = x - 1; if !zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} x = pos;
}
}
let ct = (ZLECS.load(std::sync::atomic::Ordering::SeqCst) - x) as i32;
backdel(ct, 1); 0
}
pub fn vibackwardkillword(_args: &[String]) -> i32 {
let mut x = ZLECS.load(std::sync::atomic::Ordering::SeqCst); let viinsbegin =
VIINSBEGIN.load(std::sync::atomic::Ordering::SeqCst);
let bol = findbol();
let lim: usize = viinsbegin.max(bol);
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
return 1;
} let mut n = n;
while n > 0 {
n -= 1;
while x > lim {
let pos = x - 1; if !zc_iblank(ZLELINE.lock().unwrap()[pos]) {
break;
} x = pos;
}
if x > lim {
let mut pos = x - 1; let cc = wordclass(ZLELINE.lock().unwrap()[pos]); loop {
x = pos + 1; let xv = pos;
if xv <= lim {
x = xv;
break;
}
if pos == 0 {
x = 0;
break;
}
pos -= 1; if wordclass(ZLELINE.lock().unwrap()[pos]) != cc {
x = pos + 1;
break;
}
x = pos;
}
}
}
let ct = (ZLECS.load(std::sync::atomic::Ordering::SeqCst) - x) as i32;
backkill(ct, 0x02 | 0x04);
0
}
pub fn backwardkillword(args: &[String]) -> i32 {
let mut x = ZLECS.load(std::sync::atomic::Ordering::SeqCst); let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = killword(args); let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while x > 0 {
let pos = x - 1; if zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} x = pos;
}
while x > 0 {
let pos = x - 1; if !zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} x = pos;
}
}
let ct = (ZLECS.load(std::sync::atomic::Ordering::SeqCst) - x) as i32;
backkill(ct, 0x02 | 0x04); 0
}
pub fn upcaseword(_args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
let neg = n < 0; let ocs = ZLECS.load(std::sync::atomic::Ordering::SeqCst); let mut n = if neg { -n } else { n };
while n > 0 {
n -= 1;
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& !zc_iword(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); }
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& zc_iword(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
let c = ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)];
ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)] =
c.to_uppercase().next().unwrap_or(c);
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); }
}
if neg {
ZLECS.store(ocs, std::sync::atomic::Ordering::SeqCst);
} 0
}
pub fn downcaseword(_args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
let neg = n < 0;
let ocs = ZLECS.load(std::sync::atomic::Ordering::SeqCst);
let mut n = if neg { -n } else { n };
while n > 0 {
n -= 1;
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& !zc_iword(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& zc_iword(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
let c = ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)];
ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)] =
c.to_lowercase().next().unwrap_or(c); ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); }
}
if neg {
ZLECS.store(ocs, std::sync::atomic::Ordering::SeqCst);
}
0
}
pub fn capitalizeword(_args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
let neg = n < 0;
let ocs = ZLECS.load(std::sync::atomic::Ordering::SeqCst);
let mut n = if neg { -n } else { n };
while n > 0 {
n -= 1;
let mut first = true; while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& !zc_iword(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& {
let __c = ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)];
zc_iword(__c) && !zc_ialpha(__c)
}
{
ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
}
while ZLECS.load(std::sync::atomic::Ordering::SeqCst)
!= ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& zc_iword(ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)])
{
let c = ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)];
ZLELINE.lock().unwrap()[ZLECS.load(std::sync::atomic::Ordering::SeqCst)] = if first {
c.to_uppercase().next().unwrap_or(c) } else {
c.to_lowercase().next().unwrap_or(c) };
first = false; ZLECS.fetch_add(1, std::sync::atomic::Ordering::SeqCst); }
}
if neg {
ZLECS.store(ocs, std::sync::atomic::Ordering::SeqCst);
}
0
}
pub fn deleteword(args: &[String]) -> i32 {
let mut x = ZLECS.load(std::sync::atomic::Ordering::SeqCst);
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = backwarddeleteword(args); let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while x != ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& !zc_iword(ZLELINE.lock().unwrap()[x])
{
x += 1; }
while x != ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& zc_iword(ZLELINE.lock().unwrap()[x])
{
x += 1; }
}
let ct = (x - ZLECS.load(std::sync::atomic::Ordering::SeqCst)) as i32;
foredel(ct, 1); 0
}
pub fn killword(args: &[String]) -> i32 {
let mut x = ZLECS.load(std::sync::atomic::Ordering::SeqCst);
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
if n < 0 {
let saved = n;
let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = -n;
__g_zmod.flags |= MOD_MULT;
let ret = backwardkillword(args); let mut __g_zmod = ZMOD.lock().unwrap();
__g_zmod.mult = saved;
__g_zmod.flags |= MOD_MULT;
return ret;
}
let mut n = n;
while n > 0 {
n -= 1;
while x != ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& !zc_iword(ZLELINE.lock().unwrap()[x])
{
x += 1; }
while x != ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& zc_iword(ZLELINE.lock().unwrap()[x])
{
x += 1; }
}
let ct = (x - ZLECS.load(std::sync::atomic::Ordering::SeqCst)) as i32;
forekill(ct, 1); 0
}
pub fn transposewords(_args: &[String]) -> i32 {
let mut __g_zmod = ZMOD.lock().unwrap();
let n = if __g_zmod.flags & MOD_MULT != 0 {
__g_zmod.mult
} else {
1
};
let neg = n < 0;
let ocs = ZLECS.load(std::sync::atomic::Ordering::SeqCst);
let mut n = if neg { -n } else { n };
let mut x = ZLECS.load(std::sync::atomic::Ordering::SeqCst);
while x != ZLELL.load(std::sync::atomic::Ordering::SeqCst) && {
let __c = ZLELINE.lock().unwrap()[x];
__c != '\n' && !zc_iword(__c)
} {
x += 1; }
if x == ZLELL.load(std::sync::atomic::Ordering::SeqCst) || ZLELINE.lock().unwrap()[x] == '\n' {
x = ZLECS.load(std::sync::atomic::Ordering::SeqCst); while x > 0 {
if zc_iword(ZLELINE.lock().unwrap()[x]) {
break;
} let pos = x - 1;
if ZLELINE.lock().unwrap()[pos] == '\n' {
break;
} x = pos;
}
if x == 0 {
return 1;
} let pos = x - 1;
if ZLELINE.lock().unwrap()[pos] == '\n' {
return 1;
} }
let mut p4 = x;
while p4 != ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& zc_iword(ZLELINE.lock().unwrap()[p4])
{
p4 += 1; }
let mut p3 = p4;
while p3 > 0 {
let pos = p3 - 1;
if !zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} p3 = pos;
}
if p3 == 0 {
return 1;
}
let mut p2 = p3;
let mut p1 = p3;
let mut pt = p3;
while n > 0 {
n -= 1;
p2 = pt;
while p2 > 0 {
let pos = p2 - 1;
if zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} p2 = pos;
}
if p2 == 0 {
return 1;
} p1 = p2;
while p1 > 0 {
let pos = p1 - 1;
if !zc_iword(ZLELINE.lock().unwrap()[pos]) {
break;
} p1 = pos;
}
pt = p1; }
let mut temp: Vec<char> = Vec::with_capacity(p4 - p1);
temp.extend_from_slice(&ZLELINE.lock().unwrap()[p3..p4]); temp.extend_from_slice(&ZLELINE.lock().unwrap()[p2..p3]); temp.extend_from_slice(&ZLELINE.lock().unwrap()[p1..p2]); for (i, c) in temp.iter().enumerate() {
ZLELINE.lock().unwrap()[p1 + i] = *c;
}
if neg {
ZLECS.store(ocs, std::sync::atomic::Ordering::SeqCst);
}
else {
ZLECS.store(p4, std::sync::atomic::Ordering::SeqCst);
} 0
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WordStyle {
Emacs,
Vi,
Shell,
BlankDelimited,
}
pub fn find_word_start(style: WordStyle) -> usize {
let mut pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst);
match style {
WordStyle::Emacs => {
while pos > 0 && {
let __c = ZLELINE.lock().unwrap()[pos - 1];
!(__c.is_alphanumeric() || __c == '_')
} {
pos -= 1;
}
while pos > 0 && {
let __c = ZLELINE.lock().unwrap()[pos - 1];
(__c.is_alphanumeric() || __c == '_')
} {
pos -= 1;
}
}
WordStyle::Vi => {
while pos > 0 && ZLELINE.lock().unwrap()[pos - 1].is_whitespace() {
pos -= 1;
}
if pos > 0 {
let is_word = ZLELINE.lock().unwrap()[pos - 1].is_alphanumeric()
|| ZLELINE.lock().unwrap()[pos - 1] == '_';
while pos > 0 {
let c = ZLELINE.lock().unwrap()[pos - 1];
if c.is_whitespace() || ((c.is_alphanumeric() || c == '_') != is_word) {
break;
}
pos -= 1;
}
}
}
WordStyle::Shell => {
}
WordStyle::BlankDelimited => {
while pos > 0 && ZLELINE.lock().unwrap()[pos - 1].is_whitespace() {
pos -= 1;
}
while pos > 0 && !ZLELINE.lock().unwrap()[pos - 1].is_whitespace() {
pos -= 1;
}
}
}
pos
}
pub fn find_word_end(style: WordStyle) -> usize {
let mut pos = ZLECS.load(std::sync::atomic::Ordering::SeqCst);
match style {
WordStyle::Emacs => {
while pos < ZLELL.load(std::sync::atomic::Ordering::SeqCst) && {
let __c = ZLELINE.lock().unwrap()[pos];
!(__c.is_alphanumeric() || __c == '_')
} {
pos += 1;
}
while pos < ZLELL.load(std::sync::atomic::Ordering::SeqCst) && {
let __c = ZLELINE.lock().unwrap()[pos];
(__c.is_alphanumeric() || __c == '_')
} {
pos += 1;
}
}
WordStyle::Vi => {
if pos < ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
let is_word = ZLELINE.lock().unwrap()[pos].is_alphanumeric()
|| ZLELINE.lock().unwrap()[pos] == '_';
while pos < ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
let c = ZLELINE.lock().unwrap()[pos];
if c.is_whitespace() || ((c.is_alphanumeric() || c == '_') != is_word) {
break;
}
pos += 1;
}
while pos < ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& ZLELINE.lock().unwrap()[pos].is_whitespace()
{
pos += 1;
}
}
}
WordStyle::Shell => {
}
WordStyle::BlankDelimited => {
while pos < ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& !ZLELINE.lock().unwrap()[pos].is_whitespace()
{
pos += 1;
}
while pos < ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& ZLELINE.lock().unwrap()[pos].is_whitespace()
{
pos += 1;
}
}
}
pos
}
#[cfg(test)]
mod tests {
use super::*;
fn line(s: &str) {
zle_reset();
*ZLELINE.lock().unwrap() = s.chars().collect();
ZLELL.store(
ZLELINE.lock().unwrap().len(),
std::sync::atomic::Ordering::SeqCst,
);
ZLECS.store(0, std::sync::atomic::Ordering::SeqCst);
}
#[test]
fn wordclass_dispatch() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
assert_eq!(wordclass(' '), 0);
assert_eq!(wordclass('a'), 1);
assert_eq!(wordclass('_'), 1);
assert_eq!(wordclass('5'), 1);
assert_eq!(wordclass(';'), 2);
}
#[test]
fn forwardword_basic() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
let mut z = line("foo bar baz");
forwardword(&[]);
assert_eq!(ZLECS.load(std::sync::atomic::Ordering::SeqCst), 4);
}
#[test]
fn backwardword_lands_at_word_start() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
let mut z = line("foo bar baz");
ZLECS.store(
ZLELL.load(std::sync::atomic::Ordering::SeqCst),
std::sync::atomic::Ordering::SeqCst,
);
backwardword(&[]);
assert_eq!(ZLECS.load(std::sync::atomic::Ordering::SeqCst), 8);
}
#[test]
fn upcaseword_uppercases_next_word() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
let mut z = line("foo bar");
upcaseword(&[]);
let s: String = ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "FOO bar");
assert_eq!(ZLECS.load(std::sync::atomic::Ordering::SeqCst), 3); }
#[test]
fn downcaseword_lowercases_next_word() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
let mut z = line("FOO Bar");
downcaseword(&[]);
let s: String = ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "foo Bar");
}
#[test]
fn capitalizeword_first_only() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
let mut z = line("foo bar");
capitalizeword(&[]);
let s: String = ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "Foo bar");
}
#[test]
fn deleteword_drops_next_word() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
let mut z = line("foo bar baz");
deleteword(&[]);
let s: String = ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, " bar baz");
assert_eq!(ZLECS.load(std::sync::atomic::Ordering::SeqCst), 0);
}
#[test]
fn transposewords_swaps_pair() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
let mut z = line("foo bar");
ZLECS.store(5, std::sync::atomic::Ordering::SeqCst); transposewords(&[]);
let s: String = ZLELINE.lock().unwrap().iter().collect();
assert_eq!(s, "bar foo");
}
#[test]
fn wordclass_iblank_branch_returns_zero() {
let _g = crate::test_util::global_state_lock();
assert_eq!(wordclass(' '), 0);
assert_eq!(wordclass('\t'), 0);
assert_eq!(wordclass('\r'), 0, "CR is iblank per wcsiblank");
assert_eq!(wordclass('\x0c'), 0, "FF is iblank per wcsiblank");
assert_eq!(wordclass('\x0b'), 0, "VT is iblank per wcsiblank");
assert_eq!(wordclass('\u{00A0}'), 0, "NBSP is iblank per wcsiblank");
}
#[test]
fn wordclass_alnum_and_underscore_branch_returns_one() {
let _g = crate::test_util::global_state_lock();
assert_eq!(wordclass('a'), 1);
assert_eq!(wordclass('Z'), 1);
assert_eq!(wordclass('0'), 1);
assert_eq!(wordclass('9'), 1);
assert_eq!(wordclass('_'), 1);
}
#[test]
fn wordclass_punctuation_branch_returns_two() {
let _g = crate::test_util::global_state_lock();
assert_eq!(wordclass('.'), 2);
assert_eq!(wordclass(','), 2);
assert_eq!(wordclass(';'), 2);
assert_eq!(wordclass('!'), 2);
assert_eq!(wordclass('-'), 2);
assert_eq!(wordclass('"'), 2);
}
#[test]
fn wordclass_other_branch_returns_three() {
let _g = crate::test_util::global_state_lock();
assert_eq!(
wordclass('\n'),
3,
"newline excluded from iblank by wcsiblank"
);
}
#[test]
fn wordclass_returns_value_in_range_for_all_ascii() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
for b in 0..=127u8 {
let c = b as char;
let r = wordclass(c);
assert!(
(0..=3).contains(&r),
"wordclass({:?}) = {} out of range [0,3]",
c,
r
);
}
}
#[test]
fn wordclass_is_idempotent() {
let _g = crate::test_util::global_state_lock();
for _ in 0..1000 {
assert_eq!(wordclass('a'), 1);
assert_eq!(wordclass(' '), 0);
assert_eq!(wordclass(';'), 2);
assert_eq!(wordclass('\n'), 3);
}
}
#[test]
fn wordclass_tab_is_class_zero() {
let _g = crate::test_util::global_state_lock();
assert_eq!(
wordclass('\t'),
0,
"tab is iblank → class 0 per c:75 wcsiblank branch"
);
}
#[test]
fn wordclass_non_ascii_letters_are_class_one() {
let _g = crate::test_util::global_state_lock();
for c in ['a', 'z', 'A', 'Z', '0', '9'] {
assert_eq!(wordclass(c), 1, "{:?} must be class 1 (ialnum)", c);
}
}
#[test]
fn forwardword_on_empty_buffer_no_panic() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
line("");
let r = forwardword(&[]);
assert_eq!(r, 0, "forwardword on empty must succeed");
assert_eq!(
ZLECS.load(std::sync::atomic::Ordering::SeqCst),
0,
"cursor must not advance past empty buffer"
);
}
#[test]
fn backwardword_on_empty_buffer_no_panic() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
line("");
let r = backwardword(&[]);
assert_eq!(r, 0);
assert_eq!(ZLECS.load(std::sync::atomic::Ordering::SeqCst), 0);
}
#[test]
fn forwardword_at_end_of_buffer_stays_at_zlell() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
line("foo");
ZLECS.store(3, std::sync::atomic::Ordering::SeqCst);
let r = forwardword(&[]);
assert_eq!(r, 0);
assert_eq!(
ZLECS.load(std::sync::atomic::Ordering::SeqCst),
3,
"cursor at ZLELL must stay there"
);
}
#[test]
fn backwardword_at_start_of_buffer_stays_at_zero() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
line("foo bar");
ZLECS.store(0, std::sync::atomic::Ordering::SeqCst);
let r = backwardword(&[]);
assert_eq!(r, 0);
assert_eq!(ZLECS.load(std::sync::atomic::Ordering::SeqCst), 0);
}
#[test]
fn zle_word_corpus_wordclass_space_is_blank() {
assert_eq!(wordclass(' '), 0);
assert_eq!(wordclass('\t'), 0);
}
#[test]
fn zle_word_corpus_wordclass_alpha_is_alnum() {
assert_eq!(wordclass('a'), 1);
assert_eq!(wordclass('Z'), 1);
assert_eq!(wordclass('0'), 1);
assert_eq!(wordclass('9'), 1);
}
#[test]
fn zle_word_corpus_wordclass_underscore_is_alnum() {
assert_eq!(wordclass('_'), 1,
"underscore is alnum per zsh word-class");
}
#[test]
fn zle_word_corpus_wordclass_punct_is_two() {
assert_eq!(wordclass('.'), 2);
assert_eq!(wordclass('!'), 2);
assert_eq!(wordclass(';'), 2);
assert_eq!(wordclass(','), 2);
}
#[test]
fn zle_word_corpus_wordclass_distinct_classes() {
let blank = wordclass(' ');
let alnum = wordclass('a');
let punct = wordclass('.');
assert_ne!(blank, alnum);
assert_ne!(alnum, punct);
assert_ne!(blank, punct);
}
#[test]
fn zle_word_corpus_wordclass_newline_is_other() {
assert_eq!(wordclass('\n'), 3,
"newline is NOT iblank (iblank = space/tab only) → class 3");
}
}