The R Project SVN R

Rev

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

Rev Author Line No. Line
2 r 1
/*
26763 maechler 2
 *  R : A Computer Language for Statistical Data Analysis
2 r 3
 *  Copyright (C) 1995  Robert Gentleman and Ross Ihaka
87902 ripley 4
 *  Copyright (C) 1997--2025  The R Core Team
26763 maechler 5
 *  Copyright (C) 2003	      The R Foundation
2 r 6
 *
7
 *  This program is free software; you can redistribute it and/or modify
8
 *  it under the terms of the GNU General Public License as published by
9
 *  the Free Software Foundation; either version 2 of the License, or
10
 *  (at your option) any later version.
11
 *
12
 *  This program is distributed in the hope that it will be useful,
13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 *  GNU General Public License for more details.
16
 *
42307 ripley 17
 *  You should have received a copy of the GNU General Public License
18
 *  along with this program; if not, a copy is available at
68947 ripley 19
 *  https://www.R-project.org/Licenses/
2 r 20
 */
21
 
5187 hornik 22
#ifdef HAVE_CONFIG_H
31593 ripley 23
# include <config.h>
5187 hornik 24
#endif
25
 
57538 ripley 26
#define R_USE_SIGNALS 1
36489 ripley 27
#include <Defn.h>
60667 ripley 28
#include <Internal.h>
51841 ripley 29
#include <ctype.h> /* for tolower */
2 r 30
#include <string.h>
42398 ripley 31
#include <errno.h>
2 r 32
 
11499 ripley 33
#include <Rmath.h>
5187 hornik 34
 
14156 duncan 35
 
5730 ripley 36
#ifndef max
37
#define max(a, b) ((a > b)?(a):(b))
38
#endif
39
 
60484 ripley 40
/* Was 'name' prior to 2.13.0, then .NAME, but checked as
60874 ripley 41
   'name' up to 2.15.1. */
60484 ripley 42
static void check1arg2(SEXP arg, SEXP call, const char *formal)
43
{
44
    if (TAG(arg) == R_NilValue) return;
60588 ripley 45
    errorcall(call, "the first argument should not be named");
60484 ripley 46
 }
2 r 47
 
60484 ripley 48
 
49
 
58602 ripley 50
/* These are set during the first call to do_dotCode() below. */
1839 ihaka 51
 
2 r 52
static SEXP NaokSymbol = NULL;
53
static SEXP DupSymbol = NULL;
6098 pd 54
static SEXP PkgSymbol = NULL;
32657 ripley 55
static SEXP EncSymbol = NULL;
58602 ripley 56
static SEXP CSingSymbol = NULL;
2 r 57
 
30599 duncan 58
#include <Rdynpriv.h>
60478 ripley 59
// Odd: 'type' is really this enum
60585 ripley 60
enum {NOT_DEFINED, FILENAME, DLL_HANDLE, R_OBJECT};
30599 duncan 61
typedef struct {
83883 kalibera 62
    char DLLname[R_PATH_MAX];
30599 duncan 63
    HINSTANCE dll;
64
    SEXP  obj;
65
    int type;
66
} DllReference;
6098 pd 67
 
41901 ripley 68
/* Maximum length of entry-point name, including nul terminator */
41935 ripley 69
#define MaxSymbolBytes 1024
41901 ripley 70
 
60478 ripley 71
/* Maximum number of args to .C, .Fortran and .Call */
30599 duncan 72
#define MAX_ARGS 65
73
 
58767 ripley 74
/* This looks up entry points in DLLs in a platform specific way. */
31591 ripley 75
static DL_FUNC
76
R_FindNativeSymbolFromDLL(char *name, DllReference *dll,
60350 ripley 77
			  R_RegisteredNativeSymbol *symbol, SEXP env);
30599 duncan 78
 
66552 ripley 79
static SEXP naokfind(SEXP args, int * len, int *naok, DllReference *dll);
30599 duncan 80
static SEXP pkgtrim(SEXP args, DllReference *dll);
81
 
87902 ripley 82
static R_INLINE bool isNativeSymbolInfo(SEXP op)
66131 luke 83
{
84
    /* was: inherits(op, "NativeSymbolInfo")
85
     * inherits() is slow because of string comparisons, so use
86
     * structural check instead. */
87
    return (TYPEOF(op) == VECSXP &&
88
	    LENGTH(op) >= 2 &&
89
	    TYPEOF(VECTOR_ELT(op, 1)) == EXTPTRSXP);
90
}
91
 
30599 duncan 92
/*
60478 ripley 93
  Called from resolveNativeRoutine (and itself).
94
 
30599 duncan 95
  Checks whether the specified object correctly identifies a native routine.
60478 ripley 96
  op is the supplied value for .NAME.  This can be
97
   a) a string (when this does nothing).
31591 ripley 98
   b) an external pointer giving the address of the routine
99
      (e.g. getNativeSymbolInfo("foo")$address)
30599 duncan 100
   c) or a NativeSymbolInfo itself  (e.g. getNativeSymbolInfo("foo"))
32364 ripley 101
 
60478 ripley 102
   It copies the symbol name to buf.
103
 
104
   NB: in the last two cases it sets fun and symbol as well!
30599 duncan 105
 */
32364 ripley 106
static void
41901 ripley 107
checkValidSymbolId(SEXP op, SEXP call, DL_FUNC *fun,
108
		   R_RegisteredNativeSymbol *symbol, char *buf)
30599 duncan 109
{
32364 ripley 110
    if (isValidString(op)) return;
30599 duncan 111
 
36902 duncan 112
    if(TYPEOF(op) == EXTPTRSXP) {
66131 luke 113
	static SEXP native_symbol = NULL;
114
	static SEXP registered_native_symbol = NULL;
115
	if (native_symbol == NULL) {
116
	    native_symbol = install("native symbol");
117
	    registered_native_symbol = install("registered native symbol");
118
	}
41901 ripley 119
	char *p = NULL;
66131 luke 120
	if(R_ExternalPtrTag(op) == native_symbol)
45446 ripley 121
	   *fun = R_ExternalPtrAddrFn(op);
66131 luke 122
	else if(R_ExternalPtrTag(op) == registered_native_symbol) {
45446 ripley 123
	   R_RegisteredNativeSymbol *tmp;
36902 duncan 124
	   tmp = (R_RegisteredNativeSymbol *) R_ExternalPtrAddr(op);
125
	   if(tmp) {
45446 ripley 126
	      if(symbol->type != R_ANY_SYM && symbol->type != tmp->type)
127
		 errorcall(call, _("NULL value passed as symbol address"));
128
		/* Check the type of the symbol. */
129
	      switch(symbol->type) {
36902 duncan 130
	      case R_C_SYM:
45446 ripley 131
		  *fun = tmp->symbol.c->fun;
132
		  p = tmp->symbol.c->name;
36902 duncan 133
		  break;
134
	      case R_CALL_SYM:
45446 ripley 135
		  *fun = tmp->symbol.call->fun;
136
		  p = tmp->symbol.call->name;
36902 duncan 137
		  break;
138
	      case R_FORTRAN_SYM:
45446 ripley 139
		  *fun = tmp->symbol.fortran->fun;
140
		  p = tmp->symbol.fortran->name;
36902 duncan 141
		  break;
142
	      case R_EXTERNAL_SYM:
45446 ripley 143
		  *fun = tmp->symbol.external->fun;
144
		  p = tmp->symbol.external->name;
36902 duncan 145
		  break;
146
	      default:
45446 ripley 147
		 /* Something unintended has happened if we get here. */
148
		  errorcall(call, _("Unimplemented type %d in createRSymbolObject"),
41713 ripley 149
			    symbol->type);
45446 ripley 150
		  break;
36902 duncan 151
	      }
152
	      *symbol = *tmp;
153
	   }
154
	}
32364 ripley 155
	/* This is illegal C */
36902 duncan 156
	if(*fun == NULL)
32867 ripley 157
	    errorcall(call, _("NULL value passed as symbol address"));
36902 duncan 158
 
45446 ripley 159
	/* copy the symbol name. */
66568 luke 160
	if (p && buf) {
41901 ripley 161
	    if (strlen(p) >= MaxSymbolBytes)
162
		error(_("symbol '%s' is too long"), p);
163
	    memcpy(buf, p, strlen(p)+1);
36902 duncan 164
	}
165
 
32369 ripley 166
	return;
45446 ripley 167
    }
66131 luke 168
    else if(isNativeSymbolInfo(op)) {
36902 duncan 169
	checkValidSymbolId(VECTOR_ELT(op, 1), call, fun, symbol, buf);
32364 ripley 170
	return;
171
    }
45446 ripley 172
 
32867 ripley 173
    errorcall(call,
60746 ripley 174
      _("first argument must be a string (of length 1) or native symbol reference"));
32364 ripley 175
    return; /* not reached */
30599 duncan 176
}
177
 
66568 luke 178
attribute_hidden
179
DL_FUNC R_dotCallFn(SEXP op, SEXP call, int nargs) {
180
    R_RegisteredNativeSymbol symbol = {R_CALL_SYM, {NULL}, NULL};
181
    DL_FUNC fun = NULL;
182
    checkValidSymbolId(op, call, &fun, &symbol, NULL);
183
    /* should check arg count here as well */
184
    return fun;
185
}
30599 duncan 186
 
187
/*
31591 ripley 188
  This is the routine that is called by do_dotCode, do_dotcall and
189
  do_External to find the DL_FUNC to invoke. It handles processing the
190
  arguments for the PACKAGE argument, if present, and also takes care
191
  of the cases where we are given a NativeSymbolInfo object, an
192
  address directly, and if the DLL is specified. If no PACKAGE is
193
  provided, we check whether the calling function is in a namespace
30599 duncan 194
  and look there.
195
*/
41901 ripley 196
 
38705 ripley 197
static SEXP
31591 ripley 198
resolveNativeRoutine(SEXP args, DL_FUNC *fun,
199
		     R_RegisteredNativeSymbol *symbol, char *buf,
66552 ripley 200
		     int *nargs, int *naok, SEXP call, SEXP env)
30599 duncan 201
{
202
    SEXP op;
41784 ripley 203
    const char *p; char *q;
60585 ripley 204
    DllReference dll;
205
    /* This is used as shorthand for 'all' in R_FindSymbol, but
206
       should never be supplied */
66468 maechler 207
    strcpy(dll.DLLname, "");
60585 ripley 208
    dll.dll = NULL; dll.obj = NULL; dll.type = NOT_DEFINED;
66468 maechler 209
 
60348 ripley 210
    op = CAR(args);  // value of .NAME =
36902 duncan 211
    /* NB, this sets fun, symbol and buf and is not just a check! */
45446 ripley 212
    checkValidSymbolId(op, call, fun, symbol, buf);
30599 duncan 213
 
214
    /* The following code modifies the argument list */
215
    /* We know this is ok because do_dotCode is entered */
216
    /* with its arguments evaluated. */
217
 
218
    if(symbol->type == R_C_SYM || symbol->type == R_FORTRAN_SYM) {
60348 ripley 219
	/* And that also looks for PACKAGE = */
66552 ripley 220
	args = naokfind(CDR(args), nargs, naok, &dll);
30599 duncan 221
	if(*naok == NA_LOGICAL)
35265 ripley 222
	    errorcall(call, _("invalid '%s' value"), "naok");
30599 duncan 223
	if(*nargs > MAX_ARGS)
32867 ripley 224
	    errorcall(call, _("too many arguments in foreign function call"));
30599 duncan 225
    } else {
34761 ripley 226
	/* This has the side effect of setting dll.type if a PACKAGE=
60478 ripley 227
	   argument if found, but it will only be used if a string was
228
	   passed in  */
30599 duncan 229
	args = pkgtrim(args, &dll);
230
    }
60488 ripley 231
 
232
    /* We were given a symbol (or an address), so we are done. */
233
    if (*fun) return args;
234
 
235
    if (dll.type == FILENAME && !strlen(dll.DLLname))
60348 ripley 236
	errorcall(call, _("PACKAGE = \"\" is invalid"));
60364 ripley 237
 
60587 ripley 238
    // find if we were called from a namespace
239
    SEXP env2 = ENCLOS(env);
240
    const char *ns = "";
241
    if(R_IsNamespaceEnv(env2))
242
	ns = CHAR(STRING_ELT(R_NamespaceEnvSpec(env2), 0));
243
    else env2 = R_NilValue;
244
 
60348 ripley 245
#ifdef CHECK_CROSS_USAGE
60488 ripley 246
    if (dll.type == FILENAME && strcmp(dll.DLLname, "base")) {
60348 ripley 247
	if(strlen(ns) && strcmp(dll.DLLname, ns) &&
248
	   !(streql(dll.DLLname, "BioC_graph") && streql(ns, "graph")))
66468 maechler 249
	    warningcall(call,
60348 ripley 250
			"using PACKAGE = \"%s\" from namespace '%s'",
251
			dll.DLLname, ns);
252
    }
253
#endif
30599 duncan 254
 
60488 ripley 255
    /* Make up the load symbol */
30599 duncan 256
    if(TYPEOF(op) == STRSXP) {
63181 ripley 257
	const void *vmax = vmaxget();
40705 ripley 258
	p = translateChar(STRING_ELT(op, 0));
41901 ripley 259
	if(strlen(p) >= MaxSymbolBytes)
260
	    error(_("symbol '%s' is too long"), p);
30599 duncan 261
	q = buf;
262
	while ((*q = *p) != '\0') {
59173 ripley 263
	    if(symbol->type == R_FORTRAN_SYM) *q = (char) tolower(*q);
30599 duncan 264
	    p++;
265
	    q++;
266
	}
63181 ripley 267
	vmaxset(vmax);
31591 ripley 268
    }
45446 ripley 269
 
60488 ripley 270
    if(dll.type != FILENAME && strlen(ns)) {
271
	/* no PACKAGE= arg, so see if we can identify a DLL
272
	   from the namespace defining the function */
273
	*fun = R_FindNativeSymbolFromDLL(buf, &dll, symbol, env2);
274
	if (*fun) return args;
66468 maechler 275
	errorcall(call, "\"%s\" not resolved from current namespace (%s)",
60765 ripley 276
		  buf, ns);
60488 ripley 277
    }
30604 duncan 278
 
60488 ripley 279
    /* NB: the actual conversion to the symbol is done in
280
       R_dlsym in Rdynload.c.  That prepends an underscore (usually),
281
       and may append one or more underscores.
282
    */
37711 ripley 283
 
60488 ripley 284
    *fun = R_FindSymbol(buf, dll.DLLname, symbol);
285
    if (*fun) return args;
286
 
287
    /* so we've failed and bail out */
288
    if(strlen(dll.DLLname)) {
289
	switch(symbol->type) {
290
	case R_C_SYM:
291
	    errorcall(call,
292
		      _("\"%s\" not available for %s() for package \"%s\""),
293
		      buf, ".C", dll.DLLname);
294
	    break;
295
	case R_FORTRAN_SYM:
296
	    errorcall(call,
297
		      _("\"%s\" not available for %s() for package \"%s\""),
298
		      buf, ".Fortran", dll.DLLname);
299
	    break;
300
	case R_CALL_SYM:
301
	    errorcall(call,
302
		      _("\"%s\" not available for %s() for package \"%s\""),
303
		      buf, ".Call", dll.DLLname);
304
	    break;
305
	case R_EXTERNAL_SYM:
306
	    errorcall(call,
307
		      _("\"%s\" not available for %s() for package \"%s\""),
308
		      buf, ".External", dll.DLLname);
309
	    break;
310
	case R_ANY_SYM:
311
	    errorcall(call,
312
		      _("%s symbol name \"%s\" not in DLL for package \"%s\""),
313
		      "C/Fortran", buf, dll.DLLname);
314
	    break;
30599 duncan 315
	}
60488 ripley 316
    } else
317
	errorcall(call, _("%s symbol name \"%s\" not in load table"),
318
		  symbol->type == R_FORTRAN_SYM ? "Fortran" : "C", buf);
30599 duncan 319
 
60488 ripley 320
    return args; /* -Wall */
30599 duncan 321
}
322
 
