The R Project SVN R

Rev

Rev 51841 | 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
51291 ripley 4
 *  Copyright (C) 1997--2010  The R Development Core Team
26763 maechler 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
 *
42307 ripley 17
 *  You should have received a copy of the GNU General Public License
18
 *  along with this program; if not, a copy is available at
19
 *  http://www.r-project.org/Licenses/
2 r 20
 */
21
 
32380 ripley 22
/* <UTF8-FIXME>
23
   Need to convert character strings to and from 8-bit.
24
   Check other uses.
25
 */
26
 
5187 hornik 27
#ifdef HAVE_CONFIG_H
31593 ripley 28
# include <config.h>
5187 hornik 29
#endif
30
 
36489 ripley 31
#include <Defn.h>
51841 ripley 32
#include <ctype.h> /* for tolower */
2 r 33
#include <string.h>
42398 ripley 34
#include <errno.h>
2 r 35
 
11499 ripley 36
#include <Rmath.h>
5187 hornik 37
 
41910 ripley 38
#include <R_ext/GraphicsEngine.h> /* needed for GEDevDesc in do_Externalgr */
30832 murrell 39
 
14156 duncan 40
#include <R_ext/RConverters.h>
32670 ripley 41
#include <R_ext/Riconv.h>
14156 duncan 42
 
5730 ripley 43
#ifndef max
44
#define max(a, b) ((a > b)?(a):(b))
45
#endif
46
 
2 r 47
 
1839 ihaka 48
/* These are set during each call to do_dotCode() below. */
49
 
2 r 50
static SEXP NaokSymbol = NULL;
51
static SEXP DupSymbol = NULL;
6098 pd 52
static SEXP PkgSymbol = NULL;
32657 ripley 53
static SEXP EncSymbol = NULL;
2 r 54
 
45446 ripley 55
/* Global variable that should go. Should actually be doing this in
31593 ripley 56
   a much more straightforward manner. */
30599 duncan 57
#include <Rdynpriv.h>
58
enum {FILENAME, DLL_HANDLE, R_OBJECT, NOT_DEFINED};
59
typedef struct {
60
    char DLLname[PATH_MAX];
61
    HINSTANCE dll;
62
    SEXP  obj;
63
    int type;
64
} DllReference;
6098 pd 65
 
41901 ripley 66
/* Maximum length of entry-point name, including nul terminator */
41935 ripley 67
#define MaxSymbolBytes 1024
41901 ripley 68
 
14156 duncan 69
/* This looks up entry points in DLLs in a platform specific way. */
30599 duncan 70
#define MAX_ARGS 65
71
 
31591 ripley 72
static DL_FUNC
73
R_FindNativeSymbolFromDLL(char *name, DllReference *dll,
74
			  R_RegisteredNativeSymbol *symbol);
30599 duncan 75
 
31591 ripley 76
static SEXP naokfind(SEXP args, int * len, int *naok, int *dup,
77
		     DllReference *dll);
30599 duncan 78
static SEXP pkgtrim(SEXP args, DllReference *dll);
32657 ripley 79
static SEXP enctrim(SEXP args, char *name, int len);
30599 duncan 80
 
81
/*
82
  Checks whether the specified object correctly identifies a native routine.
31591 ripley 83
  This can be
30599 duncan 84
   a) a string,
31591 ripley 85
   b) an external pointer giving the address of the routine
86
      (e.g. getNativeSymbolInfo("foo")$address)
30599 duncan 87
   c) or a NativeSymbolInfo itself  (e.g. getNativeSymbolInfo("foo"))
32364 ripley 88
 
36047 ripley 89
   NB: in the last two cases it sets fun as well!
30599 duncan 90
 */
32364 ripley 91
static void
41901 ripley 92
checkValidSymbolId(SEXP op, SEXP call, DL_FUNC *fun,
93
		   R_RegisteredNativeSymbol *symbol, char *buf)
30599 duncan 94
{
32364 ripley 95
    if (isValidString(op)) return;
30599 duncan 96
 
36902 duncan 97
    *fun = NULL;
98
    if(TYPEOF(op) == EXTPTRSXP) {
41901 ripley 99
	char *p = NULL;
48346 maechler 100
	if(R_ExternalPtrTag(op) == install("native symbol"))
45446 ripley 101
	   *fun = R_ExternalPtrAddrFn(op);
48346 maechler 102
	else if(R_ExternalPtrTag(op) == install("registered native symbol")) {
45446 ripley 103
	   R_RegisteredNativeSymbol *tmp;
36902 duncan 104
	   tmp = (R_RegisteredNativeSymbol *) R_ExternalPtrAddr(op);
105
	   if(tmp) {
45446 ripley 106
	      if(symbol->type != R_ANY_SYM && symbol->type != tmp->type)
107
		 errorcall(call, _("NULL value passed as symbol address"));
108
		/* Check the type of the symbol. */
109
	      switch(symbol->type) {
36902 duncan 110
	      case R_C_SYM:
45446 ripley 111
		  *fun = tmp->symbol.c->fun;
112
		  p = tmp->symbol.c->name;
36902 duncan 113
		  break;
114
	      case R_CALL_SYM:
45446 ripley 115
		  *fun = tmp->symbol.call->fun;
116
		  p = tmp->symbol.call->name;
36902 duncan 117
		  break;
118
	      case R_FORTRAN_SYM:
45446 ripley 119
		  *fun = tmp->symbol.fortran->fun;
120
		  p = tmp->symbol.fortran->name;
36902 duncan 121
		  break;
122
	      case R_EXTERNAL_SYM:
45446 ripley 123
		  *fun = tmp->symbol.external->fun;
124
		  p = tmp->symbol.external->name;
36902 duncan 125
		  break;
126
	      default:
45446 ripley 127
		 /* Something unintended has happened if we get here. */
128
		  errorcall(call, _("Unimplemented type %d in createRSymbolObject"),
41713 ripley 129
			    symbol->type);
45446 ripley 130
		  break;
36902 duncan 131
	      }
132
	      *symbol = *tmp;
133
	   }
134
	}
32364 ripley 135
	/* This is illegal C */
36902 duncan 136
	if(*fun == NULL)
32867 ripley 137
	    errorcall(call, _("NULL value passed as symbol address"));
36902 duncan 138
 
45446 ripley 139
	/* copy the symbol name. */
36902 duncan 140
	if (p) {
41901 ripley 141
	    if (strlen(p) >= MaxSymbolBytes)
142
		error(_("symbol '%s' is too long"), p);
143
	    memcpy(buf, p, strlen(p)+1);
144
	    /* Ouch, no length check
36902 duncan 145
	    q = buf;
146
	    while ((*q = *p) != '\0') {
45446 ripley 147
		p++;
148
		q++;
41901 ripley 149
	    } */
36902 duncan 150
	}
151
 
32369 ripley 152
	return;
45446 ripley 153
    }
33297 ripley 154
    else if(inherits(op, "NativeSymbolInfo")) {
36902 duncan 155
	checkValidSymbolId(VECTOR_ELT(op, 1), call, fun, symbol, buf);
32364 ripley 156
	return;
157
    }
45446 ripley 158
 
32867 ripley 159
    errorcall(call,
160
      _("'name' must be a string (of length 1) or native symbol reference"));
32364 ripley 161
    return; /* not reached */
30599 duncan 162
}
163
 
164
 
165
/*
31591 ripley 166
  This is the routine that is called by do_dotCode, do_dotcall and
167
  do_External to find the DL_FUNC to invoke. It handles processing the
168
  arguments for the PACKAGE argument, if present, and also takes care
169
  of the cases where we are given a NativeSymbolInfo object, an
170
  address directly, and if the DLL is specified. If no PACKAGE is
171
  provided, we check whether the calling function is in a namespace
30599 duncan 172
  and look there.
173
*/
41901 ripley 174
 
38705 ripley 175
static SEXP
31591 ripley 176
resolveNativeRoutine(SEXP args, DL_FUNC *fun,
177
		     R_RegisteredNativeSymbol *symbol, char *buf,
30599 duncan 178
		     int *nargs, int *naok, int *dup, SEXP call)
179
{
180
    SEXP op;
41784 ripley 181
    const char *p; char *q;
31591 ripley 182
    DllReference dll = {"", NULL, NULL, NOT_DEFINED};
30599 duncan 183
 
184
    op = CAR(args);
36902 duncan 185
    /* NB, this sets fun, symbol and buf and is not just a check! */
45446 ripley 186
    checkValidSymbolId(op, call, fun, symbol, buf);
30599 duncan 187
 
188
    /* The following code modifies the argument list */
189
    /* We know this is ok because do_dotCode is entered */
190
    /* with its arguments evaluated. */
191
 
192
    strcpy(dll.DLLname, "");
193
    if(symbol->type == R_C_SYM || symbol->type == R_FORTRAN_SYM) {
194
	args = naokfind(CDR(args), nargs, naok, dup, &dll);
31591 ripley 195
 
30599 duncan 196
	if(*naok == NA_LOGICAL)
35265 ripley 197
	    errorcall(call, _("invalid '%s' value"), "naok");
30599 duncan 198
	if(*nargs > MAX_ARGS)
32867 ripley 199
	    errorcall(call, _("too many arguments in foreign function call"));
30599 duncan 200
    } else {
201
	if (PkgSymbol == NULL) PkgSymbol = install("PACKAGE");
34761 ripley 202
	/* This has the side effect of setting dll.type if a PACKAGE=
34581 ripley 203
	   argument if found */
30599 duncan 204
	args = pkgtrim(args, &dll);
205
    }
206
 
207
    /* Make up the load symbol and look it up. */
208
 
209
    if(TYPEOF(op) == STRSXP) {
40705 ripley 210
	p = translateChar(STRING_ELT(op, 0));
41901 ripley 211
	if(strlen(p) >= MaxSymbolBytes)
212
	    error(_("symbol '%s' is too long"), p);
30599 duncan 213
	q = buf;
214
	while ((*q = *p) != '\0') {
37711 ripley 215
	    if(symbol->type == R_FORTRAN_SYM) *q = tolower(*q);
30599 duncan 216
	    p++;
217
	    q++;
218
	}
31591 ripley 219
    }
45446 ripley 220
 
30599 duncan 221
    if(!*fun) {
222
	if(dll.type != FILENAME) {
34581 ripley 223
	    /* no PACKAGE= arg, so see if we can identify a DLL
224
	       from the namespace defining the function */
30599 duncan 225
	    *fun = R_FindNativeSymbolFromDLL(buf, &dll, symbol);
34581 ripley 226
	    /* need to continue if there is no PACKAGE arg or if the
227
	       namespace search failed
228
	       if(!fun)
45446 ripley 229
		   errorcall(call, _("cannot resolve native routine"));
34581 ripley 230
	    */
31591 ripley 231
	}
30604 duncan 232
 
37711 ripley 233
	/* NB: the actual conversion to the symbol is done in
234
	   R_dlsym in Rdynload.c.  That prepends an underscore (usually),
235
	   and may append one or more underscores.
236
	*/
237
 
30604 duncan 238
	if (!*fun && !(*fun = R_FindSymbol(buf, dll.DLLname, symbol))) {
30599 duncan 239
	    if(strlen(dll.DLLname))
32867 ripley 240
		errorcall(call,
37711 ripley 241
			  _("%s symbol name \"%s\" not in DLL for package \"%s\""),
35488 murdoch 242
			  symbol->type == R_FORTRAN_SYM ? "Fortran" : "C", buf,
32867 ripley 243
			  dll.DLLname);
30599 duncan 244
	    else
37711 ripley 245
		errorcall(call, _("%s symbol name \"%s\" not in load table"),
246
			  symbol->type == R_FORTRAN_SYM ? "Fortran" : "C", buf);
30599 duncan 247
	}
248
    }
249
 
250
    return(args);
251
}
252
 
