use core::alloc::Layout;

use log::{error, info};

#[unsafe(no_mangle)]
pub fn sys_malloc(size: usize, align: usize) -> *mut u8 {
    info!("called sys_malloc with size {} and align {}", size, align);
    if let Ok(layout) = Layout::from_size_align(size, align) {
        unsafe { alloc::alloc::alloc(layout) }
    } else {
        core::ptr::null_mut()
    }
}

#[unsafe(no_mangle)]
pub fn sys_free(ptr: *mut u8, size: usize, align: usize) {
    info!("called sys_free");
    if let Ok(layout) = Layout::from_size_align(size, align) {
        unsafe { alloc::alloc::dealloc(ptr, layout) }
    } else {
        error!(
            "sys_free called with invalid layout: size {}, align {}",
            size, align
        );
    }
}

#[unsafe(no_mangle)]
pub fn sys_realloc(ptr: *mut u8, size: usize, align: usize, new_size: usize) -> *mut u8 {
    info!("called sys_realloc");
    if let Ok(layout) = Layout::from_size_align(size, align) {
        unsafe { alloc::alloc::realloc(ptr, layout, new_size) }
    } else {
        core::ptr::null_mut()
    }
}
