The R Project SVN R

Rev

Rev 71957 | Rev 73166 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 71957 Rev 72231
Line 1449... Line 1449...
1449
    DL_FUNC ofun = NULL;
1449
    DL_FUNC ofun = NULL;
1450
    VarFun fun = NULL;
1450
    VarFun fun = NULL;
1451
    SEXP ans, pa, s;
1451
    SEXP ans, pa, s;
1452
    R_RegisteredNativeSymbol symbol = {R_C_SYM, {NULL}, NULL};
1452
    R_RegisteredNativeSymbol symbol = {R_C_SYM, {NULL}, NULL};
1453
    R_NativePrimitiveArgType *checkTypes = NULL;
1453
    R_NativePrimitiveArgType *checkTypes = NULL;
1454
    R_NativeArgStyle *argStyles = NULL;
-
 
1455
    const void *vmax;
1454
    const void *vmax;
1456
    char symName[MaxSymbolBytes];
1455
    char symName[MaxSymbolBytes];
1457
 
1456
 
1458
    if (length(args) < 1) errorcall(call, _("'.NAME' is missing"));
1457
    if (length(args) < 1) errorcall(call, _("'.NAME' is missing"));
1459
    check1arg2(args, call, ".NAME");
1458
    check1arg2(args, call, ".NAME");
Line 1478... Line 1477...
1478
	    errorcall(call,
1477
	    errorcall(call,
1479
		      _("Incorrect number of arguments (%d), expecting %d for '%s'"),
1478
		      _("Incorrect number of arguments (%d), expecting %d for '%s'"),
1480
		      nargs, symbol.symbol.c->numArgs, symName);
1479
		      nargs, symbol.symbol.c->numArgs, symName);
1481
 
1480
 
1482
	checkTypes = symbol.symbol.c->types;
1481
	checkTypes = symbol.symbol.c->types;
1483
	argStyles = symbol.symbol.c->styles;
-
 
1484
    }
1482
    }
1485
 
1483
 
1486
    /* Construct the return value */
1484
    /* Construct the return value */
1487
    nargs = 0;
1485
    nargs = 0;
1488
    havenames = FALSE;
1486
    havenames = FALSE;
Line 2327... Line 2325...
2327
    default:
2325
    default:
2328
	errorcall(call, _("too many arguments, sorry"));
2326
	errorcall(call, _("too many arguments, sorry"));
2329
    }
2327
    }
2330
 
2328
 