323
 
87902 ripley 324
static bool
22284 duncan 325
checkNativeType(int targetType, int actualType)
326
{
31593 ripley 327
    if(targetType > 0) {
328
	if(targetType == INTSXP || targetType == LGLSXP) {
329
	    return(actualType == INTSXP || actualType == LGLSXP);
330
	}
331
	return(targetType == actualType);
332
    }
22284 duncan 333
 
87902 ripley 334
    return(true);
22284 duncan 335
}
336
 
6098 pd 337
 
87902 ripley 338
static bool
66552 ripley 339
comparePrimitiveTypes(R_NativePrimitiveArgType type, SEXP s)
20110 duncan 340
{
22284 duncan 341
   if(type == ANYSXP || TYPEOF(s) == type)
87902 ripley 342
      return(true);
2 r 343
 
66552 ripley 344
   if(type == SINGLESXP)
20110 duncan 345
      return(asLogical(getAttrib(s, install("Csingle"))) == TRUE);
346
 
87902 ripley 347
   return(false);
20110 duncan 348
}
349
 
350
 
1839 ihaka 351
/* Foreign Function Interface.  This code allows a user to call C */
352
/* or Fortran code which is either statically or dynamically linked. */
2 r 353
 
31593 ripley 354
/* NB: this leaves NAOK and DUP arguments on the list */
2 r 355
 
6098 pd 356
/* find NAOK and DUP, find and remove PACKAGE */
66552 ripley 357
static SEXP naokfind(SEXP args, int * len, int *naok, DllReference *dll)
6098 pd 358
{
14571 duncan 359
    SEXP s, prev;
6098 pd 360
    int nargs=0, naokused=0, dupused=0, pkgused=0;
41784 ripley 361
    const char *p;
26763 maechler 362
 
6098 pd 363
    *naok = 0;
364
    *len = 0;
14571 duncan 365
    for(s = args, prev=args; s != R_NilValue;) {
6098 pd 366
	if(TAG(s) == NaokSymbol) {
367
	    *naok = asLogical(CAR(s));
60844 ripley 368
	    if(naokused++ == 1) warning(_("'%s' used more than once"), "NAOK");
6098 pd 369
	} else if(TAG(s) == DupSymbol) {
60844 ripley 370
	    if(dupused++ == 1) warning(_("'%s' used more than once"), "DUP");
14571 duncan 371
	} else if(TAG(s) == PkgSymbol) {
66468 maechler 372
	    dll->obj = CAR(s);  // really?
30599 duncan 373
	    if(TYPEOF(CAR(s)) == STRSXP) {
40705 ripley 374
		p = translateChar(STRING_ELT(CAR(s), 0));
83883 kalibera 375
		if(strlen(p) > R_PATH_MAX - 1)
32867 ripley 376
		    error(_("DLL name is too long"));
30599 duncan 377
		dll->type = FILENAME;
378
		strcpy(dll->DLLname, p);
66468 maechler 379
		if(pkgused++ > 1)
60844 ripley 380
		    warning(_("'%s' used more than once"), "PACKAGE");
30599 duncan 381
		/* More generally, this should allow us to process
382
		   any additional arguments and not insist that PACKAGE
383
		   be the last argument.
384
		*/
385
	    } else {
60348 ripley 386
		/* Have a DLL object, which is not something documented .... */
45446 ripley 387
		if(TYPEOF(CAR(s)) == EXTPTRSXP) {
30599 duncan 388
		    dll->dll = (HINSTANCE) R_ExternalPtrAddr(CAR(s));
389
		    dll->type = DLL_HANDLE;
390
		} else if(TYPEOF(CAR(s)) == VECSXP) {
391
		    dll->type = R_OBJECT;
392
		    dll->obj = s;
31591 ripley 393
		    strcpy(dll->DLLname,
40705 ripley 394
			   translateChar(STRING_ELT(VECTOR_ELT(CAR(s), 1), 0)));
30599 duncan 395
		    dll->dll = (HINSTANCE) R_ExternalPtrAddr(VECTOR_ELT(s, 4));
66468 maechler 396
		} else
60368 ripley 397
		    error("incorrect type (%s) of PACKAGE argument\n",
85146 luke 398
			  R_typeToChar(CAR(s)));
30599 duncan 399
	    }
17794 duncan 400
	} else {
401
	    nargs++;
402
	    prev = s;
403
	    s = CDR(s);
404
	    continue;
405
	}
26763 maechler 406
	if(s == args)
17794 duncan 407
	    args = s = CDR(s);
26763 maechler 408
	else
17794 duncan 409
	    SETCDR(prev, s = CDR(s));
6098 pd 410
    }
411
    *len = nargs;
412
    return args;
413
}
414
 
30599 duncan 415
static void setDLLname(SEXP s, char *DLLname)
18560 ripley 416
{
41807 rgentlem 417
    SEXP ss = CAR(s);
41784 ripley 418
    const char *name;
419
 
18560 ripley 420
    if(TYPEOF(ss) != STRSXP || length(ss) != 1)
32867 ripley 421
	error(_("PACKAGE argument must be a single character string"));
40705 ripley 422
    name = translateChar(STRING_ELT(ss, 0));
18560 ripley 423
    /* allow the package: form of the name, as returned by find */
424
    if(strncmp(name, "package:", 8) == 0)
425
	name += 8;
83883 kalibera 426
    if(strlen(name) > R_PATH_MAX - 1)
32867 ripley 427
	error(_("PACKAGE argument is too long"));
18560 ripley 428
    strcpy(DLLname, name);
14018 jmc 429
}
430
 
30599 duncan 431
static SEXP pkgtrim(SEXP args, DllReference *dll)
6098 pd 432
{
433
    SEXP s, ss;
60350 ripley 434
    int pkgused = 0;
6098 pd 435
 
60350 ripley 436
    if (PkgSymbol == NULL) PkgSymbol = install("PACKAGE");
437
 
6098 pd 438
    for(s = args ; s != R_NilValue;) {
439
	ss = CDR(s);
440
	/* Look for PACKAGE=. We look at the next arg, unless
441
	   this is the last one (which will only happen for one arg),
442
	   and remove it */
443
	if(ss == R_NilValue && TAG(s) == PkgSymbol) {
66468 maechler 444
	    if(pkgused++ == 1)
60844 ripley 445
		warning(_("'%s' used more than once"), "PACKAGE");
30599 duncan 446
	    setDLLname(s, dll->DLLname);
447
	    dll->type = FILENAME;
6098 pd 448
	    return R_NilValue;
449
	}
450
	if(TAG(ss) == PkgSymbol) {
66468 maechler 451
	    if(pkgused++ == 1)
60844 ripley 452
		warning(_("'%s' used more than once"), "PACKAGE");
30599 duncan 453
	    setDLLname(ss, dll->DLLname);
454
	    dll->type = FILENAME;
10172 luke 455
	    SETCDR(s, CDR(ss));
6098 pd 456
	}
457
	s = CDR(s);
458
    }
459
    return args;
460
}
461
 
58663 ripley 462
static SEXP enctrim(SEXP args)
32657 ripley 463
{
58666 ripley 464
    SEXP s, ss;
2 r 465
 
32657 ripley 466
    for(s = args ; s != R_NilValue;) {
467
	ss = CDR(s);
468
	/* Look for ENCODING=. We look at the next arg, unless
469
	   this is the last one (which will only happen for one arg),
470
	   and remove it */
471
	if(ss == R_NilValue && TAG(s) == EncSymbol) {
58663 ripley 472
	    warning("ENCODING is defunct and will be ignored");
32657 ripley 473
	    return R_NilValue;
474
	}
475
	if(TAG(ss) == EncSymbol) {
58663 ripley 476
	    warning("ENCODING is defunct and will be ignored");
32657 ripley 477
	    SETCDR(s, CDR(ss));
478
	}
479
	s = CDR(s);
480
    }
481
    return args;
482
}
30599 duncan 483
 
32657 ripley 484
 
37711 ripley 485
 
83446 ripley 486
attribute_hidden SEXP do_isloaded(SEXP call, SEXP op, SEXP args, SEXP env)
2 r 487
{
41807 rgentlem 488
    const char *sym, *type="", *pkg = "";
14577 ripley 489
    int val = 1, nargs = length(args);
45209 ripley 490
    R_RegisteredNativeSymbol symbol = {R_ANY_SYM, {NULL}, NULL};
14577 ripley 491
 
41713 ripley 492
    if (nargs < 1) error(_("no arguments supplied"));
493
    if (nargs > 3) error(_("too many arguments"));
14577 ripley 494
 
6098 pd 495
    if(!isValidString(CAR(args)))
49076 ripley 496
	error(_("invalid '%s' argument"), "symbol");
40705 ripley 497
    sym = translateChar(STRING_ELT(CAR(args), 0));
36047 ripley 498
    if(nargs >= 2) {
14577 ripley 499
	if(!isValidString(CADR(args)))
49076 ripley 500
	    error(_("invalid '%s' argument"), "PACKAGE");
40705 ripley 501
	pkg = translateChar(STRING_ELT(CADR(args), 0));
14577 ripley 502
    }
36047 ripley 503
    if(nargs >= 3) {
504
	if(!isValidString(CADDR(args)))
49076 ripley 505
	    error(_("invalid '%s' argument"), "type");
40705 ripley 506
	type = CHAR(STRING_ELT(CADDR(args), 0)); /* ASCII */
36047 ripley 507
	if(strcmp(type, "C") == 0) symbol.type = R_C_SYM;
508
	else if(strcmp(type, "Fortran") == 0) symbol.type = R_FORTRAN_SYM;
509
	else if(strcmp(type, "Call") == 0) symbol.type = R_CALL_SYM;
510
	else if(strcmp(type, "External") == 0) symbol.type = R_EXTERNAL_SYM;
511
    }
45209 ripley 512
    if(!(R_FindSymbol(sym, pkg, &symbol))) val = 0;
41894 ripley 513
    return ScalarLogical(val);
2 r 514
}
515
 
59276 ripley 516
/*   Call dynamically loaded "internal" functions.
517
     Original code by Jean Meloche <jean@stat.ubc.ca> */
3822 thomas 518
 
39866 duncan 519
typedef SEXP (*R_ExternalRoutine)(SEXP);
59393 ripley 520
typedef SEXP (*R_ExternalRoutine2)(SEXP, SEXP, SEXP, SEXP);
39866 duncan 521
 
