The R Project SVN R

Rev

Rev 102 | Go to most recent revision | Details | 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
4
 *  Copyright (C) 1997  The R Core Team
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
18
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
 */
20
 
21
#include "Defn.h"
22
#include "Mathlib.h"
23
#include <string.h>
24
#include <stdlib.h>
25
 
26
typedef int (*DL_FUNC)();
27
 
28
static SEXP NaokSymbol = NULL;
29
static SEXP DupSymbol = NULL;
30
 
31
DL_FUNC R_FindSymbol(char *);
32
 
33
#ifdef OLD
34
void InitFunctionHashing()
35
{
36
	NaokSymbol = install("NAOK");
37
	DupSymbol = install("DUP");
38
}
39
#endif
40
 
41
	/* Convert an R object to a non-moveable C object */
42
	/* and return a pointer to it.  This leaves pointers */
43
	/* for anything other than vectors and lists unaltered. */
44
 
45
static void *RObjToCPtr(SEXP s, int naok, int dup, int narg)
46
{
47
	int *iptr;
48
	double *rptr;
49
	char **cptr;
50
	complex *zptr;
51
	int i, l, n;
52
 
53
	switch(TYPEOF(s)) {
54
	case LGLSXP:
55
	case FACTSXP:
56
	case ORDSXP:
57
	case INTSXP:
58
		n = LENGTH(s);
59
		iptr = INTEGER(s);
60
		for(i=0 ; i<n ; i++) {
61
			if(!naok && iptr[i] == NA_INTEGER)
62
				error("NAs in foreign function call (arg %d)\n", narg);
63
		}
64
		if(dup) {
65
			iptr = (int*)R_alloc(n, sizeof(int));
66
			for(i=0 ; i<n ; i++)
67
				iptr[i] = INTEGER(s)[i];
68
		}
69
		return (void*)iptr;
70
		break;
71
	case REALSXP:
72
		n = LENGTH(s);
73
		rptr = REAL(s);
74
		for(i=0 ; i<n ; i++) {
75
			if(!naok && !FINITE(rptr[i]))
76
				error("NAs in foreign function call (arg %d)\n", narg);
77
		}
78
		if(dup) {
79
			rptr = (double*)R_alloc(n, sizeof(double));
80
			for(i=0 ; i<n ; i++)
81
				rptr[i] = REAL(s)[i];
82
		}
83
		return (void*)rptr;
84
		break;
85
#ifdef COMPLEX_DATA
86
	case CPLXSXP:
87
		n = LENGTH(s);
88
		zptr = COMPLEX(s);
89
		for(i=0 ; i<n ; i++) {
90
			if(!naok && (!FINITE(zptr[i].r || !FINITE(zptr[i].i))))
91
				error("NAs in foreign function call (arg %d)\n", narg);
92
		}
93
		if(dup) {
94
			zptr = (complex*)R_alloc(n, sizeof(complex));
95
			for(i=0 ; i<n ; i++)
96
				zptr[i] = COMPLEX(s)[i];
97
		}
98
		return (void*)zptr;
99
		break;
100
#endif
101
	case STRSXP:
102
		if(!dup)
103
			error("character variables must be duplicated in .C/.Fortran\n");
104
		n = LENGTH(s);
105
		cptr = (char**)R_alloc(n, sizeof(char*));
106
		for(i=0 ; i<n ; i++) {
107
			l = strlen(CHAR(STRING(s)[i]));
108
			cptr[i] = (char*)R_alloc(l+1, sizeof(char));
109
			strcpy(cptr[i], CHAR(STRING(s)[i]));
110
		}
111
		return (void*)cptr;
112
		break;
113
	case LISTSXP:
114
		if(!dup) return (void*)s;
115
		n = length(s);
116
		cptr = (char**)R_alloc(n, sizeof(char*));
117
		for(i=0 ; i<n ; i++) {
118
			cptr[i] = (char*)s;
119
			s = CDR(s);
120
		}
121
		return (void*)cptr;
122
	default:
123
		return (void*)s;
124
	}
125
}
126
 
