Mercurial > pub > dyncall > bindings
diff R/rdyncall/src/rutils.c @ 0:0cfcc391201f
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:26:28 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/R/rdyncall/src/rutils.c Thu Mar 19 22:26:28 2015 +0100 @@ -0,0 +1,40 @@ +/** =========================================================================== + ** R-Package: rdyncall + ** File: src/rutils.c + ** Description: misc utility functions to work with low-level data structures in R + **/ + +// uses: DATAPTR macro +#define USE_RINTERNALS +#include <Rinternals.h> +#include <stddef.h> + +SEXP r_isnullptr(SEXP x) +{ + return ScalarLogical( ( R_ExternalPtrAddr(x) == NULL ) ? TRUE : FALSE ); +} + +SEXP r_asextptr(SEXP x) +{ + if (isVector(x)) { + return R_MakeExternalPtr( DATAPTR(x), R_NilValue, x ); + } + error("expected a vector type"); + return R_NilValue; /* dummy */ +} + +SEXP r_offsetPtr(SEXP x, SEXP offset) +{ + if ( LENGTH(offset) == 0 ) error("offset is missing"); + ptrdiff_t offsetval = INTEGER(offset)[0]; + unsigned char* ptr = 0; + if (isVector(x)) { + ptr = (unsigned char*) DATAPTR(x); + } else if (TYPEOF(x) == EXTPTRSXP ) { + ptr = (unsigned char*) R_ExternalPtrAddr(x); + } else { + error("unsupported type"); + } + return R_MakeExternalPtr( ptr + offsetval , R_NilValue, x ); +} +