77358 luke 522
static SEXP check_retval(SEXP call, SEXP val)
77354 luke 523
{
524
    static int inited = FALSE;
525
    static int check = FALSE;
526
 
527
    if (! inited) {
87902 ripley 528
	inited = true;
77354 luke 529
	const char *p = getenv("_R_CHECK_DOTCODE_RETVAL_");
530
	if (p != NULL && StringTrue(p))
87902 ripley 531
	    check = true;
77354 luke 532
    }
533
 
77358 luke 534
    if (check) {
535
	if (val < (SEXP) 16)
85580 kalibera 536
	    errorcall(call, "WEIRD RETURN VALUE: %p", (void *)val);
77358 luke 537
    }
538
    else if (val == NULL) {
539
	warningcall(call, "converting NULL pointer to R NULL");
540
	val = R_NilValue;
541
    }
542
 
543
    return val;
77354 luke 544
}
85146 luke 545
 
83446 ripley 546
attribute_hidden SEXP do_External(SEXP call, SEXP op, SEXP args, SEXP env)
3822 thomas 547
{
40034 ripley 548
    DL_FUNC ofun = NULL;
6098 pd 549
    SEXP retval;
17164 duncan 550
    R_RegisteredNativeSymbol symbol = {R_EXTERNAL_SYM, {NULL}, NULL};
50745 ripley 551
    const void *vmax = vmaxget();
41901 ripley 552
    char buf[MaxSymbolBytes];
3822 thomas 553
 
58666 ripley 554
    if (length(args) < 1) errorcall(call, _("'.NAME' is missing"));
60484 ripley 555
    check1arg2(args, call, ".NAME");
40034 ripley 556
    args = resolveNativeRoutine(args, &ofun, &symbol, buf, NULL, NULL,
66552 ripley 557
				call, env);
3822 thomas 558
 
61692 ripley 559
    if(symbol.symbol.external && symbol.symbol.external->numArgs > -1) {
560
	int nargs = length(args) - 1;
61782 ripley 561
	if(symbol.symbol.external->numArgs != nargs)
562
	    errorcall(call,
563
		      _("Incorrect number of arguments (%d), expecting %d for '%s'"),
564
		      nargs, symbol.symbol.external->numArgs, buf);
61692 ripley 565
    }
566
 
77450 luke 567
    /* args is escaping into user C code and might get captured, so
568
       make sure it is reference counting. */
77498 luke 569
    R_args_enable_refcnt(args);
77450 luke 570
 
59276 ripley 571
    if (PRIMVAL(op) == 1) {
572
	R_ExternalRoutine2 fun = (R_ExternalRoutine2) ofun;
59393 ripley 573
	retval = fun(call, op, args, env);
59276 ripley 574
    } else {
575
	R_ExternalRoutine fun = (R_ExternalRoutine) ofun;
576
	retval = fun(args);
14571 duncan 577
    }
80513 luke 578
 
579
    R_try_clear_args_refcnt(args);
580
 
6098 pd 581
    vmaxset(vmax);
77358 luke 582
    return check_retval(call, retval);
3822 thomas 583
}
584
 
