Mercurial > pub > dyncall > bindings
comparison R/rdyncall/src/rdynload.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/rdynload.c | |
4 ** Description: R bindings to dynload | |
5 **/ | |
6 | |
7 #include <Rinternals.h> | |
8 #include "dynload.h" | |
9 | |
10 /** --------------------------------------------------------------------------- | |
11 ** C-Function: r_dynload | |
12 ** Description: load shared library and return lib handle | |
13 ** R-Calling Convention: .Call | |
14 ** | |
15 **/ | |
16 | |
17 SEXP r_dynload(SEXP libpath_x) | |
18 { | |
19 const char* libpath_S; | |
20 void* libHandle; | |
21 | |
22 libpath_S = CHAR(STRING_ELT(libpath_x,0)); | |
23 libHandle = dlLoadLibrary(libpath_S); | |
24 | |
25 if (!libHandle) | |
26 return R_NilValue; | |
27 | |
28 return R_MakeExternalPtr(libHandle, R_NilValue, R_NilValue); | |
29 } | |
30 | |
31 /** --------------------------------------------------------------------------- | |
32 ** C-Function: r_dynunload | |
33 ** Description: unload shared library | |
34 ** R-Calling Convention: .Call | |
35 ** | |
36 **/ | |
37 | |
38 SEXP r_dynunload(SEXP libobj_x) | |
39 { | |
40 void* libHandle; | |
41 | |
42 if (TYPEOF(libobj_x) != EXTPTRSXP) error("first argument is not of type external ptr."); | |
43 | |
44 libHandle = R_ExternalPtrAddr(libobj_x); | |
45 | |
46 if (!libHandle) error("not a lib handle"); | |
47 | |
48 dlFreeLibrary( libHandle ); | |
49 | |
50 return R_NilValue; | |
51 } | |
52 | |
53 /** --------------------------------------------------------------------------- | |
54 ** C-Function: r_dynsym | |
55 ** Description: resolve symbol | |
56 ** R-Calling Convention: .Call | |
57 ** | |
58 **/ | |
59 | |
60 SEXP r_dynsym(SEXP libh, SEXP symname_x, SEXP protectlib) | |
61 { | |
62 void* libHandle; | |
63 const char* symbol; | |
64 void* addr; | |
65 SEXP protect; | |
66 libHandle = R_ExternalPtrAddr(libh); | |
67 symbol = CHAR(STRING_ELT(symname_x,0) ); | |
68 addr = dlFindSymbol( libHandle, symbol ); | |
69 protect = (LOGICAL(protectlib)[0]) ? libh : R_NilValue; | |
70 return (addr) ? R_MakeExternalPtr(addr, R_NilValue, protect) : R_NilValue; | |
71 } |