source: python/trunk/Modules/readline.c@ 603

Last change on this file since 603 was 398, checked in by dmik, 11 years ago

python: Fix frozen input in interactive mode.

Contributed by Paul Smedley.

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