85769 kalibera 585
#define R_FUNTYPES(R, N, A)                                                   \
586
typedef R (*FUN##N##0)(void);                                                 \
587
typedef R (*FUN##N##1)(A);                                                    \
588
typedef R (*FUN##N##2)(A, A);                                                 \
589
typedef R (*FUN##N##3)(A, A, A);                                              \
590
typedef R (*FUN##N##4)(A, A, A, A);                                           \
591
typedef R (*FUN##N##5)(A, A, A, A, A);                                        \
592
typedef R (*FUN##N##6)(A, A, A, A, A, A);                                     \
593
typedef R (*FUN##N##7)(A, A, A, A, A, A, A);                                  \
594
typedef R (*FUN##N##8)(A, A, A, A, A, A, A, A);                               \
595
typedef R (*FUN##N##9)(A, A, A, A, A, A, A, A, A);                            \
596
typedef R (*FUN##N##10)(A, A, A, A, A, A, A, A, A, A);                        \
597
typedef R (*FUN##N##11)(A, A, A, A, A, A, A, A, A, A, A);                     \
598
typedef R (*FUN##N##12)(A, A, A, A, A, A, A, A, A, A, A, A);                  \
599
typedef R (*FUN##N##13)(A, A, A, A, A, A, A, A, A, A, A, A, A);               \
600
typedef R (*FUN##N##14)(A, A, A, A, A, A, A, A, A, A, A, A, A, A);            \
601
typedef R (*FUN##N##15)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);         \
602
typedef R (*FUN##N##16)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);      \
603
typedef R (*FUN##N##17)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);   \
604
typedef R (*FUN##N##18)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);\
605
typedef R (*FUN##N##19)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
606
                        A);                                                   \
607
typedef R (*FUN##N##20)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
608
                        A, A);                                                \
609
typedef R (*FUN##N##21)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
610
                        A, A, A);                                             \
611
typedef R (*FUN##N##22)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
612
                        A, A, A, A);                                          \
613
typedef R (*FUN##N##23)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
614
                        A, A, A, A, A);                                       \
615
typedef R (*FUN##N##24)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
616
                        A, A, A, A, A, A);                                    \
617
typedef R (*FUN##N##25)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
618
                        A, A, A, A, A, A, A);                                 \
619
typedef R (*FUN##N##26)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
620
                        A, A, A, A, A, A, A, A);                              \
621
typedef R (*FUN##N##27)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
622
                        A, A, A, A, A, A, A, A, A);                           \
623
typedef R (*FUN##N##28)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
624
                        A, A, A, A, A, A, A, A, A, A);                        \
625
typedef R (*FUN##N##29)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
626
                        A, A, A, A, A, A, A, A, A, A, A);                     \
627
typedef R (*FUN##N##30)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
628
                        A, A, A, A, A, A, A, A, A, A, A, A);                  \
629
typedef R (*FUN##N##31)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
630
                        A, A, A, A, A, A, A, A, A, A, A, A, A);               \
631
typedef R (*FUN##N##32)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
632
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A);            \
633
typedef R (*FUN##N##33)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
634
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);         \
635
typedef R (*FUN##N##34)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
636
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);      \
637
typedef R (*FUN##N##35)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
638
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);   \
639
typedef R (*FUN##N##36)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
640
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);\
641
typedef R (*FUN##N##37)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
642
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
643
                        A);                                                   \
644
typedef R (*FUN##N##38)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
645
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
646
                        A, A);                                                \
647
typedef R (*FUN##N##39)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
648
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
649
                        A, A, A);                                             \
650
typedef R (*FUN##N##40)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
651
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
652
                        A, A, A, A);                                          \
653
typedef R (*FUN##N##41)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
654
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
655
                        A, A, A, A, A);                                       \
656
typedef R (*FUN##N##42)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
657
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
658
                        A, A, A, A, A, A);                                    \
659
typedef R (*FUN##N##43)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
660
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
661
                        A, A, A, A, A, A, A);                                 \
662
typedef R (*FUN##N##44)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
663
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
664
                        A, A, A, A, A, A, A, A);                              \
665
typedef R (*FUN##N##45)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
666
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
667
                        A, A, A, A, A, A, A, A, A);                           \
668
typedef R (*FUN##N##46)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
669
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
670
                        A, A, A, A, A, A, A, A, A, A);                        \
671
typedef R (*FUN##N##47)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
672
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
673
                        A, A, A, A, A, A, A, A, A, A, A);                     \
674
typedef R (*FUN##N##48)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
675
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
676
                        A, A, A, A, A, A, A, A, A, A, A, A);                  \
677
typedef R (*FUN##N##49)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
678
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
679
                        A, A, A, A, A, A, A, A, A, A, A, A, A);               \
680
typedef R (*FUN##N##50)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
681
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
682
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A);            \
683
typedef R (*FUN##N##51)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
684
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
685
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);         \
686
typedef R (*FUN##N##52)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
687
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
688
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);      \
689
typedef R (*FUN##N##53)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
690
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
691
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);   \
692
typedef R (*FUN##N##54)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
693
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
694
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A);\
695
typedef R (*FUN##N##55)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
696
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
697
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
698
                        A);                                                   \
699
typedef R (*FUN##N##56)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
700
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
701
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
702
                        A, A);                                                \
703
typedef R (*FUN##N##57)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
704
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
705
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
706
                        A, A, A);                                             \
707
typedef R (*FUN##N##58)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
708
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
709
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
710
                        A, A, A, A);                                          \
711
typedef R (*FUN##N##59)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
712
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
713
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
714
                        A, A, A, A, A);                                       \
715
typedef R (*FUN##N##60)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
716
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
717
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
718
                        A, A, A, A, A, A);                                    \
719
typedef R (*FUN##N##61)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
720
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
721
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
722
                        A, A, A, A, A, A, A);                                 \
723
typedef R (*FUN##N##62)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
724
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
725
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
726
                        A, A, A, A, A, A, A, A);                              \
727
typedef R (*FUN##N##63)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
728
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
729
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
730
                        A, A, A, A, A, A, A, A, A);                           \
731
typedef R (*FUN##N##64)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
732
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
733
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
734
                        A, A, A, A, A, A, A, A, A, A);                        \
735
typedef R (*FUN##N##65)(A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
736
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
737
                        A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, \
738
                        A, A, A, A, A, A, A, A, A, A, A);
10983 ihaka 739
 
85769 kalibera 740
/* typedef SEXP (*FUNS1)(SEXP); */
741
R_FUNTYPES(SEXP, S, SEXP)
742
 
743
/* typedef void (*FUNV1)(void *); */
744
R_FUNTYPES(void, V, void *)
745
 
83446 ripley 746
attribute_hidden SEXP R_doDotCall(DL_FUNC fun, int nargs, SEXP *cargs,
66568 luke 747
				  SEXP call) {
748
    SEXP retval = R_NilValue;	/* -Wall */
4855 ihaka 749
    switch (nargs) {
750
    case 0:
85769 kalibera 751
	retval = ((FUNS0)fun)();
4855 ihaka 752
	break;
753
    case 1:
85769 kalibera 754
	retval = ((FUNS1)fun)(cargs[0]);
4855 ihaka 755
	break;
756
    case 2:
85769 kalibera 757
	retval = ((FUNS2)fun)(cargs[0], cargs[1]);
4855 ihaka 758
	break;
759
    case 3:
85769 kalibera 760
	retval = ((FUNS3)fun)(cargs[0], cargs[1], cargs[2]);
4855 ihaka 761
	break;
762
    case 4:
85769 kalibera 763
	retval = ((FUNS4)fun)(cargs[0], cargs[1], cargs[2], cargs[3]);
4855 ihaka 764
	break;
765
    case 5:
85769 kalibera 766
	retval = ((FUNS5)fun)(
4855 ihaka 767
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4]);
768
	break;
769
    case 6:
85769 kalibera 770
	retval = ((FUNS6)fun)(
4855 ihaka 771
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
772
	    cargs[5]);
773
	break;
774
    case 7:
85769 kalibera 775
	retval = ((FUNS7)fun)(
4855 ihaka 776
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
777
	    cargs[5],  cargs[6]);
778
	break;
779
    case 8:
85769 kalibera 780
	retval = ((FUNS8)fun)(
4855 ihaka 781
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
782
	    cargs[5],  cargs[6],  cargs[7]);
783
	break;
784
    case 9:
85769 kalibera 785
	retval = ((FUNS9)fun)(
4855 ihaka 786
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
787
	    cargs[5],  cargs[6],  cargs[7],  cargs[8]);
788
	break;
789
    case 10:
85769 kalibera 790
	retval = ((FUNS10)fun)(
4855 ihaka 791
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
792
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9]);
793
	break;
794
    case 11:
85769 kalibera 795
	retval = ((FUNS11)fun)(
4855 ihaka 796
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
797
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
798
	    cargs[10]);
799
	break;
800
    case 12:
85769 kalibera 801
	retval = ((FUNS12)fun)(
4855 ihaka 802
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
803
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
804
	    cargs[10], cargs[11]);
805
	break;
806
    case 13:
85769 kalibera 807
	retval = ((FUNS13)fun)(
4855 ihaka 808
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
809
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
810
	    cargs[10], cargs[11], cargs[12]);
811
	break;
812
    case 14:
85769 kalibera 813
	retval = ((FUNS14)fun)(
4855 ihaka 814
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
815
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
816
	    cargs[10], cargs[11], cargs[12], cargs[13]);
817
	break;
818
    case 15:
85769 kalibera 819
	retval = ((FUNS15)fun)(
4855 ihaka 820
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
821
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
822
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14]);
823
	break;
824
    case 16:
85769 kalibera 825
	retval = ((FUNS16)fun)(
4855 ihaka 826
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
827
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
828
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
829
	    cargs[15]);
830
	break;
831
    case 17:
85769 kalibera 832
	retval = ((FUNS17)fun)(
4855 ihaka 833
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
834
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
835
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
836
	    cargs[15], cargs[16]);
837
	break;
838
    case 18:
85769 kalibera 839
	retval = ((FUNS18)fun)(
4855 ihaka 840
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
841
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
842
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
843
	    cargs[15], cargs[16], cargs[17]);
844
	break;
845
    case 19:
85769 kalibera 846
	retval = ((FUNS19)fun)(
4855 ihaka 847
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
848
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
849
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
850
	    cargs[15], cargs[16], cargs[17], cargs[18]);
851
	break;
852
    case 20:
85769 kalibera 853
	retval = ((FUNS20)fun)(
4855 ihaka 854
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
855
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
856
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
857
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19]);
858
	break;
859
    case 21:
85769 kalibera 860
	retval = ((FUNS21)fun)(
4855 ihaka 861
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
862
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
863
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
864
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
865
	    cargs[20]);
866
	break;
867
    case 22:
85769 kalibera 868
	retval = ((FUNS22)fun)(
4855 ihaka 869
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
870
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
871
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
872
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
873
	    cargs[20], cargs[21]);
874
	break;
875
    case 23:
85769 kalibera 876
	retval = ((FUNS23)fun)(
4855 ihaka 877
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
878
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
879
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
880
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
881
	    cargs[20], cargs[21], cargs[22]);
882
	break;
883
    case 24:
85769 kalibera 884
	retval = ((FUNS24)fun)(
4855 ihaka 885
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
886
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
887
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
888
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
889
	    cargs[20], cargs[21], cargs[22], cargs[23]);
890
	break;
891
    case 25:
85769 kalibera 892
	retval = ((FUNS25)fun)(
4855 ihaka 893
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
894
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
895
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
896
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
897
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24]);
898
	break;
899
    case 26:
85769 kalibera 900
	retval = ((FUNS26)fun)(
4855 ihaka 901
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
902
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
903
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
904
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
905
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
906
	    cargs[25]);
907
	break;
908
    case 27:
85769 kalibera 909
	retval = ((FUNS27)fun)(
4855 ihaka 910
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
911
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
912
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
913
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
914
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
915
	    cargs[25], cargs[26]);
916
	break;
917
    case 28:
85769 kalibera 918
	retval = ((FUNS28)fun)(
4855 ihaka 919
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
920
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
921
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
922
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
923
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
924
	    cargs[25], cargs[26], cargs[27]);
925
	break;
926
    case 29:
85769 kalibera 927
	retval = ((FUNS29)fun)(
4855 ihaka 928
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
929
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
930
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
931
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
932
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
933
	    cargs[25], cargs[26], cargs[27], cargs[28]);
934
	break;
935
    case 30:
85769 kalibera 936
	retval = ((FUNS30)fun)(
4855 ihaka 937
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
938
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
939
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
940
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
941
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
942
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29]);
943
	break;
944
    case 31:
85769 kalibera 945
	retval = ((FUNS31)fun)(
4855 ihaka 946
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
947
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
948
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
949
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
950
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
951
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
952
	    cargs[30]);
953
	break;
954
    case 32:
85769 kalibera 955
	retval = ((FUNS32)fun)(
4855 ihaka 956
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
957
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
958
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
959
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
960
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
961
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
962
	    cargs[30], cargs[31]);
963
	break;
964
    case 33:
85769 kalibera 965
	retval = ((FUNS33)fun)(
4855 ihaka 966
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
967
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
968
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
969
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
970
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
971
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
972
	    cargs[30], cargs[31], cargs[32]);
973
	break;
974
    case 34:
85769 kalibera 975
	retval = ((FUNS34)fun)(
4855 ihaka 976
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
977
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
978
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
979
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
980
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
981
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
982
	    cargs[30], cargs[31], cargs[32], cargs[33]);
983
	break;
984
    case 35:
85769 kalibera 985
	retval = ((FUNS35)fun)(
4855 ihaka 986
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
987
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
988
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
989
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
990
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
991
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
992
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34]);
993
	break;
994
    case 36:
85769 kalibera 995
	retval = ((FUNS36)fun)(
4855 ihaka 996
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
997
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
998
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
999
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1000
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1001
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1002
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1003
	    cargs[35]);
1004
	break;
1005
    case 37:
85769 kalibera 1006
	retval = ((FUNS37)fun)(
4855 ihaka 1007
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1008
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1009
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1010
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1011
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1012
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1013
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1014
	    cargs[35], cargs[36]);
1015
	break;
1016
    case 38:
85769 kalibera 1017
	retval = ((FUNS38)fun)(
4855 ihaka 1018
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1019
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1020
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1021
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1022
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1023
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1024
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1025
	    cargs[35], cargs[36], cargs[37]);
1026
	break;
1027
    case 39:
85769 kalibera 1028
	retval = ((FUNS39)fun)(
4855 ihaka 1029
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1030
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1031
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1032
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1033
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1034
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1035
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1036
	    cargs[35], cargs[36], cargs[37], cargs[38]);
1037
	break;
1038
    case 40:
85769 kalibera 1039
	retval = ((FUNS40)fun)(
4855 ihaka 1040
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1041
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1042
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1043
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1044
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1045
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1046
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1047
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39]);
1048
	break;
1049
    case 41:
85769 kalibera 1050
	retval = ((FUNS41)fun)(
4855 ihaka 1051
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1052
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1053
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1054
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1055
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1056
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1057
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1058
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1059
	    cargs[40]);
1060
	break;
1061
    case 42:
85769 kalibera 1062
	retval = ((FUNS42)fun)(
4855 ihaka 1063
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1064
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1065
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1066
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1067
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1068
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1069
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1070
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1071
	    cargs[40], cargs[41]);
1072
	break;
1073
    case 43:
85769 kalibera 1074
	retval = ((FUNS43)fun)(
4855 ihaka 1075
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1076
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1077
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1078
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1079
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1080
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1081
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1082
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1083
	    cargs[40], cargs[41], cargs[42]);
1084
	break;
1085
    case 44:
85769 kalibera 1086
	retval = ((FUNS44)fun)(
4855 ihaka 1087
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1088
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1089
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1090
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1091
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1092
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1093
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1094
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1095
	    cargs[40], cargs[41], cargs[42], cargs[43]);
1096
	break;
1097
    case 45:
85769 kalibera 1098
	retval = ((FUNS45)fun)(
4855 ihaka 1099
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1100
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1101
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1102
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1103
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1104
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1105
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1106
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1107
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44]);
1108
	break;
1109
    case 46:
85769 kalibera 1110
	retval = ((FUNS46)fun)(
4855 ihaka 1111
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1112
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1113
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1114
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1115
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1116
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1117
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1118
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1119
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1120
	    cargs[45]);
1121
	break;
1122
    case 47:
85769 kalibera 1123
	retval = ((FUNS47)fun)(
4855 ihaka 1124
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1125
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1126
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1127
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1128
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1129
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1130
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1131
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1132
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1133
	    cargs[45], cargs[46]);
1134
	break;
1135
    case 48:
85769 kalibera 1136
	retval = ((FUNS48)fun)(
4855 ihaka 1137
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1138
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1139
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1140
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1141
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1142
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1143
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1144
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1145
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1146
	    cargs[45], cargs[46], cargs[47]);
1147
	break;
1148
    case 49:
85769 kalibera 1149
	retval = ((FUNS49)fun)(
4855 ihaka 1150
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1151
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1152
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1153
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1154
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1155
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1156
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1157
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1158
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1159
	    cargs[45], cargs[46], cargs[47], cargs[48]);
1160
	break;
1161
    case 50:
85769 kalibera 1162
	retval = ((FUNS50)fun)(
4855 ihaka 1163
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1164
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1165
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1166
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1167
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1168
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1169
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1170
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1171
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1172
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49]);
1173
	break;
1174
    case 51:
85769 kalibera 1175
	retval = ((FUNS51)fun)(
4855 ihaka 1176
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1177
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1178
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1179
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1180
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1181
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1182
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1183
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1184
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1185
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1186
	    cargs[50]);
1187
	break;
1188
    case 52:
85769 kalibera 1189
	retval = ((FUNS52)fun)(
4855 ihaka 1190
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1191
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1192
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1193
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1194
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1195
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1196
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1197
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1198
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1199
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1200
	    cargs[50], cargs[51]);
1201
	break;
1202
    case 53:
85769 kalibera 1203
	retval = ((FUNS53)fun)(
4855 ihaka 1204
	    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], cargs[13], cargs[14],
1207
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1208
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1209
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1210
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1211
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1212
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1213
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1214
	    cargs[50], cargs[51], cargs[52]);
1215
	break;
1216
    case 54:
85769 kalibera 1217
	retval = ((FUNS54)fun)(
4855 ihaka 1218
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1219
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1220
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1221
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1222
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1223
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1224
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1225
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1226
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1227
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1228
	    cargs[50], cargs[51], cargs[52], cargs[53]);
1229
	break;
1230
    case 55:
85769 kalibera 1231
	retval = ((FUNS55)fun)(
4855 ihaka 1232
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1233
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1234
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1235
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1236
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1237
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1238
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1239
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1240
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1241
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1242
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54]);
1243
	break;
1244
    case 56:
85769 kalibera 1245
	retval = ((FUNS56)fun)(
4855 ihaka 1246
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1247
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1248
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1249
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1250
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1251
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1252
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1253
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1254
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1255
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1256
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1257
	    cargs[55]);
1258
	break;
1259
    case 57:
85769 kalibera 1260
	retval = ((FUNS57)fun)(
4855 ihaka 1261
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1262
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1263
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1264
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1265
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1266
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1267
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1268
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1269
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1270
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1271
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1272
	    cargs[55], cargs[56]);
1273
	break;
1274
    case 58:
85769 kalibera 1275
	retval = ((FUNS58)fun)(
4855 ihaka 1276
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1277
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1278
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1279
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1280
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1281
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1282
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1283
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1284
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1285
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1286
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1287
	    cargs[55], cargs[56], cargs[57]);
1288
	break;
1289
    case 59:
85769 kalibera 1290
	retval = ((FUNS59)fun)(
4855 ihaka 1291
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1292
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1293
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1294
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1295
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1296
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1297
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1298
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1299
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1300
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1301
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1302
	    cargs[55], cargs[56], cargs[57], cargs[58]);
1303
	break;
1304
    case 60:
85769 kalibera 1305
	retval = ((FUNS60)fun)(
4855 ihaka 1306
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1307
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1308
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1309
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1310
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1311
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1312
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1313
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1314
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1315
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1316
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1317
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59]);
1318
	break;
1319
    case 61:
85769 kalibera 1320
	retval = ((FUNS61)fun)(
4855 ihaka 1321
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1322
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1323
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1324
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1325
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1326
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1327
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1328
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1329
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1330
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1331
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1332
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1333
	    cargs[60]);
1334
	break;
1335
    case 62:
85769 kalibera 1336
	retval = ((FUNS62)fun)(
4855 ihaka 1337
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1338
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1339
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1340
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1341
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1342
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1343
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1344
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1345
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1346
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1347
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1348
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1349
	    cargs[60], cargs[61]);
1350
	break;
1351
    case 63:
85769 kalibera 1352
	retval = ((FUNS63)fun)(
4855 ihaka 1353
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1354
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1355
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1356
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1357
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1358
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1359
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1360
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1361
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1362
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1363
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1364
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1365
	    cargs[60], cargs[61], cargs[62]);
1366
	break;
1367
    case 64:
85769 kalibera 1368
	retval = ((FUNS64)fun)(
4855 ihaka 1369
	    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], cargs[36], cargs[37], cargs[38], cargs[39],
1377
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1378
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1379
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1380
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1381
	    cargs[60], cargs[61], cargs[62], cargs[63]);
1382
	break;
1383
    case 65:
85769 kalibera 1384
	retval = ((FUNS65)fun)(
4855 ihaka 1385
	    cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1386
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
1387
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
1388
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
1389
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
1390
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
1391
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
1392
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
1393
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
1394
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
1395
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
1396
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
1397
	    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
1398
	break;
1399
    default:
32867 ripley 1400
	errorcall(call, _("too many arguments, sorry"));
4855 ihaka 1401
    }
77358 luke 1402
    return check_retval(call, retval);
66568 luke 1403
}
1404
 
1405
/* .Call(name, <args>) */
83446 ripley 1406
attribute_hidden SEXP do_dotcall(SEXP call, SEXP op, SEXP args, SEXP env)
66568 luke 1407
{
1408
    DL_FUNC ofun = NULL;
1409
    SEXP retval, cargs[MAX_ARGS], pargs;
1410
    R_RegisteredNativeSymbol symbol = {R_CALL_SYM, {NULL}, NULL};
1411
 
1412
    int nargs;
1413
    const void *vmax = vmaxget();
1414
    char buf[MaxSymbolBytes];
78127 kalibera 1415
    int nprotect = 0;
66568 luke 1416
 
1417
    if (length(args) < 1) errorcall(call, _("'.NAME' is missing"));
1418
    check1arg2(args, call, ".NAME");
1419
 
1420
    args = resolveNativeRoutine(args, &ofun, &symbol, buf, NULL, NULL, call, env);
1421
    args = CDR(args);
1422
 
1423
    for(nargs = 0, pargs = args ; pargs != R_NilValue; pargs = CDR(pargs)) {
1424
	if (nargs == MAX_ARGS)
1425
	    errorcall(call, _("too many arguments in foreign function call"));
1426
	cargs[nargs] = CAR(pargs);
1427
	nargs++;
1428
    }
1429
    if(symbol.symbol.call && symbol.symbol.call->numArgs > -1) {
1430
	if(symbol.symbol.call->numArgs != nargs)
1431
	    errorcall(call,
1432
		      _("Incorrect number of arguments (%d), expecting %d for '%s'"),
1433
		      nargs, symbol.symbol.call->numArgs, buf);
1434
    }
1435
 
70827 luke 1436
    if (R_check_constants < 4)
1437
	retval = R_doDotCall(ofun, nargs, cargs, call);
1438
    else {
1439
	SEXP *cargscp = (SEXP *) R_alloc(nargs, sizeof(SEXP));
1440
	int i;
78127 kalibera 1441
	for(i = 0; i < nargs; i++) {
70827 luke 1442
	    cargscp[i] = PROTECT(duplicate(cargs[i]));
78127 kalibera 1443
	    nprotect++;
1444
	}
70845 luke 1445
	retval = PROTECT(R_doDotCall(ofun, nargs, cargs, call));
78127 kalibera 1446
	nprotect++;
87902 ripley 1447
	bool constsOK = true;
70827 luke 1448
	for(i = 0; constsOK && i < nargs; i++)
70845 luke 1449
	    /* 39: not numerical comparison, not single NA, not attributes as
1450
               set, do ignore byte-code, do ignore environments of closures,
1451
               not ignore srcref
1452
 
1453
               srcref is not ignored because ignoring it is expensive
1454
               (it triggers duplication)
1455
	    */
1456
            if (!R_compute_identical(cargs[i], cargscp[i], 39)
70827 luke 1457
		    && !R_checkConstants(FALSE))
87902 ripley 1458
		constsOK = false;
70827 luke 1459
	if (!constsOK) {
1460
	    REprintf("ERROR: detected compiler constant(s) modification after"
70868 luke 1461
		" .Call invocation of function %s from library %s (%s).\n",
1462
		buf,
1463
		symbol.dll ? symbol.dll->name : "unknown",
1464
		symbol.dll ? symbol.dll->path : "unknown");
70827 luke 1465
	    for(i = 0; i < nargs; i++)
70845 luke 1466
		if (!R_compute_identical(cargs[i], cargscp[i], 39))
70827 luke 1467
		    REprintf("NOTE: .Call function %s modified its argument"
1468
			" (number %d, type %s, length %d)\n",
1469
			buf,
1470
			i + 1,
1471
			CHAR(type2str(TYPEOF(cargscp[i]))),
1472
			length(cargscp[i])
1473
		    );
1474
	    R_Suicide("compiler constants were modified (in .Call?)!\n");
1475
	}
78127 kalibera 1476
	UNPROTECT(nprotect);
70827 luke 1477
    }
4869 ihaka 1478
    vmaxset(vmax);
4855 ihaka 1479
    return retval;
1480
}
1481
 
44311 ripley 1482
/*  Call dynamically loaded "internal" graphics functions
59267 ripley 1483
    .External.graphics (used in graphics) and  .Call.graphics (used in grid).
51272 ripley 1484
 
1485
    If there is an error or user-interrupt in the above
1486
    evaluation, dd->recordGraphics is set to TRUE
1487
    on all graphics devices (see GEonExit(); called in errors.c)
1488
 
1489
    NOTE: if someone uses try() around this call and there
1490
    is an error, then dd->recordGraphics stays FALSE, so
1491
    subsequent pages of graphics output are NOT saved on
1492
    the display list.  A workaround is to deliberately
1493
    force an error in a graphics call (e.g., a grid popViewport()
1494
    while in the ROOT viewport) which will reset dd->recordGraphics
1495
    to TRUE as per the comment above.
44311 ripley 1496
*/
10983 ihaka 1497
 
59276 ripley 1498
#include <R_ext/GraphicsEngine.h>
1499
 
83446 ripley 1500
attribute_hidden SEXP do_Externalgr(SEXP call, SEXP op, SEXP args, SEXP env)
10983 ihaka 1501
{
30832 murrell 1502
    SEXP retval;
44285 ripley 1503
    pGEDevDesc dd = GEcurrentDevice();
87902 ripley 1504
    bool record = dd->recordGraphics;
78564 murrell 1505
#ifdef R_GE_DEBUG
1506
    if (getenv("R_GE_DEBUG_record")) {
1507
        printf("do_Externalgr: record = FALSE\n");
1508
    }
1509
#endif
87902 ripley 1510
    dd->recordGraphics = false;
30832 murrell 1511
    PROTECT(retval = do_External(call, op, args, env));
78564 murrell 1512
#ifdef R_GE_DEBUG
1513
    if (getenv("R_GE_DEBUG_record")) {
1514
        printf("do_Externalgr: record = %d\n", record);
1515
    }
1516
#endif
31938 murrell 1517
    dd->recordGraphics = record;
59276 ripley 1518
    if (GErecording(call, dd)) { // which is record && call != R_NilValue
30832 murrell 1519
	if (!GEcheckState(dd))
60844 ripley 1520
	    errorcall(call, _("invalid graphics state"));
77498 luke 1521
	/* args is escaping, so make sure it is reference counting. */
84246 maechler 1522
	/* should already be handled in do_External, but be safe ... */
77498 luke 1523
	R_args_enable_refcnt(args);
30832 murrell 1524
	GErecordGraphicOperation(op, args, dd);
10983 ihaka 1525
    }
78127 kalibera 1526
    check_retval(call, retval);
30832 murrell 1527
    UNPROTECT(1);
78127 kalibera 1528
    return retval;
10983 ihaka 1529
}
1530
 
83446 ripley 1531
attribute_hidden SEXP do_dotcallgr(SEXP call, SEXP op, SEXP args, SEXP env)
10983 ihaka 1532
{
30832 murrell 1533
    SEXP retval;
44285 ripley 1534
    pGEDevDesc dd = GEcurrentDevice();
87902 ripley 1535
    bool record = dd->recordGraphics;
78564 murrell 1536
#ifdef R_GE_DEBUG
1537
    if (getenv("R_GE_DEBUG_record")) {
1538
        printf("do_dotcallgr: record = FALSE\n");
1539
    }
1540
#endif
87902 ripley 1541
    dd->recordGraphics = false;
30832 murrell 1542
    PROTECT(retval = do_dotcall(call, op, args, env));
78564 murrell 1543
#ifdef R_GE_DEBUG
1544
    if (getenv("R_GE_DEBUG_record")) {
1545
        printf("do_dotcallgr: record = %d\n", record);
1546
    }
1547
#endif
31938 murrell 1548
    dd->recordGraphics = record;
1549
    if (GErecording(call, dd)) {
30832 murrell 1550
	if (!GEcheckState(dd))
60844 ripley 1551
	    errorcall(call, _("invalid graphics state"));
77498 luke 1552
	/* args is escaping, so make sure it is reference counting. */
1553
	R_args_enable_refcnt(args);
30832 murrell 1554
	GErecordGraphicOperation(op, args, dd);
10983 ihaka 1555
    }
78127 kalibera 1556
    check_retval(call, retval);
30832 murrell 1557
    UNPROTECT(1);
78127 kalibera 1558
    return retval;
10983 ihaka 1559
}
1560
 
30599 duncan 1561
static SEXP
44201 ripley 1562
Rf_getCallingDLL(void)
30599 duncan 1563
{
1564
    SEXP e, ans;
34761 ripley 1565
    RCNTXT *cptr;
1566
    SEXP rho = R_NilValue;
87902 ripley 1567
    bool found = false;
34761 ripley 1568
 
34768 ripley 1569
    /* First find the environment of the caller.
1570
       Testing shows this is the right caller, despite the .C/.Call ...
1571
     */
1572
    for (cptr = R_GlobalContext;
34761 ripley 1573
	 cptr != NULL && cptr->callflag != CTXT_TOPLEVEL;
1574
	 cptr = cptr->nextcontext)
1575
	    if (cptr->callflag & CTXT_FUNCTION) {
34768 ripley 1576
		/* PrintValue(cptr->call); */
34761 ripley 1577
		rho = cptr->cloenv;
1578
		break;
1579
	    }
1580
    /* Then search up until we hit a namespace or globalenv.
1581
       The idea is that we will not find a namespace unless the caller
1582
       was defined in one. */
1583
    while(rho != R_NilValue) {
1584
	if (rho == R_GlobalEnv) break;
1585
	else if (R_IsNamespaceEnv(rho)) {
87902 ripley 1586
	    found = true;
34761 ripley 1587
	    break;
1588
	}
1589
	rho = ENCLOS(rho);
1590
    }
1591
    if(!found) return R_NilValue;
1592
 
48346 maechler 1593
    PROTECT(e = lang2(install("getCallingDLLe"), rho));
88719 kalibera 1594
    ans = eval(e,  R_BaseEnv);
30599 duncan 1595
    UNPROTECT(1);
1596
    return(ans);
1597
}
1598
 
1599
 
1600
/*
1601
  We are given the PACKAGE argument in dll.obj
1602
  and we can try to figure out how to resolve this.
31591 ripley 1603
  0) dll.obj is NULL.  Then find the environment of the
60348 ripley 1604
   calling function and if it is a namespace, get the first registered DLL.
31591 ripley 1605
 
30599 duncan 1606
  1) dll.obj is a DLLInfo object
1607
*/
1608
static DL_FUNC
31591 ripley 1609
R_FindNativeSymbolFromDLL(char *name, DllReference *dll,
66468 maechler 1610
			  R_RegisteredNativeSymbol *symbol,
60350 ripley 1611
			  SEXP env)
30599 duncan 1612
{
1613
    int numProtects = 0;
1614
    DllInfo *info;
1615
    DL_FUNC fun = NULL;
1616
 
1617
    if(dll->obj == NULL) {
34768 ripley 1618
	/* Rprintf("\nsearching for %s\n", name); */
60350 ripley 1619
	if (env != R_NilValue) {
1620
	    SEXP e;
1621
	    PROTECT(e = lang2(install("getCallingDLLe"), env));
88719 kalibera 1622
	    dll->obj = eval(e, R_BaseEnv);
60350 ripley 1623
	    UNPROTECT(1);
1624
	} else dll->obj = Rf_getCallingDLL();
30599 duncan 1625
	PROTECT(dll->obj); numProtects++;
1626
    }
1627
 
1628
    if(inherits(dll->obj, "DLLInfo")) {
1629
	SEXP tmp;
1630
	tmp = VECTOR_ELT(dll->obj, 4);
1631
	info = (DllInfo *) R_ExternalPtrAddr(tmp);
31591 ripley 1632
	if(!info)
32867 ripley 1633
	    error(_("NULL value for DLLInfoReference when looking for DLL"));
84014 luke 1634
	if (info->forceSymbols)
83985 luke 1635
	    error(_("DLL requires the use of native symbols"));
30599 duncan 1636
	fun = R_dlsym(info, name, symbol);
1637
    }
1638
 
60364 ripley 1639
    if(numProtects) UNPROTECT(numProtects);
30599 duncan 1640
 
60348 ripley 1641
    return fun;
30599 duncan 1642
}
1643
 
1644
 
1645
 
6098 pd 1646
/* .C() {op=0}  or  .Fortran() {op=1} */
58682 ripley 1647
/* Use of this except for atomic vectors is not allowed for .Fortran,
1648
   and is only kept for legacy code for .C.
1649
 
1650
   CRAN packages R2Cuba, RCALI, ars, coxme, fCopulae, locfit, nlme,
1651
   splinesurv and survival pass functions, the case of RCALI as a list
1652
   of two functions.
1653
 
1654
   RecordLinkage and locfit pass lists.
1655
*/
58916 ripley 1656
 
58930 ripley 1657
/* pattern and number of guard bytes */
58918 ripley 1658
#define FILL 0xee
58930 ripley 1659
#define NG 64
58916 ripley 1660
 
83446 ripley 1661
attribute_hidden SEXP do_dotCode(SEXP call, SEXP op, SEXP args, SEXP env)
2 r 1662
{
59132 ripley 1663
    void **cargs, **cargs0 = NULL /* -Wall */;
66552 ripley 1664
    int naok, na, nargs, Fort;
87902 ripley 1665
    bool copy = R_CBoundsCheck; /* options(CboundsCheck) */
83012 kalibera 1666
    DL_FUNC fun = NULL;
58854 ripley 1667
    SEXP ans, pa, s;
17164 duncan 1668
    R_RegisteredNativeSymbol symbol = {R_C_SYM, {NULL}, NULL};
20110 duncan 1669
    R_NativePrimitiveArgType *checkTypes = NULL;
63181 ripley 1670
    const void *vmax;
58663 ripley 1671
    char symName[MaxSymbolBytes];
14571 duncan 1672
 
58666 ripley 1673
    if (length(args) < 1) errorcall(call, _("'.NAME' is missing"));
60484 ripley 1674
    check1arg2(args, call, ".NAME");
6098 pd 1675
    if (NaokSymbol == NULL || DupSymbol == NULL || PkgSymbol == NULL) {
1839 ihaka 1676
	NaokSymbol = install("NAOK");
1677
	DupSymbol = install("DUP");
6098 pd 1678
	PkgSymbol = install("PACKAGE");
1839 ihaka 1679
    }
32657 ripley 1680
    if (EncSymbol == NULL) EncSymbol = install("ENCODING");
58602 ripley 1681
    if (CSingSymbol == NULL) CSingSymbol = install("Csingle");
1839 ihaka 1682
    vmax = vmaxget();
58670 ripley 1683
    Fort = PRIMVAL(op);
1684
    if(Fort) symbol.type = R_FORTRAN_SYM;
1016 maechler 1685
 
58663 ripley 1686
    args = enctrim(args);
83012 kalibera 1687
    args = resolveNativeRoutine(args, &fun, &symbol, symName, &nargs,
66552 ripley 1688
				&naok, call, env);
2 r 1689
 
14571 duncan 1690
    if(symbol.symbol.c && symbol.symbol.c->numArgs > -1) {
1691
	if(symbol.symbol.c->numArgs != nargs)
41713 ripley 1692
	    errorcall(call,
53823 ripley 1693
		      _("Incorrect number of arguments (%d), expecting %d for '%s'"),
41713 ripley 1694
		      nargs, symbol.symbol.c->numArgs, symName);
26763 maechler 1695
 
30599 duncan 1696
	checkTypes = symbol.symbol.c->types;
14571 duncan 1697
    }
14156 duncan 1698
 
58854 ripley 1699
    /* Construct the return value */
1700
    nargs = 0;
87902 ripley 1701
    bool havenames = false;
58854 ripley 1702
    for(pa = args ; pa != R_NilValue; pa = CDR(pa)) {
87902 ripley 1703
	if (TAG(pa) != R_NilValue) havenames = true;
58854 ripley 1704
	nargs++;
1705
    }
30599 duncan 1706
 
58854 ripley 1707
    PROTECT(ans = allocVector(VECSXP, nargs));
1708
    if (havenames) {
1709
	SEXP names;
1710
	PROTECT(names = allocVector(STRSXP, nargs));
1711
	for (na = 0, pa = args ; pa != R_NilValue ; pa = CDR(pa), na++) {
1712
	    if (TAG(pa) == R_NilValue)
1713
		SET_STRING_ELT(names, na, R_BlankString);
1714
	    else
1715
		SET_STRING_ELT(names, na, PRINTNAME(TAG(pa)));
1716
	}
1717
	setAttrib(ans, R_NamesSymbol, names);
1718
	UNPROTECT(1);
1719
    }
1720
 
58916 ripley 1721
    /* Convert the arguments for use in foreign function calls. */
58602 ripley 1722
    cargs = (void**) R_alloc(nargs, sizeof(void*));
59135 ripley 1723
    if (copy) cargs0 = (void**) R_alloc(nargs, sizeof(void*));
58854 ripley 1724
    for(na = 0, pa = args ; pa != R_NilValue; pa = CDR(pa), na++) {
45446 ripley 1725
	if(checkTypes &&
66552 ripley 1726
	   !comparePrimitiveTypes(checkTypes[na], CAR(pa))) {
45446 ripley 1727
	    /* We can loop over all the arguments and report all the
1728
	       erroneous ones, but then we would also want to avoid
1729
	       the conversions.  Also, in the future, we may just
1730
	       attempt to coerce the value to the appropriate
58861 ripley 1731
	       type. */
60844 ripley 1732
	    errorcall(call, _("wrong type for argument %d in call to %s"),
58854 ripley 1733
		      na+1, symName);
20110 duncan 1734
	}
59011 ripley 1735
	int nprotect = 0, targetType =  checkTypes ? checkTypes[na] : 0;
1736
	R_xlen_t n;
58855 ripley 1737
	s = CAR(pa);
58861 ripley 1738
	/* start with return value a copy of the inputs, as that is
66552 ripley 1739
	   what is needed for non-atomic-vector inputs */
58861 ripley 1740
	SET_VECTOR_ELT(ans, na, s);
58855 ripley 1741
 
87902 ripley 1742
	if(checkNativeType(targetType, TYPEOF(s)) == false &&
66552 ripley 1743
	   targetType != SINGLESXP) {
1744
	    /* Cannot be called if DUP = FALSE, so only needs to live
1745
	       until copied in the switch.
1746
	       But R_alloc allocates, so missed protection < R 2.15.0.
1747
	    */
1748
	    PROTECT(s = coerceVector(s, targetType));
1749
	    nprotect++;
58855 ripley 1750
	}
1751
 
58892 ripley 1752
	/* We create any copies needed for the return value here,
1753
	   except for character vectors.  The compiled code works on
1754
	   the data pointer of the return value for the other atomic
1755
	   vectors, and anything else is supposed to be read-only.
58870 ripley 1756
 
65019 luke 1757
	   We do not need to copy if the inputs have no references */
58892 ripley 1758
 
60132 ripley 1759
#ifdef LONG_VECTOR_SUPPORT
1760
	if (isVector(s) && IS_LONG_VEC(s))
66468 maechler 1761
	    error(_("long vectors (argument %d) are not supported in %s"),
71957 kalibera 1762
		  na + 1, Fort ? ".Fortran" : ".C");
60132 ripley 1763
#endif
58870 ripley 1764
	SEXPTYPE t = TYPEOF(s);
1765
	switch(t) {
58855 ripley 1766
	case RAWSXP:
66552 ripley 1767
	    if (copy) {
59011 ripley 1768
		n = XLENGTH(s);
1769
		char *ptr = R_alloc(n * sizeof(Rbyte) + 2 * NG, 1);
58930 ripley 1770
		memset(ptr, FILL, n * sizeof(Rbyte) + 2 * NG);
1771
		ptr += NG;
87180 kalibera 1772
		if (n) memcpy(ptr, RAW(s), n);
58930 ripley 1773
		cargs[na] = (void *) ptr;
66552 ripley 1774
	    } else if (MAYBE_REFERENCED(s)) {
59011 ripley 1775
		n = XLENGTH(s);
58892 ripley 1776
		SEXP ss = allocVector(t, n);
87180 kalibera 1777
		if (n) memcpy(RAW(ss), RAW(s), n * sizeof(Rbyte));
58892 ripley 1778
		SET_VECTOR_ELT(ans, na, ss);
1779
		cargs[na] = (void*) RAW(ss);
58954 ripley 1780
#ifdef R_MEMORY_PROFILING
59520 ripley 1781
		if (RTRACE(s)) memtrace_report(s, ss);
58954 ripley 1782
#endif
58892 ripley 1783
	    } else cargs[na] = (void *) RAW(s);
58855 ripley 1784
	    break;
1785
	case LGLSXP:
1786
	case INTSXP:
59011 ripley 1787
	    n = XLENGTH(s);
58855 ripley 1788
	    int *iptr = INTEGER(s);
1789
	    if (!naok)
59011 ripley 1790
		for (R_xlen_t i = 0 ; i < n ; i++)
58855 ripley 1791
		    if(iptr[i] == NA_INTEGER)
1792
			error(_("NAs in foreign function call (arg %d)"), na + 1);
66552 ripley 1793
	    if (copy) {
58930 ripley 1794
		char *ptr = R_alloc(n * sizeof(int) + 2 * NG, 1);
1795
		memset(ptr, FILL, n * sizeof(int) + 2 * NG);
1796
		ptr += NG;
87180 kalibera 1797
		if (n) memcpy(ptr, INTEGER(s), n * sizeof(int));
58930 ripley 1798
		cargs[na] = (void*) ptr;
66552 ripley 1799
	    } else if (MAYBE_REFERENCED(s)) {
58892 ripley 1800
		SEXP ss = allocVector(t, n);
87180 kalibera 1801
		if (n) memcpy(INTEGER(ss), INTEGER(s), n * sizeof(int));
58892 ripley 1802
		SET_VECTOR_ELT(ans, na, ss);
1803
		cargs[na] = (void*) INTEGER(ss);
58954 ripley 1804
#ifdef R_MEMORY_PROFILING
59520 ripley 1805
		if (RTRACE(s)) memtrace_report(s, ss);
58954 ripley 1806
#endif
58892 ripley 1807
	    } else cargs[na] = (void*) iptr;
58855 ripley 1808
	    break;
1809
	case REALSXP:
59011 ripley 1810
	    n = XLENGTH(s);
58855 ripley 1811
	    double *rptr = REAL(s);
1812
	    if (!naok)
59011 ripley 1813
		for (R_xlen_t i = 0 ; i < n ; i++)
58855 ripley 1814
		    if(!R_FINITE(rptr[i]))
1815
			error(_("NA/NaN/Inf in foreign function call (arg %d)"), na + 1);
1816
	    if (asLogical(getAttrib(s, CSingSymbol)) == 1) {
1817
		float *sptr = (float*) R_alloc(n, sizeof(float));
59011 ripley 1818
		for (R_xlen_t i = 0 ; i < n ; i++) sptr[i] = (float) REAL(s)[i];
58855 ripley 1819
		cargs[na] = (void*) sptr;
58954 ripley 1820
#ifdef R_MEMORY_PROFILING
1821
		if (RTRACE(s)) memtrace_report(s, sptr);
1822
#endif
66552 ripley 1823
	    } else if (copy) {
58930 ripley 1824
		char *ptr = R_alloc(n * sizeof(double) + 2 * NG, 1);
1825
		memset(ptr, FILL, n * sizeof(double) + 2 * NG);
1826
		ptr += NG;
87180 kalibera 1827
		if (n) memcpy(ptr, REAL(s), n * sizeof(double));
58930 ripley 1828
		cargs[na] = (void*) ptr;
66552 ripley 1829
	    } else if (MAYBE_REFERENCED(s)) {
58892 ripley 1830
		SEXP ss  = allocVector(t, n);
87180 kalibera 1831
		if (n) memcpy(REAL(ss), REAL(s), n * sizeof(double));
58892 ripley 1832
		SET_VECTOR_ELT(ans, na, ss);
1833
		cargs[na] = (void*) REAL(ss);
58954 ripley 1834
#ifdef R_MEMORY_PROFILING
59520 ripley 1835
		if (RTRACE(s)) memtrace_report(s, ss);
58954 ripley 1836
#endif
58855 ripley 1837
	    } else cargs[na] = (void*) rptr;
1838
	    break;
1839
	case CPLXSXP:
59011 ripley 1840
	    n = XLENGTH(s);
58855 ripley 1841
	    Rcomplex *zptr = COMPLEX(s);
1842
	    if (!naok)
59011 ripley 1843
		for (R_xlen_t i = 0 ; i < n ; i++)
58855 ripley 1844
		    if(!R_FINITE(zptr[i].r) || !R_FINITE(zptr[i].i))
1845
			error(_("complex NA/NaN/Inf in foreign function call (arg %d)"), na + 1);
66552 ripley 1846
	    if (copy) {
58930 ripley 1847
		char *ptr = R_alloc(n * sizeof(Rcomplex) + 2 * NG, 1);
1848
		memset(ptr, FILL, n * sizeof(Rcomplex) + 2 * NG);
1849
		ptr += NG;
87180 kalibera 1850
		if (n) memcpy(ptr, COMPLEX(s), n * sizeof(Rcomplex));
58930 ripley 1851
		cargs[na] = (void*) ptr;
66552 ripley 1852
	    } else if (MAYBE_REFERENCED(s)) {
58892 ripley 1853
		SEXP ss = allocVector(t, n);
87180 kalibera 1854
		if (n) memcpy(COMPLEX(ss), COMPLEX(s), n * sizeof(Rcomplex));
58892 ripley 1855
		SET_VECTOR_ELT(ans, na, ss);
1856
		cargs[na] = (void*) COMPLEX(ss);
58954 ripley 1857
#ifdef R_MEMORY_PROFILING
59520 ripley 1858
		if (RTRACE(s)) memtrace_report(s, ss);
58954 ripley 1859
#endif
58892 ripley 1860
	    } else cargs[na] = (void *) zptr;
58855 ripley 1861
	    break;
1862
	case STRSXP:
59011 ripley 1863
	    n = XLENGTH(s);
58855 ripley 1864
	    if (Fort) {
1865
		const char *ss = translateChar(STRING_ELT(s, 0));
1866
		if (n > 1)
76548 ripley 1867
		    warning("only the first string in a char vector used in .Fortran");
76544 ripley 1868
		else
76548 ripley 1869
		    warning("passing a char vector to .Fortran is not portable");
58855 ripley 1870
		char *fptr = (char*) R_alloc(max(255, strlen(ss)) + 1, sizeof(char));
1871
		strcpy(fptr, ss);
1872
		cargs[na] =  (void*) fptr;
59132 ripley 1873
	    } else if (copy) {
59135 ripley 1874
		char **cptr = (char**) R_alloc(n, sizeof(char*)),
1875
		    **cptr0 = (char**) R_alloc(n, sizeof(char*));
59132 ripley 1876
		for (R_xlen_t i = 0 ; i < n ; i++) {
1877
		    const char *ss = translateChar(STRING_ELT(s, i));
59173 ripley 1878
		    size_t nn = strlen(ss) + 1 + 2 * NG;
59140 ripley 1879
		    char *ptr = (char*) R_alloc(nn, sizeof(char));
1880
		    memset(ptr, FILL, nn);
59135 ripley 1881
		    cptr[i] = cptr0[i] = ptr + NG;
59132 ripley 1882
		    strcpy(cptr[i], ss);
1883
		}
1884
		cargs[na] = (void*) cptr;
59135 ripley 1885
		cargs0[na] = (void*) cptr0;
59132 ripley 1886
#ifdef R_MEMORY_PROFILING
1887
		if (RTRACE(s)) memtrace_report(s, cargs[na]);
1888
#endif
58855 ripley 1889
	    } else {
1890
		char **cptr = (char**) R_alloc(n, sizeof(char*));
59011 ripley 1891
		for (R_xlen_t i = 0 ; i < n ; i++) {
58855 ripley 1892
		    const char *ss = translateChar(STRING_ELT(s, i));
59173 ripley 1893
		    size_t nn = strlen(ss) + 1;
59140 ripley 1894
		    if(nn > 1) {
1895
			cptr[i] = (char*) R_alloc(nn, sizeof(char));
1896
			strcpy(cptr[i], ss);
1897
		    } else {
1898
			/* Protect ourselves against those who like to
1899
			   extend "", maybe using strncpy */
1900
			nn = 128;
1901
			cptr[i] = (char*) R_alloc(nn, sizeof(char));
1902
			memset(cptr[i], 0, nn);
1903
		    }
58855 ripley 1904
		}
1905
		cargs[na] = (void*) cptr;
58954 ripley 1906
#ifdef R_MEMORY_PROFILING
1907
		if (RTRACE(s)) memtrace_report(s, cargs[na]);
1908
#endif
58855 ripley 1909
	    }
1910
	    break;
1911
	case VECSXP:
60844 ripley 1912
	    if (Fort) error(_("invalid mode (%s) to pass to Fortran (arg %d)"),
85148 luke 1913
			    R_typeToChar(s), na + 1);
59140 ripley 1914
	    /* Used read-only, so this is safe */
58876 ripley 1915
#ifdef USE_RINTERNALS
83914 luke 1916
            if (!ALTREP(s))
1917
                cargs[na] = (void*) DATAPTR(s);
1918
            else {
58876 ripley 1919
#else
83914 luke 1920
                n = XLENGTH(s);
1921
                SEXP *lptr = (SEXP *) R_alloc(n, sizeof(SEXP));
1922
                for (R_xlen_t i = 0 ; i < n ; i++) lptr[i] = VECTOR_ELT(s, i);
1923
                cargs[na] = (void*) lptr;
58876 ripley 1924
#endif
83914 luke 1925
#ifdef USE_RINTERNALS
1926
            }
1927
#endif
1928
            break;
58855 ripley 1929
	case CLOSXP:
1930
	case BUILTINSXP:
1931
	case SPECIALSXP:
1932
	case ENVSXP:
66468 maechler 1933
	    if (Fort) error(_("invalid mode (%s) to pass to Fortran (arg %d)"),
85148 luke 1934
			    R_typeToChar(s), na + 1);
58855 ripley 1935
	    cargs[na] =  (void*) s;
1936
	    break;
1937
	case NILSXP:
66468 maechler 1938
	    error(_("invalid mode (%s) to pass to C or Fortran (arg %d)"),
85148 luke 1939
		  R_typeToChar(s), na + 1);
58976 ripley 1940
	    cargs[na] =  (void*) s;
58855 ripley 1941
	    break;
1942
	default:
1943
	    /* Includes pairlists from R 2.15.0 */
66468 maechler 1944
	    if (Fort) error(_("invalid mode (%s) to pass to Fortran (arg %d)"),
85148 luke 1945
			    R_typeToChar(s), na + 1);
66468 maechler 1946
	    warning("passing an object of type '%s' to .C (arg %d) is deprecated",
85148 luke 1947
		    R_typeToChar(s), na + 1);
58855 ripley 1948
	    if (t == LISTSXP)
1949
		warning(_("pairlists are passed as SEXP as from R 2.15.0"));
1950
	    cargs[na] =  (void*) s;
67098 luke 1951
	    break;
58855 ripley 1952
	}
1953
	if (nprotect) UNPROTECT(nprotect);
14156 duncan 1954
    }
1955
 
85716 kalibera 1956
    /* FIXME: Calling a function via an incompatible function pointer is
1957
       undefined behavior. */ 
1839 ihaka 1958
    switch (nargs) {
1959
    case 0:
85769 kalibera 1960
	((FUNV0)fun)();
1839 ihaka 1961
	break;
1962
    case 1:
85769 kalibera 1963
	((FUNV1)fun)(cargs[0]);
1839 ihaka 1964
	break;
1965
    case 2:
85769 kalibera 1966
	((FUNV2)fun)(cargs[0], cargs[1]);
1839 ihaka 1967
	break;
1968
    case 3:
85769 kalibera 1969
	((FUNV3)fun)(cargs[0], cargs[1], cargs[2]);
1839 ihaka 1970
	break;
1971
    case 4:
85769 kalibera 1972
	((FUNV4)fun)(cargs[0], cargs[1], cargs[2], cargs[3]);
1839 ihaka 1973
	break;
1974
    case 5:
85769 kalibera 1975
	((FUNV5)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4]);
1839 ihaka 1976
	break;
1977
    case 6:
85769 kalibera 1978
	((FUNV6)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 1979
	    cargs[5]);
1980
	break;
1981
    case 7:
85769 kalibera 1982
	((FUNV7)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 1983
	    cargs[5],  cargs[6]);
1984
	break;
1985
    case 8:
85769 kalibera 1986
	((FUNV8)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 1987
	    cargs[5],  cargs[6],  cargs[7]);
1988
	break;
1989
    case 9:
85769 kalibera 1990
	((FUNV9)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 1991
	    cargs[5],  cargs[6],  cargs[7],  cargs[8]);
1992
	break;
1993
    case 10:
85769 kalibera 1994
	((FUNV10)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 1995
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9]);
1996
	break;
1997
    case 11:
85769 kalibera 1998
	((FUNV11)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 1999
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2000
	    cargs[10]);
2001
	break;
2002
    case 12:
85769 kalibera 2003
	((FUNV12)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2004
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2005
	    cargs[10], cargs[11]);
2006
	break;
2007
    case 13:
85769 kalibera 2008
	((FUNV13)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2009
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2010
	    cargs[10], cargs[11], cargs[12]);
2011
	break;
2012
    case 14:
85769 kalibera 2013
	((FUNV14)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2014
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2015
	    cargs[10], cargs[11], cargs[12], cargs[13]);
2016
	break;
2017
    case 15:
85769 kalibera 2018
	((FUNV15)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2019
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2020
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14]);
2021
	break;
2022
    case 16:
85769 kalibera 2023
	((FUNV16)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2024
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2025
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2026
	    cargs[15]);
2027
	break;
2028
    case 17:
85769 kalibera 2029
	((FUNV17)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2030
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2031
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2032
	    cargs[15], cargs[16]);
2033
	break;
2034
    case 18:
85769 kalibera 2035
	((FUNV18)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2036
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2037
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2038
	    cargs[15], cargs[16], cargs[17]);
2039
	break;
2040
    case 19:
85769 kalibera 2041
	((FUNV19)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2042
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2043
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2044
	    cargs[15], cargs[16], cargs[17], cargs[18]);
2045
	break;
2046
    case 20:
85769 kalibera 2047
	((FUNV20)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2048
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2049
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2050
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19]);
2051
	break;
2052
    case 21:
85769 kalibera 2053
	((FUNV21)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2054
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2055
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2056
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2057
	    cargs[20]);
2058
	break;
2059
    case 22:
85769 kalibera 2060
	((FUNV22)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2061
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2062
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2063
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2064
	    cargs[20], cargs[21]);
2065
	break;
2066
    case 23:
85769 kalibera 2067
	((FUNV23)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2068
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2069
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2070
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2071
	    cargs[20], cargs[21], cargs[22]);
2072
	break;
2073
    case 24:
85769 kalibera 2074
	((FUNV24)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2075
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2076
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2077
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2078
	    cargs[20], cargs[21], cargs[22], cargs[23]);
2079
	break;
2080
    case 25:
85769 kalibera 2081
	((FUNV25)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2082
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2083
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2084
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2085
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24]);
2086
	break;
2087
    case 26:
85769 kalibera 2088
	((FUNV26)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2089
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2090
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2091
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2092
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2093
	    cargs[25]);
2094
	break;
2095
    case 27:
85769 kalibera 2096
	((FUNV27)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2097
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2098
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2099
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2100
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2101
	    cargs[25], cargs[26]);
2102
	break;
2103
    case 28:
85769 kalibera 2104
	((FUNV28)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2105
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2106
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2107
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2108
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2109
	    cargs[25], cargs[26], cargs[27]);
2110
	break;
2111
    case 29:
85769 kalibera 2112
	((FUNV29)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2113
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2114
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2115
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2116
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2117
	    cargs[25], cargs[26], cargs[27], cargs[28]);
2118
	break;
2119
    case 30:
85769 kalibera 2120
	((FUNV30)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2121
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2122
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2123
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2124
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2125
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29]);
2126
	break;
2127
    case 31:
85769 kalibera 2128
	((FUNV31)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2129
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2130
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2131
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2132
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2133
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2134
	    cargs[30]);
2135
	break;
2136
    case 32:
85769 kalibera 2137
	((FUNV32)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2138
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2139
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2140
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2141
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2142
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2143
	    cargs[30], cargs[31]);
2144
	break;
2145
    case 33:
85769 kalibera 2146
	((FUNV33)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2147
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2148
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2149
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2150
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2151
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2152
	    cargs[30], cargs[31], cargs[32]);
2153
	break;
2154
    case 34:
85769 kalibera 2155
	((FUNV34)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2156
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2157
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2158
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2159
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2160
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2161
	    cargs[30], cargs[31], cargs[32], cargs[33]);
2162
	break;
2163
    case 35:
85769 kalibera 2164
	((FUNV35)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2165
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2166
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2167
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2168
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2169
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2170
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34]);
2171
	break;
2172
    case 36:
85769 kalibera 2173
	((FUNV36)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2174
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2175
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2176
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2177
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2178
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2179
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2180
	    cargs[35]);
2181
	break;
2182
    case 37:
85769 kalibera 2183
	((FUNV37)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2184
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2185
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2186
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2187
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2188
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2189
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2190
	    cargs[35], cargs[36]);
2191
	break;
2192
    case 38:
85769 kalibera 2193
	((FUNV38)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2194
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2195
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2196
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2197
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2198
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2199
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2200
	    cargs[35], cargs[36], cargs[37]);
2201
	break;
2202
    case 39:
85769 kalibera 2203
	((FUNV39)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2204
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2205
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2206
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2207
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2208
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2209
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2210
	    cargs[35], cargs[36], cargs[37], cargs[38]);
2211
	break;
2212
    case 40:
85769 kalibera 2213
	((FUNV40)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2214
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2215
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2216
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2217
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2218
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2219
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2220
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39]);
2221
	break;
