The R Project SVN R

Rev

Rev 5458 | Rev 5769 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5458 Rev 5730
Line 26... Line 26...
26
#include <stdlib.h>
26
#include <stdlib.h>
27
 
27
 
28
#include "Defn.h"
28
#include "Defn.h"
29
#include "Mathlib.h"
29
#include "Mathlib.h"
30
 
30
 
-
 
31
#ifndef max
-
 
32
#define max(a, b) ((a > b)?(a):(b))
-
 
33
#endif
-
 
34
 
31
typedef int (*DL_FUNC)();
35
typedef int (*DL_FUNC)();
32
 
36
 
33
/* These are set during each call to do_dotCode() below. */
37
/* These are set during each call to do_dotCode() below. */
34
 
38
 
35
static SEXP NaokSymbol = NULL;
39
static SEXP NaokSymbol = NULL;
Line 39... Line 43...
39
/* entry points in DLLs in a platform specific way. */
43
/* entry points in DLLs in a platform specific way. */
40
 
44
 
41
DL_FUNC R_FindSymbol(char *);
45
DL_FUNC R_FindSymbol(char *);
42
 
46
 
43
 
47
 
44
/* Convert an R object to a non-moveable C object and return */
48
/* Convert an R object to a non-moveable C/Fortran object and return
45
/* a pointer to it.  This leaves pointers for anything other */
49
   a pointer to it.  This leaves pointers for anything other
46
/* than vectors and lists unaltered. */
50
   than vectors and lists unaltered. 
-
 
51
*/
47
 
52
 