253
 
254
 
5730 ripley 255
/* Convert an R object to a non-moveable C/Fortran object and return
256
   a pointer to it.  This leaves pointers for anything other
6098 pd 257
   than vectors and lists unaltered.
5730 ripley 258
*/
2 r 259
 
22284 duncan 260
static Rboolean
261
checkNativeType(int targetType, int actualType)
262
{
31593 ripley 263
    if(targetType > 0) {
264
	if(targetType == INTSXP || targetType == LGLSXP) {
265
	    return(actualType == INTSXP || actualType == LGLSXP);
266
	}
267
	return(targetType == actualType);
268
    }
22284 duncan 269
 
31593 ripley 270
    return(TRUE);
22284 duncan 271
}
272
 
31591 ripley 273
static void *RObjToCPtr(SEXP s, int naok, int dup, int narg, int Fort,
274
			const char *name, R_toCConverter **converter,
32657 ripley 275
			int targetType, char* encname)
2 r 276
{
42005 ripley 277
    Rbyte *rawptr;
1839 ihaka 278
    int *iptr;
5769 ripley 279
    float *sptr;
1839 ihaka 280
    double *rptr;
5730 ripley 281
    char **cptr, *fptr;
6994 pd 282
    Rcomplex *zptr;
5769 ripley 283
    SEXP *lptr, CSingSymbol=install("Csingle");
1839 ihaka 284
    int i, l, n;
6098 pd 285
 
14156 duncan 286
    if(converter)
287
	*converter = NULL;
288
 
289
    if(length(getAttrib(s, R_ClassSymbol))) {
290
	R_CConvertInfo info;
291
	int success;
45446 ripley 292
	void *ans;
14156 duncan 293
 
294
	info.naok = naok;
295
	info.dup = dup;
296
	info.narg = narg;
297
	info.Fort = Fort;
45446 ripley 298
	info.name = name;
14156 duncan 299
 
300
	ans = Rf_convertToC(s, &info, &success, converter);
301
	if(success)
302
	    return(ans);
303
    }
304
 
22284 duncan 305
    if(checkNativeType(targetType, TYPEOF(s)) == FALSE) {
31593 ripley 306
	if(!dup) {
33297 ripley 307
	    error(_("explicit request not to duplicate arguments in call to '%s', but argument %d is of the wrong type (%d != %d)"),
31593 ripley 308
		  name, narg + 1, targetType, TYPEOF(s));
309
	}
20110 duncan 310
 
31593 ripley 311
	if(targetType != SINGLESXP)
312
	    s = coerceVector(s, targetType);
20110 duncan 313
    }
314
 
1839 ihaka 315
    switch(TYPEOF(s)) {
34300 ripley 316
    case RAWSXP:
317
    n = LENGTH(s);
318
    rawptr = RAW(s);
319
    if (dup) {
45446 ripley 320
	rawptr = (Rbyte *) R_alloc(n, sizeof(Rbyte));
321
	for (i = 0; i < n; i++)
322
	    rawptr[i] = RAW(s)[i];
34300 ripley 323
    }
324
    return (void *) rawptr;
325
    break;
1839 ihaka 326
    case LGLSXP:
327
    case INTSXP:
328
	n = LENGTH(s);
329
	iptr = INTEGER(s);
46214 ripley 330
	if(!naok)
331
	    for (i = 0 ; i < n ; i++)
332
		if(iptr[i] == NA_INTEGER)
333
		    error(_("NAs in foreign function call (arg %d)"), narg);
1839 ihaka 334
	if (dup) {
335
	    iptr = (int*)R_alloc(n, sizeof(int));
336
	    for (i = 0 ; i < n ; i++)
337
		iptr[i] = INTEGER(s)[i];
338
	}
339
	return (void*)iptr;
340
	break;
341
    case REALSXP:
342
	n = LENGTH(s);
343
	rptr = REAL(s);
46214 ripley 344
	if(!naok)
345
	    for (i = 0 ; i < n ; i++)
346
		if(!R_FINITE(rptr[i]))
347
		    error(_("NA/NaN/Inf in foreign function call (arg %d)"), narg);
1839 ihaka 348
	if (dup) {
5769 ripley 349
	    if(asLogical(getAttrib(s, CSingSymbol)) == 1) {
350
		sptr = (float*)R_alloc(n, sizeof(float));
351
		for (i = 0 ; i < n ; i++)
352
		    sptr[i] = (float) REAL(s)[i];
353
		return (void*)sptr;
354
	    } else {
355
		rptr = (double*)R_alloc(n, sizeof(double));
356
		for (i = 0 ; i < n ; i++)
357
		    rptr[i] = REAL(s)[i];
358
		return (void*)rptr;
359
	    }
360
	} else
361
	    return (void*)rptr;
1839 ihaka 362
	break;
363
    case CPLXSXP:
364
	n = LENGTH(s);
365
	zptr = COMPLEX(s);
46214 ripley 366
	if(!naok)
367
	    for (i = 0 ; i < n ; i++)
368
		if(!R_FINITE(zptr[i].r) || !R_FINITE(zptr[i].i))
369
		    error(_("complex NA/NaN/Inf in foreign function call (arg %d)"), narg);
1839 ihaka 370
	if (dup) {
6994 pd 371
	    zptr = (Rcomplex*)R_alloc(n, sizeof(Rcomplex));
1839 ihaka 372
	    for (i = 0 ; i < n ; i++)
373
		zptr[i] = COMPLEX(s)[i];
374
	}
375
	return (void*)zptr;
376
	break;
377
    case STRSXP:
378
	if(!dup)
32867 ripley 379
	    error(_("character variables must be duplicated in .C/.Fortran"));
1839 ihaka 380
	n = LENGTH(s);
5730 ripley 381
	if(Fort) {
41784 ripley 382
	    const char *ss = translateChar(STRING_ELT(s, 0));
31591 ripley 383
	    if(n > 1)
32867 ripley 384
		warning(_("only first string in char vector used in .Fortran"));
40705 ripley 385
	    l = strlen(ss);
5730 ripley 386
	    fptr = (char*)R_alloc(max(255, l) + 1, sizeof(char));
40705 ripley 387
	    strcpy(fptr, ss);
5730 ripley 388
	    return (void*)fptr;
389
	} else {
390
	    cptr = (char**)R_alloc(n, sizeof(char*));
32657 ripley 391
	    if(strlen(encname)) {
41807 rgentlem 392
		char *outbuf;
45446 ripley 393
		const char *inbuf;
32657 ripley 394
		size_t inb, outb, outb0, res;
32913 ripley 395
		void *obj = Riconv_open("", encname); /* (to, from) */
396
		if(obj == (void *)-1)
32867 ripley 397
		    error(_("unsupported encoding '%s'"), encname);
32657 ripley 398
		for (i = 0 ; i < n ; i++) {
40711 ripley 399
		    inbuf = CHAR(STRING_ELT(s, i));
40705 ripley 400
		    inb = strlen(inbuf);
32657 ripley 401
		    outb0 = 3*inb;
402
		restart_in:
403
		    cptr[i] = outbuf = (char*)R_alloc(outb0 + 1, sizeof(char));
404
		    outb = 3*inb;
405
		    Riconv(obj, NULL, NULL, &outbuf, &outb);
406
		    res = Riconv(obj, &inbuf , &inb, &outbuf, &outb);
407
		    if(res == -1 && errno == E2BIG) {
408
			outb0 *= 3;
409
			goto restart_in;
410
		    }
45446 ripley 411
		    if(res == -1)
32867 ripley 412
			error(_("conversion problem in re-encoding to '%s'"),
32657 ripley 413
			      encname);
414
		    *outbuf = '\0';
415
		}
416
		Riconv_close(obj);
48904 ripley 417
	    } else {
32657 ripley 418
		for (i = 0 ; i < n ; i++) {
41784 ripley 419
		    const char *ss = translateChar(STRING_ELT(s, i));
40705 ripley 420
		    l = strlen(ss);
32657 ripley 421
		    cptr[i] = (char*)R_alloc(l + 1, sizeof(char));
40705 ripley 422
		    strcpy(cptr[i], ss);
32657 ripley 423
		}
424
	    }
5730 ripley 425
	    return (void*)cptr;
1839 ihaka 426
	}
427
	break;
428
    case VECSXP:
38581 ripley 429
	if(!dup)
430
	    error(_("lists must be duplicated in .C"));
431
	/* if (!dup) return (void*)VECTOR_PTR(s); ***** Dangerous to GC!!! */
45446 ripley 432
	n = length(s);
1839 ihaka 433
	lptr = (SEXP*)R_alloc(n, sizeof(SEXP));
434
	for (i = 0 ; i < n ; i++) {
10172 luke 435
	    lptr[i] = VECTOR_ELT(s, i);
1839 ihaka 436
	}
45446 ripley 437
	return (void*)lptr;
1839 ihaka 438
	break;
439
    case LISTSXP:
32867 ripley 440
	if(Fort) error(_("invalid mode to pass to Fortran (arg %d)"), narg);
1839 ihaka 441
	/* Warning : The following looks like it could bite ... */
442
	if(!dup) return (void*)s;
443
	n = length(s);
444
	cptr = (char**)R_alloc(n, sizeof(char*));
445
	for(i=0 ; i<n ; i++) {
446
	    cptr[i] = (char*)s;
447
	    s = CDR(s);
448
	}
449
	return (void*)cptr;
450
	break;
451
    default:
32867 ripley 452
	if(Fort) error(_("invalid mode to pass to Fortran (arg %d)"), narg);
1839 ihaka 453
	return (void*)s;
454
    }
2 r 455
}
456
 