2222
    case 41:
85769 kalibera 2223
	((FUNV41)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2224
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2225
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2226
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2227
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2228
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2229
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2230
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2231
	    cargs[40]);
2232
	break;
2233
    case 42:
85769 kalibera 2234
	((FUNV42)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2235
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2236
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2237
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2238
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2239
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2240
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2241
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2242
	    cargs[40], cargs[41]);
2243
	break;
2244
    case 43:
85769 kalibera 2245
	((FUNV43)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2246
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2247
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2248
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2249
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2250
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2251
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2252
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2253
	    cargs[40], cargs[41], cargs[42]);
2254
	break;
2255
    case 44:
85769 kalibera 2256
	((FUNV44)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2257
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2258
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2259
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2260
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2261
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2262
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2263
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2264
	    cargs[40], cargs[41], cargs[42], cargs[43]);
2265
	break;
2266
    case 45:
85769 kalibera 2267
	((FUNV45)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2268
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2269
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2270
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2271
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2272
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2273
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2274
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2275
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44]);
2276
	break;
2277
    case 46:
85769 kalibera 2278
	((FUNV46)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2279
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2280
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2281
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2282
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2283
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2284
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2285
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2286
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2287
	    cargs[45]);
2288
	break;
2289
    case 47:
85769 kalibera 2290
	((FUNV47)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2291
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2292
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2293
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2294
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2295
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2296
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2297
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2298
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2299
	    cargs[45], cargs[46]);