127
static SEXP CPtrToRObj(void *p, int n, SEXPTYPE type)
128
{
129
	int *iptr;
130
	double *rptr;
131
	char **cptr;
132
	complex *zptr;
133
	SEXP *lptr;
134
	int i;
135
	SEXP s, t;
136
 
137
	switch(type) {
138
		case LGLSXP:
139
		case FACTSXP:
140
		case ORDSXP:
141
		case INTSXP:
142
			s = allocVector(type, n);
143
			iptr = (int*)p;
144
			for(i=0 ; i<n ; i++) {
145
				INTEGER(s)[i] = iptr[i];
146
			}
147
			break;
148
		case REALSXP:
149
			s = allocVector(type, n);
150
			rptr = (double*)p;
151
			for(i=0 ; i<n ; i++) {
152
				REAL(s)[i] = rptr[i];
153
			}
154
			break;
155
#ifdef COMPLEX_DATA
156
		case CPLXSXP:
157
			s = allocVector(type, n);
158
			zptr = (complex*)p;
159
			for(i=0 ; i<n ; i++) {
160
				COMPLEX(s)[i] = zptr[i];
161
			}
162
			break;
163
#endif
164
		case STRSXP:
165
			PROTECT(s = allocVector(type, n));
166
			cptr = (char**)p;
167
			for(i=0 ; i<n ; i++) {
168
				STRING(s)[i] = mkChar(cptr[i]);
169
			}
170
			UNPROTECT(1);
171
			break;
172
		case LISTSXP:
173
			PROTECT(t = s = allocList(n));
174
			lptr = (SEXP*)p;
175
			for(i=0 ; i<n ; i++) {
176
				CAR(t) = lptr[i];
177
				t = CDR(t);
178
			}
179
			UNPROTECT(1);
180
		default:
181
			s = (SEXP)p;
182
	}
183
	return s;
184
}
185
 
186
	/* Foreign Function Interface.  This code allows a */
187
	/* user to call C or Fortran code which is either */
188
	/* statically or dynamically linked into R. */
189
 
190
 
191
static SEXP naoktrim(SEXP s, int * len, int *naok, int *dup)
192
{
193
	SEXP value;
194
 
195
	if(s == R_NilValue) {
196
		value = R_NilValue;
197
		*naok = 0;
198
		*dup = 1;
199
		*len = 0;
200
	}
201
	else if(TAG(s) == NaokSymbol) {
202
		value = naoktrim(CDR(s), len, naok, dup);
203
		*naok = asLogical(CAR(s));
204
	}
205
	else if(TAG(s) == DupSymbol) {
206
		value = naoktrim(CDR(s), len, naok, dup);
207
		*dup = asLogical(CAR(s));
208
	}
209
	else {
210
		CDR(s) = naoktrim(CDR(s), len, naok, dup);
211
		*len = *len + 1;
212
	}
213
	return s;
214
}
215
 
216
#define MAX_ARGS 65
217
 
218
SEXP do_symbol(SEXP call, SEXP op, SEXP args, SEXP env)
219
{
220
	char buf[128], *p, *q;
221
 
222
	checkArity(op, args);
223
	if(!isString(CAR(args)) || length(CAR(args)) < 1)
224
		errorcall(call, "invalid argument\n");
225
 
226
	p = CHAR(STRING(CAR(args))[0]);
227
	q = buf;
228
	while ((*q = *p) != '\0') {
229
		p++;
230
		q++;
231
	}
232
#ifdef HAVE_F77_UNDERSCORE
233
	if(PRIMVAL(op)) {
234
		*q++ = '_';
235
		*q = '\0';
236
#endif
237
	}
238
 
239
	return mkString(buf);
240
}
241
 
242
SEXP do_isloaded(SEXP call, SEXP op, SEXP args, SEXP env)
243
{
244
	SEXP ans;
245
	DL_FUNC fun;
246
	char *sym;
247
	int val;
248
	checkArity(op, args);
249
	if(!isString(CAR(args)) || length(CAR(args)) < 1)
250
		errorcall(call, "invalid argument\n");
251
	sym = CHAR(STRING(CAR(args))[0]);
252
 
253
	val = 1;
254
	if (!(fun = R_FindSymbol(sym)))
255
		val = 0;
256
	ans = allocVector(LGLSXP, 1);
257
	LOGICAL(ans)[0] = val;
258
	return ans;
259
}
260
 
