You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
818 B
48 lines
818 B
4 years ago
|
#![allow(unused_macros)]
|
||
|
|
||
|
pub const GENERIC_ERROR: i32 = -1;
|
||
|
pub const GENERIC_SUCCESS: i32 = 0;
|
||
|
|
||
|
macro_rules! c_try {
|
||
|
($e:expr) => {
|
||
|
match $e {
|
||
|
Ok(v) => v,
|
||
|
Err(e) => return i32::from(e),
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
macro_rules! no_unwind {
|
||
|
(try $t:expr; $($e:tt)*) => {
|
||
|
{
|
||
|
match std::panic::catch_unwind(|| {
|
||
|
$($e)*
|
||
|
}) {
|
||
|
Ok(v) => i32::from(v),
|
||
|
Err(_) => return i32::from($t),
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
($($e:tt)*) => {
|
||
|
no_unwind! {try $crate::ffi::GENERIC_ERROR; $($e)*}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
macro_rules! string_from_ffi {
|
||
|
($file:expr) => {
|
||
|
unsafe {
|
||
|
let file = $file;
|
||
|
if file.is_null() {
|
||
|
return $crate::ffi::GENERIC_ERROR;
|
||
|
}
|
||
|
let file = CStr::from_ptr(file);
|
||
|
match file.to_str() {
|
||
|
Ok(file) => file.to_owned(),
|
||
|
Err(_) => return $crate::ffi::GENERIC_ERROR,
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|