blob: 59db41ab1696319f58c84623647022be8a38aa21 [file] [log] [blame]
Guido van Rossum6fa63431993-12-24 10:36:57 +00001
Guido van Rossumfbd64c81997-02-18 21:53:32 +00002/* Readline interface for tokenizer.c and [raw_]input() in bltinmodule.c.
3 By default, or when stdin is not a tty device, we have a super
4 simple my_readline function using fgets.
5 Optionally, we can use the GNU readline library.
Guido van Rossum6fa63431993-12-24 10:36:57 +00006 my_readline() has a different return value from GNU readline():
7 - NULL if an interrupt occurred or if an error occurred
8 - a malloc'ed empty string if EOF was read
9 - a malloc'ed string ending in \n normally
10*/
11
Guido van Rossum8efa47b1998-08-27 19:43:43 +000012#include "Python.h"
Mark Hammond2f10cb82002-07-14 23:12:29 +000013#ifdef MS_WINDOWS
14#define WIN32_LEAN_AND_MEAN
15#include "windows.h"
16#endif /* MS_WINDOWS */
Guido van Rossum6fa63431993-12-24 10:36:57 +000017
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +000018#ifdef __VMS
19extern char* vms__StdioReadline(FILE *sys_stdin, FILE *sys_stdout, char *prompt);
20#endif
21
Michael W. Hudson30ea2f22004-07-07 17:44:12 +000022
23PyThreadState* _PyOS_ReadlineTState;
24
Tim Petersb7e898a2004-07-07 20:42:07 +000025#ifdef WITH_THREAD
Michael W. Hudson30ea2f22004-07-07 17:44:12 +000026#include "pythread.h"
27static PyThread_type_lock _PyOS_ReadlineLock = NULL;
28#endif
29
Thomas Wouters23c9e002000-07-22 19:20:54 +000030int (*PyOS_InputHook)(void) = NULL;
Guido van Rossumfbd64c81997-02-18 21:53:32 +000031
Guido van Rossum48a680c2001-03-02 06:34:14 +000032#ifdef RISCOS
33int Py_RISCOSWimpFlag;
34#endif
35
Guido van Rossumfbd64c81997-02-18 21:53:32 +000036/* This function restarts a fgets() after an EINTR error occurred
37 except if PyOS_InterruptOccurred() returns true. */
38
39static int
Thomas Wouters23c9e002000-07-22 19:20:54 +000040my_fgets(char *buf, int len, FILE *fp)
Guido van Rossumfbd64c81997-02-18 21:53:32 +000041{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000042 char *p;
Jesus Cead0f5f482012-07-03 13:07:58 +020043#ifdef MS_WINDOWS
Tim Golden47023362012-06-29 18:20:44 +010044 int i;
Jesus Cead0f5f482012-07-03 13:07:58 +020045#endif
46
Victor Stinner5de51ac2011-04-09 16:09:08 +020047 while (1) {
48 if (PyOS_InputHook != NULL)
49 (void)(PyOS_InputHook)();
50 errno = 0;
Victor Stinner08563d92011-05-30 23:44:13 +020051 clearerr(fp);
Victor Stinner5de51ac2011-04-09 16:09:08 +020052 p = fgets(buf, len, fp);
53 if (p != NULL)
54 return 0; /* No error */
Mark Hammond2f10cb82002-07-14 23:12:29 +000055#ifdef MS_WINDOWS
Tim Golden47023362012-06-29 18:20:44 +010056 /* Ctrl-C anywhere on the line or Ctrl-Z if the only character
57 on a line will set ERROR_OPERATION_ABORTED. Under normal
58 circumstances Ctrl-C will also have caused the SIGINT handler
59 to fire. This signal fires in another thread and is not
60 guaranteed to have occurred before this point in the code.
61
62 Therefore: check in a small loop to see if the trigger has
63 fired, in which case assume this is a Ctrl-C event. If it
64 hasn't fired within 10ms assume that this is a Ctrl-Z on its
65 own or that the signal isn't going to fire for some other
66 reason and drop through to check for EOF.
Antoine Pitrouc83ea132010-05-09 14:46:46 +000067 */
Victor Stinner5de51ac2011-04-09 16:09:08 +020068 if (GetLastError()==ERROR_OPERATION_ABORTED) {
Tim Golden47023362012-06-29 18:20:44 +010069 for (i = 0; i < 10; i++) {
70 if (PyOS_InterruptOccurred())
71 return 1;
72 Sleep(1);
Victor Stinner5de51ac2011-04-09 16:09:08 +020073 }
Victor Stinner5de51ac2011-04-09 16:09:08 +020074 }
75#endif /* MS_WINDOWS */
76 if (feof(fp)) {
Victor Stinner2c585f62011-05-10 00:22:59 +020077 clearerr(fp);
Victor Stinner5de51ac2011-04-09 16:09:08 +020078 return -1; /* EOF */
79 }
80#ifdef EINTR
81 if (errno == EINTR) {
82 int s;
83#ifdef WITH_THREAD
84 PyEval_RestoreThread(_PyOS_ReadlineTState);
85#endif
86 s = PyErr_CheckSignals();
87#ifdef WITH_THREAD
88 PyEval_SaveThread();
89#endif
90 if (s < 0)
91 return 1;
92 /* try again */
93 continue;
94 }
95#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +000096 if (PyOS_InterruptOccurred()) {
97 return 1; /* Interrupt */
98 }
Victor Stinner5de51ac2011-04-09 16:09:08 +020099 return -2; /* Error */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000100 }
Victor Stinner5de51ac2011-04-09 16:09:08 +0200101 /* NOTREACHED */
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000102}
103
104
105/* Readline implementation using fgets() */
106
107char *
Martin v. Löwis566f6af2002-10-26 14:39:10 +0000108PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, char *prompt)
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000109{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000110 size_t n;
111 char *p;
112 n = 100;
113 if ((p = (char *)PyMem_MALLOC(n)) == NULL)
114 return NULL;
115 fflush(sys_stdout);
Guido van Rossum48a680c2001-03-02 06:34:14 +0000116#ifndef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000117 if (prompt)
118 fprintf(stderr, "%s", prompt);
Guido van Rossum48a680c2001-03-02 06:34:14 +0000119#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000120 if (prompt) {
121 if(Py_RISCOSWimpFlag)
122 fprintf(stderr, "\x0cr%s\x0c", prompt);
123 else
124 fprintf(stderr, "%s", prompt);
125 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000126#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000127 fflush(stderr);
128 switch (my_fgets(p, (int)n, sys_stdin)) {
129 case 0: /* Normal case */
130 break;
131 case 1: /* Interrupt */
132 PyMem_FREE(p);
133 return NULL;
134 case -1: /* EOF */
135 case -2: /* Error */
136 default: /* Shouldn't happen */
137 *p = '\0';
138 break;
139 }
140 n = strlen(p);
141 while (n > 0 && p[n-1] != '\n') {
142 size_t incr = n+2;
143 p = (char *)PyMem_REALLOC(p, n + incr);
144 if (p == NULL)
145 return NULL;
146 if (incr > INT_MAX) {
147 PyErr_SetString(PyExc_OverflowError, "input line too long");
148 }
149 if (my_fgets(p+n, (int)incr, sys_stdin) != 0)
150 break;
151 n += strlen(p+n);
152 }
153 return (char *)PyMem_REALLOC(p, n+1);
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000154}
155
156
157/* By initializing this function pointer, systems embedding Python can
Guido van Rossumb18618d2000-05-03 23:44:39 +0000158 override the readline function.
159
Neal Norwitz08062d62006-04-11 08:19:15 +0000160 Note: Python expects in return a buffer allocated with PyMem_Malloc. */
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000161
Martin v. Löwis566f6af2002-10-26 14:39:10 +0000162char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, char *);
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000163
164
165/* Interface used by tokenizer.c and bltinmodule.c */
166
167char *
Martin v. Löwis566f6af2002-10-26 14:39:10 +0000168PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, char *prompt)
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000169{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000170 char *rv;
Martin v. Löwis566f6af2002-10-26 14:39:10 +0000171
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000172 if (_PyOS_ReadlineTState == PyThreadState_GET()) {
173 PyErr_SetString(PyExc_RuntimeError,
174 "can't re-enter readline");
175 return NULL;
176 }
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000177
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000178
179 if (PyOS_ReadlineFunctionPointer == NULL) {
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000180#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000181 PyOS_ReadlineFunctionPointer = vms__StdioReadline;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000182#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000183 PyOS_ReadlineFunctionPointer = PyOS_StdioReadline;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000184#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000185 }
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000186
Tim Petersb7e898a2004-07-07 20:42:07 +0000187#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000188 if (_PyOS_ReadlineLock == NULL) {
189 _PyOS_ReadlineLock = PyThread_allocate_lock();
190 }
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000191#endif
192
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000193 _PyOS_ReadlineTState = PyThreadState_GET();
194 Py_BEGIN_ALLOW_THREADS
195#ifdef WITH_THREAD
196 PyThread_acquire_lock(_PyOS_ReadlineLock, 1);
197#endif
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000198
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000199 /* This is needed to handle the unlikely case that the
200 * interpreter is in interactive mode *and* stdin/out are not
201 * a tty. This can happen, for example if python is run like
202 * this: python -i < test1.py
203 */
204 if (!isatty (fileno (sys_stdin)) || !isatty (fileno (sys_stdout)))
205 rv = PyOS_StdioReadline (sys_stdin, sys_stdout, prompt);
206 else
207 rv = (*PyOS_ReadlineFunctionPointer)(sys_stdin, sys_stdout,
208 prompt);
209 Py_END_ALLOW_THREADS
210
211#ifdef WITH_THREAD
212 PyThread_release_lock(_PyOS_ReadlineLock);
213#endif
214
215 _PyOS_ReadlineTState = NULL;
216
217 return rv;
Guido van Rossum6fa63431993-12-24 10:36:57 +0000218}