48
static void *RObjToCPtr(SEXP s, int naok, int dup, int narg)
53
static void *RObjToCPtr(SEXP s, int naok, int dup, int narg, int Fort)
49
{
54
{
50
    int *iptr;
55
    int *iptr;
51
    double *rptr;
56
    double *rptr;
52
    char **cptr;
57
    char **cptr, *fptr;
53
    complex *zptr;
58
    complex *zptr;
54
    SEXP *lptr;
59
    SEXP *lptr;
55
    int i, l, n;
60
    int i, l, n;
56
    switch(TYPEOF(s)) {
61
    switch(TYPEOF(s)) {
57
    case LGLSXP:
62
    case LGLSXP:
58
    case INTSXP:
63
    case INTSXP:
59
	n = LENGTH(s);
64
	n = LENGTH(s);
60
	iptr = INTEGER(s);
65
	iptr = INTEGER(s);
61
	for (i = 0 ; i < n ; i++) {
66
	for (i = 0 ; i < n ; i++) {
62
	    if(!naok && iptr[i] == NA_INTEGER)
67
	    if(!naok && iptr[i] == NA_INTEGER)
63
		error("NAs in foreign function call (arg %d)\n", narg);
68
		error("NAs in foreign function call (arg %d)", narg);
64
	}
69
	}
65
	if (dup) {
70
	if (dup) {
66
	    iptr = (int*)R_alloc(n, sizeof(int));
71
	    iptr = (int*)R_alloc(n, sizeof(int));
67
	    for (i = 0 ; i < n ; i++)
72
	    for (i = 0 ; i < n ; i++)
68
		iptr[i] = INTEGER(s)[i];
73
		iptr[i] = INTEGER(s)[i];
Line 72... Line 77...
72
    case REALSXP:
77
    case REALSXP:
73
	n = LENGTH(s);
78
	n = LENGTH(s);
74
	rptr = REAL(s);
79
	rptr = REAL(s);
75
	for (i = 0 ; i < n ; i++) {
80
	for (i = 0 ; i < n ; i++) {
76
	    if(!naok && !R_FINITE(rptr[i]))
81
	    if(!naok && !R_FINITE(rptr[i]))
77
		error("NA/NaN/Inf in foreign function call (arg %d)\n", narg);
82
		error("NA/NaN/Inf in foreign function call (arg %d)", narg);
78
	}
83
	}
79
	if (dup) {
84
	if (dup) {
80
	    rptr = (double*)R_alloc(n, sizeof(double));
85
	    rptr = (double*)R_alloc(n, sizeof(double));
81
	    for (i = 0 ; i < n ; i++)
86
	    for (i = 0 ; i < n ; i++)
82
		rptr[i] = REAL(s)[i];
87
		rptr[i] = REAL(s)[i];
Line 86... Line 91...
86
    case CPLXSXP:
91
    case CPLXSXP:
87
	n = LENGTH(s);
92
	n = LENGTH(s);
88
	zptr = COMPLEX(s);
93
	zptr = COMPLEX(s);
89
	for (i = 0 ; i < n ; i++) {
94
	for (i = 0 ; i < n ; i++) {
90
	    if(!naok && (!R_FINITE(zptr[i].r) || !R_FINITE(zptr[i].i)))
95
	    if(!naok && (!R_FINITE(zptr[i].r) || !R_FINITE(zptr[i].i)))
91
		error("Complex NA/NaN/Inf in foreign function call (arg %d)\n", narg);
96
		error("Complex NA/NaN/Inf in foreign function call (arg %d)", narg);
92
	}
97
	}
93
	if (dup) {
98
	if (dup) {
94
	    zptr = (complex*)R_alloc(n, sizeof(complex));
99
	    zptr = (complex*)R_alloc(n, sizeof(complex));
95
	    for (i = 0 ; i < n ; i++)
100
	    for (i = 0 ; i < n ; i++)
96
		zptr[i] = COMPLEX(s)[i];
101
		zptr[i] = COMPLEX(s)[i];
97
	}
102
	}
98
	return (void*)zptr;
103
	return (void*)zptr;
99
	break;
104
	break;
100
    case STRSXP:
105
    case STRSXP:
101
	if(!dup)
106
	if(!dup)
102
	    error("character variables must be duplicated in .C/.Fortran\n");
107
	    error("character variables must be duplicated in .C/.Fortran");
103
	n = LENGTH(s);
108
	n = LENGTH(s);
-
 
109
	if(Fort) {
-
 
110
	    if(n > 1) warning("only first string in char vector used in .Fortran");
-
 
111
	    l = strlen(CHAR(STRING(s)[0]));
-
 
112
	    fptr = (char*)R_alloc(max(255, l) + 1, sizeof(char));
-
 
113
	    strcpy(fptr, CHAR(STRING(s)[0]));
-
 
114
	    return (void*)fptr;
-
 
115
	} else {
104
	cptr = (char**)R_alloc(n, sizeof(char*));
116
	    cptr = (char**)R_alloc(n, sizeof(char*));
105
	for (i = 0 ; i < n ; i++) {
117
	    for (i = 0 ; i < n ; i++) {
106
	    l = strlen(CHAR(STRING(s)[i]));
118
		l = strlen(CHAR(STRING(s)[i]));
107
	    cptr[i] = (char*)R_alloc(l + 1, sizeof(char));
119
		cptr[i] = (char*)R_alloc(l + 1, sizeof(char));
108
	    strcpy(cptr[i], CHAR(STRING(s)[i]));
120
		strcpy(cptr[i], CHAR(STRING(s)[i]));
-
 
121
	    }
-
 
122
	    return (void*)cptr;
109
	}
123
	}
110
	return (void*)cptr;
-
 
111
	break;
124
	break;
112
    case VECSXP:
125
    case VECSXP:
113
	if (!dup) return (void*)VECTOR(s);
126
	if (!dup) return (void*)VECTOR(s);
114
	n = length(s);
127
	n = length(s);
115
	lptr = (SEXP*)R_alloc(n, sizeof(SEXP));
128
	lptr = (SEXP*)R_alloc(n, sizeof(SEXP));
Line 117... Line 130...
117
	    lptr[i] = VECTOR(s)[i];
130
	    lptr[i] = VECTOR(s)[i];
118
	}
131
	}
119
	return (void*)lptr;
132
	return (void*)lptr;
120
	break;
133
	break;
121
    case LISTSXP:
134
    case LISTSXP:
-
 
135
	if(Fort) error("invalid mode to pass to Fortran (arg %d)", narg);
122
	/* Warning : The following looks like it could bite ... */
136
	/* Warning : The following looks like it could bite ... */
123
	if(!dup) return (void*)s;
137
	if(!dup) return (void*)s;
124
	n = length(s);
138
	n = length(s);
125
	cptr = (char**)R_alloc(n, sizeof(char*));
139
	cptr = (char**)R_alloc(n, sizeof(char*));
126
	for(i=0 ; i<n ; i++) {
140
	for(i=0 ; i<n ; i++) {
Line 128... Line 142...
128
	    s = CDR(s);
142
	    s = CDR(s);
129
	}
143
	}
130
	return (void*)cptr;
144
	return (void*)cptr;
131
	break;
145
	break;
132
    default:
146
    default:
-
 
147
	if(Fort) error("invalid mode to pass to Fortran (arg %d)", narg);
133
	return (void*)s;
148
	return (void*)s;
134
    }
149
    }
135
}
150
}
136
 
151
 
137
static SEXP CPtrToRObj(void *p, int n, SEXPTYPE type)
152
static SEXP CPtrToRObj(void *p, int n, SEXPTYPE type, int Fort)
138
{
153
{
139
    int *iptr;
154
    int *iptr;
140
    double *rptr;
155
    double *rptr;
141
    char **cptr;
156
    char **cptr, buf[256];
142
    complex *zptr;
157
    complex *zptr;
143
    SEXP *lptr;
158
    SEXP *lptr;
144
    int i;
159
    int i;
145
    SEXP s, t;
160
    SEXP s, t;
146
    switch(type) {
161
    switch(type) {
Line 165... Line 180...
165
	for(i=0 ; i<n ; i++) {
180
	for(i=0 ; i<n ; i++) {
166
	    COMPLEX(s)[i] = zptr[i];
181
	    COMPLEX(s)[i] = zptr[i];
167
	}
182
	}
168
	break;
183
	break;
169
    case STRSXP:
184
    case STRSXP:
-
 
185
	if(Fort) {
-
 
186
	    /* only return one string: warned on the R -> Fortran step */
-
 
187
	    strncpy(buf, (char*)p, 255);
-
 
188
	    buf[256] = '\0';
-
 
189
	    PROTECT(s = allocVector(type, 1));
-
 
190
	    STRING(s)[0] = mkChar(buf);
-
 
191
	    UNPROTECT(1);
-
 
192
	} else {
170
	PROTECT(s = allocVector(type, n));
193
	    PROTECT(s = allocVector(type, n));
171
	cptr = (char**)p;
194
	    cptr = (char**)p;
172
	for(i=0 ; i<n ; i++) {
195
	    for(i = 0 ; i < n ; i++) {
173
	    STRING(s)[i] = mkChar(cptr[i]);
196
		STRING(s)[i] = mkChar(cptr[i]);
-
 
197
	    }
-
 
198
	    UNPROTECT(1);
174
	}
199
	}
175
	UNPROTECT(1);
-
 
176
	break;
200
	break;
177
    case VECSXP:
201
    case VECSXP:
178
	PROTECT(s = allocVector(VECSXP, n));
202
	PROTECT(s = allocVector(VECSXP, n));
179
	lptr = (SEXP*)p;
203
	lptr = (SEXP*)p;
180
	for (i = 0 ; i < n ; i++) {
204
	for (i = 0 ; i < n ; i++) {
Line 229... Line 253...
229
SEXP do_symbol(SEXP call, SEXP op, SEXP args, SEXP env)
253
SEXP do_symbol(SEXP call, SEXP op, SEXP args, SEXP env)
230
{
254
{
231
    char buf[128], *p, *q;
255
    char buf[128], *p, *q;
232
    checkArity(op, args);
256
    checkArity(op, args);
233
    if(!isString(CAR(args)) || length(CAR(args)) < 1)
257
    if(!isString(CAR(args)) || length(CAR(args)) < 1)
234
	errorcall(call, "invalid argument\n");
258
	errorcall(call, "invalid argument");
235
    p = CHAR(STRING(CAR(args))[0]);
259
    p = CHAR(STRING(CAR(args))[0]);
236
    q = buf;
260
    q = buf;
237
    while ((*q = *p) != '\0') {
261
    while ((*q = *p) != '\0') {
238
	p++;
262
	p++;
239
	q++;
263
	q++;
Line 253... Line 277...
253
    DL_FUNC fun;
277
    DL_FUNC fun;
254
    char *sym;
278
    char *sym;
255
    int val;
279
    int val;
256
    checkArity(op, args);
280
    checkArity(op, args);
257
    if(!isString(CAR(args)) || length(CAR(args)) < 1)
281
    if(!isString(CAR(args)) || length(CAR(args)) < 1)
258
	errorcall(call, "invalid argument\n");
282
	errorcall(call, "invalid argument");
259
    sym = CHAR(STRING(CAR(args))[0]);
283
    sym = CHAR(STRING(CAR(args))[0]);
260
    val = 1;
284
    val = 1;
261
    if (!(fun = R_FindSymbol(sym)))
285
    if (!(fun = R_FindSymbol(sym)))
262
	val = 0;
286
	val = 0;
263
    ans = allocVector(LGLSXP, 1);
287
    ans = allocVector(LGLSXP, 1);
Line 276... Line 300...
276
 
300
 
277
      /* I don't like this messing with vmax <TSL> */
301
      /* I don't like this messing with vmax <TSL> */
278
      /* vmax = vmaxget(); */
302
      /* vmax = vmaxget(); */
279
      op = CAR(args);
303
      op = CAR(args);
280
      if (!isString(op))
304
      if (!isString(op))
281
	  errorcall(call,"function name must be a string\n");
305
	  errorcall(call,"function name must be a string");
282
 
306
 
283
      /* make up load symbol & look it up */
307
      /* make up load symbol & look it up */
284
      /*      p = CHAR(STRING(op)[0]);
308
      /*      p = CHAR(STRING(op)[0]);
285
      q = buf; while ((*q = *p) != '\0') { p++; q++; }
309
      q = buf; while ((*q = *p) != '\0') { p++; q++; }
286
 
310
 
287
      if (!(fun=R_FindSymbol(buf))) */
311
      if (!(fun=R_FindSymbol(buf))) */
288
      if (!(fun=R_FindSymbol(CHAR(STRING(op)[0]))))
312
      if (!(fun=R_FindSymbol(CHAR(STRING(op)[0]))))
289
	  errorcall(call, "C-R function not in load table\n");
313
	  errorcall(call, "C-R function not in load table");
290
 
314
 
291
      retval = (SEXP)fun(args);
315
      retval = (SEXP)fun(args);
292
 
316
 
293
      /* vmaxset(vmax); */
317
      /* vmaxset(vmax); */
294
      return retval;
318
      return retval;
Line 300... Line 324...
300
    SEXP retval, cargs[MAX_ARGS], pargs;
324
    SEXP retval, cargs[MAX_ARGS], pargs;
301
    int nargs;
325
    int nargs;
302
    char *vmax = vmaxget();
326
    char *vmax = vmaxget();
303
    op = CAR(args);
327
    op = CAR(args);
304
    if (!isString(op))
328
    if (!isString(op))
305
        errorcall(call,"function name must be a string\n");
329
        errorcall(call,"function name must be a string");
306
    if (!(fun=R_FindSymbol(CHAR(STRING(op)[0]))))
330
    if (!(fun=R_FindSymbol(CHAR(STRING(op)[0]))))
307
        errorcall(call, "C-R function not in load table\n");
331
        errorcall(call, "C-R function not in load table");
308
    args = CDR(args);
332
    args = CDR(args);
309
 
333
 
310
    for(nargs = 0, pargs = args ; pargs != R_NilValue; pargs = CDR(pargs)) {
334
    for(nargs = 0, pargs = args ; pargs != R_NilValue; pargs = CDR(pargs)) {
311
        if (nargs == MAX_ARGS)
335
        if (nargs == MAX_ARGS)
312
            errorcall(call, "too many arguments in foreign function call\n");
336
            errorcall(call, "too many arguments in foreign function call");
313
	cargs[nargs] = CAR(pargs);
337
	cargs[nargs] = CAR(pargs);
314
	nargs++;
338
	nargs++;
315
    }
339
    }
316
 
340
 
317
    retval = R_NilValue;	/* -Wall */
341
    retval = R_NilValue;	/* -Wall */
Line 964... Line 988...
964
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
988
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
965
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
989
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
966
	    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
990
	    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
967
	break;
991
	break;
968
    default:
992
    default:
969
	errorcall(call, "too many arguments, sorry\n");
993
	errorcall(call, "too many arguments, sorry");
970
    }
994
    }
971
    vmaxset(vmax);
995
    vmaxset(vmax);
972
    return retval;
996
    return retval;
973
}
997
}
974
 
998
 
Line 985... Line 1009...
985
    }
1009
    }
986
    vmax = vmaxget();
1010
    vmax = vmaxget();
987
    which = PRIMVAL(op);
1011
    which = PRIMVAL(op);
988
    op = CAR(args);
1012
    op = CAR(args);
989
    if (!isString(op))
1013
    if (!isString(op))
990
	errorcall(call, "function name must be a string\n");
1014
	errorcall(call, "function name must be a string");
991
 
1015
 
992
    /* The following code modifies the argument list */
1016
    /* The following code modifies the argument list */
993
    /* We know this is ok because do_dotcode is entered */
1017
    /* We know this is ok because do_dotcode is entered */
994
    /* with its arguments evaluated. */
1018
    /* with its arguments evaluated. */
995
 
1019
 
996
    args = naoktrim(CDR(args), &nargs, &naok, &dup);
1020
    args = naoktrim(CDR(args), &nargs, &naok, &dup);
997
    if(naok == NA_LOGICAL)
1021
    if(naok == NA_LOGICAL)
998
	errorcall(call, "invalid naok value\n");
1022
	errorcall(call, "invalid naok value");
999
    if(nargs > MAX_ARGS)
1023
    if(nargs > MAX_ARGS)
1000
	errorcall(call, "too many arguments in foreign function call\n");
1024
	errorcall(call, "too many arguments in foreign function call");
1001
    cargs = (void**)R_alloc(nargs, sizeof(void*));
1025
    cargs = (void**)R_alloc(nargs, sizeof(void*));
1002
 
1026
 
1003
    /* Convert the arguments for use in foreign */
1027
    /* Convert the arguments for use in foreign */
1004
    /* function calls.  Note that we copy twice */
1028
    /* function calls.  Note that we copy twice */
1005
    /* once here, on the way into the call, and */
1029
    /* once here, on the way into the call, and */
1006
    /* once below on the way out. */
1030
    /* once below on the way out. */
1007
 
1031
 
1008
    nargs = 0;
1032
    nargs = 0;
1009
    for(pargs = args ; pargs != R_NilValue; pargs = CDR(pargs)) {
1033
    for(pargs = args ; pargs != R_NilValue; pargs = CDR(pargs)) {
1010
	cargs[nargs] = RObjToCPtr(CAR(pargs), naok, dup, nargs + 1);
1034
	cargs[nargs] = RObjToCPtr(CAR(pargs), naok, dup, nargs + 1, which);
1011
	nargs++;
1035
	nargs++;
1012
    }
1036
    }
1013
 
1037
 
1014
    /* Make up the load symbol and look it up. */
1038
    /* Make up the load symbol and look it up. */
1015
 
1039
 
Line 1023... Line 1047...
1023
    if (which)
1047
    if (which)
1024
	*q++ = '_';
1048
	*q++ = '_';
1025
    *q = '\0';
1049
    *q = '\0';
1026
#endif
1050
#endif
1027
    if (!(fun = R_FindSymbol(buf)))
1051
    if (!(fun = R_FindSymbol(buf)))
1028
	errorcall(call, "C/Fortran function not in load table\n");
1052
	errorcall(call, "C/Fortran function not in load table");
1029
 
1053
 
1030
    switch (nargs) {
1054
    switch (nargs) {
1031
    case 0:
1055
    case 0:
1032
	/* Silicon graphics C chokes here */
1056
	/* Silicon graphics C chokes here */
1033
	/* if there is no argument to fun. */
1057
	/* if there is no argument to fun. */
Line 1617... Line 1641...
1617
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1641
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1618
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1642
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1619
	    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
1643
	    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
1620
	break;
1644
	break;
1621
    default:
1645
    default:
1622
	errorcall(call, "too many arguments, sorry\n");
1646
	errorcall(call, "too many arguments, sorry");
1623
    }
1647
    }
1624
    PROTECT(ans = allocVector(VECSXP, nargs));
1648
    PROTECT(ans = allocVector(VECSXP, nargs));
1625
    havenames = 0;
1649
    havenames = 0;
1626
    if (dup) {
1650
    if (dup) {
1627
	nargs = 0;
1651
	nargs = 0;
1628
	for (pargs = args ; pargs != R_NilValue ; pargs = CDR(pargs)) {
1652
	for (pargs = args ; pargs != R_NilValue ; pargs = CDR(pargs)) {
1629
	    PROTECT(s = CPtrToRObj(cargs[nargs], LENGTH(CAR(pargs)),
1653
	    PROTECT(s = CPtrToRObj(cargs[nargs], LENGTH(CAR(pargs)),
1630
				   TYPEOF(CAR(pargs))));
1654
				   TYPEOF(CAR(pargs)), which));
1631
	    ATTRIB(s) = duplicate(ATTRIB(CAR(pargs)));
1655
	    ATTRIB(s) = duplicate(ATTRIB(CAR(pargs)));
1632
	    if (TAG(pargs) != R_NilValue)
1656
	    if (TAG(pargs) != R_NilValue)
1633
		havenames = 1;
1657
		havenames = 1;
1634
	    VECTOR(ans)[nargs] = s;
1658
	    VECTOR(ans)[nargs] = s;
1635
	    nargs++;
1659
	    nargs++;
Line 1686... Line 1710...
1686
    for (i = 0 ; typeinfo[i].name ; i++) {
1710
    for (i = 0 ; typeinfo[i].name ; i++) {
1687
	if(!strcmp(typeinfo[i].name, s)) {
1711
	if(!strcmp(typeinfo[i].name, s)) {
1688
	    return typeinfo[i].type;
1712
	    return typeinfo[i].type;
1689
	}
1713
	}
1690
    }
1714
    }
1691
    error("type \"%s\" not supported in interlanguage calls\n", s);
1715
    error("type \"%s\" not supported in interlanguage calls", s);
1692
    return 1; /* for -Wall */
1716
    return 1; /* for -Wall */
1693
}
1717
}
1694
 
1718
 
1695
void call_R(char *func, long nargs, void **arguments, char **modes,
1719
void call_R(char *func, long nargs, void **arguments, char **modes,
1696
	    long *lengths, char **names, long nres, char **results)
1720
	    long *lengths, char **names, long nres, char **results)
1697
{
1721
{
1698
    SEXP call, pcall, s;
1722
    SEXP call, pcall, s;
1699
    SEXPTYPE type;
1723
    SEXPTYPE type;
1700
    int i, j, n;
1724
    int i, j, n;
1701
    if (!isFunction((SEXP)func))
1725
    if (!isFunction((SEXP)func))
1702
	error("invalid function in call_R\n");
1726
	error("invalid function in call_R");
1703
    if (nargs < 0)
1727
    if (nargs < 0)
1704
	error("invalid argument count in call_R\n");
1728
	error("invalid argument count in call_R");
1705
    if (nres < 0)
1729
    if (nres < 0)
1706
	error("invalid return value count in call_R\n");
1730
	error("invalid return value count in call_R");
1707
    PROTECT(pcall = call = allocList(nargs + 1));
1731
    PROTECT(pcall = call = allocList(nargs + 1));
1708
    TYPEOF(call) = LANGSXP;
1732
    TYPEOF(call) = LANGSXP;
1709
    CAR(pcall) = (SEXP)func;
1733
    CAR(pcall) = (SEXP)func;
1710
    s = R_NilValue;		/* -Wall */
1734
    s = R_NilValue;		/* -Wall */
1711
    for (i = 0 ; i < nargs ; i++) {
1735
    for (i = 0 ; i < nargs ; i++) {
Line 1757... Line 1781...
1757
    case INTSXP:
1781
    case INTSXP:
1758
    case REALSXP:
1782
    case REALSXP:
1759
    case CPLXSXP:
1783
    case CPLXSXP:
1760
    case STRSXP:
1784
    case STRSXP:
1761
	if(nres > 0)
1785
	if(nres > 0)
1762
	    results[0] = RObjToCPtr(s, 1, 1, 0);
1786
	    results[0] = RObjToCPtr(s, 1, 1, 0, 0);
1763
	break;
1787
	break;
1764
    case VECSXP:
1788
    case VECSXP:
1765
	n = length(s);
1789
	n = length(s);
1766
	if (nres < n) n = nres;
1790
	if (nres < n) n = nres;
1767
	for (i = 0 ; i < n ; i++) {
1791
	for (i = 0 ; i < n ; i++) {
1768
	    results[i] = RObjToCPtr(VECTOR(s)[i], 1, 1, 0);
1792
	    results[i] = RObjToCPtr(VECTOR(s)[i], 1, 1, 0, 0);
1769
	}
1793
	}
1770
	break;
1794
	break;
1771
    case LISTSXP:
1795
    case LISTSXP:
1772
	n = length(s);
1796
	n = length(s);
1773
	if(nres < n) n = nres;
1797
	if(nres < n) n = nres;
1774
	for(i=0 ; i<n ; i++) {
1798
	for(i=0 ; i<n ; i++) {
1775
	    results[i] = RObjToCPtr(s, 1, 1, 0);
1799
	    results[i] = RObjToCPtr(s, 1, 1, 0, 0);
1776
	    s = CDR(s);
1800
	    s = CDR(s);
1777
	}
1801
	}
1778
	break;
1802
	break;
1779
    }
1803
    }
1780
    UNPROTECT(2);
1804
    UNPROTECT(2);