The R Project SVN R

Rev

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