261
SEXP do_dotCode(SEXP call, SEXP op, SEXP args, SEXP env)
262
{
263
	void **cargs;
264
	int dup, naok, nargs, which;
265
	DL_FUNC fun;
266
	SEXP pargs, s;
267
	char buf[128], *p, *q, *vmax;
268
 
269
	if(NaokSymbol == NULL || DupSymbol == NULL) {
270
		NaokSymbol = install("NAOK");
271
		DupSymbol = install("DUP");
272
	}
273
	vmax = vmaxget();
274
	which = PRIMVAL(op);
275
 
276
	op = CAR(args);
277
	if (!isString(op))
278
		errorcall(call, "function name must be a string\n");
279
 
280
		/* The following code modifies the argument list */
281
		/* We know this is ok because do_dotcode is entered */
282
		/* with its arguments evaluated. */
283
 
284
	args = naoktrim(CDR(args), &nargs, &naok, &dup);
285
	if(naok == NA_LOGICAL)
286
		errorcall(call, "invalid naok value\n");
287
 
288
	if(nargs > MAX_ARGS)
289
		errorcall(call, "too many arguments in foreign function call\n");
290
	cargs = (void**)R_alloc(nargs, sizeof(void*));
291
 
292
		/* Convert the arguments for use in foreign */
293
		/* function calls.  Note that we copy twice */
294
		/* once here, on the way into the call, and */
295
		/* once below on the way out. */
296
 
297
	nargs = 0;
298
	for(pargs = args ; pargs != R_NilValue; pargs = CDR(pargs)) {
299
		cargs[nargs] = RObjToCPtr(CAR(pargs), naok, dup, nargs+1);
300
		nargs++;
301
	}
302
 
303
	/* make up load symbol & look it up */
304
 
305
	p = CHAR(STRING(op)[0]);
306
	q = buf;
307
	while ((*q = *p) != '\0') {
308
		p++;
309
		q++;
310
	}
311
 
312
#ifdef HAVE_F77_UNDERSCORE
313
	if (which)
314
		*q++ = '_';
315
	*q = '\0';
316
#endif
317
 
318
	if (!(fun = R_FindSymbol(buf)))
319
		errorcall(call, "C/Fortran function not in load table\n");
320
 
321
	switch (nargs) {
322
	case 0:
323
		/* Silicon graphics C chokes if there is */
324
		/* no argument to fun */
325
		fun(0);
326
		break;
327
	case 1:
328
		fun(cargs[0]);
329
		break;
330
	case 2:
331
		fun(cargs[0], cargs[1]);
332
		break;
333
	case 3:
334
		fun(cargs[0], cargs[1], cargs[2]);
335
		break;
336
	case 4:
337
		fun(cargs[0], cargs[1], cargs[2], cargs[3]);
338
		break;
339
	case 5:
340
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4]);
341
		break;
342
	case 6:
343
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
344
		    cargs[5]);
345
		break;
346
	case 7:
347
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
348
		    cargs[5],  cargs[6]);
349
		break;
350
	case 8:
351
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
352
		    cargs[5],  cargs[6],  cargs[7]);
353
		break;
354
	case 9:
355
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
356
		    cargs[5],  cargs[6],  cargs[7],  cargs[8]);
357
		break;
358
	case 10:
359
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
360
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9]);
361
		break;
362
	case 11:
363
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
364
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
365
		    cargs[10]);
366
		break;
367
	case 12:
368
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
369
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
370
		    cargs[10], cargs[11]);
371
		break;
372
	case 13:
373
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
374
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
375
		    cargs[10], cargs[11], cargs[12]);
376
		break;
377
	case 14:
378
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
379
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
380
		    cargs[10], cargs[11], cargs[12], cargs[13]);
381
		break;
382
	case 15:
383
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
384
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
385
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14]);
386
		break;
387
	case 16:
388
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
389
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
390
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
391
		    cargs[15]);
392
		break;
393
	case 17:
394
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
395
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
396
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
397
		    cargs[15], cargs[16]);
398
		break;
399
	case 18:
400
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
401
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
402
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
403
		    cargs[15], cargs[16], cargs[17]);
404
		break;
405
	case 19:
406
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
407
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
408
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
409
		    cargs[15], cargs[16], cargs[17], cargs[18]);
410
		break;
