Home | History | Annotate | Download | only in Modules
      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 *
     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 *
     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 *
    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 *
    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*
    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*
    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 *
    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 *
    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 *
    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 *
    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 *
    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 *
    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 *
    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 *
    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
    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
    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 *
    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 *
    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 *
    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 *
    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 *
    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 *
    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
    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 *
    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 *
    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 *
    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 *
    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 *
    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 *
    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
    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
    739 on_startup_hook(void)
    740 {
    741     return on_hook(startup_hook);
    742 }
    743 
    744 #ifdef HAVE_RL_PRE_INPUT_HOOK
    745 static int
    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
    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 *
    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 **
    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
    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
    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 *
    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
   1000 onintr(int sig)
   1001 {
   1002     longjmp(jbuf, 1);
   1003 }
   1004 
   1005 
   1006 static char *
   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 *
   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
   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