The R Project SVN R

Rev

Rev 27263 | Rev 30604 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 r 1
/*
26763 maechler 2
 *  R : A Computer Language for Statistical Data Analysis
2 r 3
 *  Copyright (C) 1995  Robert Gentleman and Ross Ihaka
26763 maechler 4
 *  Copyright (C) 1997--2002  The R Development Core Team
5
 *  Copyright (C) 2003	      The R Foundation
2 r 6
 *
7
 *  This program is free software; you can redistribute it and/or modify
8
 *  it under the terms of the GNU General Public License as published by
9
 *  the Free Software Foundation; either version 2 of the License, or
10
 *  (at your option) any later version.
11
 *
12
 *  This program is distributed in the hope that it will be useful,
13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 *  GNU General Public License for more details.
16
 *
26763 maechler 17
 *  A copy of the GNU General Public License is available via WWW at
18
 *  http://www.gnu.org/copyleft/gpl.html.  You can also obtain it by
19
 *  writing to the Free Software Foundation, Inc., 59 Temple Place,
20
 *  Suite 330, Boston, MA  02111-1307  USA.
2 r 21
 */
22
 
5187 hornik 23
#ifdef HAVE_CONFIG_H
7701 hornik 24
#include <config.h>
5187 hornik 25
#endif
26
 
2 r 27
#include <string.h>
28
#include <stdlib.h>
29
 
11499 ripley 30
#include <Defn.h>
31
#include <Rmath.h>
12778 pd 32
#include <Rdevices.h>
5187 hornik 33
 
14156 duncan 34
#include <R_ext/RConverters.h>
35
 
5730 ripley 36
#ifndef max
37
#define max(a, b) ((a > b)?(a):(b))
38
#endif
39
 
2 r 40
 
1839 ihaka 41
/* These are set during each call to do_dotCode() below. */
42
 
2 r 43
static SEXP NaokSymbol = NULL;
44
static SEXP DupSymbol = NULL;
6098 pd 45
static SEXP PkgSymbol = NULL;
2 r 46
 
6098 pd 47
static char DLLname[PATH_MAX];
48
 
14156 duncan 49
/* This looks up entry points in DLLs in a platform specific way. */
15776 hornik 50
#include <Rdynpriv.h>
2 r 51
 
5730 ripley 52
/* Convert an R object to a non-moveable C/Fortran object and return
53
   a pointer to it.  This leaves pointers for anything other
6098 pd 54
   than vectors and lists unaltered.
5730 ripley 55
*/
2 r 56
 
22284 duncan 57
static Rboolean
58
checkNativeType(int targetType, int actualType)
59
{
60
   if(targetType > 0) {
61
      if(targetType == INTSXP || targetType == LGLSXP) {
62
	  return(actualType == INTSXP || actualType == LGLSXP);
63
      }
64
      return(targetType == actualType);
65
   }
66
 
67
  return(TRUE);
68
}
69
 
70
 
71
 
20110 duncan 72
static void *RObjToCPtr(SEXP s, int naok, int dup, int narg, int Fort, const char *name, R_toCConverter **converter,
73
                          int targetType)
2 r 74
{
1839 ihaka 75
    int *iptr;
5769 ripley 76
    float *sptr;
1839 ihaka 77
    double *rptr;
5730 ripley 78
    char **cptr, *fptr;
6994 pd 79
    Rcomplex *zptr;
5769 ripley 80
    SEXP *lptr, CSingSymbol=install("Csingle");
1839 ihaka 81
    int i, l, n;
6098 pd 82
 
14156 duncan 83
    if(converter)
84
	*converter = NULL;
85
 
86
    if(length(getAttrib(s, R_ClassSymbol))) {
87
	R_CConvertInfo info;
88
	int success;
89
        void *ans;
90
 
91
	info.naok = naok;
92
	info.dup = dup;
93
	info.narg = narg;
94
	info.Fort = Fort;
95
        info.name = name;
96
 
97
	ans = Rf_convertToC(s, &info, &success, converter);
98
	if(success)
99
	    return(ans);
100
    }
101
 
22284 duncan 102
    if(checkNativeType(targetType, TYPEOF(s)) == FALSE) {
20110 duncan 103
     if(!dup) {
26763 maechler 104
       error("explicit request not to duplicate arguments in call to %s, but argument %d is of the wrong type (%d != %d)",
22284 duncan 105
	     name, narg + 1, targetType, TYPEOF(s));
26763 maechler 106
     }
20110 duncan 107
 
26763 maechler 108
     if(targetType != SINGLESXP)
20110 duncan 109
        s = coerceVector(s, targetType);
110
    }
111
 
1839 ihaka 112
    switch(TYPEOF(s)) {
113
    case LGLSXP:
114
    case INTSXP:
115
	n = LENGTH(s);
116
	iptr = INTEGER(s);
117
	for (i = 0 ; i < n ; i++) {
118
	    if(!naok && iptr[i] == NA_INTEGER)
5730 ripley 119
		error("NAs in foreign function call (arg %d)", narg);
2 r 120
	}
1839 ihaka 121
	if (dup) {
122
	    iptr = (int*)R_alloc(n, sizeof(int));
123
	    for (i = 0 ; i < n ; i++)
124
		iptr[i] = INTEGER(s)[i];
125
	}
126
	return (void*)iptr;
127
	break;
128
    case REALSXP:
129
	n = LENGTH(s);
130
	rptr = REAL(s);
131
	for (i = 0 ; i < n ; i++) {
5107 maechler 132
	    if(!naok && !R_FINITE(rptr[i]))
5730 ripley 133
		error("NA/NaN/Inf in foreign function call (arg %d)", narg);
1839 ihaka 134
	}
135
	if (dup) {
5769 ripley 136
	    if(asLogical(getAttrib(s, CSingSymbol)) == 1) {
137
		sptr = (float*)R_alloc(n, sizeof(float));
138
		for (i = 0 ; i < n ; i++)
139
		    sptr[i] = (float) REAL(s)[i];
140
		return (void*)sptr;
141
	    } else {
142
		rptr = (double*)R_alloc(n, sizeof(double));
143
		for (i = 0 ; i < n ; i++)
144
		    rptr[i] = REAL(s)[i];
145
		return (void*)rptr;
146
	    }
147
	} else
148
	    return (void*)rptr;
1839 ihaka 149
	break;
150
    case CPLXSXP:
151
	n = LENGTH(s);
152
	zptr = COMPLEX(s);
153
	for (i = 0 ; i < n ; i++) {
5355 hornik 154
	    if(!naok && (!R_FINITE(zptr[i].r) || !R_FINITE(zptr[i].i)))
5730 ripley 155
		error("Complex NA/NaN/Inf in foreign function call (arg %d)", narg);
1839 ihaka 156
	}
157
	if (dup) {
6994 pd 158
	    zptr = (Rcomplex*)R_alloc(n, sizeof(Rcomplex));
1839 ihaka 159
	    for (i = 0 ; i < n ; i++)
160
		zptr[i] = COMPLEX(s)[i];
161
	}
162
	return (void*)zptr;
163
	break;
164
    case STRSXP:
165
	if(!dup)
5730 ripley 166
	    error("character variables must be duplicated in .C/.Fortran");
1839 ihaka 167
	n = LENGTH(s);
5730 ripley 168
	if(Fort) {
169
	    if(n > 1) warning("only first string in char vector used in .Fortran");
10172 luke 170
	    l = strlen(CHAR(STRING_ELT(s, 0)));
5730 ripley 171
	    fptr = (char*)R_alloc(max(255, l) + 1, sizeof(char));
10172 luke 172
	    strcpy(fptr, CHAR(STRING_ELT(s, 0)));
5730 ripley 173
	    return (void*)fptr;
174
	} else {
175
	    cptr = (char**)R_alloc(n, sizeof(char*));
176
	    for (i = 0 ; i < n ; i++) {
10172 luke 177
		l = strlen(CHAR(STRING_ELT(s, i)));
5730 ripley 178
		cptr[i] = (char*)R_alloc(l + 1, sizeof(char));
10172 luke 179
		strcpy(cptr[i], CHAR(STRING_ELT(s, i)));
5730 ripley 180
	    }
181
	    return (void*)cptr;
1839 ihaka 182
	}
183
	break;
184
    case VECSXP:
10172 luke 185
	if (!dup) return (void*)VECTOR_PTR(s); /***** Dangerous to GC!!! */
14156 duncan 186
  	n = length(s);
1839 ihaka 187
	lptr = (SEXP*)R_alloc(n, sizeof(SEXP));
188
	for (i = 0 ; i < n ; i++) {
10172 luke 189
	    lptr[i] = VECTOR_ELT(s, i);
1839 ihaka 190
	}
14156 duncan 191
 	return (void*)lptr;
1839 ihaka 192
	break;
193
    case LISTSXP:
5730 ripley 194
	if(Fort) error("invalid mode to pass to Fortran (arg %d)", narg);
1839 ihaka 195
	/* Warning : The following looks like it could bite ... */
196
	if(!dup) return (void*)s;
197
	n = length(s);
198
	cptr = (char**)R_alloc(n, sizeof(char*));
199
	for(i=0 ; i<n ; i++) {
200
	    cptr[i] = (char*)s;
201
	    s = CDR(s);
202
	}
203
	return (void*)cptr;
204
	break;
205
    default:
5730 ripley 206
	if(Fort) error("invalid mode to pass to Fortran (arg %d)", narg);
1839 ihaka 207
	return (void*)s;
208
    }
2 r 209
}
210
 
