The R Project SVN R

Rev

Rev 6994 | Details | Compare with Previous | Last modification | View Log | RSS feed

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