comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:0cfcc391201f
1 /** ===========================================================================
2 ** R-Package: rdyncall
3 ** File: src/rutils.c
4 ** Description: misc utility functions to work with low-level data structures in R
5 **/
6
7 // uses: DATAPTR macro
8 #define USE_RINTERNALS
9 #include <Rinternals.h>
10 #include <stddef.h>
11
12 SEXP r_isnullptr(SEXP x)
13 {
14 return ScalarLogical( ( R_ExternalPtrAddr(x) == NULL ) ? TRUE : FALSE );
15 }
16
17 SEXP r_asextptr(SEXP x)
18 {
19 if (isVector(x)) {
20 return R_MakeExternalPtr( DATAPTR(x), R_NilValue, x );
21 }
22 error("expected a vector type");
23 return R_NilValue; /* dummy */
24 }
25
26 SEXP r_offsetPtr(SEXP x, SEXP offset)
27 {
28 if ( LENGTH(offset) == 0 ) error("offset is missing");
29 ptrdiff_t offsetval = INTEGER(offset)[0];
30 unsigned char* ptr = 0;
31 if (isVector(x)) {
32 ptr = (unsigned char*) DATAPTR(x);
33 } else if (TYPEOF(x) == EXTPTRSXP ) {
34 ptr = (unsigned char*) R_ExternalPtrAddr(x);
35 } else {
36 error("unsupported type");
37 }
38 return R_MakeExternalPtr( ptr + offsetval , R_NilValue, x );
39 }
40