Fix so that it works for 2.6 and 2.5

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10059 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Joseph Wang 2007-10-28 18:21:44 +00:00
commit 3b9574953c
3 changed files with 20 additions and 5 deletions

View file

@ -156,11 +156,13 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
{
SEXP t, c;
if (!carray) return R_NilValue;
RVERSION26(return Rf_mkCharEnc(carray, size));
RVERSIONPRE26(
PROTECT(t = allocVector(STRSXP, 1));
c = allocString(size);
strncpy(CHAR(c), carray, size);
SET_STRING_ELT(t, 0, c);
UNPROTECT(1);
UNPROTECT(1);)
return t;
}
}

View file

@ -6,10 +6,23 @@ extern "C" {
#endif
#include <Rdefines.h>
#include <Rversion.h>
#include <stdlib.h>
#undef length
#define SWIGR 1
#if R_VERSION >= R_Version(2,6,0)
#warning "R Swig currently fails on runtime for 2.6 and higher."
#warning "Contact maintainer if you would like to help fix"
#define VMAXTYPE void *
#define RVERSION26(x) x
#define RVERSIONPRE26(x)
#else
#define VMAXTYPE char *
#define RVERSION26(x)
#define RVERSIONPRE26(x) x
#endif
/*
This is mainly a way to avoid having lots of local variables that may
conflict with those in the routine.

View file

@ -1758,7 +1758,7 @@ int R::functionWrapper(Node *n) {
Wrapper_add_local(f, "__r_nprotect", "unsigned int __r_nprotect = 0");
Wrapper_add_localv(f, "r_ans", "SEXP", "r_ans = R_NilValue", NIL);
Wrapper_add_localv(f, "r_vmax", "char *", "r_vmax = vmaxget()", NIL);
Wrapper_add_localv(f, "r_vmax", "VMAXTYPE", "r_vmax = vmaxget()", NIL);
String *sargs = NewString("");
@ -2174,7 +2174,7 @@ int R::defineArrayAccessors(SwigType *type) {
String *tmp = NewStringf("%s *ptr", SwigType_lstr(base, 0));
String *tmp1 = NewStringf("%s result", SwigType_lstr(base, 0));
Wrapper_add_localv(cGetItem, "r_vmax", "char *", "r_vmax = vmaxget()", NIL);
Wrapper_add_localv(cGetItem, "r_vmax", "VMAXTYPE", "r_vmax = vmaxget()", NIL);
Wrapper_add_local(cGetItem, "ptr", tmp);
Wrapper_add_local(cGetItem, "r_ans", "SEXP r_ans");
Wrapper_add_local(cGetItem, "result", tmp1);
@ -2219,7 +2219,7 @@ int R::defineArrayAccessors(SwigType *type) {
tmp = NewStringf("%s *ptr", SwigType_lstr(base, 0));
tmp1 = NewStringf("%s value", SwigType_lstr(base, 0));
Wrapper_add_localv(cSetItem, "r_vmax", "char *", "r_vmax = vmaxget()", NIL);
Wrapper_add_localv(cSetItem, "r_vmax", "VMAXTYPE", "r_vmax = vmaxget()", NIL);
Wrapper_add_local(cSetItem, "__r_nprotect", "int __r_nprotect = 0");
Wrapper_add_local(cSetItem, "ptr", tmp);
@ -2580,7 +2580,7 @@ int R::generateCopyRoutinesObsolete(Node *n) {
Wrapper_add_localv(toR, "r_obj", "SEXP", "r_obj", NIL);
Wrapper_add_localv(toR, "r_vmax", "char *", "r_vmax = vmaxget()", NIL);
Wrapper_add_localv(toR, "r_vmax", "VMAXTYPE", "r_vmax = vmaxget()", NIL);
Wrapper_add_localv(toR, "_tmp_sexp", "SEXP", "_tmp_sexp", NIL);
Wrapper_add_local(toR, "__r_nprotect", "int __r_nprotect = 0");
Wrapper_add_local(toC, "ecode", "int ecode = 0");