14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* This module makes GNU readline available to Python.  It has ideas
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * contributed by Lee Busby, LLNL, and William Magro, Cornell Theory
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Center.  The completer interface was inspired by Lele Gaifax.  More
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * recently, it was largely rewritten by Guido van Rossum.
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Standard definitions */
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h"
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <setjmp.h>
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <signal.h>
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <errno.h>
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/time.h>
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_SETLOCALE)
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* GNU readline() mistakenly sets the LC_CTYPE locale.
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * This is evil.  Only the user or the app's main() should do this!
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * We must save and restore the locale around the rl_initialize() call.
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SAVE_LOCALE
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <locale.h>
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SAVE_LOCALE
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  define RESTORE_LOCALE(sl) { setlocale(LC_CTYPE, sl); free(sl); }
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#  define RESTORE_LOCALE(sl)
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* GNU readline definitions */
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef HAVE_CONFIG_H /* Else readline/chardefs.h includes strings.h */
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <readline/readline.h>
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <readline/history.h>
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_COMPLETION_MATCHES
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define completion_matches(x, y) \
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_completion_matches((x), ((rl_compentry_func_t *)(y)))
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(_RL_FUNCTION_TYPEDEF)
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern char **completion_matches(char *, rl_compentry_func_t *);
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(__APPLE__)
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern char **completion_matches(char *, CPFunction *);
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __APPLE__
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * It is possible to link the readline module to the readline
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * emulation library of editline/libedit.
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * On OSX this emulation library is not 100% API compatible
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * with the "real" readline and cannot be detected at compile-time,
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * hence we use a runtime check to detect if we're using libedit
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Currently there is one know API incompatibility:
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * - 'get_history' has a 1-based index with GNU readline, and a 0-based
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *   index with libedit's emulation.
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * - Note that replace_history and remove_history use a 0-based index
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *   with both implementation.
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int using_libedit_emulation = 0;
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic const char libedit_version_tag[] = "EditLine wrapper";
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* __APPLE__ */
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmon_completion_display_matches_hook(char **matches,
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   int num_matches, int max_length);
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported function to send one line to readline's init file parser */
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmparse_and_bind(PyObject *self, PyObject *args)
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s, *copy;
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s:parse_and_bind", &s))
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Make a copy -- rl_parse_and_bind() modifies its argument */
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Bernard Herzog */
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    copy = malloc(1 + strlen(s));
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (copy == NULL)
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_NoMemory();
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    strcpy(copy, s);
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_parse_and_bind(copy);
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    free(copy); /* Free the copy */
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_parse_and_bind,
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"parse_and_bind(string) -> None\n\
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmParse and execute single line of a readline init file.");
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported function to parse a readline init file */
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmread_init_file(PyObject *self, PyObject *args)
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s = NULL;
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|z:read_init_file", &s))
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errno = rl_read_init_file(s);
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (errno)
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_SetFromErrno(PyExc_IOError);
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_read_init_file,
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"read_init_file([filename]) -> None\n\
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmParse a readline initialization file.\n\
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe default filename is the last filename used.");
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported function to load a readline history file */
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmread_history_file(PyObject *self, PyObject *args)
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s = NULL;
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|z:read_history_file", &s))
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errno = read_history(s);
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (errno)
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_SetFromErrno(PyExc_IOError);
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int _history_length = -1; /* do not truncate history by default */
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_read_history_file,
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"read_history_file([filename]) -> None\n\
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLoad a readline history file.\n\
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe default filename is ~/.history.");
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported function to save a readline history file */
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwrite_history_file(PyObject *self, PyObject *args)
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s = NULL;
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|z:write_history_file", &s))
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errno = write_history(s);
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!errno && _history_length >= 0)
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        history_truncate_file(s, _history_length);
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (errno)
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_SetFromErrno(PyExc_IOError);
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_write_history_file,
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"write_history_file([filename]) -> None\n\
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSave a readline history file.\n\
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe default filename is ~/.history.");
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Set history length */
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_history_length(PyObject *self, PyObject *args)
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int length = _history_length;
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i:set_history_length", &length))
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _history_length = length;
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(set_history_length_doc,
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"set_history_length(length) -> None\n\
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset the maximal number of items which will be written to\n\
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe history file. A negative length is used to inhibit\n\
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhistory truncation.");
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Get history length */
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_history_length(PyObject *self, PyObject *noarg)
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong(_history_length);
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(get_history_length_doc,
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"get_history_length() -> int\n\
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreturn the maximum number of items that will be written to\n\
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe history file.");
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Generic hook function setter */
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_hook(const char *funcname, PyObject **hook_var, PyObject *args)
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *function = Py_None;
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[80];
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyOS_snprintf(buf, sizeof(buf), "|O:set_%.50s", funcname);
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, buf, &function))
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (function == Py_None) {
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(*hook_var);
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *hook_var = NULL;
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (PyCallable_Check(function)) {
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *tmp = *hook_var;
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(function);
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *hook_var = function;
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(tmp);
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_snprintf(buf, sizeof(buf),
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      "set_%.50s(func): argument not callable",
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      funcname);
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_TypeError, buf);
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported functions to specify hook functions in Python */
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *completion_display_matches_hook = NULL;
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *startup_hook = NULL;
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_PRE_INPUT_HOOK
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *pre_input_hook = NULL;
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_completion_display_matches_hook(PyObject *self, PyObject *args)
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result = set_hook("completion_display_matches_hook",
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    &completion_display_matches_hook, args);
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* We cannot set this hook globally, since it replaces the
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       default completion display. */
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_completion_display_matches_hook =
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        completion_display_matches_hook ?
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(_RL_FUNCTION_TYPEDEF)
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (rl_compdisp_func_t *)on_completion_display_matches_hook : 0;
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (VFunction *)on_completion_display_matches_hook : 0;
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_set_completion_display_matches_hook,
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"set_completion_display_matches_hook([function]) -> None\n\
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet or remove the completion display function.\n\
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe function is called as\n\
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  function(substitution, [matches], longest_match_length)\n\
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmonce each time matches need to be displayed.");
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_startup_hook(PyObject *self, PyObject *args)
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return set_hook("startup_hook", &startup_hook, args);
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_set_startup_hook,
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"set_startup_hook([function]) -> None\n\
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet or remove the startup_hook function.\n\
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe function is called with no arguments just\n\
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbefore readline prints the first prompt.");
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_PRE_INPUT_HOOK
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Set pre-input hook */
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_pre_input_hook(PyObject *self, PyObject *args)
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return set_hook("pre_input_hook", &pre_input_hook, args);
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_set_pre_input_hook,
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"set_pre_input_hook([function]) -> None\n\
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet or remove the pre_input_hook function.\n\
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe function is called with no arguments after the first prompt\n\
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhas been printed and just before readline starts reading input\n\
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcharacters.");
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported function to specify a word completer in Python */
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *completer = NULL;
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *begidx = NULL;
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *endidx = NULL;
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Get the completion type for the scope of the tab-completion */
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_completion_type(PyObject *self, PyObject *noarg)
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  return PyInt_FromLong(rl_completion_type);
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_get_completion_type,
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"get_completion_type() -> int\n\
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmGet the type of completion being attempted.");
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Get the beginning index for the scope of the tab-completion */
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_begidx(PyObject *self, PyObject *noarg)
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(begidx);
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return begidx;
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_get_begidx,
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"get_begidx() -> int\n\
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget the beginning index of the readline tab-completion scope");
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Get the ending index for the scope of the tab-completion */
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_endidx(PyObject *self, PyObject *noarg)
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(endidx);
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return endidx;
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_get_endidx,
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"get_endidx() -> int\n\
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget the ending index of the readline tab-completion scope");
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Set the tab-completion word-delimiters that readline uses */
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_completer_delims(PyObject *self, PyObject *args)
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *break_chars;
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if(!PyArg_ParseTuple(args, "s:set_completer_delims", &break_chars)) {
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    free((void*)rl_completer_word_break_characters);
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_completer_word_break_characters = strdup(break_chars);
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_set_completer_delims,
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"set_completer_delims(string) -> None\n\
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset the readline word delimiters for tab-completion");
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* _py_free_history_entry: Utility function to free a history entry. */
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(RL_READLINE_VERSION) && RL_READLINE_VERSION >= 0x0500
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Readline version >= 5.0 introduced a timestamp field into the history entry
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   structure; this needs to be freed to avoid a memory leak.  This version of
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   readline also introduced the handy 'free_history_entry' function, which
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   takes care of the timestamp. */
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_py_free_history_entry(HIST_ENTRY *entry)
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    histdata_t data = free_history_entry(entry);
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    free(data);
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* No free_history_entry function;  free everything manually. */
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_py_free_history_entry(HIST_ENTRY *entry)
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (entry->line)
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        free((void *)entry->line);
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (entry->data)
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        free(entry->data);
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    free(entry);
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpy_remove_history(PyObject *self, PyObject *args)
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int entry_number;
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    HIST_ENTRY *entry;
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i:remove_history", &entry_number))
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (entry_number < 0) {
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "History index cannot be negative");
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    entry = remove_history(entry_number);
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!entry) {
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_ValueError,
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "No history item at position %d",
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      entry_number);
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* free memory allocated for the history entry */
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _py_free_history_entry(entry);
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_remove_history,
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"remove_history_item(pos) -> None\n\
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmremove history item given by its position");
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpy_replace_history(PyObject *self, PyObject *args)
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int entry_number;
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *line;
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    HIST_ENTRY *old_entry;
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "is:replace_history", &entry_number,
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &line)) {
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (entry_number < 0) {
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "History index cannot be negative");
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    old_entry = replace_history_entry(entry_number, line, (void *)NULL);
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!old_entry) {
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_ValueError,
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "No history item at position %d",
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     entry_number);
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* free memory allocated for the old history entry */
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _py_free_history_entry(old_entry);
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_replace_history,
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"replace_history_item(pos, line) -> None\n\
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplaces history item given by its position with contents of line");
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Add a line to the history buffer */
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpy_add_history(PyObject *self, PyObject *args)
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *line;
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if(!PyArg_ParseTuple(args, "s:add_history", &line)) {
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    add_history(line);
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_add_history,
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"add_history(string) -> None\n\
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmadd a line to the history buffer");
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Get the tab-completion word-delimiters that readline uses */
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_completer_delims(PyObject *self, PyObject *noarg)
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromString(rl_completer_word_break_characters);
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_get_completer_delims,
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"get_completer_delims() -> string\n\
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget the readline word delimiters for tab-completion");
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Set the completer function */
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_completer(PyObject *self, PyObject *args)
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return set_hook("completer", &completer, args);
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_set_completer,
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"set_completer([function]) -> None\n\
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet or remove the completer function.\n\
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe function is called as function(text, state),\n\
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor state in 0, 1, 2, ..., until it returns a non-string.\n\
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIt should return the next possible completion starting with 'text'.");
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_completer(PyObject *self, PyObject *noargs)
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (completer == NULL) {
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_RETURN_NONE;
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(completer);
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return completer;
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_get_completer,
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"get_completer() -> function\n\
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturns current completer function.");
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Private function to get current length of history.  XXX It may be
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * possible to replace this with a direct use of history_length instead,
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * but it's not clear whether BSD's libedit keeps history_length up to date.
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * See issue #8065.*/
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_py_get_history_length(void)
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    HISTORY_STATE *hist_st = history_get_history_state();
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int length = hist_st->length;
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* the history docs don't say so, but the address of hist_st changes each
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       time history_get_history_state is called which makes me think it's
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       freshly malloc'd memory...  on the other hand, the address of the last
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       line stays the same as long as history isn't extended, so it appears to
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       be malloc'd but managed by the history package... */
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    free(hist_st);
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return length;
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported function to get any element of history */
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_history_item(PyObject *self, PyObject *args)
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int idx = 0;
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    HIST_ENTRY *hist_ent;
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i:index", &idx))
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef  __APPLE__
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (using_libedit_emulation) {
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Libedit emulation uses 0-based indexes,
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * the real one uses 1-based indexes,
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * adjust the index to ensure that Python
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * code doesn't have to worry about the
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * difference.
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         */
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int length = _py_get_history_length();
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        idx --;
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /*
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * Apple's readline emulation crashes when
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * the index is out of range, therefore
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         * test for that and fail gracefully.
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         */
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (idx < 0 || idx >= length) {
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_RETURN_NONE;
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* __APPLE__ */
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((hist_ent = history_get(idx)))
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromString(hist_ent->line);
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_RETURN_NONE;
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_get_history_item,
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"get_history_item() -> string\n\
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreturn the current contents of history item at index.");
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported function to get current length of history */
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_current_history_length(PyObject *self, PyObject *noarg)
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong((long)_py_get_history_length());
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_get_current_history_length,
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"get_current_history_length() -> integer\n\
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreturn the current (not the maximum) length of history.");
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported function to read the current line buffer */
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_line_buffer(PyObject *self, PyObject *noarg)
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromString(rl_line_buffer);
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_get_line_buffer,
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"get_line_buffer() -> string\n\
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreturn the current contents of the line buffer.");
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported function to clear the current history */
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpy_clear_history(PyObject *self, PyObject *noarg)
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    clear_history();
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_clear_history,
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"clear_history() -> None\n\
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmClear the current readline history.");
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Exported function to insert text into the line buffer */
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminsert_text(PyObject *self, PyObject *args)
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s;
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s:insert_text", &s))
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_insert_text(s);
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_insert_text,
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"insert_text(string) -> None\n\
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmInsert text into the command line.");
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Redisplay the line buffer */
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmredisplay(PyObject *self, PyObject *noarg)
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_redisplay();
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_redisplay,
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"redisplay() -> None\n\
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmChange what's displayed on the screen to reflect the current\n\
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcontents of the line buffer.");
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Table of functions exported by the module */
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic struct PyMethodDef readline_methods[] =
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"parse_and_bind", parse_and_bind, METH_VARARGS, doc_parse_and_bind},
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"get_line_buffer", get_line_buffer, METH_NOARGS, doc_get_line_buffer},
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"insert_text", insert_text, METH_VARARGS, doc_insert_text},
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"redisplay", redisplay, METH_NOARGS, doc_redisplay},
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"read_init_file", read_init_file, METH_VARARGS, doc_read_init_file},
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"read_history_file", read_history_file,
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, doc_read_history_file},
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"write_history_file", write_history_file,
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, doc_write_history_file},
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"get_history_item", get_history_item,
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, doc_get_history_item},
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"get_current_history_length", (PyCFunction)get_current_history_length,
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_NOARGS, doc_get_current_history_length},
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"set_history_length", set_history_length,
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, set_history_length_doc},
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"get_history_length", get_history_length,
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_NOARGS, get_history_length_doc},
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"set_completer", set_completer, METH_VARARGS, doc_set_completer},
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"get_completer", get_completer, METH_NOARGS, doc_get_completer},
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"get_completion_type", get_completion_type,
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_NOARGS, doc_get_completion_type},
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"get_begidx", get_begidx, METH_NOARGS, doc_get_begidx},
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"get_endidx", get_endidx, METH_NOARGS, doc_get_endidx},
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"set_completer_delims", set_completer_delims,
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, doc_set_completer_delims},
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"add_history", py_add_history, METH_VARARGS, doc_add_history},
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"remove_history_item", py_remove_history, METH_VARARGS, doc_remove_history},
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"replace_history_item", py_replace_history, METH_VARARGS, doc_replace_history},
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"get_completer_delims", get_completer_delims,
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_NOARGS, doc_get_completer_delims},
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"set_completion_display_matches_hook", set_completion_display_matches_hook,
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, doc_set_completion_display_matches_hook},
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"set_startup_hook", set_startup_hook,
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, doc_set_startup_hook},
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_PRE_INPUT_HOOK
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"set_pre_input_hook", set_pre_input_hook,
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS, doc_set_pre_input_hook},
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"clear_history", py_clear_history, METH_NOARGS, doc_clear_history},
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {0, 0}
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* C function to call the Python hooks. */
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmon_hook(PyObject *func)
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int result = 0;
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (func != NULL) {
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *r;
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyGILState_STATE gilstate = PyGILState_Ensure();
7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        r = PyObject_CallFunction(func, NULL);
7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (r == NULL)
7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto error;
7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (r == Py_None)
7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = 0;
7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = PyInt_AsLong(r);
7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (result == -1 && PyErr_Occurred())
7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto error;
7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(r);
7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto done;
7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      error:
7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(r);
7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      done:
7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyGILState_Release(gilstate);
7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return result;
7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmon_startup_hook(void)
7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return on_hook(startup_hook);
7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_PRE_INPUT_HOOK
7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmon_pre_input_hook(void)
7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return on_hook(pre_input_hook);
7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* C function to call the Python completion_display_matches */
7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmon_completion_display_matches_hook(char **matches,
7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   int num_matches, int max_length)
7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *m=NULL, *s=NULL, *r=NULL;
7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyGILState_STATE gilstate = PyGILState_Ensure();
7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    m = PyList_New(num_matches);
7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (m == NULL)
7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < num_matches; i++) {
7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = PyString_FromString(matches[i+1]);
7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (s == NULL)
7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto error;
7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyList_SetItem(m, i, s) == -1)
7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto error;
7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    r = PyObject_CallFunction(completion_display_matches_hook,
7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              "sOi", matches[0], m, max_length);
7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(m); m=NULL;
7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (r == NULL ||
7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (r != Py_None && PyInt_AsLong(r) == -1 && PyErr_Occurred())) {
7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto error;
7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(r); r=NULL;
7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (0) {
7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    error:
7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(m);
7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(r);
7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyGILState_Release(gilstate);
7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* C function to call the Python completer. */
7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char *
8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmon_completion(const char *text, int state)
8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *result = NULL;
8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (completer != NULL) {
8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *r;
8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyGILState_STATE gilstate = PyGILState_Ensure();
8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rl_attempted_completion_over = 1;
8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        r = PyObject_CallFunction(completer, "si", text, state);
8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (r == NULL)
8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto error;
8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (r == Py_None) {
8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = NULL;
8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char *s = PyString_AsString(r);
8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (s == NULL)
8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto error;
8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result = strdup(s);
8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(r);
8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto done;
8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      error:
8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(r);
8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      done:
8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyGILState_Release(gilstate);
8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return result;
8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* A more flexible constructor that saves the "begidx" and "endidx"
8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * before calling the normal completer */
8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char **
8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmflex_complete(char *text, int start, int end)
8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_completion_append_character ='\0';
8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_COMPLETION_SUPPRESS_APPEND
8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_completion_suppress_append = 0;
8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(begidx);
8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(endidx);
8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    begidx = PyInt_FromLong((long) start);
8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    endidx = PyInt_FromLong((long) end);
8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return completion_matches(text, *on_completion);
8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Helper to initialize GNU readline properly. */
8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetup_readline(void)
8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SAVE_LOCALE
8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *saved_locale = strdup(setlocale(LC_CTYPE, NULL));
8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!saved_locale)
8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_FatalError("not enough memory to save locale");
8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __APPLE__
8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* the libedit readline emulation resets key bindings etc
8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * when calling rl_initialize.  So call it upfront
8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (using_libedit_emulation)
8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rl_initialize();
8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* __APPLE__ */
8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    using_history();
8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_readline_name = "python";
8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PYOS_OS2) && defined(PYCC_GCC)
8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Allow $if term= in .inputrc to work */
8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_terminal_name = getenv("TERM");
8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Force rebind of TAB to insert-tab */
8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_bind_key('\t', rl_insert);
8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Bind both ESC-TAB and ESC-ESC to the completion function */
8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap);
8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap);
8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Set our hook functions */
8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_startup_hook = (Function *)on_startup_hook;
8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_PRE_INPUT_HOOK
8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_pre_input_hook = (Function *)on_pre_input_hook;
8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Set our completion function */
8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_attempted_completion_function = (CPPFunction *)flex_complete;
8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Set Python word break characters */
8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_completer_word_break_characters =
8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* All nonalphanums except '.' */
8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    begidx = PyInt_FromLong(0L);
9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    endidx = PyInt_FromLong(0L);
9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Initialize (allows .inputrc to override)
9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     *
9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * XXX: A bug in the readline-2.2 library causes a memory leak
9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * inside this function.  Nothing we can do about it.
9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __APPLE__
9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (using_libedit_emulation)
9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm	rl_read_init_file(NULL);
9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* __APPLE__ */
9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rl_initialize();
9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    RESTORE_LOCALE(saved_locale)
9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Wrapper around GNU readline that handles signals differently. */
9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_RL_CALLBACK) && defined(HAVE_SELECT)
9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic  char *completed_input_string;
9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrlhandler(char *text)
9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    completed_input_string = text;
9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_callback_handler_remove();
9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern PyThreadState* _PyOS_ReadlineTState;
9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char *
9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreadline_until_enter_or_signal(char *prompt, int *signal)
9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char * not_done_reading = "";
9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    fd_set selectset;
9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *signal = 0;
9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_CATCH_SIGNAL
9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_catch_signals = 0;
9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_callback_handler_install (prompt, rlhandler);
9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    FD_ZERO(&selectset);
9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    completed_input_string = not_done_reading;
9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (completed_input_string == not_done_reading) {
9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int has_input = 0;
9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while (!has_input)
9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {               struct timeval timeout = {0, 100000}; /* 0.1 seconds */
9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* [Bug #1552726] Only limit the pause if an input hook has been
9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               defined.  */
9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            struct timeval *timeoutp = NULL;
9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (PyOS_InputHook)
9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                timeoutp = &timeout;
9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            FD_SET(fileno(rl_instream), &selectset);
9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* select resets selectset if no input was available */
9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            has_input = select(fileno(rl_instream) + 1, &selectset,
9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               NULL, NULL, timeoutp);
9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if(PyOS_InputHook) PyOS_InputHook();
9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if(has_input > 0) {
9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            rl_callback_read_char();
9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (errno == EINTR) {
9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int s;
9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyEval_RestoreThread(_PyOS_ReadlineTState);
9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            s = PyErr_CheckSignals();
9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyEval_SaveThread();
9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (s < 0) {
9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rl_free_line_state();
9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rl_cleanup_after_signal();
9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                rl_callback_handler_remove();
9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *signal = 1;
9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                completed_input_string = NULL;
9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return completed_input_string;
9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Interrupt handler */
9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic jmp_buf jbuf;
9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ARGSUSED */
9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmonintr(int sig)
10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    longjmp(jbuf, 1);
10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char *
10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreadline_until_enter_or_signal(char *prompt, int *signal)
10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyOS_sighandler_t old_inthandler;
10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *p;
10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *signal = 0;
10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    old_inthandler = PyOS_setsig(SIGINT, onintr);
10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (setjmp(jbuf)) {
10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SIGRELSE
10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* This seems necessary on SunOS 4.1 (Rasmus Hahn) */
10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sigrelse(SIGINT);
10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_setsig(SIGINT, old_inthandler);
10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *signal = 1;
10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rl_event_hook = PyOS_InputHook;
10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = readline(prompt);
10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyOS_setsig(SIGINT, old_inthandler);
10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return p;
10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /*defined(HAVE_RL_CALLBACK) && defined(HAVE_SELECT) */
10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char *
10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcall_readline(FILE *sys_stdin, FILE *sys_stdout, char *prompt)
10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size_t n;
10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *p, *q;
10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int signal;
10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SAVE_LOCALE
10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *saved_locale = strdup(setlocale(LC_CTYPE, NULL));
10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!saved_locale)
10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_FatalError("not enough memory to save locale");
10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    setlocale(LC_CTYPE, "");
10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sys_stdin != rl_instream || sys_stdout != rl_outstream) {
10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rl_instream = sys_stdin;
10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rl_outstream = sys_stdout;
10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rl_prep_terminal (1);
10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = readline_until_enter_or_signal(prompt, &signal);
10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* we got an interrupt signal */
10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (signal) {
10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        RESTORE_LOCALE(saved_locale)
10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* We got an EOF, return a empty string. */
10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (p == NULL) {
10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        p = PyMem_Malloc(1);
10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (p != NULL)
10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            *p = '\0';
10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        RESTORE_LOCALE(saved_locale)
10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return p;
10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* we have a valid line */
10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = strlen(p);
10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n > 0) {
10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        const char *line;
10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int length = _py_get_history_length();
10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (length > 0)
10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __APPLE__
10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (using_libedit_emulation) {
10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /*
10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * Libedit's emulation uses 0-based indexes,
10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * the real readline uses 1-based indexes.
10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 */
10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                line = history_get(length - 1)->line;
10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            } else
10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* __APPLE__ */
10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            line = history_get(length)->line;
10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            line = "";
10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (strcmp(p, line))
10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            add_history(p);
10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Copy the malloc'ed buffer into a PyMem_Malloc'ed one and
10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       release the original. */
10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    q = p;
10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = PyMem_Malloc(n+2);
10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (p != NULL) {
10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        strncpy(p, q, n);
10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        p[n] = '\n';
11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        p[n+1] = '\0';
11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    free(q);
11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    RESTORE_LOCALE(saved_locale)
11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return p;
11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Initialize the module */
11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_module,
11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Importing this module enables command line editing using GNU readline.");
11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __APPLE__
11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(doc_module_le,
11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Importing this module enables command line editing using libedit readline.");
11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* __APPLE__ */
11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyMODINIT_FUNC
11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminitreadline(void)
11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *m;
11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __APPLE__
11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strncmp(rl_library_version, libedit_version_tag, strlen(libedit_version_tag)) == 0) {
11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        using_libedit_emulation = 1;
11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (using_libedit_emulation)
11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        m = Py_InitModule4("readline", readline_methods, doc_module_le,
11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   (PyObject *)NULL, PYTHON_API_VERSION);
11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* __APPLE__ */
11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    m = Py_InitModule4("readline", readline_methods, doc_module,
11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       (PyObject *)NULL, PYTHON_API_VERSION);
11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (m == NULL)
11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyOS_ReadlineFunctionPointer = call_readline;
11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    setup_readline();
11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1145