411
	case 20:
412
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
413
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
414
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
415
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19]);
416
		break;
417
	case 21:
418
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
419
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
420
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
421
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
422
		    cargs[20]);
423
		break;
424
	case 22:
425
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
426
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
427
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
428
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
429
		    cargs[20], cargs[21]);
430
		break;
431
	case 23:
432
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
433
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
434
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
435
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
436
		    cargs[20], cargs[21], cargs[22]);
437
		break;
438
	case 24:
439
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
440
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
441
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
442
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
443
		    cargs[20], cargs[21], cargs[22], cargs[23]);
444
		break;
445
	case 25:
446
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
447
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
448
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
449
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
450
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24]);
451
		break;
452
	case 26:
453
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
454
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
455
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
456
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
457
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
458
		    cargs[25]);
459
		break;
460
	case 27:
461
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
462
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
463
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
464
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
465
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
466
		    cargs[25], cargs[26]);
467
		break;
468
	case 28:
469
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
470
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
471
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
472
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
473
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
474
		    cargs[25], cargs[26], cargs[27]);
475
		break;
476
	case 29:
477
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
478
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
479
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
480
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
481
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
482
		    cargs[25], cargs[26], cargs[27], cargs[28]);
483
		break;
484
	case 30:
485
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
486
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
487
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
488
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
489
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
490
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29]);
491
		break;
492
	case 31:
493
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
494
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
495
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
496
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
497
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
498
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
499
		    cargs[30]);
500
		break;
501
	case 32:
502
		fun(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], cargs[14],
505
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
506
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
507
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
508
		    cargs[30], cargs[31]);
509
		break;
510
	case 33:
511
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
512
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
513
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
514
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
515
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
516
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
517
		    cargs[30], cargs[31], cargs[32]);
518
		break;
519
	case 34:
520
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
521
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
522
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
523
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
524
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
525
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
526
		    cargs[30], cargs[31], cargs[32], cargs[33]);
527
		break;
528
	case 35:
529
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
530
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
531
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
532
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
533
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
534
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
535
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34]);
536
		break;
537
	case 36:
538
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
539
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
540
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
541
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
542
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
543
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
544
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
545
		    cargs[35]);
546
		break;
547
	case 37:
548
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
549
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
550
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
551
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
552
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
553
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
554
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
555
		    cargs[35], cargs[36]);
556
		break;
557
	case 38:
558
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
559
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
560
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
561
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
562
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
563
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
564
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
565
		    cargs[35], cargs[36], cargs[37]);
566
		break;
567
	case 39:
568
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
569
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
570
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
571
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
572
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
573
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
574
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
575
		    cargs[35], cargs[36], cargs[37], cargs[38]);
576
		break;
577
	case 40:
578
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
579
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
580
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
581
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
582
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
583
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
584
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
585
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39]);
586
		break;
587
	case 41:
588
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
589
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
590
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
591
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
592
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
593
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
594
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
595
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
596
		    cargs[40]);
597
		break;
598
	case 42:
599
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
600
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
601
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
602
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
603
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
604
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
605
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
606
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
607
		    cargs[40], cargs[41]);
608
		break;
609
	case 43:
610
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
611
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
612
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
613
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
614
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
615
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
616
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
617
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
618
		    cargs[40], cargs[41], cargs[42]);
619
		break;
620
	case 44:
621
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
622
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
623
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
624
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
625
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
626
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
627
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
628
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
629
		    cargs[40], cargs[41], cargs[42], cargs[43]);
630
		break;
631
	case 45:
632
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
633
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
634
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
635
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
636
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
637
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
638
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
639
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
640
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44]);
641
		break;
642
	case 46:
643
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
644
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
645
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
646
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
647
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
648
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
649
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
650
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
651
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
652
		    cargs[45]);
653
		break;
654
	case 47:
655
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
656
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
657
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
658
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
659
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
660
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
661
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
662
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
663
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
664
		    cargs[45], cargs[46]);
665
		break;
666
	case 48:
667
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
668
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
669
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
670
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
671
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
672
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
673
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
674
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
675
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
676
		    cargs[45], cargs[46], cargs[47]);
677
		break;
678
	case 49:
