• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* This module makes GNU readline available to Python.  It has ideas
2  * contributed by Lee Busby, LLNL, and William Magro, Cornell Theory
3  * Center.  The completer interface was inspired by Lele Gaifax.  More
4  * recently, it was largely rewritten by Guido van Rossum.
5  */
6 
7 /* Standard definitions */
8 #include "Python.h"
9 #include <setjmp.h>
10 #include <signal.h>
11 #include <errno.h>
12 #include <sys/time.h>
13 
14 #if defined(HAVE_SETLOCALE)
15 /* GNU readline() mistakenly sets the LC_CTYPE locale.
16  * This is evil.  Only the user or the app's main() should do this!
17  * We must save and restore the locale around the rl_initialize() call.
18  */
19 #define SAVE_LOCALE
20 #include <locale.h>
21 #endif
22 
23 #ifdef SAVE_LOCALE
24 #  define RESTORE_LOCALE(sl) { setlocale(LC_CTYPE, sl); free(sl); }
25 #else
26 #  define RESTORE_LOCALE(sl)
27 #endif
28 
29 /* GNU readline definitions */
30 #undef HAVE_CONFIG_H /* Else readline/chardefs.h includes strings.h */
31 #include <readline/readline.h>
32 #include <readline/history.h>
33 
34 #ifdef HAVE_RL_COMPLETION_MATCHES
35 #define completion_matches(x, y) \
36     rl_completion_matches((x), ((rl_compentry_func_t *)(y)))
37 #else
38 #if defined(_RL_FUNCTION_TYPEDEF)
39 extern char **completion_matches(char *, rl_compentry_func_t *);
40 #else
41 
42 #if !defined(__APPLE__)
43 extern char **completion_matches(char *, CPFunction *);
44 #endif
45 #endif
46 #endif
47 
48 #ifdef __APPLE__
49 /*
50  * It is possible to link the readline module to the readline
51  * emulation library of editline/libedit.
52  *
53  * On OSX this emulation library is not 100% API compatible
54  * with the "real" readline and cannot be detected at compile-time,
55  * hence we use a runtime check to detect if we're using libedit
56  *
57  * Currently there is one know API incompatibility:
58  * - 'get_history' has a 1-based index with GNU readline, and a 0-based
59  *   index with libedit's emulation.
60  * - Note that replace_history and remove_history use a 0-based index
61  *   with both implementation.
62  */
63 static int using_libedit_emulation = 0;
64 static const char libedit_version_tag[] = "EditLine wrapper";
65 #endif /* __APPLE__ */
66 
67 static void
68 on_completion_display_matches_hook(char **matches,
69                                    int num_matches, int max_length);
70 
71 
72 /* Exported function to send one line to readline's init file parser */
73 
74 static PyObject *
parse_and_bind(PyObject * self,PyObject * args)75 parse_and_bind(PyObject *self, PyObject *args)
76 {
77     char *s, *copy;
78     if (!PyArg_ParseTuple(args, "s:parse_and_bind", &s))
79         return NULL;
80     /* Make a copy -- rl_parse_and_bind() modifies its argument */
81     /* Bernard Herzog */
82     copy = malloc(1 + strlen(s));
83     if (copy == NULL)
84         return PyErr_NoMemory();
85     strcpy(copy, s);
86     rl_parse_and_bind(copy);
87     free(copy); /* Free the copy */
88     Py_RETURN_NONE;
89 }
90 
91 PyDoc_STRVAR(doc_parse_and_bind,
92 "parse_and_bind(string) -> None\n\
93 Parse and execute single line of a readline init file.");
94 
95 
96 /* Exported function to parse a readline init file */
97 
98 static PyObject *
read_init_file(PyObject * self,PyObject * args)99 read_init_file(PyObject *self, PyObject *args)
100 {
101     char *s = NULL;
102     if (!PyArg_ParseTuple(args, "|z:read_init_file", &s))
103         return NULL;
104     errno = rl_read_init_file(s);
105     if (errno)
106         return PyErr_SetFromErrno(PyExc_IOError);
107     Py_RETURN_NONE;
108 }
109 
110 PyDoc_STRVAR(doc_read_init_file,
111 "read_init_file([filename]) -> None\n\
112 Parse a readline initialization file.\n\
113 The default filename is the last filename used.");
114 
115 
116 /* Exported function to load a readline history file */
117 
118 static PyObject *
read_history_file(PyObject * self,PyObject * args)119 read_history_file(PyObject *self, PyObject *args)
120 {
121     char *s = NULL;
122     if (!PyArg_ParseTuple(args, "|z:read_history_file", &s))
123         return NULL;
124     errno = read_history(s);
125     if (errno)
126         return PyErr_SetFromErrno(PyExc_IOError);
127     Py_RETURN_NONE;
128 }
129 
130 static int _history_length = -1; /* do not truncate history by default */
131 PyDoc_STRVAR(doc_read_history_file,
132 "read_history_file([filename]) -> None\n\
133 Load a readline history file.\n\
134 The default filename is ~/.history.");
135 
136 
137 /* Exported function to save a readline history file */
138 
139 static PyObject *
write_history_file(PyObject * self,PyObject * args)140 write_history_file(PyObject *self, PyObject *args)
141 {
142     char *s = NULL;
143     if (!PyArg_ParseTuple(args, "|z:write_history_file", &s))
144         return NULL;
145     errno = write_history(s);
146     if (!errno && _history_length >= 0)
147         history_truncate_file(s, _history_length);
148     if (errno)
149         return PyErr_SetFromErrno(PyExc_IOError);
150     Py_RETURN_NONE;
151 }
152 
153 PyDoc_STRVAR(doc_write_history_file,
154 "write_history_file([filename]) -> None\n\
155 Save a readline history file.\n\
156 The default filename is ~/.history.");
157 
158 
159 /* Set history length */
160 
161 static PyObject*
set_history_length(PyObject * self,PyObject * args)162 set_history_length(PyObject *self, PyObject *args)
163 {
164     int length = _history_length;
165     if (!PyArg_ParseTuple(args, "i:set_history_length", &length))
166         return NULL;
167     _history_length = length;
168     Py_RETURN_NONE;
169 }
170 
171 PyDoc_STRVAR(set_history_length_doc,
172 "set_history_length(length) -> None\n\
173 set the maximal number of items which will be written to\n\
174 the history file. A negative length is used to inhibit\n\
175 history truncation.");
176 
177 
178 /* Get history length */
179 
180 static PyObject*
get_history_length(PyObject * self,PyObject * noarg)181 get_history_length(PyObject *self, PyObject *noarg)
182 {
183     return PyInt_FromLong(_history_length);
184 }
185 
186 PyDoc_STRVAR(get_history_length_doc,
187 "get_history_length() -> int\n\
188 return the maximum number of items that will be written to\n\
189 the history file.");
190 
191 
192 /* Generic hook function setter */
193 
194 static PyObject *
set_hook(const char * funcname,PyObject ** hook_var,PyObject * args)195 set_hook(const char *funcname, PyObject **hook_var, PyObject *args)
196 {
197     PyObject *function = Py_None;
198     char buf[80];
199     PyOS_snprintf(buf, sizeof(buf), "|O:set_%.50s", funcname);
200     if (!PyArg_ParseTuple(args, buf, &function))
201         return NULL;
202     if (function == Py_None) {
203         Py_XDECREF(*hook_var);
204         *hook_var = NULL;
205     }
206     else if (PyCallable_Check(function)) {
207         PyObject *tmp = *hook_var;
208         Py_INCREF(function);
209         *hook_var = function;
210         Py_XDECREF(tmp);
211     }
212     else {
213         PyOS_snprintf(buf, sizeof(buf),
214                       "set_%.50s(func): argument not callable",
215                       funcname);
216         PyErr_SetString(PyExc_TypeError, buf);
217         return NULL;
218     }
219     Py_RETURN_NONE;
220 }
221 
222 
223 /* Exported functions to specify hook functions in Python */
224 
225 static PyObject *completion_display_matches_hook = NULL;
226 static PyObject *startup_hook = NULL;
227 
228 #ifdef HAVE_RL_PRE_INPUT_HOOK
229 static PyObject *pre_input_hook = NULL;
230 #endif
231 
232 static PyObject *
set_completion_display_matches_hook(PyObject * self,PyObject * args)233 set_completion_display_matches_hook(PyObject *self, PyObject *args)
234 {
235     PyObject *result = set_hook("completion_display_matches_hook",
236                     &completion_display_matches_hook, args);
237 #ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK
238     /* We cannot set this hook globally, since it replaces the
239        default completion display. */
240     rl_completion_display_matches_hook =
241         completion_display_matches_hook ?
242 #if defined(_RL_FUNCTION_TYPEDEF)
243         (rl_compdisp_func_t *)on_completion_display_matches_hook : 0;
244 #else
245         (VFunction *)on_completion_display_matches_hook : 0;
246 #endif
247 #endif
248     return result;
249 
250 }
251 
252 PyDoc_STRVAR(doc_set_completion_display_matches_hook,
253 "set_completion_display_matches_hook([function]) -> None\n\
254 Set or remove the completion display function.\n\
255 The function is called as\n\
256   function(substitution, [matches], longest_match_length)\n\
257 once each time matches need to be displayed.");
258 
259 static PyObject *
set_startup_hook(PyObject * self,PyObject * args)260 set_startup_hook(PyObject *self, PyObject *args)
261 {
262     return set_hook("startup_hook", &startup_hook, args);
263 }
264 
265 PyDoc_STRVAR(doc_set_startup_hook,
266 "set_startup_hook([function]) -> None\n\
267 Set or remove the startup_hook function.\n\
268 The function is called with no arguments just\n\
269 before readline prints the first prompt.");
270 
271 
272 #ifdef HAVE_RL_PRE_INPUT_HOOK
273 
274 /* Set pre-input hook */
275 
276 static PyObject *
set_pre_input_hook(PyObject * self,PyObject * args)277 set_pre_input_hook(PyObject *self, PyObject *args)
278 {
279     return set_hook("pre_input_hook", &pre_input_hook, args);
280 }
281 
282 PyDoc_STRVAR(doc_set_pre_input_hook,
283 "set_pre_input_hook([function]) -> None\n\
284 Set or remove the pre_input_hook function.\n\
285 The function is called with no arguments after the first prompt\n\
286 has been printed and just before readline starts reading input\n\
287 characters.");
288 
289 #endif
290 
291 
292 /* Exported function to specify a word completer in Python */
293 
294 static PyObject *completer = NULL;
295 
296 static PyObject *begidx = NULL;
297 static PyObject *endidx = NULL;
298 
299 
300 /* Get the completion type for the scope of the tab-completion */
301 static PyObject *
get_completion_type(PyObject * self,PyObject * noarg)302 get_completion_type(PyObject *self, PyObject *noarg)
303 {
304   return PyInt_FromLong(rl_completion_type);
305 }
306 
307 PyDoc_STRVAR(doc_get_completion_type,
308 "get_completion_type() -> int\n\
309 Get the type of completion being attempted.");
310 
311 
312 /* Get the beginning index for the scope of the tab-completion */
313 
314 static PyObject *
get_begidx(PyObject * self,PyObject * noarg)315 get_begidx(PyObject *self, PyObject *noarg)
316 {
317     Py_INCREF(begidx);
318     return begidx;
319 }
320 
321 PyDoc_STRVAR(doc_get_begidx,
322 "get_begidx() -> int\n\
323 get the beginning index of the readline tab-completion scope");
324 
325 
326 /* Get the ending index for the scope of the tab-completion */
327 
328 static PyObject *
get_endidx(PyObject * self,PyObject * noarg)329 get_endidx(PyObject *self, PyObject *noarg)
330 {
331     Py_INCREF(endidx);
332     return endidx;
333 }
334 
335 PyDoc_STRVAR(doc_get_endidx,
336 "get_endidx() -> int\n\
337 get the ending index of the readline tab-completion scope");
338 
339 
340 /* Set the tab-completion word-delimiters that readline uses */
341 
342 static PyObject *
set_completer_delims(PyObject * self,PyObject * args)343 set_completer_delims(PyObject *self, PyObject *args)
344 {
345     char *break_chars;
346 
347     if(!PyArg_ParseTuple(args, "s:set_completer_delims", &break_chars)) {
348         return NULL;
349     }
350     free((void*)rl_completer_word_break_characters);
351     rl_completer_word_break_characters = strdup(break_chars);
352     Py_RETURN_NONE;
353 }
354 
355 PyDoc_STRVAR(doc_set_completer_delims,
356 "set_completer_delims(string) -> None\n\
357 set the readline word delimiters for tab-completion");
358 
359 /* _py_free_history_entry: Utility function to free a history entry. */
360 
361 #if defined(RL_READLINE_VERSION) && RL_READLINE_VERSION >= 0x0500
362 
363 /* Readline version >= 5.0 introduced a timestamp field into the history entry
364    structure; this needs to be freed to avoid a memory leak.  This version of
365    readline also introduced the handy 'free_history_entry' function, which
366    takes care of the timestamp. */
367 
368 static void
_py_free_history_entry(HIST_ENTRY * entry)369 _py_free_history_entry(HIST_ENTRY *entry)
370 {
371     histdata_t data = free_history_entry(entry);
372     free(data);
373 }
374 
375 #else
376 
377 /* No free_history_entry function;  free everything manually. */
378 
379 static void
_py_free_history_entry(HIST_ENTRY * entry)380 _py_free_history_entry(HIST_ENTRY *entry)
381 {
382     if (entry->line)
383         free((void *)entry->line);
384     if (entry->data)
385         free(entry->data);
386     free(entry);
387 }
388 
389 #endif
390 
391 static PyObject *
py_remove_history(PyObject * self,PyObject * args)392 py_remove_history(PyObject *self, PyObject *args)
393 {
394     int entry_number;
395     HIST_ENTRY *entry;
396 
397     if (!PyArg_ParseTuple(args, "i:remove_history", &entry_number))
398         return NULL;
399     if (entry_number < 0) {
400         PyErr_SetString(PyExc_ValueError,
401                         "History index cannot be negative");
402         return NULL;
403     }
404     entry = remove_history(entry_number);
405     if (!entry) {
406         PyErr_Format(PyExc_ValueError,
407                      "No history item at position %d",
408                       entry_number);
409         return NULL;
410     }
411     /* free memory allocated for the history entry */
412     _py_free_history_entry(entry);
413     Py_RETURN_NONE;
414 }
415 
416 PyDoc_STRVAR(doc_remove_history,
417 "remove_history_item(pos) -> None\n\
418 remove history item given by its position");
419 
420 static PyObject *
py_replace_history(PyObject * self,PyObject * args)421 py_replace_history(PyObject *self, PyObject *args)
422 {
423     int entry_number;
424     char *line;
425     HIST_ENTRY *old_entry;
426 
427     if (!PyArg_ParseTuple(args, "is:replace_history", &entry_number,
428                           &line)) {
429         return NULL;
430     }
431     if (entry_number < 0) {
432         PyErr_SetString(PyExc_ValueError,
433                         "History index cannot be negative");
434         return NULL;
435     }
436     old_entry = replace_history_entry(entry_number, line, (void *)NULL);
437     if (!old_entry) {
438         PyErr_Format(PyExc_ValueError,
439                      "No history item at position %d",
440                      entry_number);
441         return NULL;
442     }
443     /* free memory allocated for the old history entry */
444     _py_free_history_entry(old_entry);
445     Py_RETURN_NONE;
446 }
447 
448 PyDoc_STRVAR(doc_replace_history,
449 "replace_history_item(pos, line) -> None\n\
450 replaces history item given by its position with contents of line");
451 
452 /* Add a line to the history buffer */
453 
454 static PyObject *
py_add_history(PyObject * self,PyObject * args)455 py_add_history(PyObject *self, PyObject *args)
456 {
457     char *line;
458 
459     if(!PyArg_ParseTuple(args, "s:add_history", &line)) {
460         return NULL;
461     }
462     add_history(line);
463     Py_RETURN_NONE;
464 }
465 
466 PyDoc_STRVAR(doc_add_history,
467 "add_history(string) -> None\n\
468 add a line to the history buffer");
469 
470 
471 /* Get the tab-completion word-delimiters that readline uses */
472 
473 static PyObject *
get_completer_delims(PyObject * self,PyObject * noarg)474 get_completer_delims(PyObject *self, PyObject *noarg)
475 {
476     return PyString_FromString(rl_completer_word_break_characters);
477 }
478 
479 PyDoc_STRVAR(doc_get_completer_delims,
480 "get_completer_delims() -> string\n\
481 get the readline word delimiters for tab-completion");
482 
483 
484 /* Set the completer function */
485 
486 static PyObject *
set_completer(PyObject * self,PyObject * args)487 set_completer(PyObject *self, PyObject *args)
488 {
489     return set_hook("completer", &completer, args);
490 }
491 
492 PyDoc_STRVAR(doc_set_completer,
493 "set_completer([function]) -> None\n\
494 Set or remove the completer function.\n\
495 The function is called as function(text, state),\n\
496 for state in 0, 1, 2, ..., until it returns a non-string.\n\
497 It should return the next possible completion starting with 'text'.");
498 
499 
500 static PyObject *
get_completer(PyObject * self,PyObject * noargs)501 get_completer(PyObject *self, PyObject *noargs)
502 {
503     if (completer == NULL) {
504         Py_RETURN_NONE;
505     }
506     Py_INCREF(completer);
507     return completer;
508 }
509 
510 PyDoc_STRVAR(doc_get_completer,
511 "get_completer() -> function\n\
512 \n\
513 Returns current completer function.");
514 
515 /* Private function to get current length of history.  XXX It may be
516  * possible to replace this with a direct use of history_length instead,
517  * but it's not clear whether BSD's libedit keeps history_length up to date.
518  * See issue #8065.*/
519 
520 static int
_py_get_history_length(void)521 _py_get_history_length(void)
522 {
523     HISTORY_STATE *hist_st = history_get_history_state();
524     int length = hist_st->length;
525     /* the history docs don't say so, but the address of hist_st changes each
526        time history_get_history_state is called which makes me think it's
527        freshly malloc'd memory...  on the other hand, the address of the last
528        line stays the same as long as history isn't extended, so it appears to
529        be malloc'd but managed by the history package... */
530     free(hist_st);
531     return length;
532 }
533 
534 /* Exported function to get any element of history */
535 
536 static PyObject *
get_history_item(PyObject * self,PyObject * args)537 get_history_item(PyObject *self, PyObject *args)
538 {
539     int idx = 0;
540     HIST_ENTRY *hist_ent;
541 
542     if (!PyArg_ParseTuple(args, "i:index", &idx))
543         return NULL;
544 #ifdef  __APPLE__
545     if (using_libedit_emulation) {
546         /* Libedit emulation uses 0-based indexes,
547          * the real one uses 1-based indexes,
548          * adjust the index to ensure that Python
549          * code doesn't have to worry about the
550          * difference.
551          */
552         int length = _py_get_history_length();
553         idx --;
554 
555         /*
556          * Apple's readline emulation crashes when
557          * the index is out of range, therefore
558          * test for that and fail gracefully.
559          */
560         if (idx < 0 || idx >= length) {
561             Py_RETURN_NONE;
562         }
563     }
564 #endif /* __APPLE__ */
565     if ((hist_ent = history_get(idx)))
566         return PyString_FromString(hist_ent->line);
567     else {
568         Py_RETURN_NONE;
569     }
570 }
571 
572 PyDoc_STRVAR(doc_get_history_item,
573 "get_history_item() -> string\n\
574 return the current contents of history item at index.");
575 
576 
577 /* Exported function to get current length of history */
578 
579 static PyObject *
get_current_history_length(PyObject * self,PyObject * noarg)580 get_current_history_length(PyObject *self, PyObject *noarg)
581 {
582     return PyInt_FromLong((long)_py_get_history_length());
583 }
584 
585 PyDoc_STRVAR(doc_get_current_history_length,
586 "get_current_history_length() -> integer\n\
587 return the current (not the maximum) length of history.");
588 
589 
590 /* Exported function to read the current line buffer */
591 
592 static PyObject *
get_line_buffer(PyObject * self,PyObject * noarg)593 get_line_buffer(PyObject *self, PyObject *noarg)
594 {
595     return PyString_FromString(rl_line_buffer);
596 }
597 
598 PyDoc_STRVAR(doc_get_line_buffer,
599 "get_line_buffer() -> string\n\
600 return the current contents of the line buffer.");
601 
602 
603 #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
604 
605 /* Exported function to clear the current history */
606 
607 static PyObject *
py_clear_history(PyObject * self,PyObject * noarg)608 py_clear_history(PyObject *self, PyObject *noarg)
609 {
610     clear_history();
611     Py_RETURN_NONE;
612 }
613 
614 PyDoc_STRVAR(doc_clear_history,
615 "clear_history() -> None\n\
616 Clear the current readline history.");
617 #endif
618 
619 
620 /* Exported function to insert text into the line buffer */
621 
622 static PyObject *
insert_text(PyObject * self,PyObject * args)623 insert_text(PyObject *self, PyObject *args)
624 {
625     char *s;
626     if (!PyArg_ParseTuple(args, "s:insert_text", &s))
627         return NULL;
628     rl_insert_text(s);
629     Py_RETURN_NONE;
630 }
631 
632 PyDoc_STRVAR(doc_insert_text,
633 "insert_text(string) -> None\n\
634 Insert text into the command line.");
635 
636 
637 /* Redisplay the line buffer */
638 
639 static PyObject *
redisplay(PyObject * self,PyObject * noarg)640 redisplay(PyObject *self, PyObject *noarg)
641 {
642     rl_redisplay();
643     Py_RETURN_NONE;
644 }
645 
646 PyDoc_STRVAR(doc_redisplay,
647 "redisplay() -> None\n\
648 Change what's displayed on the screen to reflect the current\n\
649 contents of the line buffer.");
650 
651 
652 /* Table of functions exported by the module */
653 
654 static struct PyMethodDef readline_methods[] =
655 {
656     {"parse_and_bind", parse_and_bind, METH_VARARGS, doc_parse_and_bind},
657     {"get_line_buffer", get_line_buffer, METH_NOARGS, doc_get_line_buffer},
658     {"insert_text", insert_text, METH_VARARGS, doc_insert_text},
659     {"redisplay", redisplay, METH_NOARGS, doc_redisplay},
660     {"read_init_file", read_init_file, METH_VARARGS, doc_read_init_file},
661     {"read_history_file", read_history_file,
662      METH_VARARGS, doc_read_history_file},
663     {"write_history_file", write_history_file,
664      METH_VARARGS, doc_write_history_file},
665     {"get_history_item", get_history_item,
666      METH_VARARGS, doc_get_history_item},
667     {"get_current_history_length", (PyCFunction)get_current_history_length,
668      METH_NOARGS, doc_get_current_history_length},
669     {"set_history_length", set_history_length,
670      METH_VARARGS, set_history_length_doc},
671     {"get_history_length", get_history_length,
672      METH_NOARGS, get_history_length_doc},
673     {"set_completer", set_completer, METH_VARARGS, doc_set_completer},
674     {"get_completer", get_completer, METH_NOARGS, doc_get_completer},
675     {"get_completion_type", get_completion_type,
676      METH_NOARGS, doc_get_completion_type},
677     {"get_begidx", get_begidx, METH_NOARGS, doc_get_begidx},
678     {"get_endidx", get_endidx, METH_NOARGS, doc_get_endidx},
679 
680     {"set_completer_delims", set_completer_delims,
681      METH_VARARGS, doc_set_completer_delims},
682     {"add_history", py_add_history, METH_VARARGS, doc_add_history},
683     {"remove_history_item", py_remove_history, METH_VARARGS, doc_remove_history},
684     {"replace_history_item", py_replace_history, METH_VARARGS, doc_replace_history},
685     {"get_completer_delims", get_completer_delims,
686      METH_NOARGS, doc_get_completer_delims},
687 
688     {"set_completion_display_matches_hook", set_completion_display_matches_hook,
689      METH_VARARGS, doc_set_completion_display_matches_hook},
690     {"set_startup_hook", set_startup_hook,
691      METH_VARARGS, doc_set_startup_hook},
692 #ifdef HAVE_RL_PRE_INPUT_HOOK
693     {"set_pre_input_hook", set_pre_input_hook,
694      METH_VARARGS, doc_set_pre_input_hook},
695 #endif
696 #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
697     {"clear_history", py_clear_history, METH_NOARGS, doc_clear_history},
698 #endif
699     {0, 0}
700 };
701 
702 
703 /* C function to call the Python hooks. */
704 
705 static int
on_hook(PyObject * func)706 on_hook(PyObject *func)
707 {
708     int result = 0;
709     if (func != NULL) {
710         PyObject *r;
711 #ifdef WITH_THREAD
712         PyGILState_STATE gilstate = PyGILState_Ensure();
713 #endif
714         r = PyObject_CallFunction(func, NULL);
715         if (r == NULL)
716             goto error;
717         if (r == Py_None)
718             result = 0;
719         else {
720             result = PyInt_AsLong(r);
721             if (result == -1 && PyErr_Occurred())
722                 goto error;
723         }
724         Py_DECREF(r);
725         goto done;
726       error:
727         PyErr_Clear();
728         Py_XDECREF(r);
729       done:
730 #ifdef WITH_THREAD
731         PyGILState_Release(gilstate);
732 #endif
733         return result;
734     }
735     return result;
736 }
737 
738 static int
on_startup_hook(void)739 on_startup_hook(void)
740 {
741     return on_hook(startup_hook);
742 }
743 
744 #ifdef HAVE_RL_PRE_INPUT_HOOK
745 static int
on_pre_input_hook(void)746 on_pre_input_hook(void)
747 {
748     return on_hook(pre_input_hook);
749 }
750 #endif
751 
752 
753 /* C function to call the Python completion_display_matches */
754 
755 static void
on_completion_display_matches_hook(char ** matches,int num_matches,int max_length)756 on_completion_display_matches_hook(char **matches,
757                                    int num_matches, int max_length)
758 {
759     int i;
760     PyObject *m=NULL, *s=NULL, *r=NULL;
761 #ifdef WITH_THREAD
762     PyGILState_STATE gilstate = PyGILState_Ensure();
763 #endif
764     m = PyList_New(num_matches);
765     if (m == NULL)
766         goto error;
767     for (i = 0; i < num_matches; i++) {
768         s = PyString_FromString(matches[i+1]);
769         if (s == NULL)
770             goto error;
771         if (PyList_SetItem(m, i, s) == -1)
772             goto error;
773     }
774 
775     r = PyObject_CallFunction(completion_display_matches_hook,
776                               "sOi", matches[0], m, max_length);
777 
778     Py_DECREF(m); m=NULL;
779 
780     if (r == NULL ||
781         (r != Py_None && PyInt_AsLong(r) == -1 && PyErr_Occurred())) {
782         goto error;
783     }
784     Py_XDECREF(r); r=NULL;
785 
786     if (0) {
787     error:
788         PyErr_Clear();
789         Py_XDECREF(m);
790         Py_XDECREF(r);
791     }
792 #ifdef WITH_THREAD
793     PyGILState_Release(gilstate);
794 #endif
795 }
796 
797 
798 /* C function to call the Python completer. */
799 
800 static char *
on_completion(const char * text,int state)801 on_completion(const char *text, int state)
802 {
803     char *result = NULL;
804     if (completer != NULL) {
805         PyObject *r;
806 #ifdef WITH_THREAD
807         PyGILState_STATE gilstate = PyGILState_Ensure();
808 #endif
809         rl_attempted_completion_over = 1;
810         r = PyObject_CallFunction(completer, "si", text, state);
811         if (r == NULL)
812             goto error;
813         if (r == Py_None) {
814             result = NULL;
815         }
816         else {
817             char *s = PyString_AsString(r);
818             if (s == NULL)
819                 goto error;
820             result = strdup(s);
821         }
822         Py_DECREF(r);
823         goto done;
824       error:
825         PyErr_Clear();
826         Py_XDECREF(r);
827       done:
828 #ifdef WITH_THREAD
829         PyGILState_Release(gilstate);
830 #endif
831         return result;
832     }
833     return result;
834 }
835 
836 
837 /* A more flexible constructor that saves the "begidx" and "endidx"
838  * before calling the normal completer */
839 
840 static char **
flex_complete(char * text,int start,int end)841 flex_complete(char *text, int start, int end)
842 {
843 #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
844     rl_completion_append_character ='\0';
845 #endif
846 #ifdef HAVE_RL_COMPLETION_SUPPRESS_APPEND
847     rl_completion_suppress_append = 0;
848 #endif
849     Py_XDECREF(begidx);
850     Py_XDECREF(endidx);
851     begidx = PyInt_FromLong((long) start);
852     endidx = PyInt_FromLong((long) end);
853     return completion_matches(text, *on_completion);
854 }
855 
856 
857 /* Helper to initialize GNU readline properly. */
858 
859 static void
setup_readline(void)860 setup_readline(void)
861 {
862 #ifdef SAVE_LOCALE
863     char *saved_locale = strdup(setlocale(LC_CTYPE, NULL));
864     if (!saved_locale)
865         Py_FatalError("not enough memory to save locale");
866 #endif
867 
868 #ifdef __APPLE__
869     /* the libedit readline emulation resets key bindings etc
870      * when calling rl_initialize.  So call it upfront
871      */
872     if (using_libedit_emulation)
873         rl_initialize();
874 #endif /* __APPLE__ */
875 
876     using_history();
877 
878     rl_readline_name = "python";
879 #if defined(PYOS_OS2) && defined(PYCC_GCC)
880     /* Allow $if term= in .inputrc to work */
881     rl_terminal_name = getenv("TERM");
882 #endif
883     /* Force rebind of TAB to insert-tab */
884     rl_bind_key('\t', rl_insert);
885     /* Bind both ESC-TAB and ESC-ESC to the completion function */
886     rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap);
887     rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap);
888     /* Set our hook functions */
889     rl_startup_hook = (Function *)on_startup_hook;
890 #ifdef HAVE_RL_PRE_INPUT_HOOK
891     rl_pre_input_hook = (Function *)on_pre_input_hook;
892 #endif
893     /* Set our completion function */
894     rl_attempted_completion_function = (CPPFunction *)flex_complete;
895     /* Set Python word break characters */
896     rl_completer_word_break_characters =
897         strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
898         /* All nonalphanums except '.' */
899 
900     begidx = PyInt_FromLong(0L);
901     endidx = PyInt_FromLong(0L);
902     /* Initialize (allows .inputrc to override)
903      *
904      * XXX: A bug in the readline-2.2 library causes a memory leak
905      * inside this function.  Nothing we can do about it.
906      */
907 #ifdef __APPLE__
908     if (using_libedit_emulation)
909 	rl_read_init_file(NULL);
910     else
911 #endif /* __APPLE__ */
912         rl_initialize();
913 
914     RESTORE_LOCALE(saved_locale)
915 }
916 
917 /* Wrapper around GNU readline that handles signals differently. */
918 
919 
920 #if defined(HAVE_RL_CALLBACK) && defined(HAVE_SELECT)
921 
922 static  char *completed_input_string;
923 static void
rlhandler(char * text)924 rlhandler(char *text)
925 {
926     completed_input_string = text;
927     rl_callback_handler_remove();
928 }
929 
930 extern PyThreadState* _PyOS_ReadlineTState;
931 
932 static char *
readline_until_enter_or_signal(char * prompt,int * signal)933 readline_until_enter_or_signal(char *prompt, int *signal)
934 {
935     char * not_done_reading = "";
936     fd_set selectset;
937 
938     *signal = 0;
939 #ifdef HAVE_RL_CATCH_SIGNAL
940     rl_catch_signals = 0;
941 #endif
942 
943     rl_callback_handler_install (prompt, rlhandler);
944     FD_ZERO(&selectset);
945 
946     completed_input_string = not_done_reading;
947 
948     while (completed_input_string == not_done_reading) {
949         int has_input = 0;
950 
951         while (!has_input)
952         {               struct timeval timeout = {0, 100000}; /* 0.1 seconds */
953 
954             /* [Bug #1552726] Only limit the pause if an input hook has been
955                defined.  */
956             struct timeval *timeoutp = NULL;
957             if (PyOS_InputHook)
958                 timeoutp = &timeout;
959             FD_SET(fileno(rl_instream), &selectset);
960             /* select resets selectset if no input was available */
961             has_input = select(fileno(rl_instream) + 1, &selectset,
962                                NULL, NULL, timeoutp);
963             if(PyOS_InputHook) PyOS_InputHook();
964         }
965 
966         if(has_input > 0) {
967             rl_callback_read_char();
968         }
969         else if (errno == EINTR) {
970             int s;
971 #ifdef WITH_THREAD
972             PyEval_RestoreThread(_PyOS_ReadlineTState);
973 #endif
974             s = PyErr_CheckSignals();
975 #ifdef WITH_THREAD
976             PyEval_SaveThread();
977 #endif
978             if (s < 0) {
979                 rl_free_line_state();
980                 rl_cleanup_after_signal();
981                 rl_callback_handler_remove();
982                 *signal = 1;
983                 completed_input_string = NULL;
984             }
985         }
986     }
987 
988     return completed_input_string;
989 }
990 
991 
992 #else
993 
994 /* Interrupt handler */
995 
996 static jmp_buf jbuf;
997 
998 /* ARGSUSED */
999 static void
onintr(int sig)1000 onintr(int sig)
1001 {
1002     longjmp(jbuf, 1);
1003 }
1004 
1005 
1006 static char *
readline_until_enter_or_signal(char * prompt,int * signal)1007 readline_until_enter_or_signal(char *prompt, int *signal)
1008 {
1009     PyOS_sighandler_t old_inthandler;
1010     char *p;
1011 
1012     *signal = 0;
1013 
1014     old_inthandler = PyOS_setsig(SIGINT, onintr);
1015     if (setjmp(jbuf)) {
1016 #ifdef HAVE_SIGRELSE
1017         /* This seems necessary on SunOS 4.1 (Rasmus Hahn) */
1018         sigrelse(SIGINT);
1019 #endif
1020         PyOS_setsig(SIGINT, old_inthandler);
1021         *signal = 1;
1022         return NULL;
1023     }
1024     rl_event_hook = PyOS_InputHook;
1025     p = readline(prompt);
1026     PyOS_setsig(SIGINT, old_inthandler);
1027 
1028     return p;
1029 }
1030 #endif /*defined(HAVE_RL_CALLBACK) && defined(HAVE_SELECT) */
1031 
1032 
1033 static char *
call_readline(FILE * sys_stdin,FILE * sys_stdout,char * prompt)1034 call_readline(FILE *sys_stdin, FILE *sys_stdout, char *prompt)
1035 {
1036     size_t n;
1037     char *p, *q;
1038     int signal;
1039 
1040 #ifdef SAVE_LOCALE
1041     char *saved_locale = strdup(setlocale(LC_CTYPE, NULL));
1042     if (!saved_locale)
1043         Py_FatalError("not enough memory to save locale");
1044     setlocale(LC_CTYPE, "");
1045 #endif
1046 
1047     if (sys_stdin != rl_instream || sys_stdout != rl_outstream) {
1048         rl_instream = sys_stdin;
1049         rl_outstream = sys_stdout;
1050 #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
1051         rl_prep_terminal (1);
1052 #endif
1053     }
1054 
1055     p = readline_until_enter_or_signal(prompt, &signal);
1056 
1057     /* we got an interrupt signal */
1058     if (signal) {
1059         RESTORE_LOCALE(saved_locale)
1060         return NULL;
1061     }
1062 
1063     /* We got an EOF, return a empty string. */
1064     if (p == NULL) {
1065         p = PyMem_Malloc(1);
1066         if (p != NULL)
1067             *p = '\0';
1068         RESTORE_LOCALE(saved_locale)
1069         return p;
1070     }
1071 
1072     /* we have a valid line */
1073     n = strlen(p);
1074     if (n > 0) {
1075         const char *line;
1076         int length = _py_get_history_length();
1077         if (length > 0)
1078 #ifdef __APPLE__
1079             if (using_libedit_emulation) {
1080                 /*
1081                  * Libedit's emulation uses 0-based indexes,
1082                  * the real readline uses 1-based indexes.
1083                  */
1084                 line = history_get(length - 1)->line;
1085             } else
1086 #endif /* __APPLE__ */
1087             line = history_get(length)->line;
1088         else
1089             line = "";
1090         if (strcmp(p, line))
1091             add_history(p);
1092     }
1093     /* Copy the malloc'ed buffer into a PyMem_Malloc'ed one and
1094        release the original. */
1095     q = p;
1096     p = PyMem_Malloc(n+2);
1097     if (p != NULL) {
1098         strncpy(p, q, n);
1099         p[n] = '\n';
1100         p[n+1] = '\0';
1101     }
1102     free(q);
1103     RESTORE_LOCALE(saved_locale)
1104     return p;
1105 }
1106 
1107 
1108 /* Initialize the module */
1109 
1110 PyDoc_STRVAR(doc_module,
1111 "Importing this module enables command line editing using GNU readline.");
1112 
1113 #ifdef __APPLE__
1114 PyDoc_STRVAR(doc_module_le,
1115 "Importing this module enables command line editing using libedit readline.");
1116 #endif /* __APPLE__ */
1117 
1118 PyMODINIT_FUNC
initreadline(void)1119 initreadline(void)
1120 {
1121     PyObject *m;
1122 
1123 #ifdef __APPLE__
1124     if (strncmp(rl_library_version, libedit_version_tag, strlen(libedit_version_tag)) == 0) {
1125         using_libedit_emulation = 1;
1126     }
1127 
1128     if (using_libedit_emulation)
1129         m = Py_InitModule4("readline", readline_methods, doc_module_le,
1130                    (PyObject *)NULL, PYTHON_API_VERSION);
1131     else
1132 
1133 #endif /* __APPLE__ */
1134 
1135     m = Py_InitModule4("readline", readline_methods, doc_module,
1136                        (PyObject *)NULL, PYTHON_API_VERSION);
1137     if (m == NULL)
1138         return;
1139 
1140 
1141 
1142     PyOS_ReadlineFunctionPointer = call_readline;
1143     setup_readline();
1144 }
1145