use super::lfs_mdir::LfsMdir;
#[repr(C)]
pub struct LfsMlist {
pub next: *mut LfsMlist,
pub id: u16,
pub type_: u8,
pub m: LfsMdir,
}
pub fn lfs_mlist_isopen(head: *mut LfsMlist, node: *const LfsMlist) -> bool {
if head.is_null() || node.is_null() {
return false;
}
unsafe {
let mut p = head;
while !p.is_null() {
if core::ptr::eq(p, node) {
return true;
}
p = (*p).next;
}
false
}
}
pub fn lfs_mlist_remove(lfs: *mut crate::fs::Lfs, mlist: *mut LfsMlist) {
if lfs.is_null() || mlist.is_null() {
return;
}
unsafe {
let mut p = &mut (*lfs).mlist;
#[cfg(feature = "loop_limits")]
const MAX_MLIST_REMOVE_ITER: u32 = 256;
#[cfg(feature = "loop_limits")]
let mut iter: u32 = 0;
while !(*p).is_null() {
#[cfg(feature = "loop_limits")]
{
if iter >= MAX_MLIST_REMOVE_ITER {
panic!(
"loop_limits: MAX_MLIST_REMOVE_ITER ({}) exceeded",
MAX_MLIST_REMOVE_ITER
);
}
iter += 1;
}
if core::ptr::eq(*p, mlist) {
*p = (*mlist).next;
break;
}
p = &mut (*(*p)).next;
}
}
}
pub fn lfs_mlist_append(lfs: *mut crate::fs::Lfs, mlist: *mut LfsMlist) {
if lfs.is_null() || mlist.is_null() {
return;
}
unsafe {
let head = (*lfs).mlist;
(*mlist).next = head;
(*lfs).mlist = mlist;
}
}