14156 duncan 211
 
20110 duncan 212
static SEXP CPtrToRObj(void *p, SEXP arg, int Fort, R_NativePrimitiveArgType type)
2 r 213
{
5769 ripley 214
    int *iptr, n=length(arg);
215
    float *sptr;
1839 ihaka 216
    double *rptr;
5730 ripley 217
    char **cptr, buf[256];
6994 pd 218
    Rcomplex *zptr;
5769 ripley 219
    SEXP *lptr, CSingSymbol = install("Csingle");
1839 ihaka 220
    int i;
221
    SEXP s, t;
6098 pd 222
 
1839 ihaka 223
    switch(type) {
224
    case LGLSXP:
225
    case INTSXP:
226
	s = allocVector(type, n);
227
	iptr = (int*)p;
26763 maechler 228
	for(i=0 ; i<n ; i++)
20110 duncan 229
            INTEGER(s)[i] = iptr[i];
1839 ihaka 230
	break;
231
    case REALSXP:
20110 duncan 232
    case SINGLESXP:
233
	s = allocVector(REALSXP, n);
234
	if(type == SINGLESXP || asLogical(getAttrib(arg, CSingSymbol)) == 1) {
5769 ripley 235
	    sptr = (float*) p;
236
	    for(i=0 ; i<n ; i++) REAL(s)[i] = (double) sptr[i];
237
	} else {
238
	    rptr = (double*) p;
239
	    for(i=0 ; i<n ; i++) REAL(s)[i] = rptr[i];
1839 ihaka 240
	}
241
	break;
242
    case CPLXSXP:
243
	s = allocVector(type, n);
6994 pd 244
	zptr = (Rcomplex*)p;
1839 ihaka 245
	for(i=0 ; i<n ; i++) {
246
	    COMPLEX(s)[i] = zptr[i];
247
	}
248
	break;
249
    case STRSXP:
5730 ripley 250
	if(Fort) {
251
	    /* only return one string: warned on the R -> Fortran step */
252
	    strncpy(buf, (char*)p, 255);
26418 rgentlem 253
	    buf[255] = '\0';
5730 ripley 254
	    PROTECT(s = allocVector(type, 1));
10172 luke 255
	    SET_STRING_ELT(s, 0, mkChar(buf));
5730 ripley 256
	    UNPROTECT(1);
257
	} else {
258
	    PROTECT(s = allocVector(type, n));
259
	    cptr = (char**)p;
260
	    for(i = 0 ; i < n ; i++) {
10172 luke 261
		SET_STRING_ELT(s, i, mkChar(cptr[i]));
5730 ripley 262
	    }
263
	    UNPROTECT(1);
1839 ihaka 264
	}
265
	break;
266
    case VECSXP:
267
	PROTECT(s = allocVector(VECSXP, n));
268
	lptr = (SEXP*)p;
269
	for (i = 0 ; i < n ; i++) {
10172 luke 270
	    SET_VECTOR_ELT(s, i, lptr[i]);
1839 ihaka 271
	}
272
	UNPROTECT(1);
273
	break;
274
    case LISTSXP:
275
	PROTECT(t = s = allocList(n));
276
	lptr = (SEXP*)p;
277
	for(i=0 ; i<n ; i++) {
10172 luke 278
	    SETCAR(t, lptr[i]);
1839 ihaka 279
	    t = CDR(t);
280
	}
281
	UNPROTECT(1);
282
    default:
283
	s = (SEXP)p;
284
    }
285
    return s;
2 r 286
}
287
 
26763 maechler 288
#define THROW_REGISTRATION_TYPE_ERROR
289
 
20110 duncan 290
#ifdef THROW_REGISTRATION_TYPE_ERROR
291
static Rboolean
292
comparePrimitiveTypes(R_NativePrimitiveArgType type, SEXP s, Rboolean dup)
293
{
22284 duncan 294
   if(type == ANYSXP || TYPEOF(s) == type)
20110 duncan 295
      return(TRUE);
2 r 296
 
20110 duncan 297
   if(dup && type == SINGLESXP)
298
      return(asLogical(getAttrib(s, install("Csingle"))) == TRUE);
299
 
300
   return(FALSE);
301
}
302
#endif /* end of THROW_REGISTRATION_TYPE_ERROR */
303
 
304
 
1839 ihaka 305
/* Foreign Function Interface.  This code allows a user to call C */
306
/* or Fortran code which is either statically or dynamically linked. */
2 r 307
 
6098 pd 308
/* NB: despite its name, this leaves NAOK and DUP arguments on the list */
2 r 309
 
6098 pd 310
/* find NAOK and DUP, find and remove PACKAGE */
311
static SEXP naokfind(SEXP args, int * len, int *naok, int *dup)
312
{
14571 duncan 313
    SEXP s, prev;
6098 pd 314
    int nargs=0, naokused=0, dupused=0, pkgused=0;
18560 ripley 315
    char *p;
26763 maechler 316
 
6098 pd 317
    *naok = 0;
318
    *dup = 1;
319
    *len = 0;
14571 duncan 320
    for(s = args, prev=args; s != R_NilValue;) {
6098 pd 321
	if(TAG(s) == NaokSymbol) {
322
	    *naok = asLogical(CAR(s));
14571 duncan 323
	    /* SETCDR(prev, s = CDR(s)); */
6098 pd 324
	    if(naokused++ == 1) warning("NAOK used more than once");
325
	} else if(TAG(s) == DupSymbol) {
326
	    *dup = asLogical(CAR(s));
14571 duncan 327
	    /* SETCDR(prev, s = CDR(s)); */
6098 pd 328
	    if(dupused++ == 1) warning("DUP used more than once");
14571 duncan 329
	} else if(TAG(s) == PkgSymbol) {
18560 ripley 330
	    p = CHAR(STRING_ELT(CAR(s), 0));
331
	    if(strlen(p) > PATH_MAX - 1)
332
		error("DLL name is too long");
333
	    strcpy(DLLname, p);
14585 duncan 334
	    if(pkgused++ > 1) warning("PACKAGE used more than once");
335
	    /* More generally, this should allow us to process
336
               any additional arguments and not insist that PACKAGE
337
               be the last argument.
338
             */
17794 duncan 339
	} else {
340
	    nargs++;
341
	    prev = s;
342
	    s = CDR(s);
343
	    continue;
344
	}
26763 maechler 345
	if(s == args)
17794 duncan 346
	    args = s = CDR(s);
26763 maechler 347
	else
17794 duncan 348
	    SETCDR(prev, s = CDR(s));
6098 pd 349
    }
350
    *len = nargs;
351
    return args;
352
}
353
 
