#![warn(unsafe_op_in_unsafe_fn)]
pub mod error;
pub mod eval;
pub mod ffi;
pub mod io;
pub mod panic_hook;
pub mod protect;
pub mod sexp;
pub mod unwind_protect;
#[cfg(feature = "altrep")]
pub mod altrep;
pub mod log;
use std::os::raw::c_char;
pub use error::{Error, Result};
pub use sexp::environment::EnvironmentSexp;
pub use sexp::external_pointer::{
get_external_pointer_addr, take_external_pointer_value, ExternalPointerSexp, IntoExtPtrSexp,
};
pub use sexp::function::{FunctionArgs, FunctionSexp};
pub use sexp::integer::{IntegerSexp, OwnedIntegerSexp};
pub use sexp::list::{ListSexp, OwnedListSexp};
pub use sexp::logical::{LogicalSexp, OwnedLogicalSexp};
pub use sexp::na::NotAvailableValue;
pub use sexp::null::NullSexp;
pub use sexp::numeric::{NumericScalar, NumericSexp, NumericTypedSexp};
pub use sexp::obj::ObjSexp;
pub use sexp::raw::{OwnedRawSexp, RawSexp};
pub use sexp::real::{OwnedRealSexp, RealSexp};
pub use sexp::string::{OwnedStringSexp, StringSexp};
pub use sexp::{Sexp, TypedSexp};
#[cfg(feature = "complex")]
pub use sexp::complex::{ComplexSexp, OwnedComplexSexp};
#[cfg(feature = "complex")]
pub use savvy_ffi::Complex64;
pub use unwind_protect::unwind_protect;
pub use eval::{assert_eq_r_code, eval_parse_text, EvalResult};
pub use savvy_macro::savvy;
pub use savvy_macro::savvy_init;
use ffi::SEXP;
use savvy_ffi::{cetype_t_CE_UTF8, Rf_allocVector, Rf_mkCharLenCE, SEXPTYPE};
fn alloc_vector(arg1: SEXPTYPE, arg2: usize) -> crate::error::Result<SEXP> {
unsafe { unwind_protect(|| Rf_allocVector(arg1, arg2 as _)) }
}
pub fn handle_error(e: crate::error::Error) -> SEXP {
match e {
error::Error::Aborted(token) => token,
e => unsafe {
let msg = e.to_string();
let r_error = Rf_mkCharLenCE(
msg.as_ptr() as *const c_char,
msg.len() as i32,
cetype_t_CE_UTF8,
);
(r_error as usize | 1) as SEXP
},
}
}
#[macro_export]
macro_rules! r_print {
() => {};
($($arg:tt)*) => { $crate::io::r_print(&format!($($arg)*), false); };
}
#[macro_export]
macro_rules! r_eprint {
() => {};
($($arg:tt)*) => { $crate::io::r_eprint(&format!($($arg)*), false); };
}
#[macro_export]
macro_rules! r_println {
() => {};
($($arg:tt)*) => { $crate::io::r_print(&format!($($arg)*), true); };
}
#[macro_export]
macro_rules! r_eprintln {
() => {};
($($arg:tt)*) => { $crate::io::r_eprint(&format!($($arg)*), true); };
}
#[macro_export]
macro_rules! savvy_err {
() => {};
($($arg:tt)*) => { $crate::Error::new(&format!($($arg)*)) };
}