keithf@amnis.com
2005-May-12 00:01 UTC
[Rd] Patch to address (PR#7853) -- tested briefly, seems to work
--- dotcode.c 2004-09-05 02:31:57.000000000 -0700 +++ /usr/local/src/R-2.0.0/src/main/dotcode.c 2005-05-11 12:24:11.000000000 -0700 @@ -190,6 +190,7 @@ static void *RObjToCPtr(SEXP s, int naok, int dup, int narg, int Fort, const char *name, R_toCConverter **converter, int targetType) { + unsigned char *rawptr; int *iptr; float *sptr; double *rptr; @@ -228,6 +229,16 @@ } switch(TYPEOF(s)) { + case RAWSXP: + n = LENGTH(s); + rawptr = RAW(s); + if (dup) { + rawptr = (unsigned char *) R_alloc(n, sizeof(unsigned char)); + for (i = 0; i < n; i++) + rawptr[i] = RAW(s)[i]; + } + return (void *) rawptr; + break; case LGLSXP: case INTSXP: n = LENGTH(s); @@ -329,6 +340,7 @@ static SEXP CPtrToRObj(void *p, SEXP arg, int Fort, R_NativePrimitiveArgType type) { + unsigned char *rawptr; int *iptr, n=length(arg); float *sptr; double *rptr; @@ -339,6 +351,12 @@ SEXP s, t; switch(type) { + case RAWSXP: + s = allocVector(type, n); + rawptr = (unsigned char *)p; + for (i = 0; i < n; i++) + RAW(s)[i] = rawptr[i]; + break; case LGLSXP: case INTSXP: s = allocVector(type, n);