The R Project SVN R

Rev

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

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