2300
	break;
2301
    case 48:
85769 kalibera 2302
	((FUNV48)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2303
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2304
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2305
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2306
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2307
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2308
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2309
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2310
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2311
	    cargs[45], cargs[46], cargs[47]);
2312
	break;
2313
    case 49:
85769 kalibera 2314
	((FUNV49)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2315
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2316
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2317
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2318
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2319
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2320
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2321
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2322
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2323
	    cargs[45], cargs[46], cargs[47], cargs[48]);
2324
	break;
2325
    case 50:
85769 kalibera 2326
	((FUNV50)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2327
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2328
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2329
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2330
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2331
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2332
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2333
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2334
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2335
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49]);
2336
	break;
2337
    case 51:
85769 kalibera 2338
	((FUNV51)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2339
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2340
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2341
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2342
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2343
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2344
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2345
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2346
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2347
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2348
	    cargs[50]);
2349
	break;
2350
    case 52:
85769 kalibera 2351
	((FUNV52)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2352
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2353
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2354
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2355
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2356
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2357
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2358
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2359
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2360
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2361
	    cargs[50], cargs[51]);
2362
	break;
2363
    case 53:
85769 kalibera 2364
	((FUNV53)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2365
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2366
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2367
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2368
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2369
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2370
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2371
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2372
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2373
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2374
	    cargs[50], cargs[51], cargs[52]);
