The R Project SVN R

Rev

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

Rev 28349 Rev 28357
Line 458... Line 458...
458
}
458
}
459
 
459
 
460
/* vector(mode="logical", length=0) */
460
/* vector(mode="logical", length=0) */
461
SEXP do_makevector(SEXP call, SEXP op, SEXP args, SEXP rho)
461
SEXP do_makevector(SEXP call, SEXP op, SEXP args, SEXP rho)
462
{
462
{
463
    int len, i;
463
    R_len_t len, i;
464
    SEXP s;
464
    SEXP s;
465
    SEXPTYPE mode;
465
    SEXPTYPE mode;
466
    checkArity(op, args);
466
    checkArity(op, args);
467
    len = asInteger(CADR(args));
467
    len = asVecSize(CADR(args));
468
    if (len == NA_INTEGER) /* is < 0 */
-
 
469
	error("vector: invalid length value (too large or NA)");
-
 
470
    if (len < 0)
-
 
471
	error("vector: invalid length value (< 0)");
-
 
472
    s = coerceVector(CAR(args), STRSXP);
468
    s = coerceVector(CAR(args), STRSXP);
473
    if (length(s) == 0)
469
    if (length(s) == 0)
474
	error("vector: zero-length type argument");
470
	error("vector: zero-length type argument");
475
    mode = str2type(CHAR(STRING_ELT(s, 0)));
471
    mode = str2type(CHAR(STRING_ELT(s, 0)));
476
    if (mode == -1 && streql(CHAR(STRING_ELT(s, 0)), "double"))
472
    if (mode == -1 && streql(CHAR(STRING_ELT(s, 0)), "double"))
Line 510... Line 506...
510
 
506
 
511
/* do_lengthgets: assign a length to a vector or a list */
507
/* do_lengthgets: assign a length to a vector or a list */
512
/* (if it is vectorizable). We could probably be fairly */
508
/* (if it is vectorizable). We could probably be fairly */
513
/* clever with memory here if we wanted to. */
509
/* clever with memory here if we wanted to. */
514
 
510
 
515
SEXP lengthgets(SEXP x, int len)
511
SEXP lengthgets(SEXP x, R_len_t len)
516
{
512
{
517
    int lenx, i;
513
    R_len_t lenx, i;
518
    SEXP rval, names, xnames, t;
514
    SEXP rval, names, xnames, t;
519
    if (!isVector(x) && !isVectorizable(x))
515
    if (!isVector(x) && !isVectorizable(x))
520
	error("can not set length of non-vector");
516
	error("can not set length of non-vector");
521
    lenx = length(x);
517
    lenx = length(x);
522
    if (lenx == len)
518
    if (lenx == len)
Line 591... Line 587...
591
}
587
}
592
 
588
 
593
 
589
 
594
SEXP do_lengthgets(SEXP call, SEXP op, SEXP args, SEXP rho)
590
SEXP do_lengthgets(SEXP call, SEXP op, SEXP args, SEXP rho)
595
{
591
{
596
    int len;
592
    R_len_t len;
597
    SEXP x;
593
    SEXP x;
598
    checkArity(op, args);
594
    checkArity(op, args);
599
    x = CAR(args);
595
    x = CAR(args);
600
    if (!isVector(x) && !isVectorizable(x))
596
    if (!isVector(x) && !isVectorizable(x))
601
       error("length<- invalid first argument");
597
       error("length<- invalid first argument");
602
    if (length(CADR(args)) != 1)
598
    if (length(CADR(args)) != 1)
603
       error("length<- invalid second argument");
599
       error("length<- invalid second argument");
604
    len = asInteger(CADR(args));
600
    len = asVecSize(CADR(args));
605
    if (len == NA_INTEGER)
601
    if (len == NA_INTEGER)
606
       error("length<- missing value for length");
602
       error("length<- missing value for length");
607
    return lengthgets(x, len);
603
    return lengthgets(x, len);
608
}
604
}
609
 
605