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