2375
	break;
2376
    case 54:
85769 kalibera 2377
	((FUNV54)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2378
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2379
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2380
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2381
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2382
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2383
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2384
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2385
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2386
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2387
	    cargs[50], cargs[51], cargs[52], cargs[53]);
2388
	break;
2389
    case 55:
85769 kalibera 2390
	((FUNV55)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2391
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2392
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2393
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2394
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2395
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2396
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2397
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2398
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2399
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2400
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54]);
2401
	break;
2402
    case 56:
85769 kalibera 2403
	((FUNV56)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2404
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2405
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2406
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2407
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2408
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2409
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2410
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2411
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2412
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2413
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2414
	    cargs[55]);
2415
	break;
2416
    case 57:
85769 kalibera 2417
	((FUNV57)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2418
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2419
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2420
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2421
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2422
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2423
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2424
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2425
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2426
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2427
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2428
	    cargs[55], cargs[56]);
2429
	break;
2430
    case 58:
85769 kalibera 2431
	((FUNV58)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2432
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2433
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2434
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2435
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2436
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2437
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2438
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2439
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2440
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2441
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2442
	    cargs[55], cargs[56], cargs[57]);
2443
	break;
2444
    case 59:
85769 kalibera 2445
	((FUNV59)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2446
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2447
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2448
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2449
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2450
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2451
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2452
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2453
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2454
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2455
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2456
	    cargs[55], cargs[56], cargs[57], cargs[58]);
