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