679
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
680
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
681
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
682
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
683
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
684
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
685
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
686
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
687
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
688
		    cargs[45], cargs[46], cargs[47], cargs[48]);
689
		break;
690
	case 50:
691
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
692
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
693
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
694
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
695
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
696
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
697
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
698
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
699
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
700
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49]);
701
		break;
702
	case 51:
703
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
704
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
705
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
706
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
707
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
708
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
709
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
710
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
711
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
712
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
713
		    cargs[50]);
714
		break;
715
	case 52:
716
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
717
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
718
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
719
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
720
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
721
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
722
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
723
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
724
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
725
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
726
		    cargs[50], cargs[51]);
727
		break;
728
	case 53:
729
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
730
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
731
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
732
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
733
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
734
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
735
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
736
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
737
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
738
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
739
		    cargs[50], cargs[51], cargs[52]);
740
		break;
741
	case 54:
742
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
743
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
744
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
745
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
746
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
747
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
748
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
749
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
750
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
751
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
752
		    cargs[50], cargs[51], cargs[52], cargs[53]);
753
		break;
754
	case 55:
755
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
756
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
757
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
758
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
759
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
760
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
761
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
762
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
763
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
764
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
765
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54]);
766
		break;
767
	case 56:
768
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
769
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
770
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
771
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
772
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
773
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
774
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
775
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
776
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
777
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
778
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
779
		    cargs[55]);
780
		break;
781
	case 57:
782
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
783
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
784
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
785
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
786
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
787
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
788
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
789
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
790
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
791
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
792
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
793
		    cargs[55], cargs[56]);
794
		break;
795
	case 58:
796
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
797
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
798
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
799
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
800
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
801
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
802
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
803
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
804
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
805
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
806
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
807
		    cargs[55], cargs[56], cargs[57]);
808
		break;
809
	case 59:
810
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
811
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
812
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
813
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
814
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
815
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
816
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
817
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
818
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
819
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
820
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
821
		    cargs[55], cargs[56], cargs[57], cargs[58]);
822
		break;
823
	case 60:
824
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
825
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
826
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
827
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
828
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
829
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
830
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
831
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
832
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
833
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
834
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
835
		    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59]);
836
		break;
837
	case 61:
838
		fun(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], cargs[49],
848
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
849
		    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
850
		    cargs[60]);
851
		break;
852
	case 62:
853
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
854
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
855
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
856
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
857
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
858
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
859
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
860
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
861
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
862
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
863
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
864
		    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
865
		    cargs[60], cargs[61]);
866
		break;
867
	case 63:
868
		fun(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], cargs[16], cargs[17], cargs[18], cargs[19],
872
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
873
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
874
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
875
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
876
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
877
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
878
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
879
		    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
880
		    cargs[60], cargs[61], cargs[62]);
881
		break;
882
	case 64:
883
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
884
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
885
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
886
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
887
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
888
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
889
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
890
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
891
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
892
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
893
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
894
		    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
895
		    cargs[60], cargs[61], cargs[62], cargs[63]);
896
		break;
897
	case 65:
898
		fun(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
899
		    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
900
		    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
901
		    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
902
		    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
903
		    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
904
		    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
905
		    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
906
		    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
907
		    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
908
		    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
909
		    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
910
		    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
911
		break;
912
	default:
913
		errorcall(call, "too many arguments, sorry\n");
914
	}
915
 
916
	if(dup) {
917
		nargs = 0;
918
		for(pargs=args ; pargs != R_NilValue ; pargs=CDR(pargs)) {
919
			PROTECT(s = CPtrToRObj(cargs[nargs],
920
					LENGTH(CAR(pargs)),
921
					TYPEOF(CAR(pargs))));
922
			ATTRIB(s) = duplicate(ATTRIB(CAR(pargs)));
923
			CAR(pargs) = s;
924
			nargs++;
925
			UNPROTECT(1);
926
		}
927
	}
928
	vmaxset(vmax);
929
	return (args);
930
}
931
 
932
static struct {
933
	char *name;
934
	SEXPTYPE type;
935
} typeinfo[] = {
936
	{"logical",	LGLSXP},
937
	{"integer",	INTSXP},
938
	{"double",	REALSXP},
939
#ifdef COMPLEX_DATA
940
	{"complex",	CPLXSXP},
941
#endif
942
	{"character",	STRSXP},
943
	{"list",	LISTSXP},
944
	{NULL,		0}
945
};
946
 
