Documentation
#![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,
	    }
	}
    }
}