14156 duncan 457
 
31591 ripley 458
static SEXP CPtrToRObj(void *p, SEXP arg, int Fort,
32657 ripley 459
		       R_NativePrimitiveArgType type, char *encname)
2 r 460
{
42005 ripley 461
    Rbyte *rawptr;
5769 ripley 462
    int *iptr, n=length(arg);
463
    float *sptr;
1839 ihaka 464
    double *rptr;
5730 ripley 465
    char **cptr, buf[256];
6994 pd 466
    Rcomplex *zptr;
5769 ripley 467
    SEXP *lptr, CSingSymbol = install("Csingle");
1839 ihaka 468
    int i;
469
    SEXP s, t;
6098 pd 470
 
1839 ihaka 471
    switch(type) {
34300 ripley 472
    case RAWSXP:
473
    s = allocVector(type, n);
42005 ripley 474
    rawptr = (Rbyte *)p;
51291 ripley 475
    for (i = 0; i < n; i++) RAW(s)[i] = rawptr[i];
34300 ripley 476
    break;
1839 ihaka 477
    case LGLSXP:
51648 ripley 478
	s = allocVector(type, n);
479
	iptr = (int*)p;
480
	for(i = 0 ; i < n ; i++) {
481
	    int tmp =  iptr[i];
482
	    LOGICAL(s)[i] = (tmp == NA_INTEGER || tmp == 0) ? tmp : 1;
483
	}
484
	break;
1839 ihaka 485
    case INTSXP:
486
	s = allocVector(type, n);
487
	iptr = (int*)p;
51291 ripley 488
	for(i = 0 ; i < n ; i++) INTEGER(s)[i] = iptr[i];
1839 ihaka 489
	break;
490
    case REALSXP:
20110 duncan 491
    case SINGLESXP:
492
	s = allocVector(REALSXP, n);
493
	if(type == SINGLESXP || asLogical(getAttrib(arg, CSingSymbol)) == 1) {
5769 ripley 494
	    sptr = (float*) p;
51648 ripley 495
	    for(i = 0 ; i < n ; i++) REAL(s)[i] = (double) sptr[i];
5769 ripley 496
	} else {
497
	    rptr = (double*) p;
51291 ripley 498
	    for(i = 0 ; i < n ; i++) REAL(s)[i] = rptr[i];
1839 ihaka 499
	}
500
	break;
501
    case CPLXSXP:
502
	s = allocVector(type, n);
6994 pd 503
	zptr = (Rcomplex*)p;
51291 ripley 504
	for(i = 0 ; i < n ; i++) COMPLEX(s)[i] = zptr[i];
1839 ihaka 505
	break;
506
    case STRSXP:
5730 ripley 507
	if(Fort) {
508
	    /* only return one string: warned on the R -> Fortran step */
509
	    strncpy(buf, (char*)p, 255);
26418 rgentlem 510
	    buf[255] = '\0';
5730 ripley 511
	    PROTECT(s = allocVector(type, 1));
10172 luke 512
	    SET_STRING_ELT(s, 0, mkChar(buf));
5730 ripley 513
	    UNPROTECT(1);
514
	} else {
515
	    PROTECT(s = allocVector(type, n));
516
	    cptr = (char**)p;
32657 ripley 517
	    if(strlen(encname)) {
45446 ripley 518
		const char *inbuf;
41807 rgentlem 519
		char *outbuf, *p;
32657 ripley 520
		size_t inb, outb, outb0, res;
32913 ripley 521
		void *obj = Riconv_open(encname, ""); /* (to, from) */
522
		if(obj == (void *)(-1))
32867 ripley 523
		    error(_("unsupported encoding '%s'"), encname);
32657 ripley 524
		for (i = 0 ; i < n ; i++) {
525
		    inbuf = cptr[i]; inb = strlen(inbuf);
526
		    outb0 = 3*inb;
527
		restart_out:
528
		    p = outbuf = (char*)R_alloc(outb0 + 1, sizeof(char));
529
		    outb = outb0;
530
		    Riconv(obj, NULL, NULL, &outbuf, &outb);
531
		    res = Riconv(obj, &inbuf , &inb, &outbuf, &outb);
532
		    if(res == -1 && errno == E2BIG) {
533
			outb0 *= 3;
534
			goto restart_out;
535
		    }
45446 ripley 536
		    if(res == -1)
32867 ripley 537
			error(_("conversion problem in re-encoding from '%s'"),
32657 ripley 538
			      encname);
539
		    *outbuf = '\0';
540
		    SET_STRING_ELT(s, i, mkChar(p));
541
		}
542
		Riconv_close(obj);
48904 ripley 543
	    } else {
32657 ripley 544
		for(i = 0 ; i < n ; i++)
545
		    SET_STRING_ELT(s, i, mkChar(cptr[i]));
546
	    }
5730 ripley 547
	    UNPROTECT(1);
1839 ihaka 548
	}
549
	break;
550
    case VECSXP:
551
	PROTECT(s = allocVector(VECSXP, n));
552
	lptr = (SEXP*)p;
51291 ripley 553
	for (i = 0 ; i < n ; i++) SET_VECTOR_ELT(s, i, lptr[i]);
1839 ihaka 554
	UNPROTECT(1);
555
	break;
556
    case LISTSXP:
557
	PROTECT(t = s = allocList(n));
558
	lptr = (SEXP*)p;
51291 ripley 559
	for(i = 0 ; i < n ; i++) {
10172 luke 560
	    SETCAR(t, lptr[i]);
1839 ihaka 561
	    t = CDR(t);
562
	}
563
	UNPROTECT(1);
564
    default:
565
	s = (SEXP)p;
566
    }
567
    return s;
2 r 568
}
569
 
20110 duncan 570
static Rboolean
571
comparePrimitiveTypes(R_NativePrimitiveArgType type, SEXP s, Rboolean dup)
572
{
22284 duncan 573
   if(type == ANYSXP || TYPEOF(s) == type)
20110 duncan 574
      return(TRUE);
2 r 575
 
20110 duncan 576
   if(dup && type == SINGLESXP)
577
      return(asLogical(getAttrib(s, install("Csingle"))) == TRUE);
578
 
579
   return(FALSE);
580
}
581
 
582
 
1839 ihaka 583
/* Foreign Function Interface.  This code allows a user to call C */
584
/* or Fortran code which is either statically or dynamically linked. */
2 r 585
 
31593 ripley 586
/* NB: this leaves NAOK and DUP arguments on the list */
2 r 587
 
6098 pd 588
/* find NAOK and DUP, find and remove PACKAGE */
31591 ripley 589
static SEXP naokfind(SEXP args, int * len, int *naok, int *dup,
590
		     DllReference *dll)
6098 pd 591
{
14571 duncan 592
    SEXP s, prev;
6098 pd 593
    int nargs=0, naokused=0, dupused=0, pkgused=0;
41784 ripley 594
    const char *p;
26763 maechler 595
 
6098 pd 596
    *naok = 0;
597
    *dup = 1;
598
    *len = 0;
14571 duncan 599
    for(s = args, prev=args; s != R_NilValue;) {
6098 pd 600
	if(TAG(s) == NaokSymbol) {
601
	    *naok = asLogical(CAR(s));
14571 duncan 602
	    /* SETCDR(prev, s = CDR(s)); */
32867 ripley 603
	    if(naokused++ == 1) warning(_("NAOK used more than once"));
6098 pd 604
	} else if(TAG(s) == DupSymbol) {
605
	    *dup = asLogical(CAR(s));
14571 duncan 606
	    /* SETCDR(prev, s = CDR(s)); */
32867 ripley 607
	    if(dupused++ == 1) warning(_("DUP used more than once"));
14571 duncan 608
	} else if(TAG(s) == PkgSymbol) {
30599 duncan 609
	    dll->obj = CAR(s);
610
	    if(TYPEOF(CAR(s)) == STRSXP) {
40705 ripley 611
		p = translateChar(STRING_ELT(CAR(s), 0));
30599 duncan 612
		if(strlen(p) > PATH_MAX - 1)
32867 ripley 613
		    error(_("DLL name is too long"));
30599 duncan 614
		dll->type = FILENAME;
615
		strcpy(dll->DLLname, p);
32867 ripley 616
		if(pkgused++ > 1) warning(_("PACKAGE used more than once"));
30599 duncan 617
		/* More generally, this should allow us to process
618
		   any additional arguments and not insist that PACKAGE
619
		   be the last argument.
620
		*/
621
	    } else {
622
		    /* Have a DLL object*/
45446 ripley 623
		if(TYPEOF(CAR(s)) == EXTPTRSXP) {
30599 duncan 624
		    dll->dll = (HINSTANCE) R_ExternalPtrAddr(CAR(s));
625
		    dll->type = DLL_HANDLE;
626
		} else if(TYPEOF(CAR(s)) == VECSXP) {
627
		    dll->type = R_OBJECT;
628
		    dll->obj = s;
31591 ripley 629
		    strcpy(dll->DLLname,
40705 ripley 630
			   translateChar(STRING_ELT(VECTOR_ELT(CAR(s), 1), 0)));
30599 duncan 631
		    dll->dll = (HINSTANCE) R_ExternalPtrAddr(VECTOR_ELT(s, 4));
632
		}
633
	    }
17794 duncan 634
	} else {
635
	    nargs++;
636
	    prev = s;
637
	    s = CDR(s);
638
	    continue;
639
	}
26763 maechler 640
	if(s == args)
17794 duncan 641
	    args = s = CDR(s);
26763 maechler 642
	else
17794 duncan 643
	    SETCDR(prev, s = CDR(s));
6098 pd 644
    }
645
    *len = nargs;
646
    return args;
647
}
648
 