26763 maechler 354
static void setDLLname(SEXP s, char *DLLName)
18560 ripley 355
{
356
    SEXP ss = CAR(s); char *name;
357
    if(TYPEOF(ss) != STRSXP || length(ss) != 1)
358
	error("PACKAGE argument must be a single character string");
359
    name = CHAR(STRING_ELT(ss, 0));
360
    /* allow the package: form of the name, as returned by find */
361
    if(strncmp(name, "package:", 8) == 0)
362
	name += 8;
363
    if(strlen(name) > PATH_MAX - 1)
364
	error("PACKAGE argument is too long");
365
    strcpy(DLLname, name);
14018 jmc 366
}
367
 
6098 pd 368
static SEXP pkgtrim(SEXP args)
369
{
370
    SEXP s, ss;
371
    int pkgused=0;
372
 
373
    for(s = args ; s != R_NilValue;) {
374
	ss = CDR(s);
375
	/* Look for PACKAGE=. We look at the next arg, unless
376
	   this is the last one (which will only happen for one arg),
377
	   and remove it */
378
	if(ss == R_NilValue && TAG(s) == PkgSymbol) {
379
	    if(pkgused++ == 1) warning("PACKAGE used more than once");
14156 duncan 380
	    setDLLname(s, DLLname);
6098 pd 381
	    return R_NilValue;
382
	}
383
	if(TAG(ss) == PkgSymbol) {
384
	    if(pkgused++ == 1) warning("PACKAGE used more than once");
14156 duncan 385
	    setDLLname(ss, DLLname);
10172 luke 386
	    SETCDR(s, CDR(ss));
6098 pd 387
	}
388
	s = CDR(s);
389
    }
390
    return args;
391
}
392
 
2 r 393
#define MAX_ARGS 65
394
 
395
SEXP do_symbol(SEXP call, SEXP op, SEXP args, SEXP env)
396
{
1839 ihaka 397
    char buf[128], *p, *q;
398
    checkArity(op, args);
6098 pd 399
    if(!isValidString(CAR(args)))
9147 maechler 400
	errorcall(call, R_MSG_IA);
10172 luke 401
    p = CHAR(STRING_ELT(CAR(args), 0));
1839 ihaka 402
    q = buf;
403
    while ((*q = *p) != '\0') {
404
	p++;
405
	q++;
406
    }
2 r 407
#ifdef HAVE_F77_UNDERSCORE
1839 ihaka 408
    if(PRIMVAL(op)) {
409
	*q++ = '_';
410
	*q = '\0';
411
    }
2 r 412
#endif
1839 ihaka 413
    return mkString(buf);
2 r 414
}
415
 
416
SEXP do_isloaded(SEXP call, SEXP op, SEXP args, SEXP env)
417
{
1839 ihaka 418
    SEXP ans;
14577 ripley 419
    char *sym, *pkg= "";
420
    int val = 1, nargs = length(args);
421
 
422
    if (nargs < 1) errorcall(call, "no arguments supplied");
423
    if (nargs > 2) errorcall(call, "too many arguments");
424
 
6098 pd 425
    if(!isValidString(CAR(args)))
9147 maechler 426
	errorcall(call, R_MSG_IA);
10172 luke 427
    sym = CHAR(STRING_ELT(CAR(args), 0));
14577 ripley 428
    if(nargs == 2) {
429
	if(!isValidString(CADR(args)))
430
	    errorcall(call, R_MSG_IA);
431
	pkg = CHAR(STRING_ELT(CADR(args), 0));
432
    }
433
    if (!(R_FindSymbol(sym, pkg, NULL))) val = 0;
1839 ihaka 434
    ans = allocVector(LGLSXP, 1);
435
    LOGICAL(ans)[0] = val;
436
    return ans;
2 r 437
}
438
 
3822 thomas 439
/*   Call dynamically loaded "internal" functions */
440
/*   code by Jean Meloche <jean@stat.ubc.ca> */
441
 
442
SEXP do_External(SEXP call, SEXP op, SEXP args, SEXP env)
443
{
6098 pd 444
    DL_FUNC fun;
445
    SEXP retval;
17164 duncan 446
    R_RegisteredNativeSymbol symbol = {R_EXTERNAL_SYM, {NULL}, NULL};
6098 pd 447
    /* I don't like this messing with vmax <TSL> */
448
    /* But it is needed for clearing R_alloc and to be like .Call <BDR>*/
449
    char *vmax = vmaxget();
3822 thomas 450
 
6098 pd 451
    op = CAR(args);
452
    if (!isValidString(op))
6191 maechler 453
	errorcall(call, "function name must be a string (of length 1)");
6098 pd 454
    if (PkgSymbol == NULL) PkgSymbol = install("PACKAGE");
455
    strcpy(DLLname, "");
456
    args = pkgtrim(args);
3822 thomas 457
 
27298 ripley 458
    if (!(fun=R_FindSymbol(CHAR(STRING_ELT(op, 0)), DLLname, NULL))) {
27263 ripley 459
	if(strlen(DLLname))
460
	    errorcall(call,
461
		      ".External function name not in DLL for package %s", 
462
		      DLLname);
463
	else
464
	    errorcall(call, ".External function name not in load table");
27298 ripley 465
    }
6098 pd 466
 
14571 duncan 467
    if(symbol.symbol.external && symbol.symbol.external->numArgs > -1) {
468
	if(symbol.symbol.external->numArgs != length(args))
26763 maechler 469
	    error("Incorrect number of arguments (%d), expecting %d for %s",
14571 duncan 470
		  length(args), symbol.symbol.external->numArgs, CHAR(STRING_ELT(op, 0)));
471
    }
6098 pd 472
    retval = (SEXP)fun(args);
473
    vmaxset(vmax);
474
    return retval;
3822 thomas 475
}
476
 
10983 ihaka 477
 
