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