use crate::{
simics_exception,
sys::{SIM_add_directory, SIM_clear_directories, SIM_get_directories, SIM_lookup_file},
AttrValue, Error, Result,
};
use raw_cstr::raw_cstr;
use std::{
ffi::CStr,
path::{Path, PathBuf},
};
#[simics_exception]
pub fn lookup_file<S>(file: S) -> Result<PathBuf>
where
S: AsRef<str>,
{
let res = unsafe { SIM_lookup_file(raw_cstr(file.as_ref())?) };
if res.is_null() {
Err(Error::FileLookup {
file: file.as_ref().to_string(),
})
} else {
Ok(PathBuf::from(unsafe { CStr::from_ptr(res) }.to_str()?))
}
}
#[simics_exception]
pub fn add_directory<P>(directory: P, prepend: bool) -> Result<()>
where
P: AsRef<Path>,
{
unsafe {
SIM_add_directory(
raw_cstr(directory.as_ref().to_str().ok_or(Error::ToString)?)?,
prepend,
);
}
Ok(())
}
#[simics_exception]
pub fn clear_directories() {
unsafe { SIM_clear_directories() };
}
#[simics_exception]
pub fn get_directories() -> AttrValue {
unsafe { SIM_get_directories() }.into()
}