The R Project SVN R

Rev

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

Rev 76844 Rev 76872
Line 293... Line 293...
293
{
293
{
294
    size_t after;
294
    size_t after;
295
    size_t before = strlen(dest);
295
    size_t before = strlen(dest);
296
 
296
 
297
    strncat(dest, src, n);
297
    strncat(dest, src, n);
298
    
298
 
299
    after = strlen(dest);
299
    after = strlen(dest);
300
    if (after - before == n)
300
    if (after - before == n)
301
	/* the string may have been truncated, but we cannot know for sure
301
	/* the string may have been truncated, but we cannot know for sure
302
	   because str may not be null terminated */
302
	   because str may not be null terminated */
303
	mbcsTruncateToValid(dest + before);
303
	mbcsTruncateToValid(dest + before);
Line 348... Line 348...
348
 
348
 
349
    va_list(ap);
349
    va_list(ap);
350
    va_start(ap, format);
350
    va_start(ap, format);
351
    size_t psize;
351
    size_t psize;
352
    int pval;
352
    int pval;
353
    
353
 
354
    psize = min(BUFSIZE, R_WarnLength+1);
354
    psize = min(BUFSIZE, R_WarnLength+1);
355
    pval = Rvsnprintf(buf, psize, format, ap);
355
    pval = Rvsnprintf(buf, psize, format, ap);
356
    va_end(ap);
356
    va_end(ap);
357
    p = buf + strlen(buf) - 1;
357
    p = buf + strlen(buf) - 1;
358
    if(strlen(buf) > 0 && *p == '\n') *p = '\0';
358
    if(strlen(buf) > 0 && *p == '\n') *p = '\0';
Line 1006... Line 1006...
1006
	/* write traceback if requested, unless we're already doing it
1006
	/* write traceback if requested, unless we're already doing it
1007
	   or there is an inconsistency between inError and oldInError
1007
	   or there is an inconsistency between inError and oldInError
1008
	   (which should not happen) */
1008
	   (which should not happen) */
1009
	if (traceback && inError < 2 && inError == oldInError) {
1009
	if (traceback && inError < 2 && inError == oldInError) {
1010
	    inError = 2;
1010
	    inError = 2;
1011
	    PROTECT(s = R_GetTraceback(0));
1011
	    PROTECT(s = R_GetTracebackOnly(0));
1012
	    SET_SYMVALUE(install(".Traceback"), s);
1012
	    SET_SYMVALUE(install(".Traceback"), s);
1013
	    /* should have been defineVar
1013
	    /* should have been defineVar
1014
	       setVar(install(".Traceback"), s, R_GlobalEnv); */
1014
	       setVar(install(".Traceback"), s, R_GlobalEnv); */
1015
	    UNPROTECT(1);
1015
	    UNPROTECT(1);
1016
	    inError = oldInError;
1016
	    inError = oldInError;
Line 1438... Line 1438...
1438
    if( R_ShowErrorMessages && R_CollectWarnings ) {
1438
    if( R_ShowErrorMessages && R_CollectWarnings ) {
1439
	REprintf(_("In addition: "));
1439
	REprintf(_("In addition: "));
1440
	PrintWarnings();
1440
	PrintWarnings();
1441
    }
1441
    }
1442
}
1442
}
1443
 
1443
/*
-
 
1444
 * Return the traceback without deparsing the calls
-
 
1445
 */
1444
attribute_hidden
1446
attribute_hidden
1445
SEXP R_GetTraceback(int skip)
1447
SEXP R_GetTracebackOnly(int skip)
1446
{
1448
{
1447
    int nback = 0, ns;
1449
    int nback = 0, ns;
1448
    RCNTXT *c;
1450
    RCNTXT *c;
1449
    SEXP s, t;
1451
    SEXP s, t;
1450
 
1452
 
Line 1465... Line 1467...
1465
	 c = c->nextcontext)
1467
	 c = c->nextcontext)
1466
	if (c->callflag & (CTXT_FUNCTION | CTXT_BUILTIN) ) {
1468
	if (c->callflag & (CTXT_FUNCTION | CTXT_BUILTIN) ) {
1467
	    if (skip > 0)
1469
	    if (skip > 0)
1468
		skip--;
1470
		skip--;
1469
	    else {
1471
	    else {
1470
		SETCAR(t, deparse1m(c->call, 0, DEFAULTDEPARSE));
1472
		SETCAR(t, duplicate(c->call));
1471
		if (c->srcref && !isNull(c->srcref)) {
1473
		if (c->srcref && !isNull(c->srcref)) {
1472
		    SEXP sref;
1474
		    SEXP sref;
1473
		    if (c->srcref == R_InBCInterpreter)
1475
		    if (c->srcref == R_InBCInterpreter)
1474
			sref = R_findBCInterpreterSrcref(c);
1476
			sref = R_findBCInterpreterSrcref(c);
1475
		    else
1477
		    else
Line 1480... Line 1482...
1480
	    }
1482
	    }
1481
	}
1483
	}
1482
    UNPROTECT(1);
1484
    UNPROTECT(1);
1483
    return s;
1485
    return s;
1484
}
1486
}
-
 
1487
/*
-
 
1488
 * Return the traceback with calls deparsed
-
 
1489
 */
-
 
1490
attribute_hidden
-
 
1491
SEXP R_GetTraceback(int skip)
-
 
1492
{
-
 
1493
    int nback = 0;
-
 
1494
    SEXP s, t, u, v;
-
 
1495
    s = PROTECT(R_GetTracebackOnly(skip));
-
 
1496
    for(t = s; t != R_NilValue; t = CDR(t)) nback++;
-
 
1497
    u = v = PROTECT(allocList(nback));
-
 
1498
 
-
 
1499
    for(t = s; t != R_NilValue; t = CDR(t), v=CDR(v)) {
-
 
1500
        SETCAR(v, PROTECT(deparse1m(CAR(t), 0, DEFAULTDEPARSE)));
-
 
1501
        UNPROTECT(1);
-
 
1502
    }
-
 
1503
    UNPROTECT(2);
-
 
1504
    return u;
-
 
1505
}
1485
 
1506
 
1486
SEXP attribute_hidden do_traceback(SEXP call, SEXP op, SEXP args, SEXP rho)
1507
SEXP attribute_hidden do_traceback(SEXP call, SEXP op, SEXP args, SEXP rho)
1487
{
1508
{
1488
    int skip;
1509
    int skip;
1489
 
1510