2331
    for (na = 0, pa = args ; pa != R_NilValue ; pa = CDR(pa), na++) {
2329
    for (na = 0, pa = args ; pa != R_NilValue ; pa = CDR(pa), na++) {
2332
	if(argStyles && argStyles[na] == R_ARG_IN) {
-
 
2333
	    SET_VECTOR_ELT(ans, na, R_NilValue);
-
 
2334
	    continue;
-
 
2335
	} else {
-
 
2336
	    void *p = cargs[na];
2330
	void *p = cargs[na];
2337
	    SEXP arg = CAR(pa);
2331
	SEXP arg = CAR(pa);
2338
	    s = VECTOR_ELT(ans, na);
2332
	s = VECTOR_ELT(ans, na);
2339
	    R_NativePrimitiveArgType type =
2333
	R_NativePrimitiveArgType type =
2340
		checkTypes ? checkTypes[na] : TYPEOF(arg);
2334
	    checkTypes ? checkTypes[na] : TYPEOF(arg);
2341
	    R_xlen_t n = xlength(arg);
2335
	R_xlen_t n = xlength(arg);
2342
 
2336
 
2343
	    switch(type) {
2337
	switch(type) {
2344
	    case RAWSXP:
2338
	case RAWSXP:
2345
		if (copy) {
2339
	    if (copy) {
2346
		    s = allocVector(type, n);
2340
		s = allocVector(type, n);
2347
		    unsigned char *ptr = (unsigned char *) p;
2341
		unsigned char *ptr = (unsigned char *) p;
2348
		    memcpy(RAW(s), ptr, n * sizeof(Rbyte));
2342
		memcpy(RAW(s), ptr, n * sizeof(Rbyte));
2349
		    ptr += n * sizeof(Rbyte);
2343
		ptr += n * sizeof(Rbyte);
2350
		    for (int i = 0; i < NG; i++)
2344
		for (int i = 0; i < NG; i++)
2351
			if(*ptr++ != FILL)
2345
		    if(*ptr++ != FILL)
2352
			    error("array over-run in %s(\"%s\") in %s argument %d\n",
2346
			error("array over-run in %s(\"%s\") in %s argument %d\n",
2353
				  Fort ? ".Fortran" : ".C",
2347
			      Fort ? ".Fortran" : ".C",
2354
				  symName, type2char(type), na+1);
2348
			      symName, type2char(type), na+1);
2355
		    ptr = (unsigned char *) p;
2349
		ptr = (unsigned char *) p;
2356
		    for (int i = 0; i < NG; i++)
2350
		for (int i = 0; i < NG; i++)
2357
			if(*--ptr != FILL)
2351
		    if(*--ptr != FILL)
2358
			    error("array under-run in %s(\"%s\") in %s argument %d\n",
2352
			error("array under-run in %s(\"%s\") in %s argument %d\n",
2359
				  Fort ? ".Fortran" : ".C",
2353
			      Fort ? ".Fortran" : ".C",
2360
				  symName, type2char(type), na+1);
2354
			      symName, type2char(type), na+1);
-
 
2355
	    }
-
 
2356
	    break;
-
 
2357
	case INTSXP:
-
 
2358
	    if (copy) {
-
 
2359
		s = allocVector(type, n);
-
 
2360
		unsigned char *ptr = (unsigned char *) p;
-
 
2361
		memcpy(INTEGER(s), ptr, n * sizeof(int));
-
 
2362
		ptr += n * sizeof(int);
-
 
2363
		for (int i = 0; i < NG; i++)
-
 
2364
		    if(*ptr++ != FILL)
-
 
2365
			error("array over-run in %s(\"%s\") in %s argument %d\n",
-
 
2366
			      Fort ? ".Fortran" : ".C",
-
 
2367
			      symName, type2char(type), na+1);
-
 
2368
		ptr = (unsigned char *) p;
-
 
2369
		for (int i = 0; i < NG; i++)
-
 
2370
		    if(*--ptr != FILL)
-
 
2371
			error("array under-run in %s(\"%s\") in %s argument %d\n",
-
 
2372
			      Fort ? ".Fortran" : ".C",
-
 
2373
			      symName, type2char(type), na+1);
-
 
2374
	    }
-
 
2375
	    break;
-
 
2376
	case LGLSXP:
-
 
2377
	    if (copy) {
-
 
2378
		s = allocVector(type, n);
-
 
2379
		unsigned char *ptr = (unsigned char *) p;
-
 
2380
		int *iptr = (int*) ptr, tmp;
-
 
2381
		for (R_xlen_t i = 0 ; i < n ; i++) {
-
 
2382
		    tmp =  iptr[i];
-
 
2383
		    LOGICAL(s)[i] = (tmp == NA_INTEGER || tmp == 0) ? tmp : 1;
2361
		}
2384
		}
2362
		break;
-
 
2363
	    case INTSXP:
-
 
2364
		if (copy) {
-
 
2365
		    s = allocVector(type, n);
-
 
2366
		    unsigned char *ptr = (unsigned char *) p;
-
 
2367
		    memcpy(INTEGER(s), ptr, n * sizeof(int));
-
 
2368
		    ptr += n * sizeof(int);
2385
		ptr += n * sizeof(int);
2369
		    for (int i = 0; i < NG; i++)
2386
		for (int i = 0; i < NG;  i++)
2370
			if(*ptr++ != FILL)
2387
		    if(*ptr++ != FILL)
2371
			    error("array over-run in %s(\"%s\") in %s argument %d\n",
2388
			error("array over-run in %s(\"%s\") in %s argument %d\n",
2372
				  Fort ? ".Fortran" : ".C",
2389
			      Fort ? ".Fortran" : ".C",
2373
				  symName, type2char(type), na+1);
2390
			      symName, type2char(type), na+1);
2374
		    ptr = (unsigned char *) p;
2391
		ptr = (unsigned char *) p;
2375
		    for (int i = 0; i < NG; i++)
2392
		for (int i = 0; i < NG; i++)
2376
			if(*--ptr != FILL)
2393
		    if(*--ptr != FILL)
2377
			    error("array under-run in %s(\"%s\") in %s argument %d\n",
2394
			error("array under-run in %s(\"%s\") in %s argument %d\n",
2378
				  Fort ? ".Fortran" : ".C",
2395
			      Fort ? ".Fortran" : ".C",
2379
				  symName, type2char(type), na+1);
2396
			      symName, type2char(type), na+1);
-
 
2397
	    } else {
-
 
2398
		int *iptr = INTEGER(arg), tmp;
-
 
2399
		for (R_xlen_t i = 0 ; i < n ; i++) {
-
 
2400
		    tmp =  iptr[i];
-
 
2401
		    iptr[i] = (tmp == NA_INTEGER || tmp == 0) ? tmp : 1;
2380
		}
2402
		}
-
 
2403
	    }
2381
		break;
2404
	    break;
2382
	    case LGLSXP:
2405
	case REALSXP:
-
 
2406
	case SINGLESXP:
2383
		if (copy) {
2407
	    if (copy) {
2384
		    s = allocVector(type, n);
2408
		s = allocVector(REALSXP, n);
-
 
2409
		if (type == SINGLESXP || asLogical(getAttrib(arg, CSingSymbol)) == 1) {
-
 
2410
		    float *sptr = (float*) p;
-
 
2411
		    for(R_xlen_t i = 0 ; i < n ; i++)
-
 
2412
			REAL(s)[i] = (double) sptr[i];
-
 
2413
		} else {
2385
		    unsigned char *ptr = (unsigned char *) p;
2414
		    unsigned char *ptr = (unsigned char *) p;
2386
		    int *iptr = (int*) ptr, tmp;
-
 
2387
		    for (R_xlen_t i = 0 ; i < n ; i++) {
2415
		    memcpy(REAL(s), ptr, n * sizeof(double));
2388
			tmp =  iptr[i];
-
 
2389
			LOGICAL(s)[i] = (tmp == NA_INTEGER || tmp == 0) ? tmp : 1;
-
 
2390
		    }
-
 
2391
		    ptr += n * sizeof(int);
2416
		    ptr += n * sizeof(double);
2392
		    for (int i = 0; i < NG;  i++)
2417
		    for (int i = 0; i < NG; i++)
2393
			if(*ptr++ != FILL)
2418
			if(*ptr++ != FILL)
2394
			    error("array over-run in %s(\"%s\") in %s argument %d\n",
2419
			    error("array over-run in %s(\"%s\") in %s argument %d\n",
2395
				  Fort ? ".Fortran" : ".C",
2420
				  Fort ? ".Fortran" : ".C",
2396
				  symName, type2char(type), na+1);
2421
				  symName, type2char(type), na+1);
2397
		    ptr = (unsigned char *) p;
2422
		    ptr = (unsigned char *) p;
2398
		    for (int i = 0; i < NG; i++)
2423
		    for (int i = 0; i < NG; i++)
2399
			if(*--ptr != FILL)
2424
			if(*--ptr != FILL)
2400
			    error("array under-run in %s(\"%s\") in %s argument %d\n",
2425
			    error("array under-run in %s(\"%s\") in %s argument %d\n",
2401
				  Fort ? ".Fortran" : ".C",
2426
				  Fort ? ".Fortran" : ".C",
2402
				  symName, type2char(type), na+1);
2427
				  symName, type2char(type), na+1);
2403
		} else {
-
 
2404
		    int *iptr = INTEGER(arg), tmp;
-
 
2405
		    for (R_xlen_t i = 0 ; i < n ; i++) {
-
 
2406
			tmp =  iptr[i];
-
 
2407
			iptr[i] = (tmp == NA_INTEGER || tmp == 0) ? tmp : 1;
-
 
2408
		    }
-
 
2409
		}
2428
		}
2410
		break;
-
 
2411
	    case REALSXP:
2429
	    } else {
2412
	    case SINGLESXP:
2430
		if (type == SINGLESXP || asLogical(getAttrib(arg, CSingSymbol)) == 1) {
2413
		if (copy) {
-
 
2414
		    s = allocVector(REALSXP, n);
2431
		    s = allocVector(REALSXP, n);
2415
		    if (type == SINGLESXP || asLogical(getAttrib(arg, CSingSymbol)) == 1) {
-
 
2416
			float *sptr = (float*) p;
2432
		    float *sptr = (float*) p;
2417
			for(R_xlen_t i = 0 ; i < n ; i++)
-
 
2418
			    REAL(s)[i] = (double) sptr[i];
-
 
2419
		    } else {
-
 
2420
			unsigned char *ptr = (unsigned char *) p;
-
 
2421
			memcpy(REAL(s), ptr, n * sizeof(double));
-
 
2422
			ptr += n * sizeof(double);
-
 
2423
			for (int i = 0; i < NG; i++)
-
 
2424
			    if(*ptr++ != FILL)
-
 
2425
				error("array over-run in %s(\"%s\") in %s argument %d\n",
-
 
2426
				      Fort ? ".Fortran" : ".C",
-
 
2427
				      symName, type2char(type), na+1);
-
 
2428
			ptr = (unsigned char *) p;
-
 
2429
			for (int i = 0; i < NG; i++)
-
 
2430
			    if(*--ptr != FILL)
-
 
2431
				error("array under-run in %s(\"%s\") in %s argument %d\n",
-
 
2432
				      Fort ? ".Fortran" : ".C",
-
 
2433
				      symName, type2char(type), na+1);
-
 
2434
		    }
-
 
2435
		} else {
-
 
2436
		    if (type == SINGLESXP || asLogical(getAttrib(arg, CSingSymbol)) == 1) {
-
 
2437
			s = allocVector(REALSXP, n);
-
 
2438
			float *sptr = (float*) p;
-
 
2439
			for(int i = 0 ; i < n ; i++)
2433
		    for(int i = 0 ; i < n ; i++)
2440
			    REAL(s)[i] = (double) sptr[i];
2434
			REAL(s)[i] = (double) sptr[i];
2441
		    }
-
 
2442
		}
-
 
2443
		break;
-
 
2444
	    case CPLXSXP:
-
 
2445
		if (copy) {
-
 
2446
		    s = allocVector(type, n);
-
 
2447
		    unsigned char *ptr = (unsigned char *) p;
-
 
2448
		    memcpy(COMPLEX(s), p, n * sizeof(Rcomplex));
-
 
2449
		    ptr += n * sizeof(Rcomplex);
-
 
2450
		    for (int i = 0; i < NG;  i++)
-
 
2451
			if(*ptr++ != FILL)
-
 
2452
			    error("array over-run in %s(\"%s\") in %s argument %d\n",
-
 
2453
				  Fort ? ".Fortran" : ".C",
-
 
2454
				  symName, type2char(type), na+1);
-
 
2455
		    ptr = (unsigned char *) p;
-
 
2456
		    for (int i = 0; i < NG; i++)
-
 
2457
			if(*--ptr != FILL)
-
 
2458
			    error("array under-run in %s(\"%s\") in %s argument %d\n",
-
 
2459
				  Fort ? ".Fortran" : ".C",
-
 
2460
				  symName, type2char(type), na+1);
-
 
2461
		}
2435
		}
-
 
2436
	    }
2462
		break;
2437
	    break;
-
 
2438
	case CPLXSXP:
-
 
2439
	    if (copy) {
-
 
2440
		s = allocVector(type, n);
-
 
2441
		unsigned char *ptr = (unsigned char *) p;
-
 
2442
		memcpy(COMPLEX(s), p, n * sizeof(Rcomplex));
-
 
2443
		ptr += n * sizeof(Rcomplex);
-
 
2444
		for (int i = 0; i < NG;  i++)
-
 
2445
		    if(*ptr++ != FILL)
-
 
2446
			error("array over-run in %s(\"%s\") in %s argument %d\n",
-
 
2447
			      Fort ? ".Fortran" : ".C",
-
 
2448
			      symName, type2char(type), na+1);
-
 
2449
		ptr = (unsigned char *) p;
-
 
2450
		for (int i = 0; i < NG; i++)
-
 
2451
		    if(*--ptr != FILL)
-
 
2452
			error("array under-run in %s(\"%s\") in %s argument %d\n",
-
 
2453
			      Fort ? ".Fortran" : ".C",
-
 
2454
			      symName, type2char(type), na+1);
-
 
2455
	    }
-
 
2456
	    break;
2463
	    case STRSXP:
2457
	case STRSXP:
2464
		if(Fort) {
2458
	    if(Fort) {
2465
		    char buf[256];
2459
		char buf[256];
2466
		    /* only return one string: warned on the R -> Fortran step */
2460
		/* only return one string: warned on the R -> Fortran step */
2467
		    strncpy(buf, (char*)p, 255);
2461
		strncpy(buf, (char*)p, 255);
2468
		    buf[255] = '\0';
2462
		buf[255] = '\0';
2469
		    PROTECT(s = allocVector(type, 1));
2463
		PROTECT(s = allocVector(type, 1));
2470
		    SET_STRING_ELT(s, 0, mkChar(buf));
2464
		SET_STRING_ELT(s, 0, mkChar(buf));
2471
		    UNPROTECT(1);
2465
		UNPROTECT(1);
2472
		} else if (copy) {
2466
	    } else if (copy) {
2473
		    SEXP ss = arg;
2467
		SEXP ss = arg;
2474
		    PROTECT(s = allocVector(type, n));
2468
		PROTECT(s = allocVector(type, n));
2475
		    char **cptr = (char**) p, **cptr0 = (char**) cargs0[na];
2469
		char **cptr = (char**) p, **cptr0 = (char**) cargs0[na];
2476
		    for (R_xlen_t i = 0 ; i < n ; i++) {
2470
		for (R_xlen_t i = 0 ; i < n ; i++) {
2477
			unsigned char *ptr = (unsigned char *) cptr[i];
2471
		    unsigned char *ptr = (unsigned char *) cptr[i];
2478
			SET_STRING_ELT(s, i, mkChar(cptr[i]));
2472
		    SET_STRING_ELT(s, i, mkChar(cptr[i]));
2479
			if (cptr[i] == cptr0[i]) {
2473
		    if (cptr[i] == cptr0[i]) {
2480
			    const char *z = translateChar(STRING_ELT(ss, i));
2474
			const char *z = translateChar(STRING_ELT(ss, i));
2481
			    for (int j = 0; j < NG; j++)
2475
			for (int j = 0; j < NG; j++)
2482
				if(*--ptr != FILL)
2476
			    if(*--ptr != FILL)
2483
				    error("array under-run in .C(\"%s\") in character argument %d, element %d",
2477
				error("array under-run in .C(\"%s\") in character argument %d, element %d",
2484
					  symName, na+1, (int)(i+1));
2478
				      symName, na+1, (int)(i+1));
2485
			    ptr = (unsigned char *) cptr[i];
2479
			ptr = (unsigned char *) cptr[i];
2486
			    ptr += strlen(z) + 1;
2480
			ptr += strlen(z) + 1;
2487
			    for (int j = 0; j < NG;  j++)
2481
			for (int j = 0; j < NG;  j++)
2488
				if(*ptr++ != FILL) {
2482
			    if(*ptr++ != FILL) {
2489
				    // force termination
2483
				// force termination
2490
				    unsigned char *p = ptr;
2484
				unsigned char *p = ptr;
2491
				    for (int k = 1; k < NG - j; k++, p++)
2485
				for (int k = 1; k < NG - j; k++, p++)
2492
					if (*p == FILL) *p = '\0';
2486
				    if (*p == FILL) *p = '\0';
2493
				    error("array over-run in .C(\"%s\") in character argument %d, element %d\n'%s'->'%s'\n",
2487
				error("array over-run in .C(\"%s\") in character argument %d, element %d\n'%s'->'%s'\n",
2494
					  symName, na+1, (int)(i+1),
2488
				      symName, na+1, (int)(i+1),
2495
					  z, cptr[i]);
2489
				      z, cptr[i]);
2496
				}
2490
			    }
2497
			}
-
 
2498
		    }
2491
		    }
2499
		    UNPROTECT(1);
-
 
2500
		} else {
-
 
2501
		    PROTECT(s = allocVector(type, n));
-
 
2502
		    char **cptr = (char**) p;
-
 
2503
		    for (R_xlen_t i = 0 ; i < n ; i++)
-
 
2504
			SET_STRING_ELT(s, i, mkChar(cptr[i]));
-
 
2505
		    UNPROTECT(1);
-
 
2506
		}
2492
		}
2507
		break;
2493
		UNPROTECT(1);
2508
	    default:
2494
	    } else {
2509
		break;
-
 
2510
	    }
-
 
2511
	    if (s != arg) {
2495
		PROTECT(s = allocVector(type, n));
2512
		PROTECT(s);
2496
		char **cptr = (char**) p;
2513
		SHALLOW_DUPLICATE_ATTRIB(s, arg);
2497
		for (R_xlen_t i = 0 ; i < n ; i++)
2514
		SET_VECTOR_ELT(ans, na, s);
2498
		    SET_STRING_ELT(s, i, mkChar(cptr[i]));
2515
		UNPROTECT(1);
2499
		UNPROTECT(1);
2516
	    }
2500
	    }
-
 
2501
	    break;
-
 
2502
	default:
-
 
2503
	    break;
-
 
2504
	}
-
 
2505
	if (s != arg) {
-
 
2506
	    PROTECT(s);
-
 
2507
	    SHALLOW_DUPLICATE_ATTRIB(s, arg);
-
 
2508
	    SET_VECTOR_ELT(ans, na, s);
-
 
2509
	    UNPROTECT(1);
2517
	}
2510
	}
2518
    }
2511
    }
2519
    UNPROTECT(1);
2512
    UNPROTECT(1);
2520
    vmaxset(vmax);
2513
    vmaxset(vmax);
2521
    return ans;
2514
    return ans;