Mercurial > pub > dyncall > bindings
comparison R/rdyncall/src/rutils_str.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_str.c | |
4 ** Description: Support functions for handling C string data types. | |
5 **/ | |
6 | |
7 #define USE_RINTERNALS | |
8 #include <Rdefines.h> | |
9 #include <Rinternals.h> | |
10 #include <R_ext/RS.h> | |
11 | |
12 /* String utils */ | |
13 | |
14 SEXP r_ptr2str(SEXP extptr) | |
15 { | |
16 void* addr = R_ExternalPtrAddr(extptr); | |
17 if (addr == NULL) { | |
18 return R_NilValue; | |
19 } | |
20 return mkString(addr); | |
21 } | |
22 | |
23 SEXP r_strptr(SEXP x) | |
24 { | |
25 return R_MakeExternalPtr( (void*) CHAR(STRING_ELT(x, 0)), R_NilValue, x ); | |
26 } | |
27 | |
28 void do_free(SEXP x) | |
29 { | |
30 void* addr = R_ExternalPtrAddr(x); | |
31 R_Free(addr); | |
32 } | |
33 | |
34 SEXP r_strarrayptr(SEXP s) | |
35 { | |
36 int i; | |
37 int n; | |
38 const char ** ptrs; | |
39 | |
40 n = LENGTH(s); | |
41 | |
42 // allocate array | |
43 ptrs = R_Calloc(n, const char*); | |
44 | |
45 // copy cstring pointers into array | |
46 for( i=0 ; i<n ; ++i ) ptrs[i] = CHAR( STRING_ELT(s, i) ); | |
47 | |
48 // create external pointer pointing to array | |
49 SEXP x = PROTECT( R_MakeExternalPtr( ptrs, R_NilValue, s ) ); | |
50 R_RegisterCFinalizerEx( x, do_free, TRUE ); | |
51 UNPROTECT(1); | |
52 return x; | |
53 } |