30599 duncan 649
static void setDLLname(SEXP s, char *DLLname)
18560 ripley 650
{
41807 rgentlem 651
    SEXP ss = CAR(s);
41784 ripley 652
    const char *name;
653
 
18560 ripley 654
    if(TYPEOF(ss) != STRSXP || length(ss) != 1)
32867 ripley 655
	error(_("PACKAGE argument must be a single character string"));
40705 ripley 656
    name = translateChar(STRING_ELT(ss, 0));
18560 ripley 657
    /* allow the package: form of the name, as returned by find */
658
    if(strncmp(name, "package:", 8) == 0)
659
	name += 8;
660
    if(strlen(name) > PATH_MAX - 1)
32867 ripley 661
	error(_("PACKAGE argument is too long"));
18560 ripley 662
    strcpy(DLLname, name);
14018 jmc 663
}
664
 
30599 duncan 665
static SEXP pkgtrim(SEXP args, DllReference *dll)
6098 pd 666
{
667
    SEXP s, ss;
668
    int pkgused=0;
669
 
670
    for(s = args ; s != R_NilValue;) {
671
	ss = CDR(s);
672
	/* Look for PACKAGE=. We look at the next arg, unless
673
	   this is the last one (which will only happen for one arg),
674
	   and remove it */
675
	if(ss == R_NilValue && TAG(s) == PkgSymbol) {
32867 ripley 676
	    if(pkgused++ == 1) warning(_("PACKAGE used more than once"));
30599 duncan 677
	    setDLLname(s, dll->DLLname);
678
	    dll->type = FILENAME;
6098 pd 679
	    return R_NilValue;
680
	}
681
	if(TAG(ss) == PkgSymbol) {
32867 ripley 682
	    if(pkgused++ == 1) warning(_("PACKAGE used more than once"));
30599 duncan 683
	    setDLLname(ss, dll->DLLname);
684
	    dll->type = FILENAME;
10172 luke 685
	    SETCDR(s, CDR(ss));
6098 pd 686
	}
687
	s = CDR(s);
688
    }
689
    return args;
690
}
691
 
32657 ripley 692
static SEXP enctrim(SEXP args, char *name, int len)
693
{
694
    SEXP s, ss, sx;
695
    int pkgused=0;
2 r 696
 
32657 ripley 697
    strcpy(name, "");
698
    for(s = args ; s != R_NilValue;) {
699
	ss = CDR(s);
700
	/* Look for ENCODING=. We look at the next arg, unless
701
	   this is the last one (which will only happen for one arg),
702
	   and remove it */
703
	if(ss == R_NilValue && TAG(s) == EncSymbol) {
704
	    sx = CAR(s);
32867 ripley 705
	    if(pkgused++ == 1) warning(_("ENCODING used more than once"));
32657 ripley 706
	    if(TYPEOF(sx) != STRSXP || length(sx) != 1)
32867 ripley 707
		error(_("ENCODING argument must be a single character string"));
40705 ripley 708
	    strncpy(name, translateChar(STRING_ELT(sx, 0)), len);
32657 ripley 709
	    return R_NilValue;
710
	}
711
	if(TAG(ss) == EncSymbol) {
712
	    sx = CAR(ss);
32867 ripley 713
	    if(pkgused++ == 1) warning(_("ENCODING used more than once"));
32657 ripley 714
	    if(TYPEOF(sx) != STRSXP || length(sx) != 1)
32867 ripley 715
		error(_("ENCODING argument must be a single character string"));
40705 ripley 716
	    strncpy(name, translateChar(STRING_ELT(sx, 0)), len);
32657 ripley 717
	    SETCDR(s, CDR(ss));
718
	}
719
	s = CDR(s);
720
    }
721
    return args;
722
}
30599 duncan 723
 
32657 ripley 724
 
37711 ripley 725
 
36990 ripley 726
SEXP attribute_hidden do_isloaded(SEXP call, SEXP op, SEXP args, SEXP env)
2 r 727
{
41807 rgentlem 728
    const char *sym, *type="", *pkg = "";
14577 ripley 729
    int val = 1, nargs = length(args);
45209 ripley 730
    R_RegisteredNativeSymbol symbol = {R_ANY_SYM, {NULL}, NULL};
14577 ripley 731
 
41713 ripley 732
    if (nargs < 1) error(_("no arguments supplied"));
733
    if (nargs > 3) error(_("too many arguments"));
14577 ripley 734
 
6098 pd 735
    if(!isValidString(CAR(args)))
49076 ripley 736
	error(_("invalid '%s' argument"), "symbol");
40705 ripley 737
    sym = translateChar(STRING_ELT(CAR(args), 0));
36047 ripley 738
    if(nargs >= 2) {
14577 ripley 739
	if(!isValidString(CADR(args)))
49076 ripley 740
	    error(_("invalid '%s' argument"), "PACKAGE");
40705 ripley 741
	pkg = translateChar(STRING_ELT(CADR(args), 0));
14577 ripley 742
    }
36047 ripley 743
    if(nargs >= 3) {
744
	if(!isValidString(CADDR(args)))
49076 ripley 745
	    error(_("invalid '%s' argument"), "type");
40705 ripley 746
	type = CHAR(STRING_ELT(CADDR(args), 0)); /* ASCII */
36047 ripley 747
	if(strcmp(type, "C") == 0) symbol.type = R_C_SYM;
748
	else if(strcmp(type, "Fortran") == 0) symbol.type = R_FORTRAN_SYM;
749
	else if(strcmp(type, "Call") == 0) symbol.type = R_CALL_SYM;
750
	else if(strcmp(type, "External") == 0) symbol.type = R_EXTERNAL_SYM;
751
    }
45209 ripley 752
    if(!(R_FindSymbol(sym, pkg, &symbol))) val = 0;
41894 ripley 753
    return ScalarLogical(val);
2 r 754
}
755
 
3822 thomas 756
/*   Call dynamically loaded "internal" functions */
757
/*   code by Jean Meloche <jean@stat.ubc.ca> */
758
 
39866 duncan 759
typedef SEXP (*R_ExternalRoutine)(SEXP);
760
 
36990 ripley 761
SEXP attribute_hidden do_External(SEXP call, SEXP op, SEXP args, SEXP env)
3822 thomas 762
{
40034 ripley 763
    DL_FUNC ofun = NULL;
39866 duncan 764
    R_ExternalRoutine fun = NULL;
6098 pd 765
    SEXP retval;
17164 duncan 766
    R_RegisteredNativeSymbol symbol = {R_EXTERNAL_SYM, {NULL}, NULL};
50745 ripley 767
    const void *vmax = vmaxget();
41901 ripley 768
    char buf[MaxSymbolBytes];
3822 thomas 769
 
51291 ripley 770
    if (length(args) < 1) errorcall(call, _("'name' is missing"));
771
    check1arg(args, call, "name");
40034 ripley 772
    args = resolveNativeRoutine(args, &ofun, &symbol, buf, NULL, NULL,
31591 ripley 773
				NULL, call);
40034 ripley 774
    fun = (R_ExternalRoutine) ofun;
3822 thomas 775
 
31591 ripley 776
    /* Some external symbols that are registered may have 0 as the
777
       expected number of arguments.  We may want a warning
778
       here. However, the number of values may vary across calls and
779
       that is why people use the .External() mechanism.  So perhaps
780
       we should just kill this check.
781
    */
30599 duncan 782
#ifdef CHECK_EXTERNAL_ARG_COUNT         /* Off by default. */
14571 duncan 783
    if(symbol.symbol.external && symbol.symbol.external->numArgs > -1) {
784
	if(symbol.symbol.external->numArgs != length(args))
41713 ripley 785
	    errorcall(call,
786
		      _("Incorrect number of arguments (%d), expecting %d for %s"),
47366 ripley 787
		      length(args), symbol.symbol.external->numArgs, buf);
14571 duncan 788
    }
30599 duncan 789
#endif
790
 
6098 pd 791
    retval = (SEXP)fun(args);
792
    vmaxset(vmax);
793
    return retval;
3822 thomas 794
}
795
 
39866 duncan 796
#ifdef __cplusplus
797
typedef SEXP (*VarFun)(...);
798
#else
799
typedef DL_FUNC VarFun;
800
#endif
10983 ihaka 801
 
6098 pd 802
/* .Call(name, <args>) */
36990 ripley 803
SEXP attribute_hidden do_dotcall(SEXP call, SEXP op, SEXP args, SEXP env)
4855 ihaka 804
{
39866 duncan 805
    DL_FUNC ofun = NULL;
806
    VarFun fun = NULL;
31601 bates 807
    SEXP retval, nm, cargs[MAX_ARGS], pargs;
17164 duncan 808
    R_RegisteredNativeSymbol symbol = {R_CALL_SYM, {NULL}, NULL};
4855 ihaka 809
    int nargs;
50745 ripley 810
    const void *vmax = vmaxget();
41901 ripley 811
    char buf[MaxSymbolBytes];
6098 pd 812
 
51291 ripley 813
    if (length(args) < 1) errorcall(call, _("'name' is missing"));
814
    check1arg(args, call, "name");
31601 bates 815
    nm = CAR(args);
39866 duncan 816
    args = resolveNativeRoutine(args, &ofun, &symbol, buf, NULL, NULL,
31591 ripley 817
				NULL, call);
4855 ihaka 818
    args = CDR(args);
39866 duncan 819
    fun = (VarFun) ofun;
5231 hornik 820
 
4855 ihaka 821
    for(nargs = 0, pargs = args ; pargs != R_NilValue; pargs = CDR(pargs)) {
45446 ripley 822
	if (nargs == MAX_ARGS)
823
	    errorcall(call, _("too many arguments in foreign function call"));
4855 ihaka 824
	cargs[nargs] = CAR(pargs);
825
	nargs++;
826
    }
14571 duncan 827
    if(symbol.symbol.call && symbol.symbol.call->numArgs > -1) {
828
	if(symbol.symbol.call->numArgs != nargs)
41713 ripley 829
	    errorcall(call,
830
		      _("Incorrect number of arguments (%d), expecting %d for %s"),
47366 ripley 831
		      nargs, symbol.symbol.call->numArgs, buf);
14571 duncan 832
    }
5231 hornik 833
 
834
    retval = R_NilValue;	/* -Wall */
39866 duncan 835
    fun = (VarFun) ofun;
4855 ihaka 836
    switch (nargs) {
837
    case 0:
39866 duncan 838
	retval = (SEXP)ofun();
4855 ihaka 839
	break;
840
    case 1:
841
	retval = (SEXP)fun(cargs[0]);
842
	break;
843
    case 2:
844
	retval = (SEXP)fun(cargs[0], cargs[1]);
845
	break;
846
    case 3:
847
	retval = (SEXP)fun(cargs[0], cargs[1], cargs[2]);
848
	break;
849
    case 4:
850
	retval = (SEXP)fun(cargs[0], cargs[1], cargs[2], cargs[3]);
851
	break;
852
    case 5:
853
	retval = (SEXP)fun(
854
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4]);
855
	break;
856
    case 6:
857
	retval = (SEXP)fun(
858
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
859
	    cargs[5]);
860
	break;
861
    case 7:
862
	retval = (SEXP)fun(
863
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
864
	    cargs[5],  cargs[6]);
865
	break;
866
    case 8:
867
	retval = (SEXP)fun(
868
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
869
	    cargs[5],  cargs[6],  cargs[7]);
870
	break;
871
    case 9:
872
	retval = (SEXP)fun(
873
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
874
	    cargs[5],  cargs[6],  cargs[7],  cargs[8]);
875
	break;
876
    case 10:
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
	break;
881
    case 11:
882
	retval = (SEXP)fun(
883
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
884
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
885
	    cargs[10]);
886
	break;
887
    case 12:
888
	retval = (SEXP)fun(
889
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
890
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
891
	    cargs[10], cargs[11]);
892
	break;
893
    case 13:
894
	retval = (SEXP)fun(
895
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
896
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
897
	    cargs[10], cargs[11], cargs[12]);
898
	break;
899
    case 14:
900
	retval = (SEXP)fun(
901
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
902
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
903
	    cargs[10], cargs[11], cargs[12], cargs[13]);
904
	break;
905
    case 15:
906
	retval = (SEXP)fun(
907
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
908
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
909
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14]);
910
	break;
