blob: 2dd362321aaf304519a59bffdde357c37dc68e1a [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"
Victor Stinnere5014be2020-04-14 17:52:15 +020013#include "pycore_pystate.h" // _PyThreadState_GET()
Mark Hammond2f10cb82002-07-14 23:12:29 +000014#ifdef MS_WINDOWS
Victor Stinnere5014be2020-04-14 17:52:15 +020015# define WIN32_LEAN_AND_MEAN
16# include "windows.h"
Mark Hammond2f10cb82002-07-14 23:12:29 +000017#endif /* MS_WINDOWS */
Guido van Rossum6fa63431993-12-24 10:36:57 +000018
Michael W. Hudson30ea2f22004-07-07 17:44:12 +000019
Benjamin Peterson0a37a302017-12-31 10:04:13 -080020PyThreadState* _PyOS_ReadlineTState = NULL;
Michael W. Hudson30ea2f22004-07-07 17:44:12 +000021
Michael W. Hudson30ea2f22004-07-07 17:44:12 +000022static PyThread_type_lock _PyOS_ReadlineLock = NULL;
Michael W. Hudson30ea2f22004-07-07 17:44:12 +000023
Thomas Wouters23c9e002000-07-22 19:20:54 +000024int (*PyOS_InputHook)(void) = NULL;
Guido van Rossumfbd64c81997-02-18 21:53:32 +000025
26/* This function restarts a fgets() after an EINTR error occurred
Victor Stinnerfa7ab6a2020-06-03 14:39:59 +020027 except if _PyOS_InterruptOccurred() returns true. */
Guido van Rossumfbd64c81997-02-18 21:53:32 +000028
29static int
Victor Stinnerc3537642020-06-01 20:59:35 +020030my_fgets(PyThreadState* tstate, char *buf, int len, FILE *fp)
Guido van Rossumfbd64c81997-02-18 21:53:32 +000031{
Tim Golden9175c3d2012-06-29 18:39:26 +010032#ifdef MS_WINDOWS
Victor Stinnerfa7ab6a2020-06-03 14:39:59 +020033 HANDLE handle;
34 _Py_BEGIN_SUPPRESS_IPH
35 handle = (HANDLE)_get_osfhandle(fileno(fp));
36 _Py_END_SUPPRESS_IPH
37
38 /* bpo-40826: fgets(fp) does crash if fileno(fp) is closed */
39 if (handle == INVALID_HANDLE_VALUE) {
40 return -1; /* EOF */
41 }
Tim Golden9175c3d2012-06-29 18:39:26 +010042#endif
Victor Stinnerfa7ab6a2020-06-03 14:39:59 +020043
Victor Stinner52c950f2011-04-09 15:55:44 +020044 while (1) {
Victor Stinnerc3537642020-06-01 20:59:35 +020045 if (PyOS_InputHook != NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000046 (void)(PyOS_InputHook)();
Victor Stinnerc3537642020-06-01 20:59:35 +020047 }
48
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000049 errno = 0;
Victor Stinner4f711012011-05-30 23:46:00 +020050 clearerr(fp);
Victor Stinnerc3537642020-06-01 20:59:35 +020051 char *p = fgets(buf, len, fp);
52 if (p != NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000053 return 0; /* No error */
Victor Stinnerc3537642020-06-01 20:59:35 +020054 }
55 int err = errno;
56
Mark Hammond2f10cb82002-07-14 23:12:29 +000057#ifdef MS_WINDOWS
Tim Golden9175c3d2012-06-29 18:39:26 +010058 /* Ctrl-C anywhere on the line or Ctrl-Z if the only character
59 on a line will set ERROR_OPERATION_ABORTED. Under normal
60 circumstances Ctrl-C will also have caused the SIGINT handler
61 to fire which will have set the event object returned by
62 _PyOS_SigintEvent. This signal fires in another thread and
63 is not guaranteed to have occurred before this point in the
64 code.
65
66 Therefore: check whether the event is set with a small timeout.
67 If it is, assume this is a Ctrl-C and reset the event. If it
68 isn't set assume that this is a Ctrl-Z on its own and drop
69 through to check for EOF.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000071 if (GetLastError()==ERROR_OPERATION_ABORTED) {
Victor Stinnerfa7ab6a2020-06-03 14:39:59 +020072 HANDLE hInterruptEvent = _PyOS_SigintEvent();
Martin v. Löwisb26a9b12013-01-25 14:25:48 +010073 switch (WaitForSingleObjectEx(hInterruptEvent, 10, FALSE)) {
Tim Golden9175c3d2012-06-29 18:39:26 +010074 case WAIT_OBJECT_0:
75 ResetEvent(hInterruptEvent);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000076 return 1; /* Interrupt */
Tim Golden9175c3d2012-06-29 18:39:26 +010077 case WAIT_FAILED:
78 return -2; /* Error */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000079 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000080 }
Mark Hammond2f10cb82002-07-14 23:12:29 +000081#endif /* MS_WINDOWS */
Victor Stinnerc3537642020-06-01 20:59:35 +020082
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000083 if (feof(fp)) {
Victor Stinner4755ab02011-05-10 00:19:53 +020084 clearerr(fp);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000085 return -1; /* EOF */
86 }
Victor Stinnerc3537642020-06-01 20:59:35 +020087
Guido van Rossumfbd64c81997-02-18 21:53:32 +000088#ifdef EINTR
Antoine Pitrouc345ce12011-12-16 12:28:32 +010089 if (err == EINTR) {
Victor Stinnerc3537642020-06-01 20:59:35 +020090 PyEval_RestoreThread(tstate);
91 int s = PyErr_CheckSignals();
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000092 PyEval_SaveThread();
Victor Stinnerc3537642020-06-01 20:59:35 +020093
94 if (s < 0) {
95 return 1;
96 }
97 /* try again */
Victor Stinner52c950f2011-04-09 15:55:44 +020098 continue;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000099 }
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000100#endif
Victor Stinnerc3537642020-06-01 20:59:35 +0200101
Victor Stinnerfa7ab6a2020-06-03 14:39:59 +0200102 if (_PyOS_InterruptOccurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 return 1; /* Interrupt */
104 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000105 return -2; /* Error */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000107 /* NOTREACHED */
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000108}
109
Steve Dower39294992016-08-30 21:22:36 -0700110#ifdef MS_WINDOWS
111/* Readline implementation using ReadConsoleW */
112
113extern char _get_console_type(HANDLE handle);
114
115char *
Victor Stinnerc3537642020-06-01 20:59:35 +0200116_PyOS_WindowsConsoleReadline(PyThreadState *tstate, HANDLE hStdIn)
Steve Dower39294992016-08-30 21:22:36 -0700117{
118 static wchar_t wbuf_local[1024 * 16];
119 const DWORD chunk_size = 1024;
120
121 DWORD n_read, total_read, wbuflen, u8len;
122 wchar_t *wbuf;
123 char *buf = NULL;
124 int err = 0;
125
ValeriyaSinevichce75df32018-07-19 15:34:03 -0700126 n_read = (DWORD)-1;
Steve Dower39294992016-08-30 21:22:36 -0700127 total_read = 0;
128 wbuf = wbuf_local;
129 wbuflen = sizeof(wbuf_local) / sizeof(wbuf_local[0]) - 1;
130 while (1) {
Thomas A Caswell9b9d58f2018-06-28 12:29:44 -0400131 if (PyOS_InputHook != NULL) {
132 (void)(PyOS_InputHook)();
133 }
Steve Dower39294992016-08-30 21:22:36 -0700134 if (!ReadConsoleW(hStdIn, &wbuf[total_read], wbuflen - total_read, &n_read, NULL)) {
135 err = GetLastError();
136 goto exit;
137 }
ValeriyaSinevichce75df32018-07-19 15:34:03 -0700138 if (n_read == (DWORD)-1 && (err = GetLastError()) == ERROR_OPERATION_ABORTED) {
139 break;
140 }
Steve Dower39294992016-08-30 21:22:36 -0700141 if (n_read == 0) {
142 int s;
143 err = GetLastError();
144 if (err != ERROR_OPERATION_ABORTED)
145 goto exit;
146 err = 0;
147 HANDLE hInterruptEvent = _PyOS_SigintEvent();
148 if (WaitForSingleObjectEx(hInterruptEvent, 100, FALSE)
149 == WAIT_OBJECT_0) {
150 ResetEvent(hInterruptEvent);
Victor Stinnerc3537642020-06-01 20:59:35 +0200151 PyEval_RestoreThread(tstate);
Steve Dower39294992016-08-30 21:22:36 -0700152 s = PyErr_CheckSignals();
Steve Dower39294992016-08-30 21:22:36 -0700153 PyEval_SaveThread();
Victor Stinnerc3537642020-06-01 20:59:35 +0200154 if (s < 0) {
Steve Dower39294992016-08-30 21:22:36 -0700155 goto exit;
Victor Stinnerc3537642020-06-01 20:59:35 +0200156 }
Steve Dower39294992016-08-30 21:22:36 -0700157 }
158 break;
159 }
160
161 total_read += n_read;
162 if (total_read == 0 || wbuf[total_read - 1] == L'\n') {
163 break;
164 }
165 wbuflen += chunk_size;
166 if (wbuf == wbuf_local) {
167 wbuf[total_read] = '\0';
168 wbuf = (wchar_t*)PyMem_RawMalloc(wbuflen * sizeof(wchar_t));
Victor Stinnerc3537642020-06-01 20:59:35 +0200169 if (wbuf) {
Steve Dower39294992016-08-30 21:22:36 -0700170 wcscpy_s(wbuf, wbuflen, wbuf_local);
Victor Stinnerc3537642020-06-01 20:59:35 +0200171 }
Zackery Spytz4c49da02018-12-07 03:11:30 -0700172 else {
Victor Stinnerc3537642020-06-01 20:59:35 +0200173 PyEval_RestoreThread(tstate);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700174 PyErr_NoMemory();
Victor Stinnerc3537642020-06-01 20:59:35 +0200175 PyEval_SaveThread();
Zackery Spytz4c49da02018-12-07 03:11:30 -0700176 goto exit;
177 }
Steve Dower39294992016-08-30 21:22:36 -0700178 }
Zackery Spytz4c49da02018-12-07 03:11:30 -0700179 else {
180 wchar_t *tmp = PyMem_RawRealloc(wbuf, wbuflen * sizeof(wchar_t));
181 if (tmp == NULL) {
Victor Stinnerc3537642020-06-01 20:59:35 +0200182 PyEval_RestoreThread(tstate);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700183 PyErr_NoMemory();
Victor Stinnerc3537642020-06-01 20:59:35 +0200184 PyEval_SaveThread();
Zackery Spytz4c49da02018-12-07 03:11:30 -0700185 goto exit;
186 }
187 wbuf = tmp;
188 }
Steve Dower39294992016-08-30 21:22:36 -0700189 }
190
191 if (wbuf[0] == '\x1a') {
192 buf = PyMem_RawMalloc(1);
Victor Stinnerc3537642020-06-01 20:59:35 +0200193 if (buf) {
Steve Dower39294992016-08-30 21:22:36 -0700194 buf[0] = '\0';
Victor Stinnerc3537642020-06-01 20:59:35 +0200195 }
Zackery Spytz4c49da02018-12-07 03:11:30 -0700196 else {
Victor Stinnerc3537642020-06-01 20:59:35 +0200197 PyEval_RestoreThread(tstate);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700198 PyErr_NoMemory();
Victor Stinnerc3537642020-06-01 20:59:35 +0200199 PyEval_SaveThread();
Zackery Spytz4c49da02018-12-07 03:11:30 -0700200 }
Steve Dower39294992016-08-30 21:22:36 -0700201 goto exit;
202 }
203
Victor Stinnerc3537642020-06-01 20:59:35 +0200204 u8len = WideCharToMultiByte(CP_UTF8, 0,
205 wbuf, total_read,
206 NULL, 0,
207 NULL, NULL);
Steve Dower39294992016-08-30 21:22:36 -0700208 buf = PyMem_RawMalloc(u8len + 1);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700209 if (buf == NULL) {
Victor Stinnerc3537642020-06-01 20:59:35 +0200210 PyEval_RestoreThread(tstate);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700211 PyErr_NoMemory();
Victor Stinnerc3537642020-06-01 20:59:35 +0200212 PyEval_SaveThread();
Zackery Spytz4c49da02018-12-07 03:11:30 -0700213 goto exit;
214 }
Victor Stinnerc3537642020-06-01 20:59:35 +0200215
216 u8len = WideCharToMultiByte(CP_UTF8, 0,
217 wbuf, total_read,
218 buf, u8len,
219 NULL, NULL);
Steve Dower39294992016-08-30 21:22:36 -0700220 buf[u8len] = '\0';
Benjamin Petersone2e792d2016-09-19 22:17:16 -0700221
Steve Dower39294992016-08-30 21:22:36 -0700222exit:
Victor Stinnerc3537642020-06-01 20:59:35 +0200223 if (wbuf != wbuf_local) {
Steve Dower39294992016-08-30 21:22:36 -0700224 PyMem_RawFree(wbuf);
Victor Stinnerc3537642020-06-01 20:59:35 +0200225 }
Steve Dower39294992016-08-30 21:22:36 -0700226
227 if (err) {
Victor Stinnerc3537642020-06-01 20:59:35 +0200228 PyEval_RestoreThread(tstate);
Steve Dower39294992016-08-30 21:22:36 -0700229 PyErr_SetFromWindowsErr(err);
Steve Dower39294992016-08-30 21:22:36 -0700230 PyEval_SaveThread();
Steve Dower39294992016-08-30 21:22:36 -0700231 }
Steve Dower39294992016-08-30 21:22:36 -0700232 return buf;
233}
234
235#endif
236
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000237
238/* Readline implementation using fgets() */
239
240char *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300241PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt)
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 size_t n;
Christian Heimes9ae513c2013-08-06 15:59:16 +0200244 char *p, *pr;
Victor Stinnerc3537642020-06-01 20:59:35 +0200245 PyThreadState *tstate = _PyOS_ReadlineTState;
246 assert(tstate != NULL);
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200247
Steve Dower39294992016-08-30 21:22:36 -0700248#ifdef MS_WINDOWS
249 if (!Py_LegacyWindowsStdioFlag && sys_stdin == stdin) {
Steve Dower3cd187b2016-10-08 12:18:16 -0700250 HANDLE hStdIn, hStdErr;
Benjamin Petersone2e792d2016-09-19 22:17:16 -0700251
Steve Dower39294992016-08-30 21:22:36 -0700252 _Py_BEGIN_SUPPRESS_IPH
253 hStdIn = (HANDLE)_get_osfhandle(fileno(sys_stdin));
Steve Dower3cd187b2016-10-08 12:18:16 -0700254 hStdErr = (HANDLE)_get_osfhandle(fileno(stderr));
Steve Dower39294992016-08-30 21:22:36 -0700255 _Py_END_SUPPRESS_IPH
Benjamin Petersone2e792d2016-09-19 22:17:16 -0700256
Steve Dower39294992016-08-30 21:22:36 -0700257 if (_get_console_type(hStdIn) == 'r') {
258 fflush(sys_stdout);
Steve Dower3cd187b2016-10-08 12:18:16 -0700259 if (prompt) {
260 if (_get_console_type(hStdErr) == 'w') {
261 wchar_t *wbuf;
262 int wlen;
263 wlen = MultiByteToWideChar(CP_UTF8, 0, prompt, -1,
264 NULL, 0);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700265 if (wlen) {
266 wbuf = PyMem_RawMalloc(wlen * sizeof(wchar_t));
267 if (wbuf == NULL) {
Victor Stinnerc3537642020-06-01 20:59:35 +0200268 PyEval_RestoreThread(tstate);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700269 PyErr_NoMemory();
Victor Stinnerc3537642020-06-01 20:59:35 +0200270 PyEval_SaveThread();
Zackery Spytz4c49da02018-12-07 03:11:30 -0700271 return NULL;
272 }
Steve Dower3cd187b2016-10-08 12:18:16 -0700273 wlen = MultiByteToWideChar(CP_UTF8, 0, prompt, -1,
274 wbuf, wlen);
275 if (wlen) {
276 DWORD n;
277 fflush(stderr);
Steve Dower6c2b9d32016-10-25 11:51:54 -0700278 /* wlen includes null terminator, so subtract 1 */
279 WriteConsoleW(hStdErr, wbuf, wlen - 1, &n, NULL);
Steve Dower3cd187b2016-10-08 12:18:16 -0700280 }
281 PyMem_RawFree(wbuf);
282 }
283 } else {
284 fprintf(stderr, "%s", prompt);
285 fflush(stderr);
286 }
287 }
Steve Dower39294992016-08-30 21:22:36 -0700288 clearerr(sys_stdin);
Victor Stinnerc3537642020-06-01 20:59:35 +0200289 return _PyOS_WindowsConsoleReadline(tstate, hStdIn);
Steve Dower39294992016-08-30 21:22:36 -0700290 }
291 }
292#endif
293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 n = 100;
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200295 p = (char *)PyMem_RawMalloc(n);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700296 if (p == NULL) {
Victor Stinnerc3537642020-06-01 20:59:35 +0200297 PyEval_RestoreThread(tstate);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700298 PyErr_NoMemory();
Victor Stinnerc3537642020-06-01 20:59:35 +0200299 PyEval_SaveThread();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 return NULL;
Zackery Spytz4c49da02018-12-07 03:11:30 -0700301 }
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 fflush(sys_stdout);
Victor Stinnerc3537642020-06-01 20:59:35 +0200304 if (prompt) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 fprintf(stderr, "%s", prompt);
Victor Stinnerc3537642020-06-01 20:59:35 +0200306 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 fflush(stderr);
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200308
Victor Stinnerc3537642020-06-01 20:59:35 +0200309 switch (my_fgets(tstate, p, (int)n, sys_stdin)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 case 0: /* Normal case */
311 break;
312 case 1: /* Interrupt */
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200313 PyMem_RawFree(p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 return NULL;
315 case -1: /* EOF */
316 case -2: /* Error */
317 default: /* Shouldn't happen */
318 *p = '\0';
319 break;
320 }
Victor Stinnerc3537642020-06-01 20:59:35 +0200321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 n = strlen(p);
323 while (n > 0 && p[n-1] != '\n') {
324 size_t incr = n+2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 if (incr > INT_MAX) {
Victor Stinnerc5486602013-10-19 02:40:16 +0200326 PyMem_RawFree(p);
Victor Stinnerc3537642020-06-01 20:59:35 +0200327 PyEval_RestoreThread(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 PyErr_SetString(PyExc_OverflowError, "input line too long");
Victor Stinnerc3537642020-06-01 20:59:35 +0200329 PyEval_SaveThread();
Christian Heimes9ae513c2013-08-06 15:59:16 +0200330 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 }
Victor Stinnerc3537642020-06-01 20:59:35 +0200332
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200333 pr = (char *)PyMem_RawRealloc(p, n + incr);
Christian Heimes9ae513c2013-08-06 15:59:16 +0200334 if (pr == NULL) {
Victor Stinnerc5486602013-10-19 02:40:16 +0200335 PyMem_RawFree(p);
Victor Stinnerc3537642020-06-01 20:59:35 +0200336 PyEval_RestoreThread(tstate);
Christian Heimes9ae513c2013-08-06 15:59:16 +0200337 PyErr_NoMemory();
Victor Stinnerc3537642020-06-01 20:59:35 +0200338 PyEval_SaveThread();
Christian Heimes9ae513c2013-08-06 15:59:16 +0200339 return NULL;
340 }
341 p = pr;
Victor Stinnerc3537642020-06-01 20:59:35 +0200342
343 if (my_fgets(tstate, p+n, (int)incr, sys_stdin) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 break;
Victor Stinnerc3537642020-06-01 20:59:35 +0200345 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 n += strlen(p+n);
347 }
Victor Stinnerc3537642020-06-01 20:59:35 +0200348
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200349 pr = (char *)PyMem_RawRealloc(p, n+1);
Christian Heimes9ae513c2013-08-06 15:59:16 +0200350 if (pr == NULL) {
Victor Stinnerc5486602013-10-19 02:40:16 +0200351 PyMem_RawFree(p);
Victor Stinnerc3537642020-06-01 20:59:35 +0200352 PyEval_RestoreThread(tstate);
Christian Heimes9ae513c2013-08-06 15:59:16 +0200353 PyErr_NoMemory();
Victor Stinnerc3537642020-06-01 20:59:35 +0200354 PyEval_SaveThread();
Christian Heimes9ae513c2013-08-06 15:59:16 +0200355 return NULL;
356 }
357 return pr;
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000358}
359
360
361/* By initializing this function pointer, systems embedding Python can
Guido van Rossumb18618d2000-05-03 23:44:39 +0000362 override the readline function.
363
364 Note: Python expects in return a buffer allocated with PyMem_Malloc. */
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000365
Benjamin Peterson0a37a302017-12-31 10:04:13 -0800366char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *) = NULL;
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000367
368
369/* Interface used by tokenizer.c and bltinmodule.c */
370
371char *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300372PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt)
Guido van Rossumfbd64c81997-02-18 21:53:32 +0000373{
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200374 char *rv, *res;
375 size_t len;
Martin v. Löwis566f6af2002-10-26 14:39:10 +0000376
Victor Stinnerc3537642020-06-01 20:59:35 +0200377 PyThreadState *tstate = _PyThreadState_GET();
378 if (_PyOS_ReadlineTState == tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 PyErr_SetString(PyExc_RuntimeError,
380 "can't re-enter readline");
381 return NULL;
382 }
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384
385 if (PyOS_ReadlineFunctionPointer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 PyOS_ReadlineFunctionPointer = PyOS_StdioReadline;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 }
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 if (_PyOS_ReadlineLock == NULL) {
390 _PyOS_ReadlineLock = PyThread_allocate_lock();
Zackery Spytz4c49da02018-12-07 03:11:30 -0700391 if (_PyOS_ReadlineLock == NULL) {
392 PyErr_SetString(PyExc_MemoryError, "can't allocate lock");
393 return NULL;
394 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 }
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000396
Victor Stinnerc3537642020-06-01 20:59:35 +0200397 _PyOS_ReadlineTState = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 PyThread_acquire_lock(_PyOS_ReadlineLock, 1);
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 /* This is needed to handle the unlikely case that the
402 * interpreter is in interactive mode *and* stdin/out are not
403 * a tty. This can happen, for example if python is run like
404 * this: python -i < test1.py
405 */
406 if (!isatty (fileno (sys_stdin)) || !isatty (fileno (sys_stdout)))
407 rv = PyOS_StdioReadline (sys_stdin, sys_stdout, prompt);
408 else
409 rv = (*PyOS_ReadlineFunctionPointer)(sys_stdin, sys_stdout,
410 prompt);
411 Py_END_ALLOW_THREADS
412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 PyThread_release_lock(_PyOS_ReadlineLock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414
415 _PyOS_ReadlineTState = NULL;
416
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200417 if (rv == NULL)
418 return NULL;
419
420 len = strlen(rv) + 1;
421 res = PyMem_Malloc(len);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700422 if (res != NULL) {
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200423 memcpy(res, rv, len);
Zackery Spytz4c49da02018-12-07 03:11:30 -0700424 }
425 else {
426 PyErr_NoMemory();
427 }
Victor Stinner2fe9bac2013-10-10 16:18:20 +0200428 PyMem_RawFree(rv);
429
430 return res;
Guido van Rossum6fa63431993-12-24 10:36:57 +0000431}