6098 pd 478
/* .Call(name, <args>) */
4855 ihaka 479
SEXP do_dotcall(SEXP call, SEXP op, SEXP args, SEXP env)
480
{
481
    DL_FUNC fun;
482
    SEXP retval, cargs[MAX_ARGS], pargs;
17164 duncan 483
    R_RegisteredNativeSymbol symbol = {R_CALL_SYM, {NULL}, NULL};
4855 ihaka 484
    int nargs;
4869 ihaka 485
    char *vmax = vmaxget();
4855 ihaka 486
    op = CAR(args);
6098 pd 487
    if (!isValidString(op))
6191 maechler 488
	errorcall(call, "function name must be a string (of length 1)");
6098 pd 489
 
490
    if (PkgSymbol == NULL) PkgSymbol = install("PACKAGE");
491
    strcpy(DLLname, "");
492
    args = pkgtrim(args);
493
 
27298 ripley 494
    if (!(fun=R_FindSymbol(CHAR(STRING_ELT(op, 0)), DLLname, &symbol))) {
27263 ripley 495
	if(strlen(DLLname))
496
	    errorcall(call, ".Call function name not in DLL for package %s", 
497
		      DLLname);
498
	else
499
	    errorcall(call, ".Call function name not in load table");
27298 ripley 500
    }
4855 ihaka 501
    args = CDR(args);
5231 hornik 502
 
4855 ihaka 503
    for(nargs = 0, pargs = args ; pargs != R_NilValue; pargs = CDR(pargs)) {
504
        if (nargs == MAX_ARGS)
5730 ripley 505
            errorcall(call, "too many arguments in foreign function call");
4855 ihaka 506
	cargs[nargs] = CAR(pargs);
507
	nargs++;
508
    }
14571 duncan 509
    if(symbol.symbol.call && symbol.symbol.call->numArgs > -1) {
510
	if(symbol.symbol.call->numArgs != nargs)
26763 maechler 511
	    error("Incorrect number of arguments (%d), expecting %d for %s",
14571 duncan 512
		  nargs, symbol.symbol.call->numArgs, CHAR(STRING_ELT(op, 0)));
513
    }
5231 hornik 514
 
515
    retval = R_NilValue;	/* -Wall */
4855 ihaka 516
    switch (nargs) {
517
    case 0:
518
	retval = (SEXP)fun();
519
	break;
520
    case 1:
521
	retval = (SEXP)fun(cargs[0]);
522
	break;
523
    case 2:
524
	retval = (SEXP)fun(cargs[0], cargs[1]);
525
	break;
526
    case 3:
527
	retval = (SEXP)fun(cargs[0], cargs[1], cargs[2]);
528
	break;
529
    case 4:
530
	retval = (SEXP)fun(cargs[0], cargs[1], cargs[2], cargs[3]);
531
	break;
532
    case 5:
533
	retval = (SEXP)fun(
534
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4]);
535
	break;
536
    case 6:
537
	retval = (SEXP)fun(
538
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
539
	    cargs[5]);
540
	break;
541
    case 7:
542
	retval = (SEXP)fun(
543
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
544
	    cargs[5],  cargs[6]);
545
	break;
546
    case 8:
547
	retval = (SEXP)fun(
548
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
549
	    cargs[5],  cargs[6],  cargs[7]);
550
	break;
551
    case 9:
552
	retval = (SEXP)fun(
553
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
554
	    cargs[5],  cargs[6],  cargs[7],  cargs[8]);
555
	break;
556
    case 10:
557
	retval = (SEXP)fun(
558
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
559
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9]);
560
	break;
561
    case 11:
562
	retval = (SEXP)fun(
563
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
564
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
565
	    cargs[10]);
566
	break;
567
    case 12:
568
	retval = (SEXP)fun(
569
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
570
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
571
	    cargs[10], cargs[11]);
572
	break;
573
    case 13:
574
	retval = (SEXP)fun(
575
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
576
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
577
	    cargs[10], cargs[11], cargs[12]);
578
	break;
579
    case 14:
580
	retval = (SEXP)fun(
581
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
582
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
583
	    cargs[10], cargs[11], cargs[12], cargs[13]);
584
	break;
585
    case 15:
586
	retval = (SEXP)fun(
587
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
588
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
589
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14]);
590
	break;
591
    case 16:
592
	retval = (SEXP)fun(
593
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
594
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
595
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
596
	    cargs[15]);
597
	break;
598
    case 17:
599
	retval = (SEXP)fun(
600
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
601
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
602
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
603
	    cargs[15], cargs[16]);
604
	break;
605
    case 18:
606
	retval = (SEXP)fun(
607
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
608
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
609
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
610
	    cargs[15], cargs[16], cargs[17]);
611
	break;
612
    case 19:
613
	retval = (SEXP)fun(
614
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
615
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
616
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
617
	    cargs[15], cargs[16], cargs[17], cargs[18]);
618
	break;
619
    case 20:
620
	retval = (SEXP)fun(
621
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
622
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
623
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
624
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19]);
625
	break;
626
    case 21:
627
	retval = (SEXP)fun(
628
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
629
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
630
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
631
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
632
	    cargs[20]);
633
	break;
634
    case 22:
635
	retval = (SEXP)fun(
636
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
637
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
638
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
639
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
640
	    cargs[20], cargs[21]);
641
	break;
642
    case 23:
643
	retval = (SEXP)fun(
644
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
645
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
646
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
647
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
648
	    cargs[20], cargs[21], cargs[22]);
649
	break;
650
    case 24:
651
	retval = (SEXP)fun(
652
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
653
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
654
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
655
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
656
	    cargs[20], cargs[21], cargs[22], cargs[23]);
657
	break;
658
    case 25:
659
	retval = (SEXP)fun(
660
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
661
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
662
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
663
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
664
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24]);
665
	break;
666
    case 26:
667
	retval = (SEXP)fun(
668
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
669
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
670
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
671
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
672
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
673
	    cargs[25]);
674
	break;
675
    case 27:
676
	retval = (SEXP)fun(
677
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
678
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
679
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
680
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
681
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
682
	    cargs[25], cargs[26]);
683
	break;
684
    case 28:
685
	retval = (SEXP)fun(
686
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
687
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
688
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
689
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
690
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
691
	    cargs[25], cargs[26], cargs[27]);
692
	break;
693
    case 29:
694
	retval = (SEXP)fun(
695
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
696
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
697
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
698
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
699
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
700
	    cargs[25], cargs[26], cargs[27], cargs[28]);
701
	break;
702
    case 30:
703
	retval = (SEXP)fun(
704
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
705
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
706
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
707
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
708
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
709
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29]);
710
	break;
711
    case 31:
712
	retval = (SEXP)fun(
713
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
714
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
715
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
716
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
717
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
718
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
719
	    cargs[30]);
720
	break;
721
    case 32:
722
	retval = (SEXP)fun(
723
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
724
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
725
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
726
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
727
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
728
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
729
	    cargs[30], cargs[31]);
730
	break;
731
    case 33:
732
	retval = (SEXP)fun(
733
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
734
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
735
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
736
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
737
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
738
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
739
	    cargs[30], cargs[31], cargs[32]);
740
	break;
741
    case 34:
742
	retval = (SEXP)fun(
743
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
744
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
745
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
746
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
747
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
748
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
749
	    cargs[30], cargs[31], cargs[32], cargs[33]);
750
	break;
751
    case 35:
752
	retval = (SEXP)fun(
753
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
754
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
755
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
756
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
757
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
758
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
759
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34]);
760
	break;
761
    case 36:
762
	retval = (SEXP)fun(
763
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
764
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
765
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
766
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
767
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
768
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
769
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
770
	    cargs[35]);
771
	break;
772
    case 37:
773
	retval = (SEXP)fun(
774
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
775
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
776
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
777
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
778
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
779
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
780
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
781
	    cargs[35], cargs[36]);
782
	break;
783
    case 38:
784
	retval = (SEXP)fun(
785
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
786
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
787
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
788
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
789
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
790
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
791
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
792
	    cargs[35], cargs[36], cargs[37]);
793
	break;
794
    case 39:
795
	retval = (SEXP)fun(
796
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
797
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
798
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
799
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
800
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
801
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
802
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
803
	    cargs[35], cargs[36], cargs[37], cargs[38]);
804
	break;
805
    case 40:
806
	retval = (SEXP)fun(
807
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
808
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
809
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
810
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
811
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
812
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
813
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
814
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39]);
815
	break;
816
    case 41:
817
	retval = (SEXP)fun(
818
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
819
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
820
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
821
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
822
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
823
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
824
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
825
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
826
	    cargs[40]);
827
	break;
828
    case 42:
829
	retval = (SEXP)fun(
830
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
831
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
832
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
833
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
834
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
835
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
836
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
837
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
838
	    cargs[40], cargs[41]);
839
	break;
840
    case 43:
841
	retval = (SEXP)fun(
842
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
843
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
844
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
845
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
846
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
847
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
848
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
849
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
850
	    cargs[40], cargs[41], cargs[42]);
851
	break;
852
    case 44:
