The R Project SVN R

Rev

Rev 85625 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 85625 Rev 85648
Line 253... Line 253...
253
    const char *fout = "", *ferr = "";
253
    const char *fout = "", *ferr = "";
254
    int   vis = 0, flag = 2, i = 0, j, ll = 0;
254
    int   vis = 0, flag = 2, i = 0, j, ll = 0;
255
    SEXP  cmd, fin, Stdout, Stderr, tlist = R_NilValue, tchar, rval;
255
    SEXP  cmd, fin, Stdout, Stderr, tlist = R_NilValue, tchar, rval;
256
    PROTECT_INDEX ti;
256
    PROTECT_INDEX ti;
257
    int timeout = 0, timedout = 0, consignals = 0;
257
    int timeout = 0, timedout = 0, consignals = 0;
-
 
258
    const void *vmax = vmaxget();
258
 
259
 
259
    checkArity(op, args);
260
    checkArity(op, args);
260
    cmd = CAR(args);
261
    cmd = CAR(args);
261
    if (!isString(cmd) || LENGTH(cmd) != 1)
262
    if (!isString(cmd) || LENGTH(cmd) != 1)
262
	errorcall(call, _("character string expected as first argument"));
263
	errorcall(call, _("character string expected as first argument"));
Line 292... Line 293...
292
	   standard handles -- but users might well not expect that.
293
	   standard handles -- but users might well not expect that.
293
	*/
294
	*/
294
	SetStdHandle(STD_INPUT_HANDLE, INVALID_HANDLE_VALUE);
295
	SetStdHandle(STD_INPUT_HANDLE, INVALID_HANDLE_VALUE);
295
	SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE);
296
	SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE);
296
	SetStdHandle(STD_ERROR_HANDLE, INVALID_HANDLE_VALUE);
297
	SetStdHandle(STD_ERROR_HANDLE, INVALID_HANDLE_VALUE);
-
 
298
	if (TYPEOF(Stdout) == STRSXP)
297
	if (TYPEOF(Stdout) == STRSXP) fout = CHAR(STRING_ELT(Stdout, 0));
299
	    fout = translateCharFP(STRING_ELT(Stdout, 0));
-
 
300
	if (TYPEOF(Stderr) == STRSXP)
298
	if (TYPEOF(Stderr) == STRSXP) ferr = CHAR(STRING_ELT(Stderr, 0));
301
	    ferr = translateCharFP(STRING_ELT(Stderr, 0));
299
    } else {
302
    } else {
300
	if (flag == 2) flag = 1; /* ignore std.output.on.console */
303
	if (flag == 2) flag = 1; /* ignore std.output.on.console */
-
 
304
	if (TYPEOF(Stdout) == STRSXP)
301
	if (TYPEOF(Stdout) == STRSXP) fout = CHAR(STRING_ELT(Stdout, 0));
305
	    fout = translateCharFP(STRING_ELT(Stdout, 0));
302
	else if (asLogical(Stdout) == 0) fout = NULL;
306
	else if (asLogical(Stdout) == 0)
-
 
307
	    fout = NULL;
-
 
308
	if (TYPEOF(Stderr) == STRSXP)
303
	if (TYPEOF(Stderr) == STRSXP) ferr = CHAR(STRING_ELT(Stderr, 0));
309
	    ferr = translateCharFP(STRING_ELT(Stderr, 0));
304
	else if (asLogical(Stderr) == 0) ferr = NULL;
310
	else if (asLogical(Stderr) == 0)
-
 
311
	    ferr = NULL;
305
    }
312
    }
306
 
313
 