911
    case 16:
912
	retval = (SEXP)fun(
913
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
914
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
915
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
916
	    cargs[15]);
917
	break;
918
    case 17:
919
	retval = (SEXP)fun(
920
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
921
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
922
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
923
	    cargs[15], cargs[16]);
924
	break;
925
    case 18:
926
	retval = (SEXP)fun(
927
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
928
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
929
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
930
	    cargs[15], cargs[16], cargs[17]);
931
	break;
932
    case 19:
933
	retval = (SEXP)fun(
934
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
935
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
936
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
937
	    cargs[15], cargs[16], cargs[17], cargs[18]);
938
	break;
939
    case 20:
940
	retval = (SEXP)fun(
941
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
942
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
943
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
944
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19]);
945
	break;
946
    case 21:
947
	retval = (SEXP)fun(
948
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
949
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
950
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
951
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
952
	    cargs[20]);
953
	break;
954
    case 22:
955
	retval = (SEXP)fun(
956
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
957
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
958
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
959
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
960
	    cargs[20], cargs[21]);
961
	break;
962
    case 23:
963
	retval = (SEXP)fun(
964
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
965
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
966
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
967
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
968
	    cargs[20], cargs[21], cargs[22]);
969
	break;
970
    case 24:
971
	retval = (SEXP)fun(
972
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
973
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
974
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
975
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
976
	    cargs[20], cargs[21], cargs[22], cargs[23]);
977
	break;
978
    case 25:
979
	retval = (SEXP)fun(
980
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
981
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
982
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
983
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
984
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24]);
985
	break;
986
    case 26:
987
	retval = (SEXP)fun(
988
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
989
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
990
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
991
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
992
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
993
	    cargs[25]);
994
	break;
995
    case 27:
996
	retval = (SEXP)fun(
997
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
998
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
999
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1000
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1001
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1002
	    cargs[25], cargs[26]);
1003
	break;
1004
    case 28:
1005
	retval = (SEXP)fun(
1006
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1007
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1008
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1009
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1010
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1011
	    cargs[25], cargs[26], cargs[27]);
1012
	break;
1013
    case 29:
1014
	retval = (SEXP)fun(
1015
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1016
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1017
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1018
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1019
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1020
	    cargs[25], cargs[26], cargs[27], cargs[28]);
1021
	break;
1022
    case 30:
1023
	retval = (SEXP)fun(
1024
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1025
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1026
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1027
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1028
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1029
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29]);
1030
	break;
1031
    case 31:
1032
	retval = (SEXP)fun(
1033
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1034
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1035
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1036
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1037
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1038
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1039
	    cargs[30]);
1040
	break;
1041
    case 32:
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]);
1050
	break;
1051
    case 33:
1052
	retval = (SEXP)fun(
1053
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1054
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1055
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1056
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1057
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1058
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1059
	    cargs[30], cargs[31], cargs[32]);
1060
	break;
1061
    case 34:
1062
	retval = (SEXP)fun(
1063
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1064
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1065
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1066
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1067
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1068
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1069
	    cargs[30], cargs[31], cargs[32], cargs[33]);
1070
	break;
1071
    case 35:
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
	break;
1081
    case 36:
1082
	retval = (SEXP)fun(
1083
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1084
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1085
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1086
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1087
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1088
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1089
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1090
	    cargs[35]);
1091
	break;
1092
    case 37:
1093
	retval = (SEXP)fun(
1094
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1095
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1096
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1097
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1098
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1099
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1100
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1101
	    cargs[35], cargs[36]);
1102
	break;
1103
    case 38:
1104
	retval = (SEXP)fun(
1105
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1106
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1107
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1108
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1109
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1110
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1111
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1112
	    cargs[35], cargs[36], cargs[37]);
1113
	break;
1114
    case 39:
1115
	retval = (SEXP)fun(
1116
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1117
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1118
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1119
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1120
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1121
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1122
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1123
	    cargs[35], cargs[36], cargs[37], cargs[38]);
1124
	break;
1125
    case 40:
1126
	retval = (SEXP)fun(
1127
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1128
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1129
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1130
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1131
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1132
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1133
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1134
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39]);
1135
	break;
1136
    case 41:
1137
	retval = (SEXP)fun(
1138
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1139
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1140
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1141
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1142
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1143
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1144
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1145
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1146
	    cargs[40]);
1147
	break;
1148
    case 42:
1149
	retval = (SEXP)fun(
1150
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1151
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1152
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1153
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1154
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1155
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1156
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1157
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1158
	    cargs[40], cargs[41]);
1159
	break;
1160
    case 43:
1161
	retval = (SEXP)fun(
1162
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1163
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1164
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1165
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1166
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1167
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1168
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1169
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1170
	    cargs[40], cargs[41], cargs[42]);
1171
	break;
1172
    case 44:
1173
	retval = (SEXP)fun(
1174
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1175
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1176
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1177
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1178
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1179
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1180
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1181
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1182
	    cargs[40], cargs[41], cargs[42], cargs[43]);
1183
	break;
1184
    case 45:
1185
	retval = (SEXP)fun(
1186
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1187
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1188
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1189
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1190
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1191
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1192
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1193
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1194
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44]);
1195
	break;
1196
    case 46:
1197
	retval = (SEXP)fun(
1198
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1199
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1200
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1201
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1202
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1203
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1204
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1205
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1206
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1207
	    cargs[45]);
1208
	break;
1209
    case 47:
1210
	retval = (SEXP)fun(
1211
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1212
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1213
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1214
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1215
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1216
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1217
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1218
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1219
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1220
	    cargs[45], cargs[46]);
1221
	break;
1222
    case 48:
1223
	retval = (SEXP)fun(
1224
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1225
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1226
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1227
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1228
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1229
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1230
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1231
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1232
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1233
	    cargs[45], cargs[46], cargs[47]);
1234
	break;
1235
    case 49:
1236
	retval = (SEXP)fun(
1237
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1238
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1239
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1240
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1241
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1242
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1243
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1244
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1245
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1246
	    cargs[45], cargs[46], cargs[47], cargs[48]);
1247
	break;
1248
    case 50:
1249
	retval = (SEXP)fun(
1250
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1251
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1252
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1253
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1254
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1255
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1256
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1257
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1258
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1259
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49]);
1260
	break;
1261
    case 51:
1262
	retval = (SEXP)fun(
1263
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1264
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1265
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1266
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1267
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1268
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1269
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1270
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1271
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1272
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1273
	    cargs[50]);
1274
	break;
1275
    case 52:
1276
	retval = (SEXP)fun(
1277
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1278
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1279
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1280
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1281
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1282
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1283
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1284
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1285
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1286
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1287
	    cargs[50], cargs[51]);
1288
	break;
1289
    case 53:
1290
	retval = (SEXP)fun(
1291
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1292
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1293
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1294
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1295
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1296
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1297
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1298
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1299
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1300
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1301
	    cargs[50], cargs[51], cargs[52]);
1302
	break;
1303
    case 54:
1304
	retval = (SEXP)fun(
1305
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1306
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1307
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1308
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1309
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1310
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1311
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1312
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1313
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1314
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1315
	    cargs[50], cargs[51], cargs[52], cargs[53]);
1316
	break;
1317
    case 55:
1318
	retval = (SEXP)fun(
1319
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1320
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1321
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1322
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1323
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1324
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1325
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1326
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1327
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1328
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1329
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54]);
1330
	break;
1331
    case 56:
1332
	retval = (SEXP)fun(
1333
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1334
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1335
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1336
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1337
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1338
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1339
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1340
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1341
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1342
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1343
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1344
	    cargs[55]);
1345
	break;
1346
    case 57:
1347
	retval = (SEXP)fun(
1348
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1349
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1350
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1351
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1352
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1353
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1354
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1355
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1356
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1357
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1358
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1359
	    cargs[55], cargs[56]);
1360
	break;
1361
    case 58:
1362
	retval = (SEXP)fun(
1363
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1364
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1365
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1366
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1367
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1368
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1369
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1370
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1371
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1372
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1373
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1374
	    cargs[55], cargs[56], cargs[57]);
1375
	break;
1376
    case 59:
1377
	retval = (SEXP)fun(
1378
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1379
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1380
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1381
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1382
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1383
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1384
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1385
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1386
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1387
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1388
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1389
	    cargs[55], cargs[56], cargs[57], cargs[58]);
1390
	break;
1391
    case 60:
1392
	retval = (SEXP)fun(
1393
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1394
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1395
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1396
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1397
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1398
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1399
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1400
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1401
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1402
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1403
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1404
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59]);
1405
	break;
1406
    case 61:
1407
	retval = (SEXP)fun(
1408
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1409
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1410
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1411
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1412
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1413
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1414
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1415
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1416
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1417
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1418
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1419
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1420
	    cargs[60]);
1421
	break;
1422
    case 62:
1423
	retval = (SEXP)fun(
1424
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1425
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1426
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1427
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1428
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1429
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1430
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1431
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1432
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1433
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1434
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1435
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1436
	    cargs[60], cargs[61]);
1437
	break;
1438
    case 63:
