use crate::{Rboolean, SEXP};
#[cfg(not(r_4_5))]
use crate::R_UnboundValue;
extern "C" {
#[cfg(not(r_4_5))]
fn ENCLOS(x: SEXP) -> SEXP;
#[cfg(r_4_5)]
fn R_ParentEnv(x: SEXP) -> SEXP;
#[cfg(not(r_4_5))]
fn Rf_findVar(arg1: SEXP, arg2: SEXP) -> SEXP;
#[cfg(r_4_5)]
fn R_getVar(arg1: SEXP, arg2: SEXP) -> SEXP;
#[cfg(not(r_4_5))]
fn Rf_findVarInFrame(arg1: SEXP, arg2: SEXP) -> SEXP;
#[cfg(r_4_5)]
fn R_getVarEx(arg1: SEXP, arg2: SEXP) -> SEXP;
#[cfg(not(r_4_5))]
fn CLOENV(x: SEXP) -> SEXP;
#[cfg(r_4_5)]
fn R_ClosureEnv(x: SEXP) -> SEXP;
#[cfg(not(r_4_5))]
fn BODY(x: SEXP) -> SEXP;
#[cfg(r_4_5)]
fn R_ClosureBody(x: SEXP) -> SEXP;
#[cfg(not(r_4_5))]
fn FORMALS(x: SEXP) -> SEXP;
#[cfg(r_4_5)]
fn R_ClosureFormals(x: SEXP) -> SEXP;
#[cfg(not(r_4_5))]
fn DATAPTR(x: SEXP) -> *mut ::std::os::raw::c_void;
#[cfg(r_4_5)]
fn DATAPTR_RO(x: SEXP) -> *const ::std::os::raw::c_void;
#[cfg(not(r_4_5))]
fn Rf_isFrame(x: SEXP) -> Rboolean;
#[cfg(r_4_5)]
fn Rf_isDataFrame(x: SEXP) -> Rboolean;
}
#[inline]
pub unsafe fn get_parent_env(x: SEXP) -> SEXP {
#[cfg(not(r_4_5))]
{
ENCLOS(x)
}
#[cfg(r_4_5)]
{
R_ParentEnv(x)
}
}
#[inline]
pub unsafe fn get_var(symbol: SEXP, env: SEXP) -> SEXP {
#[cfg(not(r_4_5))]
{
Rf_findVar(symbol, env)
}
#[cfg(r_4_5)]
{
R_getVar(symbol, env)
}
}
#[inline]
pub unsafe fn get_var_safe(symbol: SEXP, env: SEXP) -> Option<SEXP> {
#[cfg(not(r_4_5))]
{
let var = Rf_findVar(symbol, env);
if var == R_UnboundValue {
None
} else {
Some(var)
}
}
#[cfg(r_4_5)]
{
Some(R_getVar(symbol, env))
}
}
#[inline]
pub unsafe fn get_var_in_frame(symbol: SEXP, env: SEXP) -> SEXP {
#[cfg(not(r_4_5))]
{
Rf_findVarInFrame(symbol, env)
}
#[cfg(r_4_5)]
{
R_getVarEx(env, symbol)
}
}
#[inline]
pub unsafe fn get_closure_env(x: SEXP) -> SEXP {
#[cfg(not(r_4_5))]
{
CLOENV(x)
}
#[cfg(r_4_5)]
{
R_ClosureEnv(x)
}
}
#[inline]
pub unsafe fn get_closure_body(x: SEXP) -> SEXP {
#[cfg(not(r_4_5))]
{
BODY(x)
}
#[cfg(r_4_5)]
{
R_ClosureBody(x)
}
}
#[inline]
pub unsafe fn get_closure_formals(x: SEXP) -> SEXP {
#[cfg(not(r_4_5))]
{
FORMALS(x)
}
#[cfg(r_4_5)]
{
R_ClosureFormals(x)
}
}
#[inline]
pub unsafe fn dataptr(x: SEXP) -> *const ::std::os::raw::c_void {
#[cfg(not(r_4_5))]
{
DATAPTR(x) as *const _
}
#[cfg(r_4_5)]
{
DATAPTR_RO(x)
}
}
#[inline]
pub unsafe fn is_data_frame(x: SEXP) -> Rboolean {
#[cfg(not(r_4_5))]
{
Rf_isFrame(x)
}
#[cfg(r_4_5)]
{
Rf_isDataFrame(x)
}
}