853
	retval = (SEXP)fun(
854
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
855
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
856
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
857
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
858
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
859
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
860
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
861
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
862
	    cargs[40], cargs[41], cargs[42], cargs[43]);
863
	break;
864
    case 45:
865
	retval = (SEXP)fun(
866
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
867
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
868
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
869
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
870
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
871
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
872
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
873
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
874
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44]);
875
	break;
876
    case 46:
877
	retval = (SEXP)fun(
878
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
879
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
880
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
881
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
882
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
883
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
884
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
885
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
886
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
887
	    cargs[45]);
888
	break;
889
    case 47:
890
	retval = (SEXP)fun(
891
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
892
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
893
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
894
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
895
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
896
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
897
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
898
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
899
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
900
	    cargs[45], cargs[46]);
901
	break;
902
    case 48:
903
	retval = (SEXP)fun(
904
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
905
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
906
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
907
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
908
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
909
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
910
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
911
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
912
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
913
	    cargs[45], cargs[46], cargs[47]);
914
	break;
915
    case 49:
916
	retval = (SEXP)fun(
917
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
918
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
919
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
920
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
921
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
922
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
923
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
924
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
925
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
926
	    cargs[45], cargs[46], cargs[47], cargs[48]);
927
	break;
928
    case 50:
929
	retval = (SEXP)fun(
930
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
931
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
932
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
933
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
934
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
935
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
936
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
937
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
938
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
939
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49]);
940
	break;
941
    case 51:
942
	retval = (SEXP)fun(
943
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
944
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
945
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
946
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
947
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
948
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
949
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
950
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
951
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
952
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
953
	    cargs[50]);
954
	break;
955
    case 52:
956
	retval = (SEXP)fun(
957
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
958
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
959
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
960
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
961
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
962
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
963
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
964
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
965
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
966
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
967
	    cargs[50], cargs[51]);
968
	break;
969
    case 53:
970
	retval = (SEXP)fun(
971
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
972
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
973
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
974
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
975
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
976
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
977
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
978
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
979
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
980
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
981
	    cargs[50], cargs[51], cargs[52]);
982
	break;
983
    case 54:
984
	retval = (SEXP)fun(
985
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
986
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
987
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
988
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
989
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
990
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
991
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
992
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
993
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
994
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
995
	    cargs[50], cargs[51], cargs[52], cargs[53]);
996
	break;
997
    case 55:
998
	retval = (SEXP)fun(
999
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1000
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1001
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1002
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1003
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1004
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1005
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1006
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1007
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1008
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1009
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54]);
1010
	break;
1011
    case 56:
1012
	retval = (SEXP)fun(
1013
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1014
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1015
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1016
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1017
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1018
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1019
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1020
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1021
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1022
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1023
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1024
	    cargs[55]);
1025
	break;
1026
    case 57:
1027
	retval = (SEXP)fun(
1028
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1029
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1030
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1031
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1032
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1033
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1034
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1035
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1036
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1037
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1038
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1039
	    cargs[55], cargs[56]);
1040
	break;
1041
    case 58:
1042
	retval = (SEXP)fun(
1043
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1044
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1045
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1046
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1047
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1048
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1049
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1050
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1051
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1052
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1053
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1054
	    cargs[55], cargs[56], cargs[57]);
1055
	break;
1056
    case 59:
1057
	retval = (SEXP)fun(
1058
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1059
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1060
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1061
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1062
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1063
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1064
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1065
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1066
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1067
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1068
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1069
	    cargs[55], cargs[56], cargs[57], cargs[58]);
1070
	break;
1071
    case 60:
1072
	retval = (SEXP)fun(
1073
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1074
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1075
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1076
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1077
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1078
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1079
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1080
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1081
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1082
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1083
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1084
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59]);
1085
	break;
1086
    case 61:
1087
	retval = (SEXP)fun(
1088
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1089
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1090
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1091
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1092
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1093
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1094
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1095
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1096
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1097
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1098
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1099
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1100
	    cargs[60]);
1101
	break;
1102
    case 62:
1103
	retval = (SEXP)fun(
1104
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1105
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1106
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1107
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1108
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1109
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1110
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1111
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1112
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1113
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1114
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1115
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1116
	    cargs[60], cargs[61]);
1117
	break;
1118
    case 63:
1119
	retval = (SEXP)fun(
1120
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1121
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1122
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1123
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1124
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1125
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1126
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1127
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1128
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1129
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1130
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1131
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1132
	    cargs[60], cargs[61], cargs[62]);
1133
	break;
1134
    case 64:
1135
	retval = (SEXP)fun(
1136
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1137
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1138
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1139
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1140
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1141
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1142
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1143
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1144
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1145
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1146
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1147
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1148
	    cargs[60], cargs[61], cargs[62], cargs[63]);
1149
	break;
1150
    case 65:
1151
	retval = (SEXP)fun(
1152
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1153
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1154
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1155
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1156
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1157
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1158
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1159
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1160
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1161
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1162
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1163
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1164
	    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
1165
	break;
1166
    default:
5730 ripley 1167
	errorcall(call, "too many arguments, sorry");
4855 ihaka 1168
    }
4869 ihaka 1169
    vmaxset(vmax);
4855 ihaka 1170
    return retval;
1171
}
1172
 
10983 ihaka 1173
/*  Call dynamically loaded "internal" graphics functions */
1174
/*  .External.gr  and  .Call.gr */
1175
 
1176
SEXP do_Externalgr(SEXP call, SEXP op, SEXP args, SEXP env)
1177
{
1178
    SEXP retval = do_External(call, op, args, env);
1179
    if (call != R_NilValue) {
1180
        DevDesc *dd = CurrentDevice();
1181
        GCheckState(dd);
1182
	recordGraphicOperation(op, args, dd);
1183
    }
1184
    return retval;
1185
}
1186
 
1187
SEXP do_dotcallgr(SEXP call, SEXP op, SEXP args, SEXP env)
1188
{
1189
    SEXP retval = do_dotcall(call, op, args, env);
1190
    if (call != R_NilValue) {
1191
        DevDesc *dd = CurrentDevice();
16950 murrell 1192
	GCheckState(dd);
10983 ihaka 1193
	recordGraphicOperation(op, args, dd);
1194
    }
1195
    return retval;
1196
}
1197
 
1198
 