1439
	retval = (SEXP)fun(
1440
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1441
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1442
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1443
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1444
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1445
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1446
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1447
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1448
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1449
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1450
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1451
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1452
	    cargs[60], cargs[61], cargs[62]);
1453
	break;
1454
    case 64:
1455
	retval = (SEXP)fun(
1456
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1457
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1458
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1459
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1460
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1461
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1462
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1463
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1464
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1465
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1466
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1467
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1468
	    cargs[60], cargs[61], cargs[62], cargs[63]);
1469
	break;
1470
    case 65:
1471
	retval = (SEXP)fun(
1472
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1473
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1474
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1475
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1476
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1477
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1478
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1479
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1480
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1481
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1482
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1483
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1484
	    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
1485
	break;
1486
    default:
32867 ripley 1487
	errorcall(call, _("too many arguments, sorry"));
4855 ihaka 1488
    }
4869 ihaka 1489
    vmaxset(vmax);
4855 ihaka 1490
    return retval;
1491
}
1492
 
44311 ripley 1493
/*  Call dynamically loaded "internal" graphics functions
1494
    .External.graphics (unused) and  .Call.graphics (used in grid).
51272 ripley 1495
 
1496
    If there is an error or user-interrupt in the above
1497
    evaluation, dd->recordGraphics is set to TRUE
1498
    on all graphics devices (see GEonExit(); called in errors.c)
1499
 
1500
    NOTE: if someone uses try() around this call and there
1501
    is an error, then dd->recordGraphics stays FALSE, so
1502
    subsequent pages of graphics output are NOT saved on
1503
    the display list.  A workaround is to deliberately
1504
    force an error in a graphics call (e.g., a grid popViewport()
1505
    while in the ROOT viewport) which will reset dd->recordGraphics
1506
    to TRUE as per the comment above.
44311 ripley 1507
*/
10983 ihaka 1508
 
36990 ripley 1509
SEXP attribute_hidden do_Externalgr(SEXP call, SEXP op, SEXP args, SEXP env)
10983 ihaka 1510
{
30832 murrell 1511
    SEXP retval;
44285 ripley 1512
    pGEDevDesc dd = GEcurrentDevice();
31938 murrell 1513
    Rboolean record = dd->recordGraphics;
1514
    dd->recordGraphics = FALSE;
30832 murrell 1515
    PROTECT(retval = do_External(call, op, args, env));
31938 murrell 1516
    dd->recordGraphics = record;
1517
    if (GErecording(call, dd)) {
30832 murrell 1518
	if (!GEcheckState(dd))
41713 ripley 1519
	    errorcall(call, _("Invalid graphics state"));
30832 murrell 1520
	GErecordGraphicOperation(op, args, dd);
10983 ihaka 1521
    }
30832 murrell 1522
    UNPROTECT(1);
10983 ihaka 1523
    return retval;
1524
}
1525
 
36990 ripley 1526
SEXP attribute_hidden do_dotcallgr(SEXP call, SEXP op, SEXP args, SEXP env)
10983 ihaka 1527
{
30832 murrell 1528
    SEXP retval;
44285 ripley 1529
    pGEDevDesc dd = GEcurrentDevice();
31938 murrell 1530
    Rboolean record = dd->recordGraphics;
1531
    dd->recordGraphics = FALSE;
30832 murrell 1532
    PROTECT(retval = do_dotcall(call, op, args, env));
31938 murrell 1533
    dd->recordGraphics = record;
1534
    if (GErecording(call, dd)) {
30832 murrell 1535
	if (!GEcheckState(dd))
41713 ripley 1536
	    errorcall(call, _("Invalid graphics state"));
30832 murrell 1537
	GErecordGraphicOperation(op, args, dd);
10983 ihaka 1538
    }
30832 murrell 1539
    UNPROTECT(1);
10983 ihaka 1540
    return retval;
1541
}
1542
 
30599 duncan 1543
static SEXP
44201 ripley 1544
Rf_getCallingDLL(void)
30599 duncan 1545
{
1546
    SEXP e, ans;
34761 ripley 1547
    RCNTXT *cptr;
1548
    SEXP rho = R_NilValue;
1549
    Rboolean found = FALSE;
1550
 
34768 ripley 1551
    /* First find the environment of the caller.
1552
       Testing shows this is the right caller, despite the .C/.Call ...
1553
     */
1554
    for (cptr = R_GlobalContext;
34761 ripley 1555
	 cptr != NULL && cptr->callflag != CTXT_TOPLEVEL;
1556
	 cptr = cptr->nextcontext)
1557
	    if (cptr->callflag & CTXT_FUNCTION) {
34768 ripley 1558
		/* PrintValue(cptr->call); */
34761 ripley 1559
		rho = cptr->cloenv;
1560
		break;
1561
	    }
1562
    /* Then search up until we hit a namespace or globalenv.
1563
       The idea is that we will not find a namespace unless the caller
1564
       was defined in one. */
1565
    while(rho != R_NilValue) {
1566
	if (rho == R_GlobalEnv) break;
1567
	else if (R_IsNamespaceEnv(rho)) {
1568
	    found = TRUE;
1569
	    break;
1570
	}
1571
	rho = ENCLOS(rho);
1572
    }
1573
    if(!found) return R_NilValue;
1574
 
48346 maechler 1575
    PROTECT(e = lang2(install("getCallingDLLe"), rho));
30599 duncan 1576
    ans = eval(e,  R_GlobalEnv);
1577
    UNPROTECT(1);
1578
    return(ans);
1579
}
1580
 
1581
 
1582
/*
1583
  We are given the PACKAGE argument in dll.obj
1584
  and we can try to figure out how to resolve this.
31591 ripley 1585
  0) dll.obj is NULL.  Then find the environment of the
1586
   calling function and if it is a namespace, get the
1587
 
30599 duncan 1588
  1) dll.obj is a DLLInfo object
1589
*/
1590
static DL_FUNC
31591 ripley 1591
R_FindNativeSymbolFromDLL(char *name, DllReference *dll,
1592
			  R_RegisteredNativeSymbol *symbol)
30599 duncan 1593
{
1594
    int numProtects = 0;
1595
    DllInfo *info;
1596
    DL_FUNC fun = NULL;
1597
 
1598
    if(dll->obj == NULL) {
34768 ripley 1599
	/* Rprintf("\nsearching for %s\n", name); */
30599 duncan 1600
	dll->obj = Rf_getCallingDLL();
1601
	PROTECT(dll->obj); numProtects++;
1602
    }
1603
 
1604
    if(inherits(dll->obj, "DLLInfo")) {
1605
	SEXP tmp;
1606
	tmp = VECTOR_ELT(dll->obj, 4);
1607
	info = (DllInfo *) R_ExternalPtrAddr(tmp);
31591 ripley 1608
	if(!info)
32867 ripley 1609
	    error(_("NULL value for DLLInfoReference when looking for DLL"));
30599 duncan 1610
	fun = R_dlsym(info, name, symbol);
1611
    }
1612
 
1613
    if(numProtects)
1614
	UNPROTECT(numProtects);
1615
 
1616
    return(fun);
1617
}
1618
 
1619
 
1620
 
6098 pd 1621
/* .C() {op=0}  or  .Fortran() {op=1} */
36990 ripley 1622
SEXP attribute_hidden do_dotCode(SEXP call, SEXP op, SEXP args, SEXP env)
2 r 1623
{
1839 ihaka 1624
    void **cargs;
1625
    int dup, havenames, naok, nargs, which;
39866 duncan 1626
    DL_FUNC ofun = NULL;
1627
    VarFun fun = NULL;
1895 ihaka 1628
    SEXP ans, pargs, s;
31591 ripley 1629
    /* the post-call converters back to R objects. */
1630
    R_toCConverter  *argConverters[65];
17164 duncan 1631
    R_RegisteredNativeSymbol symbol = {R_C_SYM, {NULL}, NULL};
20110 duncan 1632
    R_NativePrimitiveArgType *checkTypes = NULL;
1633
    R_NativeArgStyle *argStyles = NULL;
41901 ripley 1634
    void *vmax;
1635
    char symName[MaxSymbolBytes], encname[101];
14571 duncan 1636
 
51291 ripley 1637
    if (length(args) < 1) errorcall(call, _("'name' is missing"));
1638
    check1arg(args, call, "name");
6098 pd 1639
    if (NaokSymbol == NULL || DupSymbol == NULL || PkgSymbol == NULL) {
1839 ihaka 1640
	NaokSymbol = install("NAOK");
1641
	DupSymbol = install("DUP");
6098 pd 1642
	PkgSymbol = install("PACKAGE");
1839 ihaka 1643
    }
32657 ripley 1644
    if (EncSymbol == NULL) EncSymbol = install("ENCODING");
1839 ihaka 1645
    vmax = vmaxget();
1646
    which = PRIMVAL(op);
14571 duncan 1647
    if(which)
1648
	symbol.type = R_FORTRAN_SYM;
1016 maechler 1649
 
32657 ripley 1650
    args = enctrim(args, encname, 100);
39866 duncan 1651
    args = resolveNativeRoutine(args, &ofun, &symbol, symName, &nargs,
31591 ripley 1652
				&naok, &dup, call);
39866 duncan 1653
    fun = (VarFun) ofun;
2 r 1654
 
14571 duncan 1655
    if(symbol.symbol.c && symbol.symbol.c->numArgs > -1) {
1656
	if(symbol.symbol.c->numArgs != nargs)
41713 ripley 1657
	    errorcall(call,
1658
		      _("Incorrect number of arguments (%d), expecting %d for %s"),
1659
		      nargs, symbol.symbol.c->numArgs, symName);
26763 maechler 1660
 
30599 duncan 1661
	checkTypes = symbol.symbol.c->types;
1662
	argStyles = symbol.symbol.c->styles;
14571 duncan 1663
    }
14156 duncan 1664
 
30599 duncan 1665
 
14156 duncan 1666
    /* Convert the arguments for use in foreign */
1667
    /* function calls.  Note that we copy twice */
1668
    /* once here, on the way into the call, and */
1669
    /* once below on the way out. */
14571 duncan 1670
    cargs = (void**)R_alloc(nargs, sizeof(void*));
14156 duncan 1671
    nargs = 0;
1672
    for(pargs = args ; pargs != R_NilValue; pargs = CDR(pargs)) {
45446 ripley 1673
	if(checkTypes &&
31591 ripley 1674
	   !comparePrimitiveTypes(checkTypes[nargs], CAR(pargs), dup)) {
45446 ripley 1675
	    /* We can loop over all the arguments and report all the
1676
	       erroneous ones, but then we would also want to avoid
1677
	       the conversions.  Also, in the future, we may just
1678
	       attempt to coerce the value to the appropriate
1679
	       type. This is why we pass the checkTypes[nargs] value
1680
	       to RObjToCPtr(). We just have to sort out the ability
1681
	       to return the correct value which is complicated by
1682
	       dup, etc. */
41713 ripley 1683
	    errorcall(call, _("Wrong type for argument %d in call to %s"),
1684
		      nargs+1, symName);
20110 duncan 1685
	}
26763 maechler 1686
	cargs[nargs] = RObjToCPtr(CAR(pargs), naok, dup, nargs + 1,
30599 duncan 1687
				  which, symName, argConverters + nargs,
32657 ripley 1688
				  checkTypes ? checkTypes[nargs] : 0,
1689
				  encname);
38550 tlumley 1690
#ifdef R_MEMORY_PROFILING
49001 ripley 1691
	if (RTRACE(CAR(pargs)) && dup)
38550 tlumley 1692
		memtrace_report(CAR(pargs), cargs[nargs]);
1693
#endif
14156 duncan 1694
	nargs++;
1695
    }
1696
 
1697
 
1839 ihaka 1698
    switch (nargs) {
1699
    case 0:
1700
	/* Silicon graphics C chokes here */
1701
	/* if there is no argument to fun. */
1702
	fun(0);
1703
	break;
1704
    case 1:
1705
	fun(cargs[0]);
1706
	break;
1707
    case 2:
1708
	fun(cargs[0], cargs[1]);
1709
	break;
1710
    case 3:
1711
	fun(cargs[0], cargs[1], cargs[2]);
1712
	break;
1713
    case 4:
1714
	fun(cargs[0], cargs[1], cargs[2], cargs[3]);
1715
	break;
1716
    case 5:
1717
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4]);
1718
	break;
