summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-02-14 19:50:32 (GMT)
committerGuido van Rossum <guido@python.org>1997-02-14 19:50:32 (GMT)
commit775af9191149059bf5ebfcda6dd9bf0251ce511a (patch)
tree66cf34fc0ca605b6d073e7869461c052204c296c /Modules
parent7433b12a5ca8c1c6a6685160edb09efbf61c4544 (diff)
downloadcpython-775af9191149059bf5ebfcda6dd9bf0251ce511a.zip
cpython-775af9191149059bf5ebfcda6dd9bf0251ce511a.tar.gz
cpython-775af9191149059bf5ebfcda6dd9bf0251ce511a.tar.bz2
My version of Lee Busby's patches to make '-i' pretend stdin is a tty
even if it isn't. Changes: - set the global flag Py_InteractiveFlag when -i is given - call Py_FdIsInteractive() instead of isatty() - make stdin unbuffered, too, when using -u - make stdin and stdout line buffered, when stdin is interactive and not -u Note that setting the environment variable PYTHONINSPECT does not have these extra effects of -i. (Should it?) Unlike Lee's changes, I don't set change the prompt to go to stderr when -i is given.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/main.c57
1 files changed, 35 insertions, 22 deletions
diff --git a/Modules/main.c b/Modules/main.c
index 789f764..19c3e1d 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -59,22 +59,22 @@ static char *argv0;
static char **orig_argv;
static int orig_argc;
-
/* Short usage message (with %s for argv0) */
static char *usage_line =
-"usage: %s [-d] [-i] [-s] [-u ] [-v] [-c cmd | file | -] [arg] ...\n";
+"usage: %s [-d] [-i] [-s] [-u] [-v] [-c cmd | file | -] [arg] ...\n";
/* Long usage message, split into parts < 512 bytes */
static char *usage_top = "\n\
Options and arguments (and corresponding environment variables):\n\
-d : debug output from parser (also PYTHONDEBUG=x)\n\
--i : inspect interactively after running script (also PYTHONINSPECT=x)\n\
+-i : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
+ and force prompts, even if stdin does not appear to be a terminal.\n\
-s : suppress printing of top level expressions (also PYTHONSUPPRESS=x)\n\
-u : unbuffered stdout and stderr (also PYTHONUNBUFFERED=x)\n\
-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
--c cmd : program passed in as string (terminates option list)\n\
";
static char *usage_bot = "\
+-c cmd : program passed in as string (terminates option list)\n\
file : program read from script file\n\
- : program read from stdin (default; interactive mode if a tty)\n\
arg ...: arguments passed to program in sys.argv[1:]\n\
@@ -101,6 +101,7 @@ main(argc, argv)
char *p;
int inspect = 0;
int unbuffered = 0;
+ int stdin_is_interactive = 0;
orig_argc = argc; /* For Py_GetArgcArgv() */
orig_argv = argv;
@@ -139,6 +140,7 @@ main(argc, argv)
case 'i':
inspect++;
+ Py_InteractiveFlag++;
break;
case 's':
@@ -165,38 +167,48 @@ main(argc, argv)
}
}
+ if (command == NULL && optind < argc &&
+ strcmp(argv[optind], "-") != 0)
+ {
+ filename = argv[optind];
+ if (filename != NULL) {
+ if ((fp = fopen(filename, "r")) == NULL) {
+ fprintf(stderr, "%s: can't open file '%s'\n",
+ argv[0], filename);
+ exit(2);
+ }
+ }
+ }
+
+ stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
+
if (unbuffered) {
#ifdef MS_WINDOWS
_setmode(fileno(stdin), O_BINARY);
_setmode(fileno(stdout), O_BINARY);
#endif
#ifndef MPW
- setbuf(stdout, (char *)NULL);
- setbuf(stderr, (char *)NULL);
+ setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
+ setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
+ setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
#else
/* On MPW (3.2) unbuffered seems to hang */
+ setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
#endif
}
-
- if (command == NULL && optind < argc &&
- strcmp(argv[optind], "-") != 0)
- filename = argv[optind];
+ else if (stdin_is_interactive) {
+ setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
+ setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
+ /* Leave stderr alone - it should be unbuffered anyway. */
+ }
if (Py_VerboseFlag ||
- (command == NULL && filename == NULL && isatty((int)fileno(fp))))
+ command == NULL && filename == NULL && stdin_is_interactive)
fprintf(stderr, "Python %s\n%s\n",
Py_GetVersion(), Py_GetCopyright());
- if (filename != NULL) {
- if ((fp = fopen(filename, "r")) == NULL) {
- fprintf(stderr, "%s: can't open file '%s'\n",
- argv[0], filename);
- exit(2);
- }
- }
-
Py_Initialize();
if (command != NULL) {
@@ -211,7 +223,7 @@ main(argc, argv)
sts = PyRun_SimpleString(command) != 0;
}
else {
- if (filename == NULL && isatty((int)fileno(fp))) {
+ if (filename == NULL && stdin_is_interactive) {
char *startup = getenv("PYTHONSTARTUP");
if (startup != NULL && startup[0] != '\0') {
FILE *fp = fopen(startup, "r");
@@ -223,12 +235,13 @@ main(argc, argv)
}
}
sts = PyRun_AnyFile(
- fp, filename == NULL ? "<stdin>" : filename) != 0;
+ fp,
+ filename == NULL ? "<stdin>" : filename) != 0;
if (filename != NULL)
fclose(fp);
}
- if (inspect && isatty((int)fileno(stdin)) &&
+ if (inspect && stdin_is_interactive &&
(filename != NULL || command != NULL))
sts = PyRun_AnyFile(stdin, "<stdin>") != 0;