use super::*;
#[no_mangle]
pub unsafe extern "C" fn axiolid_v0_4_context_last_error_info(
context: AxiolidContextHandle,
out_info: *mut AxiolidErrorInfo,
) -> AxiolidStatus {
boundary(|| {
if out_info.is_null() {
return AxiolidStatus::NullPointer;
}
let Some(context) = context_entry(context.0) else {
return AxiolidStatus::InvalidHandle;
};
let context = lock_unpoisoned(&context);
let Some(error) = &context.last_error else {
return AxiolidStatus::NoError;
};
let mut info = AxiolidErrorInfo {
status: error.status,
operation: error.operation,
tolerance: error.tolerance,
provider: [0; 64],
message_len: error.message.len(),
provider_len: 0,
reserved: [0; 7],
};
info.provider_len = copy_text(&error.provider, &mut info.provider);
unsafe { out_info.write(info) };
AxiolidStatus::Ok
})
}
#[no_mangle]
pub unsafe extern "C" fn axiolid_v0_4_context_last_error_message(
context: AxiolidContextHandle,
buffer: *mut u8,
capacity: usize,
out_required: *mut usize,
) -> AxiolidStatus {
boundary(|| {
if out_required.is_null() || (capacity != 0 && buffer.is_null()) {
return AxiolidStatus::NullPointer;
}
let Some(context) = context_entry(context.0) else {
return AxiolidStatus::InvalidHandle;
};
let context = lock_unpoisoned(&context);
let Some(error) = &context.last_error else {
return AxiolidStatus::NoError;
};
let required = error.message.len().saturating_add(1);
unsafe { out_required.write(required) };
if capacity < required {
return AxiolidStatus::BufferTooSmall;
}
let destination = unsafe { std::slice::from_raw_parts_mut(buffer, required) };
destination[..error.message.len()].copy_from_slice(error.message.as_bytes());
destination[required - 1] = 0;
AxiolidStatus::Ok
})
}
#[no_mangle]
pub unsafe extern "C" fn axiolid_v0_4_context_live_object_counts(
context: AxiolidContextHandle,
out_meshes: *mut usize,
out_results: *mut usize,
) -> AxiolidStatus {
boundary(|| {
if out_meshes.is_null() || out_results.is_null() {
return AxiolidStatus::NullPointer;
}
let Some(context) = context_entry(context.0) else {
return AxiolidStatus::InvalidHandle;
};
let context = lock_unpoisoned(&context);
unsafe {
out_meshes.write(context.meshes.live_count());
out_results.write(context.results.live_count());
}
AxiolidStatus::Ok
})
}