1719
    case 6:
1720
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1721
	    cargs[5]);
1722
	break;
1723
    case 7:
1724
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1725
	    cargs[5],  cargs[6]);
1726
	break;
1727
    case 8:
1728
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1729
	    cargs[5],  cargs[6],  cargs[7]);
1730
	break;
1731
    case 9:
1732
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1733
	    cargs[5],  cargs[6],  cargs[7],  cargs[8]);
1734
	break;
1735
    case 10:
1736
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1737
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9]);
1738
	break;
1739
    case 11:
1740
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1741
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1742
	    cargs[10]);
1743
	break;
1744
    case 12:
1745
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1746
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1747
	    cargs[10], cargs[11]);
1748
	break;
1749
    case 13:
1750
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1751
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1752
	    cargs[10], cargs[11], cargs[12]);
1753
	break;
1754
    case 14:
1755
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1756
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1757
	    cargs[10], cargs[11], cargs[12], cargs[13]);
1758
	break;
1759
    case 15:
1760
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1761
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1762
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14]);
1763
	break;
1764
    case 16:
1765
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1766
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1767
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1768
	    cargs[15]);
1769
	break;
1770
    case 17:
1771
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1772
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1773
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1774
	    cargs[15], cargs[16]);
1775
	break;
1776
    case 18:
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]);
1781
	break;
1782
    case 19:
1783
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1784
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1785
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1786
	    cargs[15], cargs[16], cargs[17], cargs[18]);
1787
	break;
1788
    case 20:
1789
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1790
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1791
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1792
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19]);
1793
	break;
1794
    case 21:
1795
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1796
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1797
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1798
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1799
	    cargs[20]);
1800
	break;
1801
    case 22:
1802
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1803
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1804
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1805
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1806
	    cargs[20], cargs[21]);
1807
	break;
1808
    case 23:
1809
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1810
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1811
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1812
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1813
	    cargs[20], cargs[21], cargs[22]);
1814
	break;
1815
    case 24:
1816
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1817
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1818
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1819
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1820
	    cargs[20], cargs[21], cargs[22], cargs[23]);
1821
	break;
1822
    case 25:
1823
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1824
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1825
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1826
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1827
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24]);
1828
	break;
1829
    case 26:
1830
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1831
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1832
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1833
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1834
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1835
	    cargs[25]);
1836
	break;
1837
    case 27:
1838
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1840
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1841
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1842
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1843
	    cargs[25], cargs[26]);
1844
	break;
1845
    case 28:
1846
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1847
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1848
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1849
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1850
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1851
	    cargs[25], cargs[26], cargs[27]);
1852
	break;
1853
    case 29:
1854
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1855
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1856
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1857
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1858
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1859
	    cargs[25], cargs[26], cargs[27], cargs[28]);
1860
	break;
1861
    case 30:
1862
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1863
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1864
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1865
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1866
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1867
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29]);
1868
	break;
1869
    case 31:
1870
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1871
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1872
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1873
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1874
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1875
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1876
	    cargs[30]);
1877
	break;
1878
    case 32:
1879
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1880
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1881
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1882
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1883
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1884
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1885
	    cargs[30], cargs[31]);
1886
	break;
1887
    case 33:
1888
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1889
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1890
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1891
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1892
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1893
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1894
	    cargs[30], cargs[31], cargs[32]);
1895
	break;
1896
    case 34:
1897
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1898
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1899
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1900
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1901
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1902
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1903
	    cargs[30], cargs[31], cargs[32], cargs[33]);
1904
	break;
1905
    case 35:
1906
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1907
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1908
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1909
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1910
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1911
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1912
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34]);
1913
	break;
1914
    case 36:
1915
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1916
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1917
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1918
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1919
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1920
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1921
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1922
	    cargs[35]);
1923
	break;
1924
    case 37:
1925
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1926
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1927
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1928
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1929
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1930
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1931
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1932
	    cargs[35], cargs[36]);
1933
	break;
1934
    case 38:
1935
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1936
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1937
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1938
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1939
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1940
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1941
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1942
	    cargs[35], cargs[36], cargs[37]);
1943
	break;
1944
    case 39:
1945
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1946
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1947
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1948
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1949
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1950
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1951
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1952
	    cargs[35], cargs[36], cargs[37], cargs[38]);
1953
	break;
1954
    case 40:
1955
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1956
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1957
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1958
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1959
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1960
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1961
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1962
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39]);
1963
	break;
1964
    case 41:
1965
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1966
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1967
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1968
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1969
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1970
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1971
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1972
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1973
	    cargs[40]);
1974
	break;
1975
    case 42:
1976
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1977
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1978
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1979
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1980
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1981
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1982
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1983
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1984
	    cargs[40], cargs[41]);
1985
	break;
1986
    case 43:
1987
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1988
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1989
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1990
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1991
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1992
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1993
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1994
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1995
	    cargs[40], cargs[41], cargs[42]);
1996
	break;
1997
    case 44:
1998
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1999
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2000
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2001
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2002
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2003
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2004
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2005
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2006
	    cargs[40], cargs[41], cargs[42], cargs[43]);
2007
	break;
2008
    case 45:
2009
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2010
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2011
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2012
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2013
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2014
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2015
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2016
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2017
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44]);
2018
	break;
2019
    case 46:
2020
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2021
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2022
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2023
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2024
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2025
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2026
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2027
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2028
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2029
	    cargs[45]);
2030
	break;
2031
    case 47:
2032
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2033
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2034
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2035
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2036
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2037
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2038
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2039
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2040
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2041
	    cargs[45], cargs[46]);
2042
	break;
2043
    case 48:
2044
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2045
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2046
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2047
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2048
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2049
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2050
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2051
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2052
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2053
	    cargs[45], cargs[46], cargs[47]);
2054
	break;
2055
    case 49:
2056
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2057
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2058
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2059
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2060
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2061
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2062
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2063
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2064
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2065
	    cargs[45], cargs[46], cargs[47], cargs[48]);
2066
	break;
2067
    case 50:
2068
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2069
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2070
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2071
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2072
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2073
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2074
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2075
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2076
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2077
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49]);
2078
	break;
2079
    case 51:
2080
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2081
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2082
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2083
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2084
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2085
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2086
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2087
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2088
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2089
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2090
	    cargs[50]);
2091
	break;
2092
    case 52:
2093
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2094
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2095
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2096
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2097
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2098
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2099
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2100
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2101
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2102
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2103
	    cargs[50], cargs[51]);
2104
	break;
2105
    case 53:
2106
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2107
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2108
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2109
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2110
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2111
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2112
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2113
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2114
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2115
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2116
	    cargs[50], cargs[51], cargs[52]);
2117
	break;
2118
    case 54:
2119
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2120
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2121
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2122
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2123
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2124
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2125
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2126
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2127
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2128
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2129
	    cargs[50], cargs[51], cargs[52], cargs[53]);
2130
	break;
2131
    case 55:
2132
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2133
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2134
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2135
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2136
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2137
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2138
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2139
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2140
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2141
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2142
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54]);
2143
	break;
2144
    case 56:
2145
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2146
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2147
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2148
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2149
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2150
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2151
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2152
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2153
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2154
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2155
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2156
	    cargs[55]);
2157
	break;
2158
    case 57:
2159
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2160
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2161
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2162
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2163
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2164
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2165
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2166
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2167
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2168
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2169
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2170
	    cargs[55], cargs[56]);
2171
	break;
2172
    case 58:
2173
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2174
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2175
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2176
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2177
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2178
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2179
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2180
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2181
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2182
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2183
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2184
	    cargs[55], cargs[56], cargs[57]);
2185
	break;
2186
    case 59:
2187
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2188
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2189
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2190
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2191
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2192
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2193
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2194
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2195
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2196
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2197
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2198
	    cargs[55], cargs[56], cargs[57], cargs[58]);
2199
	break;
2200
    case 60:
2201
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2202
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2203
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2204
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2205
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2206
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2207
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2208
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2209
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2210
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2211
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2212
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59]);
2213
	break;
2214
    case 61:
2215
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2216
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2217
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2218
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2219
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2220
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2221
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2222
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2223
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2224
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2225
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2226
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
2227
	    cargs[60]);
2228
	break;
2229
    case 62:
2230
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2231
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2232
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2233
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2234
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2235
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2236
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2237
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2238
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2239
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2240
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2241
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
2242
	    cargs[60], cargs[61]);
2243
	break;
2244
    case 63:
2245
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2246
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2247
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2248
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2249
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2250
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2251
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2252
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2253
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2254
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2255
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2256
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
2257
	    cargs[60], cargs[61], cargs[62]);
2258
	break;
2259
    case 64:
