The R Project SVN R

Rev

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