2457
	break;
2458
    case 60:
85769 kalibera 2459
	((FUNV60)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2460
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2461
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2462
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2463
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2464
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2465
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2466
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2467
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2468
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2469
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2470
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59]);
2471
	break;
2472
    case 61:
85769 kalibera 2473
	((FUNV61)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2474
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2475
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2476
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2477
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2478
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2479
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2480
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2481
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2482
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2483
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2484
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
2485
	    cargs[60]);
2486
	break;
2487
    case 62:
85769 kalibera 2488
	((FUNV62)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2489
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2490
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2491
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2492
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2493
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2494
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2495
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2496
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2497
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2498
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2499
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
2500
	    cargs[60], cargs[61]);
2501
	break;
2502
    case 63:
85769 kalibera 2503
	((FUNV63)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2504
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2505
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2506
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2507
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2508
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2509
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2510
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2511
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2512
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2513
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2514
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
2515
	    cargs[60], cargs[61], cargs[62]);
2516
	break;
2517
    case 64:
85769 kalibera 2518
	((FUNV64)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2519
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2520
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2521
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2522
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2523
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2524
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2525
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2526
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2527
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2528
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2529
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
2530
	    cargs[60], cargs[61], cargs[62], cargs[63]);
2531
	break;
2532
    case 65:
85769 kalibera 2533
	((FUNV65)fun)(cargs[0],  cargs[1],  cargs[2],  cargs[3],  cargs[4],
1839 ihaka 2534
	    cargs[5],  cargs[6],  cargs[7],  cargs[8],  cargs[9],
2535
	    cargs[10], cargs[11], cargs[12], cargs[13], cargs[14],
2536
	    cargs[15], cargs[16], cargs[17], cargs[18], cargs[19],
2537
	    cargs[20], cargs[21], cargs[22], cargs[23], cargs[24],
2538
	    cargs[25], cargs[26], cargs[27], cargs[28], cargs[29],
2539
	    cargs[30], cargs[31], cargs[32], cargs[33], cargs[34],
2540
	    cargs[35], cargs[36], cargs[37], cargs[38], cargs[39],
2541
	    cargs[40], cargs[41], cargs[42], cargs[43], cargs[44],
2542
	    cargs[45], cargs[46], cargs[47], cargs[48], cargs[49],
2543
	    cargs[50], cargs[51], cargs[52], cargs[53], cargs[54],
2544
	    cargs[55], cargs[56], cargs[57], cargs[58], cargs[59],
2545
	    cargs[60], cargs[61], cargs[62], cargs[63], cargs[64]);
2546
	break;
2547
    default:
32867 ripley 2548
	errorcall(call, _("too many arguments, sorry"));
1839 ihaka 2549
    }
58854 ripley 2550
 
66552 ripley 2551
    for (na = 0, pa = args ; pa != R_NilValue ; pa = CDR(pa), na++) {
72231 ripley 2552
	void *p = cargs[na];
2553
	SEXP arg = CAR(pa);
2554
	s = VECTOR_ELT(ans, na);
2555
	R_NativePrimitiveArgType type =
2556
	    checkTypes ? checkTypes[na] : TYPEOF(arg);
2557
	R_xlen_t n = xlength(arg);
58854 ripley 2558
 
72231 ripley 2559
	switch(type) {
2560
	case RAWSXP:
2561
	    if (copy) {
2562
		s = allocVector(type, n);
2563
		unsigned char *ptr = (unsigned char *) p;
87180 kalibera 2564
		if (n) memcpy(RAW(s), ptr, n * sizeof(Rbyte));
72231 ripley 2565
		ptr += n * sizeof(Rbyte);
2566
		for (int i = 0; i < NG; i++)
2567
		    if(*ptr++ != FILL)
2568
			error("array over-run in %s(\"%s\") in %s argument %d\n",
2569
			      Fort ? ".Fortran" : ".C",
2570
			      symName, type2char(type), na+1);
2571
		ptr = (unsigned char *) p;
2572
		for (int i = 0; i < NG; i++)
2573
		    if(*--ptr != FILL)
2574
			error("array under-run in %s(\"%s\") in %s argument %d\n",
2575
			      Fort ? ".Fortran" : ".C",
2576
			      symName, type2char(type), na+1);
2577
	    }
2578
	    break;
2579
	case INTSXP:
2580
	    if (copy) {
2581
		s = allocVector(type, n);
2582
		unsigned char *ptr = (unsigned char *) p;
87180 kalibera 2583
		if (n) memcpy(INTEGER(s), ptr, n * sizeof(int));
72231 ripley 2584
		ptr += n * sizeof(int);
2585
		for (int i = 0; i < NG; i++)
2586
		    if(*ptr++ != FILL)
2587
			error("array over-run in %s(\"%s\") in %s argument %d\n",
2588
			      Fort ? ".Fortran" : ".C",
2589
			      symName, type2char(type), na+1);
2590
		ptr = (unsigned char *) p;
2591
		for (int i = 0; i < NG; i++)
2592
		    if(*--ptr != FILL)
2593
			error("array under-run in %s(\"%s\") in %s argument %d\n",
2594
			      Fort ? ".Fortran" : ".C",
2595
			      symName, type2char(type), na+1);
2596
	    }
2597
	    break;
2598
	case LGLSXP:
2599
	    if (copy) {
2600
		s = allocVector(type, n);
2601
		unsigned char *ptr = (unsigned char *) p;
2602
		int *iptr = (int*) ptr, tmp;
2603
		for (R_xlen_t i = 0 ; i < n ; i++) {
2604
		    tmp =  iptr[i];
2605
		    LOGICAL(s)[i] = (tmp == NA_INTEGER || tmp == 0) ? tmp : 1;
66552 ripley 2606
		}
72231 ripley 2607
		ptr += n * sizeof(int);
2608
		for (int i = 0; i < NG;  i++)
2609
		    if(*ptr++ != FILL)
2610
			error("array over-run in %s(\"%s\") in %s argument %d\n",
2611
			      Fort ? ".Fortran" : ".C",
2612
			      symName, type2char(type), na+1);
2613
		ptr = (unsigned char *) p;
2614
		for (int i = 0; i < NG; i++)
2615
		    if(*--ptr != FILL)
2616
			error("array under-run in %s(\"%s\") in %s argument %d\n",
2617
			      Fort ? ".Fortran" : ".C",
2618
			      symName, type2char(type), na+1);
2619
	    } else {
73583 kalibera 2620
		int *iptr = (int *)p, tmp;
72231 ripley 2621
		for (R_xlen_t i = 0 ; i < n ; i++) {
2622
		    tmp =  iptr[i];
2623
		    iptr[i] = (tmp == NA_INTEGER || tmp == 0) ? tmp : 1;
2624
		}
2625
	    }
2626
	    break;
2627
	case REALSXP:
2628
	case SINGLESXP:
2629
	    if (copy) {
75532 kalibera 2630
		PROTECT(s = allocVector(REALSXP, n));
72231 ripley 2631
		if (type == SINGLESXP || asLogical(getAttrib(arg, CSingSymbol)) == 1) {
2632
		    float *sptr = (float*) p;
2633
		    for(R_xlen_t i = 0 ; i < n ; i++)
2634
			REAL(s)[i] = (double) sptr[i];
2635
		} else {
66552 ripley 2636
		    unsigned char *ptr = (unsigned char *) p;
87180 kalibera 2637
		    if (n) memcpy(REAL(s), ptr, n * sizeof(double));
72231 ripley 2638
		    ptr += n * sizeof(double);
66552 ripley 2639
		    for (int i = 0; i < NG; i++)
2640
			if(*ptr++ != FILL)
2641
			    error("array over-run in %s(\"%s\") in %s argument %d\n",
2642
				  Fort ? ".Fortran" : ".C",
2643
				  symName, type2char(type), na+1);
2644
		    ptr = (unsigned char *) p;
2645
		    for (int i = 0; i < NG; i++)
2646
			if(*--ptr != FILL)
2647
			    error("array under-run in %s(\"%s\") in %s argument %d\n",
2648
				  Fort ? ".Fortran" : ".C",
2649
				  symName, type2char(type), na+1);
2650
		}
75532 kalibera 2651
		UNPROTECT(1); /* s */
72231 ripley 2652
	    } else {
2653
		if (type == SINGLESXP || asLogical(getAttrib(arg, CSingSymbol)) == 1) {
2654
		    s = allocVector(REALSXP, n);
2655
		    float *sptr = (float*) p;
2656
		    for(int i = 0 ; i < n ; i++)
2657
			REAL(s)[i] = (double) sptr[i];
66552 ripley 2658
		}
72231 ripley 2659
	    }
2660
	    break;
2661
	case CPLXSXP:
2662
	    if (copy) {
2663
		s = allocVector(type, n);
2664
		unsigned char *ptr = (unsigned char *) p;
87180 kalibera 2665
		if (n) memcpy(COMPLEX(s), p, n * sizeof(Rcomplex));
72231 ripley 2666
		ptr += n * sizeof(Rcomplex);
2667
		for (int i = 0; i < NG;  i++)
2668
		    if(*ptr++ != FILL)
2669
			error("array over-run in %s(\"%s\") in %s argument %d\n",
2670
			      Fort ? ".Fortran" : ".C",
2671
			      symName, type2char(type), na+1);
2672
		ptr = (unsigned char *) p;
2673
		for (int i = 0; i < NG; i++)
2674
		    if(*--ptr != FILL)
2675
			error("array under-run in %s(\"%s\") in %s argument %d\n",
2676
			      Fort ? ".Fortran" : ".C",
2677
			      symName, type2char(type), na+1);
2678
	    }
2679
	    break;
2680
	case STRSXP:
2681
	    if(Fort) {
2682
		char buf[256];
2683
		/* only return one string: warned on the R -> Fortran step */
2684
		strncpy(buf, (char*)p, 255);
2685
		buf[255] = '\0';
2686
		PROTECT(s = allocVector(type, 1));
2687
		SET_STRING_ELT(s, 0, mkChar(buf));
2688
		UNPROTECT(1);
2689
	    } else if (copy) {
2690
		SEXP ss = arg;
2691
		PROTECT(s = allocVector(type, n));
2692
		char **cptr = (char**) p, **cptr0 = (char**) cargs0[na];
2693
		for (R_xlen_t i = 0 ; i < n ; i++) {
2694
		    unsigned char *ptr = (unsigned char *) cptr[i];
2695
		    SET_STRING_ELT(s, i, mkChar(cptr[i]));
2696
		    if (cptr[i] == cptr0[i]) {
2697
			const char *z = translateChar(STRING_ELT(ss, i));
2698
			for (int j = 0; j < NG; j++)
58930 ripley 2699
			    if(*--ptr != FILL)
72231 ripley 2700
				error("array under-run in .C(\"%s\") in character argument %d, element %d",
2701
				      symName, na+1, (int)(i+1));
2702
			ptr = (unsigned char *) cptr[i];
2703
			ptr += strlen(z) + 1;
2704
			for (int j = 0; j < NG;  j++)
2705
			    if(*ptr++ != FILL) {
2706
				// force termination
2707
				unsigned char *p = ptr;
2708
				for (int k = 1; k < NG - j; k++, p++)
2709
				    if (*p == FILL) *p = '\0';
2710
				error("array over-run in .C(\"%s\") in character argument %d, element %d\n'%s'->'%s'\n",
2711
				      symName, na+1, (int)(i+1),
2712
				      z, cptr[i]);
2713
			    }
58916 ripley 2714
		    }
66552 ripley 2715
		}
2716
		UNPROTECT(1);
72231 ripley 2717
	    } else {
2718
		PROTECT(s = allocVector(type, n));
2719
		char **cptr = (char**) p;
2720
		for (R_xlen_t i = 0 ; i < n ; i++)
2721
		    SET_STRING_ELT(s, i, mkChar(cptr[i]));
2722
		UNPROTECT(1);
66552 ripley 2723
	    }
72231 ripley 2724
	    break;
2725
	default:
2726
	    break;
2 r 2727
	}
72231 ripley 2728
	if (s != arg) {
2729
	    PROTECT(s);
2730
	    SHALLOW_DUPLICATE_ATTRIB(s, arg);
2731
	    SET_VECTOR_ELT(ans, na, s);
2732
	    UNPROTECT(1);
2733
	}
1839 ihaka 2734
    }
2735
    UNPROTECT(1);
2736
    vmaxset(vmax);
58854 ripley 2737
    return ans;
1839 ihaka 2738
}