2260
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2261
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2262
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2263
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2264
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2265
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2266
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2267
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2268
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2269
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2270
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2271
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
2272
	    cargs[60], cargs[61], cargs[62], cargs[63]);
2273
	break;
2274
    case 65:
2275
	fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
2276
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2277
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2278
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2279
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2280
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2281
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2282
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2283
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2284
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2285
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2286
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
2287
	    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
2288
	break;
2289
    default:
32867 ripley 2290
	errorcall(call, _("too many arguments, sorry"));
1839 ihaka 2291
    }
2292
    PROTECT(ans = allocVector(VECSXP, nargs));
2293
    havenames = 0;
2294
    if (dup) {
14156 duncan 2295
	R_FromCConvertInfo info;
2296
	info.cargs = cargs;
2297
	info.allArgs = args;
2298
	info.nargs = nargs;
30599 duncan 2299
	info.functionName = symName;
2 r 2300
	nargs = 0;
1839 ihaka 2301
	for (pargs = args ; pargs != R_NilValue ; pargs = CDR(pargs)) {
20110 duncan 2302
	    if(argStyles && argStyles[nargs] == R_ARG_IN) {
45446 ripley 2303
		PROTECT(s = R_NilValue);
20110 duncan 2304
	    } else if(argConverters[nargs]) {
45446 ripley 2305
		if(argConverters[nargs]->reverse) {
14156 duncan 2306
		    info.argIndex = nargs;
26763 maechler 2307
		    s = argConverters[nargs]->reverse(cargs[nargs], CAR(pargs),
31591 ripley 2308
						      &info,
2309
						      argConverters[nargs]);
14156 duncan 2310
		} else
2311
		    s = R_NilValue;
2312
		PROTECT(s);
2313
	    } else {
26763 maechler 2314
		PROTECT(s = CPtrToRObj(cargs[nargs], CAR(pargs), which,
32657 ripley 2315
				       checkTypes ? checkTypes[nargs] : TYPEOF(CAR(pargs)),
2316
				       encname));
38550 tlumley 2317
#if R_MEMORY_PROFILING
49001 ripley 2318
		if (RTRACE(CAR(pargs)) && dup){
38550 tlumley 2319
			memtrace_report(cargs[nargs], s);
49001 ripley 2320
			SET_RTRACE(s, 1);
38550 tlumley 2321
		}
45446 ripley 2322
#endif
41002 jmc 2323
		DUPLICATE_ATTRIB(s, CAR(pargs));
14156 duncan 2324
	    }
1839 ihaka 2325
	    if (TAG(pargs) != R_NilValue)
2326
		havenames = 1;
10172 luke 2327
	    SET_VECTOR_ELT(ans, nargs, s);
1839 ihaka 2328
	    nargs++;
2329
	    UNPROTECT(1);
2 r 2330
	}
1839 ihaka 2331
    }
2332
    else {
2333
	nargs = 0;
2334
	for (pargs = args ; pargs != R_NilValue ; pargs = CDR(pargs)) {
2335
	    if (TAG(pargs) != R_NilValue)
2336
		havenames = 1;
10172 luke 2337
	    SET_VECTOR_ELT(ans, nargs, CAR(pargs));
1839 ihaka 2338
	    nargs++;
2 r 2339
	}
1839 ihaka 2340
    }
2341
    if (havenames) {
1889 ihaka 2342
	SEXP names;
1839 ihaka 2343
	PROTECT(names = allocVector(STRSXP, nargs));
2344
	nargs = 0;
2345
	for (pargs = args ; pargs != R_NilValue ; pargs = CDR(pargs)) {
2346
	    if (TAG(pargs) == R_NilValue)
10172 luke 2347
		SET_STRING_ELT(names, nargs++, R_BlankString);
1839 ihaka 2348
	    else
10172 luke 2349
		SET_STRING_ELT(names, nargs++, PRINTNAME(TAG(pargs)));
45446 ripley 2350
	}
1839 ihaka 2351
	setAttrib(ans, R_NamesSymbol, names);
2352
	UNPROTECT(1);
2353
    }
2354
    UNPROTECT(1);
2355
    vmaxset(vmax);
2356
    return (ans);
2357
}
2 r 2358
 
3875 hornik 2359
/* FIXME : Must work out what happens here when we replace LISTSXP by
2360
   VECSXP. */
1016 maechler 2361
 
19912 duncan 2362
static const struct {
2363
    const char *name;
2364
    const SEXPTYPE type;
2 r 2365
}
1839 ihaka 2366
typeinfo[] = {
2367
    {"logical",	  LGLSXP },
2368
    {"integer",	  INTSXP },
2369
    {"double",	  REALSXP},
2370
    {"complex",	  CPLXSXP},
2371
    {"character", STRSXP },
2372
    {"list",	  VECSXP },
2373
    {NULL,	  0      }
2 r 2374
};
2375
 
2376
static int string2type(char *s)
2377
{
1839 ihaka 2378
    int i;
2379
    for (i = 0 ; typeinfo[i].name ; i++) {
2380
	if(!strcmp(typeinfo[i].name, s)) {
2381
	    return typeinfo[i].type;
2 r 2382
	}
1839 ihaka 2383
    }
32867 ripley 2384
    error(_("type \"%s\" not supported in interlanguage calls"), s);
1839 ihaka 2385
    return 1; /* for -Wall */
2 r 2386
}
2387
 
2388
void call_R(char *func, long nargs, void **arguments, char **modes,
1839 ihaka 2389
	    long *lengths, char **names, long nres, char **results)
2 r 2390
{
1839 ihaka 2391
    SEXP call, pcall, s;
2392
    SEXPTYPE type;
2393
    int i, j, n;
9317 ripley 2394
 
1839 ihaka 2395
    if (!isFunction((SEXP)func))
32867 ripley 2396
	error(_("invalid function in call_R"));
1839 ihaka 2397
    if (nargs < 0)
32867 ripley 2398
	error(_("invalid argument count in call_R"));
1839 ihaka 2399
    if (nres < 0)
32867 ripley 2400
	error(_("invalid return value count in call_R"));
1839 ihaka 2401
    PROTECT(pcall = call = allocList(nargs + 1));
10172 luke 2402
    SET_TYPEOF(call, LANGSXP);
2403
    SETCAR(pcall, (SEXP)func);
3865 pd 2404
    s = R_NilValue;		/* -Wall */
1839 ihaka 2405
    for (i = 0 ; i < nargs ; i++) {
2406
	pcall = CDR(pcall);
2407
	type = string2type(modes[i]);
2408
	switch(type) {
2 r 2409
	case LGLSXP:
2410
	case INTSXP:
10172 luke 2411
	    n = lengths[i];
2412
	    SETCAR(pcall, allocVector(type, n));
2413
	    memcpy(INTEGER(CAR(pcall)), arguments[i], n * sizeof(int));
1839 ihaka 2414
	    break;
2 r 2415
	case REALSXP:
10172 luke 2416
	    n = lengths[i];
2417
	    SETCAR(pcall, allocVector(REALSXP, n));
2418
	    memcpy(REAL(CAR(pcall)), arguments[i], n * sizeof(double));
1839 ihaka 2419
	    break;
2 r 2420
	case CPLXSXP:
10172 luke 2421
	    n = lengths[i];
2422
	    SETCAR(pcall, allocVector(CPLXSXP, n));
2423
	    memcpy(REAL(CAR(pcall)), arguments[i], n * sizeof(Rcomplex));
1839 ihaka 2424
	    break;
2 r 2425
	case STRSXP:
1839 ihaka 2426
	    n = lengths[i];
10172 luke 2427
	    SETCAR(pcall, allocVector(STRSXP, n));
2428
	    for (j = 0 ; j < n ; j++) {
2429
		char *str = (char*)(arguments[i]);
41495 rgentlem 2430
		SET_STRING_ELT(CAR(pcall), i, mkChar(str));
45446 ripley 2431
	    }
1839 ihaka 2432
	    break;
2433
	    /* FIXME : This copy is unnecessary! */
9317 ripley 2434
	    /* FIXME : This is obviously incorrect so disable
1839 ihaka 2435
	case VECSXP:
2436
	    n = lengths[i];
10172 luke 2437
	    SETCAR(pcall, allocVector(VECSXP, n));
1839 ihaka 2438
	    for (j = 0 ; j < n ; j++) {
10172 luke 2439
		SET_VECTOR_ELT(s, i, (SEXP)(arguments[i]));
1839 ihaka 2440
	    }
9317 ripley 2441
	    break; */
2442
	default:
33297 ripley 2443
	    error(_("mode '%s' is not supported in call_R"), modes[i]);
2 r 2444
	}
1839 ihaka 2445
	if(names && names[i])
10172 luke 2446
	    SET_TAG(pcall, install(names[i]));
2447
	SET_NAMED(CAR(pcall), 2);
1839 ihaka 2448
    }
2449
    PROTECT(s = eval(call, R_GlobalEnv));
2450
    switch(TYPEOF(s)) {
2451
    case LGLSXP:
2452
    case INTSXP:
2453
    case REALSXP:
2454
    case CPLXSXP:
2455
    case STRSXP:
2456
	if(nres > 0)
39866 duncan 2457
	    results[0] = (char *) RObjToCPtr(s, 1, 1, 0, 0, (const char *)NULL,
2458
					     NULL, 0, "");
1839 ihaka 2459
	break;
2460
    case VECSXP:
2461
	n = length(s);
2462
	if (nres < n) n = nres;
2463
	for (i = 0 ; i < n ; i++) {
39866 duncan 2464
	    results[i] = (char *) RObjToCPtr(VECTOR_ELT(s, i), 1, 1, 0, 0,
2465
					     (const char *)NULL, NULL, 0, "");
1839 ihaka 2466
	}
2467
	break;
2468
    case LISTSXP:
2469
	n = length(s);
2470
	if(nres < n) n = nres;
2471
	for(i=0 ; i<n ; i++) {
39866 duncan 2472
	    results[i] =(char *) RObjToCPtr(s, 1, 1, 0, 0, (const char *)NULL,
2473
					    NULL, 0, "");
1839 ihaka 2474
	    s = CDR(s);
2475
	}
2476
	break;
2477
    }
2478
    UNPROTECT(2);
2479
    return;
2 r 2480
}
2481
 
2482
void call_S(char *func, long nargs, void **arguments, char **modes,
1839 ihaka 2483
	    long *lengths, char **names, long nres, char **results)
2 r 2484
{
1839 ihaka 2485
    call_R(func, nargs, arguments, modes, lengths, names, nres, results);
2 r 2486
}