6098 pd 1199
/* .C() {op=0}  or  .Fortran() {op=1} */
2 r 1200
SEXP do_dotCode(SEXP call, SEXP op, SEXP args, SEXP env)
1201
{
1839 ihaka 1202
    void **cargs;
1203
    int dup, havenames, naok, nargs, which;
1204
    DL_FUNC fun;
1895 ihaka 1205
    SEXP ans, pargs, s;
20110 duncan 1206
    R_toCConverter  *argConverters[65]; /* the post-call converters back to R objects. */
17164 duncan 1207
    R_RegisteredNativeSymbol symbol = {R_C_SYM, {NULL}, NULL};
20110 duncan 1208
    R_NativePrimitiveArgType *checkTypes = NULL;
1209
    R_NativeArgStyle *argStyles = NULL;
14571 duncan 1210
 
1839 ihaka 1211
    char buf[128], *p, *q, *vmax;
6098 pd 1212
    if (NaokSymbol == NULL || DupSymbol == NULL || PkgSymbol == NULL) {
1839 ihaka 1213
	NaokSymbol = install("NAOK");
1214
	DupSymbol = install("DUP");
6098 pd 1215
	PkgSymbol = install("PACKAGE");
1839 ihaka 1216
    }
1217
    vmax = vmaxget();
1218
    which = PRIMVAL(op);
14571 duncan 1219
    if(which)
1220
	symbol.type = R_FORTRAN_SYM;
1839 ihaka 1221
    op = CAR(args);
6098 pd 1222
    if (!isValidString(op))
1223
	errorcall(call, "function name must be a string (of length 1)");
1016 maechler 1224
 
1839 ihaka 1225
    /* The following code modifies the argument list */
5769 ripley 1226
    /* We know this is ok because do_dotCode is entered */
1839 ihaka 1227
    /* with its arguments evaluated. */
2 r 1228
 
6098 pd 1229
    strcpy(DLLname, "");
1230
    args = naokfind(CDR(args), &nargs, &naok, &dup);
1839 ihaka 1231
    if(naok == NA_LOGICAL)
5730 ripley 1232
	errorcall(call, "invalid naok value");
1839 ihaka 1233
    if(nargs > MAX_ARGS)
5730 ripley 1234
	errorcall(call, "too many arguments in foreign function call");
2 r 1235
 
1839 ihaka 1236
    /* Make up the load symbol and look it up. */
1016 maechler 1237
 
10172 luke 1238
    p = CHAR(STRING_ELT(op, 0));
1839 ihaka 1239
    q = buf;
1240
    while ((*q = *p) != '\0') {
1241
	p++;
1242
	q++;
1243
    }
22284 duncan 1244
 
27298 ripley 1245
    if (!(fun = R_FindSymbol(buf, DLLname, &symbol))) {
27263 ripley 1246
	if(strlen(DLLname))
1247
	    errorcall(call, "%s function name not in DLL for package %s",
1248
		      which ? "Fortran" : "C", DLLname);
1249
	else
1250
	    errorcall(call, "%s function name not in load table",
1251
		      which ? "Fortran" : "C");
27298 ripley 1252
    }
2 r 1253
 
14571 duncan 1254
    if(symbol.symbol.c && symbol.symbol.c->numArgs > -1) {
1255
	if(symbol.symbol.c->numArgs != nargs)
26763 maechler 1256
	    error("Incorrect number of arguments (%d), expecting %d for %s",
14571 duncan 1257
		  nargs, symbol.symbol.c->numArgs, buf);
26763 maechler 1258
 
20110 duncan 1259
        checkTypes = symbol.symbol.c->types;
1260
        argStyles = symbol.symbol.c->styles;
14571 duncan 1261
    }
14156 duncan 1262
 
1263
    /* Convert the arguments for use in foreign */
1264
    /* function calls.  Note that we copy twice */
1265
    /* once here, on the way into the call, and */
1266
    /* once below on the way out. */
14571 duncan 1267
    cargs = (void**)R_alloc(nargs, sizeof(void*));
14156 duncan 1268
    nargs = 0;
1269
    for(pargs = args ; pargs != R_NilValue; pargs = CDR(pargs)) {
20110 duncan 1270
#ifdef THROW_REGISTRATION_TYPE_ERROR
1271
        if(checkTypes && !comparePrimitiveTypes(checkTypes[nargs], CAR(pargs), dup)) {
1272
            /* We can loop over all the arguments and report all the erroneous ones,
1273
               but then we would also want to avoid the conversions.
1274
               Also, in the future, we may just attempt to coerce the value
1275
               to the appropriate type. This is why we pass the checkTypes[nargs]
26763 maechler 1276
               value to RObjToCPtr(). We just have to sort out the ability to
20110 duncan 1277
               return the correct value which is complicated by dup, etc. */
1278
  	   error("Wrong type for argument %d in call to %s", nargs+1, buf);
1279
	}
1280
#endif
26763 maechler 1281
	cargs[nargs] = RObjToCPtr(CAR(pargs), naok, dup, nargs + 1,
1282
				  which, buf, argConverters + nargs,
20110 duncan 1283
				  checkTypes ? checkTypes[nargs] : 0);
14156 duncan 1284
	nargs++;
1285
    }
1286
 
1287
 
1839 ihaka 1288
    switch (nargs) {
1289
    case 0:
1290
	/* Silicon graphics C chokes here */
1291
	/* if there is no argument to fun. */
1292
	fun(0);
1293
	break;
1294
    case 1:
1295
	fun(cargs[0]);
1296
	break;
1297
    case 2:
1298
	fun(cargs[0], cargs[1]);
1299
	break;
1300
    case 3:
1301
	fun(cargs[0], cargs[1], cargs[2]);
1302
	break;
1303
    case 4:
1304
	fun(cargs[0], cargs[1], cargs[2], cargs[3]);
1305
	break;
1306
    case 5:
1307
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4]);
1308
	break;
1309
    case 6:
1310
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1311
	    cargs[5]);
1312
	break;
1313
    case 7:
1314
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1315
	    cargs[5],  cargs[6]);
1316
	break;
1317
    case 8:
1318
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1319
	    cargs[5],  cargs[6],  cargs[7]);
1320
	break;
1321
    case 9:
1322
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1323
	    cargs[5],  cargs[6],  cargs[7],  cargs[8]);
1324
	break;
1325
    case 10:
1326
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1327
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9]);
1328
	break;
1329
    case 11:
1330
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1331
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1332
	    cargs[10]);
1333
	break;
1334
    case 12:
1335
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1336
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1337
	    cargs[10], cargs[11]);
1338
	break;
1339
    case 13:
1340
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1341
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1342
	    cargs[10], cargs[11], cargs[12]);
1343
	break;
1344
    case 14:
1345
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1346
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1347
	    cargs[10], cargs[11], cargs[12], cargs[13]);
1348
	break;
1349
    case 15:
1350
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1351
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1352
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14]);
1353
	break;
1354
    case 16:
1355
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1356
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1357
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1358
	    cargs[15]);
1359
	break;
1360
    case 17:
1361
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1362
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1363
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1364
	    cargs[15], cargs[16]);
1365
	break;
1366
    case 18:
1367
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1368
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1369
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1370
	    cargs[15], cargs[16], cargs[17]);
1371
	break;
1372
    case 19:
1373
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1374
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1375
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1376
	    cargs[15], cargs[16], cargs[17], cargs[18]);
1377
	break;
1378
    case 20:
1379
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1380
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1381
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1382
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19]);
1383
	break;
1384
    case 21:
1385
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1386
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1387
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1388
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1389
	    cargs[20]);
1390
	break;
1391
    case 22:
1392
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1393
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1394
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1395
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1396
	    cargs[20], cargs[21]);
1397
	break;
1398
    case 23:
1399
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1400
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1401
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1402
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1403
	    cargs[20], cargs[21], cargs[22]);
1404
	break;
1405
    case 24:
1406
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1407
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1408
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1409
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1410
	    cargs[20], cargs[21], cargs[22], cargs[23]);
1411
	break;
1412
    case 25:
1413
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1414
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1415
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1416
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1417
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24]);
1418
	break;
1419
    case 26:
1420
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1421
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1422
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1423
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1424
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1425
	    cargs[25]);
1426
	break;
1427
    case 27:
1428
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1429
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1430
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1431
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1432
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1433
	    cargs[25], cargs[26]);
1434
	break;
1435
    case 28:
1436
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1437
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1438
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1439
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1440
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1441
	    cargs[25], cargs[26], cargs[27]);
1442
	break;
1443
    case 29:
1444
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1445
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1446
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1447
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1448
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1449
	    cargs[25], cargs[26], cargs[27], cargs[28]);
1450
	break;
1451
    case 30:
1452
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1453
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1454
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1455
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1456
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1457
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29]);
1458
	break;
1459
    case 31:
1460
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1461
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1462
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1463
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1464
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1465
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1466
	    cargs[30]);
1467
	break;
1468
    case 32:
1469
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1470
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1471
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1472
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1473
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1474
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1475
	    cargs[30], cargs[31]);
1476
	break;
1477
    case 33:
1478
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1479
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1480
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1481
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1482
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1483
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1484
	    cargs[30], cargs[31], cargs[32]);
