2
/* Remove global namespace pollution */
3
#if !defined(SWIG_NO_R_NO_REMAP)
6
#if !defined(SWIG_NO_STRICT_R_HEADERS)
7
# define STRICT_R_HEADERS
19
#define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_R_ConvertPtr(obj, pptr, type, flags)
20
#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_R_ConvertPtr(obj, pptr, type, flags)
21
#define SWIG_NewPointerObj(ptr, type, flags) SWIG_R_NewPointerObj(ptr, type, flags)
26
#if R_VERSION >= R_Version(2,6,0)
27
#define VMAXTYPE void *
29
#define VMAXTYPE char *
33
This is mainly a way to avoid having lots of local variables that may
34
conflict with those in the routine.
36
Change name to R_SWIG_Callb....
38
typedef struct RCallbackFunctionData {
48
SEXP el; /* Temporary pointer used in the construction of the expression to call the R function. */
50
struct RCallbackFunctionData *previous; /* Stack */
52
} RCallbackFunctionData;
54
static RCallbackFunctionData *callbackFunctionDataStack;
58
R_SWIG_debug_getCallbackFunctionData()
62
RCallbackFunctionData *p = callbackFunctionDataStack;
70
Rf_protect(ans = Rf_allocVector(VECSXP, n));
71
for(p = callbackFunctionDataStack, i = 0; i < n; p = p->previous, i++)
72
SET_VECTOR_ELT(ans, i, p->fun);
81
SWIGRUNTIME RCallbackFunctionData *
82
R_SWIG_pushCallbackFunctionData(SEXP fun, SEXP userData)
84
RCallbackFunctionData *el;
85
el = (RCallbackFunctionData *) calloc(1, sizeof(RCallbackFunctionData));
87
el->userData = userData;
88
el->previous = callbackFunctionDataStack;
90
callbackFunctionDataStack = el;
97
R_SWIG_R_pushCallbackFunctionData(SEXP fun, SEXP userData)
99
R_SWIG_pushCallbackFunctionData(fun, userData);
103
SWIGRUNTIME RCallbackFunctionData *
104
R_SWIG_getCallbackFunctionData()
106
if(!callbackFunctionDataStack) {
107
Rf_error("Supposedly impossible error occurred in the SWIG callback mechanism."
108
" No callback function data set.");
111
return callbackFunctionDataStack;
115
R_SWIG_popCallbackFunctionData(int doFree)
117
RCallbackFunctionData *el = NULL;
118
if(!callbackFunctionDataStack)
119
return ; /* Error !!! */
121
el = callbackFunctionDataStack ;
122
callbackFunctionDataStack = callbackFunctionDataStack->previous;
130
Interface to S function
132
which is to be used to determine if an
133
external pointer inherits from the right class.
135
Ideally, we would like to be able to do this without an explicit call to the is() function.
136
When the S4 class system uses its own SEXP types, then we will hopefully be able to do this
139
Should we make the expression static and preserve it to avoid the overhead of
140
allocating each time.
143
R_SWIG_checkInherits(SEXP obj, SEXP tag, const char *type)
148
Rf_protect(e = Rf_allocVector(LANGSXP, 3));
149
SETCAR(e, Rf_install("extends"));
151
SETCAR(CDR(e), Rf_mkString(CHAR(PRINTNAME(tag))));
152
SETCAR(CDR(CDR(e)), Rf_mkString(type));
154
val = R_tryEval(e, R_GlobalEnv, &check_err);
160
return(LOGICAL(val)[0]);
165
R_SWIG_resolveExternalRef(SEXP arg, const char * const type, const char * const argName, Rboolean nullOk)
170
if(TYPEOF(arg) != EXTPTRSXP)
171
arg = GET_SLOT(arg, Rf_mkString("ref"));
174
if(TYPEOF(arg) != EXTPTRSXP) {
175
Rf_error("argument %s must be an external pointer (from an ExternalReference)", argName);
179
ptr = R_ExternalPtrAddr(arg);
181
if(ptr == NULL && nullOk == (Rboolean) FALSE) {
182
Rf_error("the external pointer (of type %s) for argument %s has value NULL", argName, type);
185
if(type[0] && R_ExternalPtrTag(arg) != Rf_install(type) && strcmp(type, "voidRef")
186
&& !R_SWIG_checkInherits(orig, R_ExternalPtrTag(arg), type)) {
187
Rf_error("the external pointer for argument %s has tag %s, not the expected value %s",
188
argName, CHAR(PRINTNAME(R_ExternalPtrTag(arg))), type);
196
R_SWIG_ReferenceFinalizer(SEXP el)
198
void *ptr = R_SWIG_resolveExternalRef(el, "", "<finalizer>", (Rboolean) 1);
199
fprintf(stderr, "In R_SWIG_ReferenceFinalizer for %p\n", ptr);
203
if(TYPEOF(el) != EXTPTRSXP)
204
el = GET_SLOT(el, Rf_mkString("ref"));
206
if(TYPEOF(el) == EXTPTRSXP)
207
R_ClearExternalPtr(el);
215
typedef enum {R_SWIG_EXTERNAL, R_SWIG_OWNER } R_SWIG_Owner;
218
SWIG_MakePtr(void *ptr, const char *typeName, R_SWIG_Owner owner)
220
SEXP external, r_obj;
222
Rf_protect(external = R_MakeExternalPtr(ptr, Rf_install(typeName), R_NilValue));
223
Rf_protect(r_obj = NEW_OBJECT(MAKE_CLASS((char *) typeName)));
226
R_RegisterCFinalizer(external, R_SWIG_ReferenceFinalizer);
228
r_obj = SET_SLOT(r_obj, Rf_mkString((char *) "ref"), external);
229
SET_S4_OBJECT(r_obj);
237
R_SWIG_create_SWIG_R_Array(const char *typeName, SEXP ref, int len)
241
/*XXX remove the char * cast when we can. MAKE_CLASS should be declared appropriately. */
242
Rf_protect(arr = NEW_OBJECT(MAKE_CLASS((char *) typeName)));
243
Rf_protect(arr = R_do_slot_assign(arr, Rf_mkString("ref"), ref));
244
Rf_protect(arr = R_do_slot_assign(arr, Rf_mkString("dims"), Rf_ScalarInteger(len)));
251
#define ADD_OUTPUT_ARG(result, pos, value, name) r_ans = AddOutputArgToReturn(pos, value, name, OutputValues);
254
AddOutputArgToReturn(int pos, SEXP value, const char *name, SEXP output)
256
SET_VECTOR_ELT(output, pos, value);
261
/* Create a new pointer object */
262
SWIGRUNTIMEINLINE SEXP
263
SWIG_R_NewPointerObj(void *ptr, swig_type_info *type, int flags) {
264
SEXP rptr = R_MakeExternalPtr(ptr,
265
R_MakeExternalPtr(type, R_NilValue, R_NilValue), R_NilValue);
271
/* Convert a pointer value */
272
SWIGRUNTIMEINLINE int
273
SWIG_R_ConvertPtr(SEXP obj, void **ptr, swig_type_info *ty, int flags) {
275
if (!obj) return SWIG_ERROR;
276
if (obj == R_NilValue) {
277
if (ptr) *ptr = NULL;
281
vptr = R_ExternalPtrAddr(obj);
283
swig_type_info *to = (swig_type_info*)
284
R_ExternalPtrAddr(R_ExternalPtrTag(obj));
286
if (ptr) *ptr = vptr;
288
swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
290
if (ptr) *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
291
assert(!newmemory); /* newmemory handling not yet implemented */
294
if (ptr) *ptr = vptr;
299
SWIGRUNTIME swig_module_info *
300
SWIG_GetModule(void *SWIGUNUSEDPARM(clientdata)) {
301
static void *type_pointer = (void *)0;
302
return (swig_module_info *) type_pointer;
306
SWIG_SetModule(void *v, swig_module_info *swig_module) {
315
/* Create a new packed object */
317
SWIGRUNTIMEINLINE SEXP RSwigPacked_New(void *ptr, size_t sz,
318
swig_type_info *ty) {
321
(RSwigPacked*) malloc(sizeof(RSwigPacked));
323
void *pack = malloc(sz);
325
memcpy(pack, ptr, sz);
333
rptr = R_MakeExternalPtr(sobj, R_NilValue, R_NilValue);
337
SWIGRUNTIME swig_type_info *
338
RSwigPacked_UnpackData(SEXP obj, void *ptr, size_t size)
341
(RSwigPacked *)R_ExternalPtrAddr(obj);
342
if (sobj->size != size) return 0;
343
memcpy(ptr, sobj->pack, size);
347
SWIGRUNTIMEINLINE SEXP
348
SWIG_R_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) {
349
return ptr ? RSwigPacked_New((void *) ptr, sz, type) : R_NilValue;
352
/* Convert a packed value value */
355
SWIG_R_ConvertPacked(SEXP obj, void *ptr, size_t sz, swig_type_info *ty) {
356
swig_type_info *to = RSwigPacked_UnpackData(obj, ptr, sz);
357
if (!to) return SWIG_ERROR;
360
/* check type cast? */
361
swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
362
if (!tc) return SWIG_ERROR;
369
#define SWIG_exception_noreturn(code, msg) do { throw std::runtime_error(msg); } while(0)
371
#define SWIG_exception_noreturn(code, msg) do { return result; } while(0)