307
    if (flag < 2) { /* Neither intern = TRUE nor
314
    if (flag < 2) { /* Neither intern = TRUE nor
308
		       show.output.on.console for Rgui */
315
		       show.output.on.console for Rgui */
309
	ll = runcmd_timeout(CHAR(STRING_ELT(cmd, 0)),
316
	ll = runcmd_timeout(translateCharFP(STRING_ELT(cmd, 0)),
310
		    getCharCE(STRING_ELT(cmd, 0)),
317
		    CE_NATIVE,
311
		    flag, vis, CHAR(STRING_ELT(fin, 0)), fout, ferr,
318
		    flag, vis, translateCharFP(STRING_ELT(fin, 0)), fout, ferr,
312
		    timeout, &timedout, consignals);
319
		    timeout, &timedout, consignals);
313
	if (ll == NOLAUNCH) warning("%s", runerror());
320
	if (ll == NOLAUNCH) warning("%s", runerror());
314
    } else {
321
    } else {
315
	/* read stdout +/- stderr from pipe */
322
	/* read stdout +/- stderr from pipe */
316
	int m = -1;
323
	int m = -1;
Line 324... Line 331...
324
	    m = (m == 2) ? 3 : 0;
331
	    m = (m == 2) ? 3 : 0;
325
	if (m == -1)
332
	if (m == -1)
326
	    /* does not happen with system()/system2() */
333
	    /* does not happen with system()/system2() */
327
	    error(_("invalid %s argument"), "flag");
334
	    error(_("invalid %s argument"), "flag");
328
 
335
 
329
	fp = rpipeOpen(CHAR(STRING_ELT(cmd, 0)), getCharCE(STRING_ELT(cmd, 0)),
336
	fp = rpipeOpen(translateCharFP(STRING_ELT(cmd, 0)), CE_NATIVE,
330
		       vis, CHAR(STRING_ELT(fin, 0)), m, fout, ferr, timeout, 0);
337
		       vis, translateCharFP(STRING_ELT(fin, 0)), m, fout, ferr,
-
 
338
	               timeout, 0);
331
	if (!fp) {
339
	if (!fp) {
332
	    /* If intern = TRUE generate an error */
340
	    /* If intern = TRUE generate an error */
333
	    if (flag == 3) error("%s", runerror());
341
	    if (flag == 3) error("%s", runerror());
334
	    ll = NOLAUNCH;
342
	    ll = NOLAUNCH;
335
	} else {
343
	} else {
Line 349... Line 357...
349
	}
357
	}
350
    }
358
    }
351
    if (timedout) {
359
    if (timedout) {
352
	ll = 124;
360
	ll = 124;
353
	warning(_("command '%s' timed out after %ds"),
361
	warning(_("command '%s' timed out after %ds"),
354
	        CHAR(STRING_ELT(cmd, 0)), timeout);
362
	        translateChar(STRING_ELT(cmd, 0)), timeout);
355
    } else if (flag == 3 && ll) {
363
    } else if (flag == 3 && ll) {
356
	warning(_("running command '%s' had status %d"), 
364
	warning(_("running command '%s' had status %d"), 
357
	        CHAR(STRING_ELT(cmd, 0)), ll);
365
	        translateChar(STRING_ELT(cmd, 0)), ll);
358
    }
366
    }
359
    if (flag == 3) { /* intern = TRUE: convert pairlist to list */
367
    if (flag == 3) { /* intern = TRUE: convert pairlist to list */
360
	PROTECT(rval = allocVector(STRSXP, i));
368
	PROTECT(rval = allocVector(STRSXP, i));
361
	for (j = (i - 1); j >= 0; j--) {
369
	for (j = (i - 1); j >= 0; j--) {
362
	    SET_STRING_ELT(rval, j, CAR(tlist));
370
	    SET_STRING_ELT(rval, j, CAR(tlist));
Line 364... Line 372...
364
	}
372
	}
365
	if(ll) {
373
	if(ll) {
366
	    SEXP lsym = install("status");
374
	    SEXP lsym = install("status");
367
	    setAttrib(rval, lsym, ScalarInteger(ll));
375
	    setAttrib(rval, lsym, ScalarInteger(ll));
368
	}
376
	}
-
 
377
	vmaxset(vmax);
369
	UNPROTECT(2); /* tlist, rval */
378
	UNPROTECT(2); /* tlist, rval */
370
	return rval;
379
	return rval;
371
    } else {
380
    } else {
-
 
381
	vmaxset(vmax);
372
	rval = ScalarInteger(ll);
382
	rval = ScalarInteger(ll);
373
	R_Visible = 0;
383
	R_Visible = 0;
374
	return rval;
384
	return rval;
375
    }
385
    }
376
}
386
}