1485
	break;
1486
    case 34:
1487
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1488
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1489
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1490
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1491
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1492
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1493
	    cargs[30], cargs[31], cargs[32], cargs[33]);
1494
	break;
1495
    case 35:
1496
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1497
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1498
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1499
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1500
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1501
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1502
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34]);
1503
	break;
1504
    case 36:
1505
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1506
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1507
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1508
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1509
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1510
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1511
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1512
	    cargs[35]);
1513
	break;
1514
    case 37:
1515
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1516
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1517
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1518
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1519
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1520
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1521
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1522
	    cargs[35], cargs[36]);
1523
	break;
1524
    case 38:
1525
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1526
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1527
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1528
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1529
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1530
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1531
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1532
	    cargs[35], cargs[36], cargs[37]);
1533
	break;
1534
    case 39:
1535
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1536
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1537
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1538
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1539
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1540
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1541
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1542
	    cargs[35], cargs[36], cargs[37], cargs[38]);
1543
	break;
1544
    case 40:
1545
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1546
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1547
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1548
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1549
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1550
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1551
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1552
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39]);
1553
	break;
1554
    case 41:
1555
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1556
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1557
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1558
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1559
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1560
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1561
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1562
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1563
	    cargs[40]);
1564
	break;
1565
    case 42:
1566
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1567
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1568
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1569
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1570
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1571
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1572
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1573
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1574
	    cargs[40], cargs[41]);
1575
	break;
1576
    case 43:
1577
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1578
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1579
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1580
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1581
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1582
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1583
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1584
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1585
	    cargs[40], cargs[41], cargs[42]);
1586
	break;
1587
    case 44:
1588
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1589
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1590
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1591
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1592
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1593
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1594
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1595
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1596
	    cargs[40], cargs[41], cargs[42], cargs[43]);
1597
	break;
1598
    case 45:
1599
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1600
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1601
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1602
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1603
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1604
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1605
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1606
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1607
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44]);
1608
	break;
1609
    case 46:
1610
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1611
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1612
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1613
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1614
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1615
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1616
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1617
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1618
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1619
	    cargs[45]);
1620
	break;
1621
    case 47:
1622
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1623
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1624
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1625
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1626
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1627
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1628
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1629
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1630
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1631
	    cargs[45], cargs[46]);
1632
	break;
1633
    case 48:
1634
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1635
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1636
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1637
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1638
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1639
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1640
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1641
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1642
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1643
	    cargs[45], cargs[46], cargs[47]);
1644
	break;
1645
    case 49:
1646
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1647
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1648
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1649
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1650
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1651
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1652
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1653
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1654
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1655
	    cargs[45], cargs[46], cargs[47], cargs[48]);
1656
	break;
1657
    case 50:
1658
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1659
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1660
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1661
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1662
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1663
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1664
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1665
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1666
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1667
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49]);
1668
	break;
1669
    case 51:
1670
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1671
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1672
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1673
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1674
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1675
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1676
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1677
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1678
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1679
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1680
	    cargs[50]);
1681
	break;
1682
    case 52:
1683
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1684
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1685
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1686
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1687
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1688
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1689
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1690
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1691
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1692
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1693
	    cargs[50], cargs[51]);
1694
	break;
1695
    case 53:
1696
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1697
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1698
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1699
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1700
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1701
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1702
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1703
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1704
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1705
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1706
	    cargs[50], cargs[51], cargs[52]);
1707
	break;
1708
    case 54:
1709
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1710
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1711
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1712
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1713
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1714
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1715
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1716
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1717
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1718
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1719
	    cargs[50], cargs[51], cargs[52], cargs[53]);
1720
	break;
1721
    case 55:
1722
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1723
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1724
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1725
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1726
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1727
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1728
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1729
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1730
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1731
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1732
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54]);
1733
	break;
1734
    case 56:
1735
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1736
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1737
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1738
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1739
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1740
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1741
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1742
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1743
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1744
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1745
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1746
	    cargs[55]);
1747
	break;
1748
    case 57:
1749
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1750
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1751
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1752
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1753
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1754
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1755
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1756
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1757
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1758
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1759
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1760
	    cargs[55], cargs[56]);
1761
	break;
1762
    case 58:
1763
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1764
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1765
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1766
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1767
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1768
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1769
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1770
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1771
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1772
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1773
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1774
	    cargs[55], cargs[56], cargs[57]);
1775
	break;
1776
    case 59:
1777
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1778
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1779
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1780
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1781
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1782
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1783
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1784
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1785
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1786
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1787
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1788
	    cargs[55], cargs[56], cargs[57], cargs[58]);
1789
	break;
1790
    case 60:
1791
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1792
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1793
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1794
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1795
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1796
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1797
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1798
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1799
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1800
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1801
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1802
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59]);
1803
	break;
1804
    case 61:
1805
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1806
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1807
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1808
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1809
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1810
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1811
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1812
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1813
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1814
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1815
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1816
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1817
	    cargs[60]);
1818
	break;
1819
    case 62:
1820
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1821
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1822
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1823
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1824
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1825
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1826
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1827
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1828
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1829
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1830
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1831
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1832
	    cargs[60], cargs[61]);
1833
	break;
1834
    case 63:
1835
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1836
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1837
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1838
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1839
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1840
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1841
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1842
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1843
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1844
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1845
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1846
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1847
	    cargs[60], cargs[61], cargs[62]);
1848
	break;
1849
    case 64:
1850
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1851
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1852
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1853
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1854
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1855
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1856
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1857
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1858
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1859
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1860
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1861
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1862
	    cargs[60], cargs[61], cargs[62], cargs[63]);
1863
	break;
1864
    case 65:
1865
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1866
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1867
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1868
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1869
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1870
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1871
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1872
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1873
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1874
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1875
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1876
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1877
	    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
1878
	break;
1879
    default:
5730 ripley 1880
	errorcall(call, "too many arguments, sorry");
1839 ihaka 1881
    }
1882
    PROTECT(ans = allocVector(VECSXP, nargs));
1883
    havenames = 0;
1884
    if (dup) {
14156 duncan 1885
	R_FromCConvertInfo info;
1886
	info.cargs = cargs;
1887
	info.allArgs = args;
1888
	info.nargs = nargs;
1889
	info.functionName = buf;
2 r 1890
	nargs = 0;
1839 ihaka 1891
	for (pargs = args ; pargs != R_NilValue ; pargs = CDR(pargs)) {
20110 duncan 1892
	    if(argStyles && argStyles[nargs] == R_ARG_IN) {
1893
	        PROTECT(s = R_NilValue);
1894
	    } else if(argConverters[nargs]) {
14156 duncan 1895
                if(argConverters[nargs]->reverse) {
1896
		    info.argIndex = nargs;
26763 maechler 1897
		    s = argConverters[nargs]->reverse(cargs[nargs], CAR(pargs),
14156 duncan 1898
                                                       &info, argConverters[nargs]);
1899
		} else
1900
		    s = R_NilValue;
1901
		PROTECT(s);
1902
	    } else {
26763 maechler 1903
		PROTECT(s = CPtrToRObj(cargs[nargs], CAR(pargs), which,
20110 duncan 1904
				       checkTypes ? checkTypes[nargs] : TYPEOF(CAR(pargs))));
14156 duncan 1905
		SET_ATTRIB(s, duplicate(ATTRIB(CAR(pargs))));
1906
		SET_OBJECT(s, OBJECT(CAR(pargs)));
1907
	    }
1839 ihaka 1908
	    if (TAG(pargs) != R_NilValue)
1909
		havenames = 1;
10172 luke 1910
	    SET_VECTOR_ELT(ans, nargs, s);
1839 ihaka 1911
	    nargs++;
1912
	    UNPROTECT(1);
2 r 1913
	}
1839 ihaka 1914
    }
