Mercurial > pub > dyncall > bindings
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 |