947
static int string2type(char *s)
948
{
949
	int i;
950
	for(i=0 ; typeinfo[i].name ; i++) {
951
		if(!strcmp(typeinfo[i].name, s)) {
952
			return typeinfo[i].type;
953
		}
954
	}
955
	error("type \"%s\" not supported in interlanguage calls\n", s);
956
}
957
 
958
void call_R(char *func, long nargs, void **arguments, char **modes,
959
	long *lengths, char **names, long nres, char **results)
960
{
961
	SEXP call, pcall, s;
962
	SEXPTYPE type;
963
	int i, j, n;
964
 
965
	if(!isFunction((SEXP)func))
966
		error("invalid function in call_R\n");
967
	if(nargs < 0)
968
		error("invalid argument count in call_R\n");
969
	if(nres < 0)
970
		error("invalid return value count in call_R\n");
971
	PROTECT(pcall = call = allocList(nargs+1));
972
	TYPEOF(call) = LANGSXP;
973
	CAR(pcall) = (SEXP)func;
974
 
975
	for(i=0 ; i<nargs ; i++) {
976
		pcall = CDR(pcall);
977
		type = string2type(modes[i]);
978
		switch(type) {
979
		case LGLSXP:
980
		case INTSXP:
981
			CAR(pcall) = allocSExp(type);
982
			INTEGER(CAR(pcall)) = (int*)(arguments[i]);
983
			LENGTH(CAR(pcall)) = lengths[i];
984
			break;
985
		case REALSXP:
986
			CAR(pcall) = allocSExp(REALSXP);
987
			REAL(CAR(pcall)) = (double*)(arguments[i]);
988
			LENGTH(CAR(pcall)) = lengths[i];
989
			break;
990
#ifdef COMPLEX_DATA
991
		case CPLXSXP:
992
			CAR(pcall) = allocSExp(CPLXSXP);
993
			COMPLEX(CAR(pcall)) = (complex*)(arguments[i]);
994
			LENGTH(CAR(pcall)) = lengths[i];
995
			break;
996
#endif
997
		case STRSXP:
998
			n = lengths[i];
999
			CAR(pcall) = allocVector(STRSXP, n);
1000
			for(j=0 ; j<n ; j++) {
1001
				s = allocSExp(CHARSXP);
1002
				CHAR(s) = (char*)(arguments[i]);
1003
				LENGTH(s) = strlen(CHAR(s));
1004
				STRING(CAR(pcall))[i] = s;
1005
			}
1006
			break;
1007
		case LISTSXP:
1008
			n = lengths[i];
1009
			CAR(pcall) = allocList(n);
1010
			s = CAR(pcall);
1011
			for(j=0 ; j<n ; j++) {
1012
				CAR(s) = (SEXP)(arguments[i]);
1013
				s = CDR(s);
1014
			}
1015
			break;
1016
		}
1017
		if(names && names[i])
1018
			TAG(pcall) = install(names[i]);
1019
		NAMED(CAR(pcall)) = 2;
1020
	}
1021
 
1022
	PROTECT(s = eval(call, R_GlobalEnv));
1023
 
1024
	switch(TYPEOF(s)) {
1025
	case LGLSXP:
1026
	case INTSXP:
1027
	case REALSXP:
1028
#ifdef COMPLEX_DATA
1029
	case CPLXSXP:
1030
#endif
1031
	case STRSXP:
1032
		if(nres > 0)
1033
			results[0] = RObjToCPtr(s, 1, 1, 0);
1034
		break;
1035
	case LISTSXP:
1036
		n = length(s);
1037
		if(nres < n) n = nres;
1038
		for(i=0 ; i<n ; i++) {
1039
			results[i] = RObjToCPtr(s, 1, 1, 0);
1040
			s = CDR(s);
1041
		}
1042
	}
1043
	UNPROTECT(2);
1044
	return;
1045
}
1046
 
1047
void call_S(char *func, long nargs, void **arguments, char **modes,
1048
	long *lengths, char **names, long nres, char **results)
1049
{
1050
	call_R(func, nargs, arguments, modes,
1051
		lengths, names, nres, results);
1052
}
1053