1915
    else {
1916
	nargs = 0;
1917
	for (pargs = args ; pargs != R_NilValue ; pargs = CDR(pargs)) {
1918
	    if (TAG(pargs) != R_NilValue)
1919
		havenames = 1;
10172 luke 1920
	    SET_VECTOR_ELT(ans, nargs, CAR(pargs));
1839 ihaka 1921
	    nargs++;
2 r 1922
	}
1839 ihaka 1923
    }
1924
    if (havenames) {
1889 ihaka 1925
	SEXP names;
1839 ihaka 1926
	PROTECT(names = allocVector(STRSXP, nargs));
1927
	nargs = 0;
1928
	for (pargs = args ; pargs != R_NilValue ; pargs = CDR(pargs)) {
1929
	    if (TAG(pargs) == R_NilValue)
10172 luke 1930
		SET_STRING_ELT(names, nargs++, R_BlankString);
1839 ihaka 1931
	    else
10172 luke 1932
		SET_STRING_ELT(names, nargs++, PRINTNAME(TAG(pargs)));
1839 ihaka 1933
        }
1934
	setAttrib(ans, R_NamesSymbol, names);
1935
	UNPROTECT(1);
1936
    }
1937
    UNPROTECT(1);
1938
    vmaxset(vmax);
1939
    return (ans);
1940
}
2 r 1941
 
3875 hornik 1942
/* FIXME : Must work out what happens here when we replace LISTSXP by
1943
   VECSXP. */
1016 maechler 1944
 
19912 duncan 1945
static const struct {
1946
    const char *name;
1947
    const SEXPTYPE type;
2 r 1948
}
1839 ihaka 1949
typeinfo[] = {
1950
    {"logical",	  LGLSXP },
1951
    {"integer",	  INTSXP },
1952
    {"double",	  REALSXP},
1953
    {"complex",	  CPLXSXP},
1954
    {"character", STRSXP },
1955
    {"list",	  VECSXP },
1956
    {NULL,	  0      }
2 r 1957
};
1958
 
1959
static int string2type(char *s)
1960
{
1839 ihaka 1961
    int i;
1962
    for (i = 0 ; typeinfo[i].name ; i++) {
1963
	if(!strcmp(typeinfo[i].name, s)) {
1964
	    return typeinfo[i].type;
2 r 1965
	}
1839 ihaka 1966
    }
5730 ripley 1967
    error("type \"%s\" not supported in interlanguage calls", s);
1839 ihaka 1968
    return 1; /* for -Wall */
2 r 1969
}
1970
 
1971
void call_R(char *func, long nargs, void **arguments, char **modes,
1839 ihaka 1972
	    long *lengths, char **names, long nres, char **results)
2 r 1973
{
1839 ihaka 1974
    SEXP call, pcall, s;
1975
    SEXPTYPE type;
1976
    int i, j, n;
9317 ripley 1977
 
1839 ihaka 1978
    if (!isFunction((SEXP)func))
5730 ripley 1979
	error("invalid function in call_R");
1839 ihaka 1980
    if (nargs < 0)
5730 ripley 1981
	error("invalid argument count in call_R");
1839 ihaka 1982
    if (nres < 0)
5730 ripley 1983
	error("invalid return value count in call_R");
1839 ihaka 1984
    PROTECT(pcall = call = allocList(nargs + 1));
10172 luke 1985
    SET_TYPEOF(call, LANGSXP);
1986
    SETCAR(pcall, (SEXP)func);
3865 pd 1987
    s = R_NilValue;		/* -Wall */
1839 ihaka 1988
    for (i = 0 ; i < nargs ; i++) {
1989
	pcall = CDR(pcall);
1990
	type = string2type(modes[i]);
1991
	switch(type) {
2 r 1992
	case LGLSXP:
1993
	case INTSXP:
10172 luke 1994
	    n = lengths[i];
1995
	    SETCAR(pcall, allocVector(type, n));
1996
	    memcpy(INTEGER(CAR(pcall)), arguments[i], n * sizeof(int));
1839 ihaka 1997
	    break;
2 r 1998
	case REALSXP:
10172 luke 1999
	    n = lengths[i];
2000
	    SETCAR(pcall, allocVector(REALSXP, n));
2001
	    memcpy(REAL(CAR(pcall)), arguments[i], n * sizeof(double));
1839 ihaka 2002
	    break;
2 r 2003
	case CPLXSXP:
10172 luke 2004
	    n = lengths[i];
2005
	    SETCAR(pcall, allocVector(CPLXSXP, n));
2006
	    memcpy(REAL(CAR(pcall)), arguments[i], n * sizeof(Rcomplex));
1839 ihaka 2007
	    break;
2 r 2008
	case STRSXP:
1839 ihaka 2009
	    n = lengths[i];
10172 luke 2010
	    SETCAR(pcall, allocVector(STRSXP, n));
2011
	    for (j = 0 ; j < n ; j++) {
2012
		char *str = (char*)(arguments[i]);
2013
		s = allocString(strlen(str));
2014
		SET_STRING_ELT(CAR(pcall), i, s);
2015
		strcpy(CHAR(s), str);
9317 ripley 2016
 	    }
1839 ihaka 2017
	    break;
2018
	    /* FIXME : This copy is unnecessary! */
9317 ripley 2019
	    /* FIXME : This is obviously incorrect so disable
1839 ihaka 2020
	case VECSXP:
2021
	    n = lengths[i];
10172 luke 2022
	    SETCAR(pcall, allocVector(VECSXP, n));
1839 ihaka 2023
	    for (j = 0 ; j < n ; j++) {
10172 luke 2024
		SET_VECTOR_ELT(s, i, (SEXP)(arguments[i]));
1839 ihaka 2025
	    }
9317 ripley 2026
	    break; */
2027
	default:
2028
	    error("Mode `%s' is not supported in call_R", modes[i]);
2 r 2029
	}
1839 ihaka 2030
	if(names && names[i])
10172 luke 2031
	    SET_TAG(pcall, install(names[i]));
2032
	SET_NAMED(CAR(pcall), 2);
1839 ihaka 2033
    }
2034
    PROTECT(s = eval(call, R_GlobalEnv));
2035
    switch(TYPEOF(s)) {
2036
    case LGLSXP:
2037
    case INTSXP:
2038
    case REALSXP:
2039
    case CPLXSXP:
2040
    case STRSXP:
2041
	if(nres > 0)
20110 duncan 2042
	    results[0] = RObjToCPtr(s, 1, 1, 0, 0, (const char *)NULL, NULL, 0);
1839 ihaka 2043
	break;
2044
    case VECSXP:
2045
	n = length(s);
2046
	if (nres < n) n = nres;
2047
	for (i = 0 ; i < n ; i++) {
20110 duncan 2048
	    results[i] = RObjToCPtr(VECTOR_ELT(s, i), 1, 1, 0, 0, (const char *)NULL, NULL, 0);
1839 ihaka 2049
	}
2050
	break;
2051
    case LISTSXP:
2052
	n = length(s);
2053
	if(nres < n) n = nres;
2054
	for(i=0 ; i<n ; i++) {
20110 duncan 2055
	    results[i] = RObjToCPtr(s, 1, 1, 0, 0, (const char *)NULL, NULL, 0);
1839 ihaka 2056
	    s = CDR(s);
2057
	}
2058
	break;
2059
    }
2060
    UNPROTECT(2);
2061
    return;
2 r 2062
}
2063
 
2064
void call_S(char *func, long nargs, void **arguments, char **modes,
1839 ihaka 2065
	    long *lengths, char **names, long nres, char **results)
2 r 2066
{
1839 ihaka 2067
    call_R(func, nargs, arguments, modes, lengths, names, nres, results);
2 r 2068
}