17db96d56Sopenharmony_ci/* This module makes GNU readline available to Python. It has ideas 27db96d56Sopenharmony_ci * contributed by Lee Busby, LLNL, and William Magro, Cornell Theory 37db96d56Sopenharmony_ci * Center. The completer interface was inspired by Lele Gaifax. More 47db96d56Sopenharmony_ci * recently, it was largely rewritten by Guido van Rossum. 57db96d56Sopenharmony_ci */ 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci/* Standard definitions */ 87db96d56Sopenharmony_ci#include "Python.h" 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci#include <errno.h> 117db96d56Sopenharmony_ci#include <signal.h> 127db96d56Sopenharmony_ci#include <stddef.h> 137db96d56Sopenharmony_ci#include <stdlib.h> // free() 147db96d56Sopenharmony_ci#include <sys/time.h> 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci#if defined(HAVE_SETLOCALE) 177db96d56Sopenharmony_ci/* GNU readline() mistakenly sets the LC_CTYPE locale. 187db96d56Sopenharmony_ci * This is evil. Only the user or the app's main() should do this! 197db96d56Sopenharmony_ci * We must save and restore the locale around the rl_initialize() call. 207db96d56Sopenharmony_ci */ 217db96d56Sopenharmony_ci#define SAVE_LOCALE 227db96d56Sopenharmony_ci#include <locale.h> 237db96d56Sopenharmony_ci#endif 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci#ifdef SAVE_LOCALE 267db96d56Sopenharmony_ci# define RESTORE_LOCALE(sl) { setlocale(LC_CTYPE, sl); free(sl); } 277db96d56Sopenharmony_ci#else 287db96d56Sopenharmony_ci# define RESTORE_LOCALE(sl) 297db96d56Sopenharmony_ci#endif 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci#ifdef WITH_EDITLINE 327db96d56Sopenharmony_ci# include <editline/readline.h> 337db96d56Sopenharmony_ci#else 347db96d56Sopenharmony_ci/* GNU readline definitions */ 357db96d56Sopenharmony_ci# undef HAVE_CONFIG_H /* Else readline/chardefs.h includes strings.h */ 367db96d56Sopenharmony_ci# include <readline/readline.h> 377db96d56Sopenharmony_ci# include <readline/history.h> 387db96d56Sopenharmony_ci#endif 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci#ifdef HAVE_RL_COMPLETION_MATCHES 417db96d56Sopenharmony_ci#define completion_matches(x, y) \ 427db96d56Sopenharmony_ci rl_completion_matches((x), ((rl_compentry_func_t *)(y))) 437db96d56Sopenharmony_ci#else 447db96d56Sopenharmony_ci#if defined(_RL_FUNCTION_TYPEDEF) 457db96d56Sopenharmony_ciextern char **completion_matches(char *, rl_compentry_func_t *); 467db96d56Sopenharmony_ci#else 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci#if !defined(__APPLE__) 497db96d56Sopenharmony_ciextern char **completion_matches(char *, CPFunction *); 507db96d56Sopenharmony_ci#endif 517db96d56Sopenharmony_ci#endif 527db96d56Sopenharmony_ci#endif 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci/* 557db96d56Sopenharmony_ci * It is possible to link the readline module to the readline 567db96d56Sopenharmony_ci * emulation library of editline/libedit. 577db96d56Sopenharmony_ci * 587db96d56Sopenharmony_ci * This emulation library is not 100% API compatible with the "real" readline 597db96d56Sopenharmony_ci * and cannot be detected at compile-time, 607db96d56Sopenharmony_ci * hence we use a runtime check to detect if the Python readline module is 617db96d56Sopenharmony_ci * linked to libedit. 627db96d56Sopenharmony_ci * 637db96d56Sopenharmony_ci * Currently there is one known API incompatibility: 647db96d56Sopenharmony_ci * - 'get_history' has a 1-based index with GNU readline, and a 0-based 657db96d56Sopenharmony_ci * index with older versions of libedit's emulation. 667db96d56Sopenharmony_ci * - Note that replace_history and remove_history use a 0-based index 677db96d56Sopenharmony_ci * with both implementations. 687db96d56Sopenharmony_ci */ 697db96d56Sopenharmony_cistatic int using_libedit_emulation = 0; 707db96d56Sopenharmony_cistatic const char libedit_version_tag[] = "EditLine wrapper"; 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_cistatic int8_t libedit_history_start = 0; 737db96d56Sopenharmony_cistatic int8_t libedit_append_replace_history_offset = 0; 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci#ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 767db96d56Sopenharmony_cistatic void 777db96d56Sopenharmony_cion_completion_display_matches_hook(char **matches, 787db96d56Sopenharmony_ci int num_matches, int max_length); 797db96d56Sopenharmony_ci#endif 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci/* Memory allocated for rl_completer_word_break_characters 827db96d56Sopenharmony_ci (see issue #17289 for the motivation). */ 837db96d56Sopenharmony_cistatic char *completer_word_break_characters; 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_citypedef struct { 867db96d56Sopenharmony_ci /* Specify hook functions in Python */ 877db96d56Sopenharmony_ci PyObject *completion_display_matches_hook; 887db96d56Sopenharmony_ci PyObject *startup_hook; 897db96d56Sopenharmony_ci PyObject *pre_input_hook; 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci PyObject *completer; /* Specify a word completer in Python */ 927db96d56Sopenharmony_ci PyObject *begidx; 937db96d56Sopenharmony_ci PyObject *endidx; 947db96d56Sopenharmony_ci} readlinestate; 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_cistatic inline readlinestate* 977db96d56Sopenharmony_ciget_readline_state(PyObject *module) 987db96d56Sopenharmony_ci{ 997db96d56Sopenharmony_ci void *state = PyModule_GetState(module); 1007db96d56Sopenharmony_ci assert(state != NULL); 1017db96d56Sopenharmony_ci return (readlinestate *)state; 1027db96d56Sopenharmony_ci} 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci/*[clinic input] 1057db96d56Sopenharmony_cimodule readline 1067db96d56Sopenharmony_ci[clinic start generated code]*/ 1077db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ad49da781b9c8721]*/ 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_cistatic int 1107db96d56Sopenharmony_cireadline_clear(PyObject *m) 1117db96d56Sopenharmony_ci{ 1127db96d56Sopenharmony_ci readlinestate *state = get_readline_state(m); 1137db96d56Sopenharmony_ci Py_CLEAR(state->completion_display_matches_hook); 1147db96d56Sopenharmony_ci Py_CLEAR(state->startup_hook); 1157db96d56Sopenharmony_ci Py_CLEAR(state->pre_input_hook); 1167db96d56Sopenharmony_ci Py_CLEAR(state->completer); 1177db96d56Sopenharmony_ci Py_CLEAR(state->begidx); 1187db96d56Sopenharmony_ci Py_CLEAR(state->endidx); 1197db96d56Sopenharmony_ci return 0; 1207db96d56Sopenharmony_ci} 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_cistatic int 1237db96d56Sopenharmony_cireadline_traverse(PyObject *m, visitproc visit, void *arg) 1247db96d56Sopenharmony_ci{ 1257db96d56Sopenharmony_ci readlinestate *state = get_readline_state(m); 1267db96d56Sopenharmony_ci Py_VISIT(state->completion_display_matches_hook); 1277db96d56Sopenharmony_ci Py_VISIT(state->startup_hook); 1287db96d56Sopenharmony_ci Py_VISIT(state->pre_input_hook); 1297db96d56Sopenharmony_ci Py_VISIT(state->completer); 1307db96d56Sopenharmony_ci Py_VISIT(state->begidx); 1317db96d56Sopenharmony_ci Py_VISIT(state->endidx); 1327db96d56Sopenharmony_ci return 0; 1337db96d56Sopenharmony_ci} 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_cistatic void 1367db96d56Sopenharmony_cireadline_free(void *m) 1377db96d56Sopenharmony_ci{ 1387db96d56Sopenharmony_ci readline_clear((PyObject *)m); 1397db96d56Sopenharmony_ci} 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_cistatic PyModuleDef readlinemodule; 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci#define readlinestate_global ((readlinestate *)PyModule_GetState(PyState_FindModule(&readlinemodule))) 1447db96d56Sopenharmony_ci 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci/* Convert to/from multibyte C strings */ 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_cistatic PyObject * 1497db96d56Sopenharmony_ciencode(PyObject *b) 1507db96d56Sopenharmony_ci{ 1517db96d56Sopenharmony_ci return PyUnicode_EncodeLocale(b, "surrogateescape"); 1527db96d56Sopenharmony_ci} 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_cistatic PyObject * 1557db96d56Sopenharmony_cidecode(const char *s) 1567db96d56Sopenharmony_ci{ 1577db96d56Sopenharmony_ci return PyUnicode_DecodeLocale(s, "surrogateescape"); 1587db96d56Sopenharmony_ci} 1597db96d56Sopenharmony_ci 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci/* 1627db96d56Sopenharmony_ciExplicitly disable bracketed paste in the interactive interpreter, even if it's 1637db96d56Sopenharmony_ciset in the inputrc, is enabled by default (eg GNU Readline 8.1), or a user calls 1647db96d56Sopenharmony_cireadline.read_init_file(). The Python REPL has not implemented bracketed 1657db96d56Sopenharmony_cipaste support. Also, bracketed mode writes the "\x1b[?2004h" escape sequence 1667db96d56Sopenharmony_ciinto stdout which causes test failures in applications that don't support it. 1677db96d56Sopenharmony_ciIt can still be explicitly enabled by calling readline.parse_and_bind("set 1687db96d56Sopenharmony_cienable-bracketed-paste on"). See bpo-42819 for more details. 1697db96d56Sopenharmony_ci 1707db96d56Sopenharmony_ciThis should be removed if bracketed paste mode is implemented (bpo-39820). 1717db96d56Sopenharmony_ci*/ 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_cistatic void 1747db96d56Sopenharmony_cidisable_bracketed_paste(void) 1757db96d56Sopenharmony_ci{ 1767db96d56Sopenharmony_ci if (!using_libedit_emulation) { 1777db96d56Sopenharmony_ci rl_variable_bind ("enable-bracketed-paste", "off"); 1787db96d56Sopenharmony_ci } 1797db96d56Sopenharmony_ci} 1807db96d56Sopenharmony_ci 1817db96d56Sopenharmony_ci/* Exported function to send one line to readline's init file parser */ 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci/*[clinic input] 1847db96d56Sopenharmony_cireadline.parse_and_bind 1857db96d56Sopenharmony_ci 1867db96d56Sopenharmony_ci string: object 1877db96d56Sopenharmony_ci / 1887db96d56Sopenharmony_ci 1897db96d56Sopenharmony_ciExecute the init line provided in the string argument. 1907db96d56Sopenharmony_ci[clinic start generated code]*/ 1917db96d56Sopenharmony_ci 1927db96d56Sopenharmony_cistatic PyObject * 1937db96d56Sopenharmony_cireadline_parse_and_bind(PyObject *module, PyObject *string) 1947db96d56Sopenharmony_ci/*[clinic end generated code: output=1a1ede8afb9546c1 input=8a28a00bb4d61eec]*/ 1957db96d56Sopenharmony_ci{ 1967db96d56Sopenharmony_ci char *copy; 1977db96d56Sopenharmony_ci PyObject *encoded = encode(string); 1987db96d56Sopenharmony_ci if (encoded == NULL) { 1997db96d56Sopenharmony_ci return NULL; 2007db96d56Sopenharmony_ci } 2017db96d56Sopenharmony_ci /* Make a copy -- rl_parse_and_bind() modifies its argument */ 2027db96d56Sopenharmony_ci /* Bernard Herzog */ 2037db96d56Sopenharmony_ci copy = PyMem_Malloc(1 + PyBytes_GET_SIZE(encoded)); 2047db96d56Sopenharmony_ci if (copy == NULL) { 2057db96d56Sopenharmony_ci Py_DECREF(encoded); 2067db96d56Sopenharmony_ci return PyErr_NoMemory(); 2077db96d56Sopenharmony_ci } 2087db96d56Sopenharmony_ci strcpy(copy, PyBytes_AS_STRING(encoded)); 2097db96d56Sopenharmony_ci Py_DECREF(encoded); 2107db96d56Sopenharmony_ci rl_parse_and_bind(copy); 2117db96d56Sopenharmony_ci PyMem_Free(copy); /* Free the copy */ 2127db96d56Sopenharmony_ci Py_RETURN_NONE; 2137db96d56Sopenharmony_ci} 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci/* Exported function to parse a readline init file */ 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci/*[clinic input] 2187db96d56Sopenharmony_cireadline.read_init_file 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ci filename as filename_obj: object = None 2217db96d56Sopenharmony_ci / 2227db96d56Sopenharmony_ci 2237db96d56Sopenharmony_ciExecute a readline initialization file. 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ciThe default filename is the last filename used. 2267db96d56Sopenharmony_ci[clinic start generated code]*/ 2277db96d56Sopenharmony_ci 2287db96d56Sopenharmony_cistatic PyObject * 2297db96d56Sopenharmony_cireadline_read_init_file_impl(PyObject *module, PyObject *filename_obj) 2307db96d56Sopenharmony_ci/*[clinic end generated code: output=8e059b676142831e input=4c80c473e448139d]*/ 2317db96d56Sopenharmony_ci{ 2327db96d56Sopenharmony_ci PyObject *filename_bytes; 2337db96d56Sopenharmony_ci if (filename_obj != Py_None) { 2347db96d56Sopenharmony_ci if (!PyUnicode_FSConverter(filename_obj, &filename_bytes)) 2357db96d56Sopenharmony_ci return NULL; 2367db96d56Sopenharmony_ci errno = rl_read_init_file(PyBytes_AS_STRING(filename_bytes)); 2377db96d56Sopenharmony_ci Py_DECREF(filename_bytes); 2387db96d56Sopenharmony_ci } else 2397db96d56Sopenharmony_ci errno = rl_read_init_file(NULL); 2407db96d56Sopenharmony_ci if (errno) 2417db96d56Sopenharmony_ci return PyErr_SetFromErrno(PyExc_OSError); 2427db96d56Sopenharmony_ci disable_bracketed_paste(); 2437db96d56Sopenharmony_ci Py_RETURN_NONE; 2447db96d56Sopenharmony_ci} 2457db96d56Sopenharmony_ci 2467db96d56Sopenharmony_ci/* Exported function to load a readline history file */ 2477db96d56Sopenharmony_ci 2487db96d56Sopenharmony_ci/*[clinic input] 2497db96d56Sopenharmony_cireadline.read_history_file 2507db96d56Sopenharmony_ci 2517db96d56Sopenharmony_ci filename as filename_obj: object = None 2527db96d56Sopenharmony_ci / 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ciLoad a readline history file. 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_ciThe default filename is ~/.history. 2577db96d56Sopenharmony_ci[clinic start generated code]*/ 2587db96d56Sopenharmony_ci 2597db96d56Sopenharmony_cistatic PyObject * 2607db96d56Sopenharmony_cireadline_read_history_file_impl(PyObject *module, PyObject *filename_obj) 2617db96d56Sopenharmony_ci/*[clinic end generated code: output=66a951836fb54fbb input=3d29d755b7e6932e]*/ 2627db96d56Sopenharmony_ci{ 2637db96d56Sopenharmony_ci PyObject *filename_bytes; 2647db96d56Sopenharmony_ci if (filename_obj != Py_None) { 2657db96d56Sopenharmony_ci if (!PyUnicode_FSConverter(filename_obj, &filename_bytes)) 2667db96d56Sopenharmony_ci return NULL; 2677db96d56Sopenharmony_ci errno = read_history(PyBytes_AS_STRING(filename_bytes)); 2687db96d56Sopenharmony_ci Py_DECREF(filename_bytes); 2697db96d56Sopenharmony_ci } else 2707db96d56Sopenharmony_ci errno = read_history(NULL); 2717db96d56Sopenharmony_ci if (errno) 2727db96d56Sopenharmony_ci return PyErr_SetFromErrno(PyExc_OSError); 2737db96d56Sopenharmony_ci Py_RETURN_NONE; 2747db96d56Sopenharmony_ci} 2757db96d56Sopenharmony_ci 2767db96d56Sopenharmony_cistatic int _history_length = -1; /* do not truncate history by default */ 2777db96d56Sopenharmony_ci 2787db96d56Sopenharmony_ci/* Exported function to save a readline history file */ 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci/*[clinic input] 2817db96d56Sopenharmony_cireadline.write_history_file 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ci filename as filename_obj: object = None 2847db96d56Sopenharmony_ci / 2857db96d56Sopenharmony_ci 2867db96d56Sopenharmony_ciSave a readline history file. 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ciThe default filename is ~/.history. 2897db96d56Sopenharmony_ci[clinic start generated code]*/ 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_cistatic PyObject * 2927db96d56Sopenharmony_cireadline_write_history_file_impl(PyObject *module, PyObject *filename_obj) 2937db96d56Sopenharmony_ci/*[clinic end generated code: output=fbcad13d8ef59ae6 input=28a8e062fe363703]*/ 2947db96d56Sopenharmony_ci{ 2957db96d56Sopenharmony_ci PyObject *filename_bytes; 2967db96d56Sopenharmony_ci const char *filename; 2977db96d56Sopenharmony_ci int err; 2987db96d56Sopenharmony_ci if (filename_obj != Py_None) { 2997db96d56Sopenharmony_ci if (!PyUnicode_FSConverter(filename_obj, &filename_bytes)) 3007db96d56Sopenharmony_ci return NULL; 3017db96d56Sopenharmony_ci filename = PyBytes_AS_STRING(filename_bytes); 3027db96d56Sopenharmony_ci } else { 3037db96d56Sopenharmony_ci filename_bytes = NULL; 3047db96d56Sopenharmony_ci filename = NULL; 3057db96d56Sopenharmony_ci } 3067db96d56Sopenharmony_ci errno = err = write_history(filename); 3077db96d56Sopenharmony_ci if (!err && _history_length >= 0) 3087db96d56Sopenharmony_ci history_truncate_file(filename, _history_length); 3097db96d56Sopenharmony_ci Py_XDECREF(filename_bytes); 3107db96d56Sopenharmony_ci errno = err; 3117db96d56Sopenharmony_ci if (errno) 3127db96d56Sopenharmony_ci return PyErr_SetFromErrno(PyExc_OSError); 3137db96d56Sopenharmony_ci Py_RETURN_NONE; 3147db96d56Sopenharmony_ci} 3157db96d56Sopenharmony_ci 3167db96d56Sopenharmony_ci#ifdef HAVE_RL_APPEND_HISTORY 3177db96d56Sopenharmony_ci/* Exported function to save part of a readline history file */ 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci/*[clinic input] 3207db96d56Sopenharmony_cireadline.append_history_file 3217db96d56Sopenharmony_ci 3227db96d56Sopenharmony_ci nelements: int 3237db96d56Sopenharmony_ci filename as filename_obj: object = None 3247db96d56Sopenharmony_ci / 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ciAppend the last nelements items of the history list to file. 3277db96d56Sopenharmony_ci 3287db96d56Sopenharmony_ciThe default filename is ~/.history. 3297db96d56Sopenharmony_ci[clinic start generated code]*/ 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_cistatic PyObject * 3327db96d56Sopenharmony_cireadline_append_history_file_impl(PyObject *module, int nelements, 3337db96d56Sopenharmony_ci PyObject *filename_obj) 3347db96d56Sopenharmony_ci/*[clinic end generated code: output=5df06fc9da56e4e4 input=784b774db3a4b7c5]*/ 3357db96d56Sopenharmony_ci{ 3367db96d56Sopenharmony_ci PyObject *filename_bytes; 3377db96d56Sopenharmony_ci const char *filename; 3387db96d56Sopenharmony_ci int err; 3397db96d56Sopenharmony_ci if (filename_obj != Py_None) { 3407db96d56Sopenharmony_ci if (!PyUnicode_FSConverter(filename_obj, &filename_bytes)) 3417db96d56Sopenharmony_ci return NULL; 3427db96d56Sopenharmony_ci filename = PyBytes_AS_STRING(filename_bytes); 3437db96d56Sopenharmony_ci } else { 3447db96d56Sopenharmony_ci filename_bytes = NULL; 3457db96d56Sopenharmony_ci filename = NULL; 3467db96d56Sopenharmony_ci } 3477db96d56Sopenharmony_ci errno = err = append_history( 3487db96d56Sopenharmony_ci nelements - libedit_append_replace_history_offset, filename); 3497db96d56Sopenharmony_ci if (!err && _history_length >= 0) 3507db96d56Sopenharmony_ci history_truncate_file(filename, _history_length); 3517db96d56Sopenharmony_ci Py_XDECREF(filename_bytes); 3527db96d56Sopenharmony_ci errno = err; 3537db96d56Sopenharmony_ci if (errno) 3547db96d56Sopenharmony_ci return PyErr_SetFromErrno(PyExc_OSError); 3557db96d56Sopenharmony_ci Py_RETURN_NONE; 3567db96d56Sopenharmony_ci} 3577db96d56Sopenharmony_ci#endif 3587db96d56Sopenharmony_ci 3597db96d56Sopenharmony_ci 3607db96d56Sopenharmony_ci/* Set history length */ 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci/*[clinic input] 3637db96d56Sopenharmony_cireadline.set_history_length 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_ci length: int 3667db96d56Sopenharmony_ci / 3677db96d56Sopenharmony_ci 3687db96d56Sopenharmony_ciSet the maximal number of lines which will be written to the history file. 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ciA negative length is used to inhibit history truncation. 3717db96d56Sopenharmony_ci[clinic start generated code]*/ 3727db96d56Sopenharmony_ci 3737db96d56Sopenharmony_cistatic PyObject * 3747db96d56Sopenharmony_cireadline_set_history_length_impl(PyObject *module, int length) 3757db96d56Sopenharmony_ci/*[clinic end generated code: output=e161a53e45987dc7 input=b8901bf16488b760]*/ 3767db96d56Sopenharmony_ci{ 3777db96d56Sopenharmony_ci _history_length = length; 3787db96d56Sopenharmony_ci Py_RETURN_NONE; 3797db96d56Sopenharmony_ci} 3807db96d56Sopenharmony_ci 3817db96d56Sopenharmony_ci/* Get history length */ 3827db96d56Sopenharmony_ci 3837db96d56Sopenharmony_ci/*[clinic input] 3847db96d56Sopenharmony_cireadline.get_history_length 3857db96d56Sopenharmony_ci 3867db96d56Sopenharmony_ciReturn the maximum number of lines that will be written to the history file. 3877db96d56Sopenharmony_ci[clinic start generated code]*/ 3887db96d56Sopenharmony_ci 3897db96d56Sopenharmony_cistatic PyObject * 3907db96d56Sopenharmony_cireadline_get_history_length_impl(PyObject *module) 3917db96d56Sopenharmony_ci/*[clinic end generated code: output=83a2eeae35b6d2b9 input=5dce2eeba4327817]*/ 3927db96d56Sopenharmony_ci{ 3937db96d56Sopenharmony_ci return PyLong_FromLong(_history_length); 3947db96d56Sopenharmony_ci} 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci/* Generic hook function setter */ 3977db96d56Sopenharmony_ci 3987db96d56Sopenharmony_cistatic PyObject * 3997db96d56Sopenharmony_ciset_hook(const char *funcname, PyObject **hook_var, PyObject *function) 4007db96d56Sopenharmony_ci{ 4017db96d56Sopenharmony_ci if (function == Py_None) { 4027db96d56Sopenharmony_ci Py_CLEAR(*hook_var); 4037db96d56Sopenharmony_ci } 4047db96d56Sopenharmony_ci else if (PyCallable_Check(function)) { 4057db96d56Sopenharmony_ci Py_INCREF(function); 4067db96d56Sopenharmony_ci Py_XSETREF(*hook_var, function); 4077db96d56Sopenharmony_ci } 4087db96d56Sopenharmony_ci else { 4097db96d56Sopenharmony_ci PyErr_Format(PyExc_TypeError, 4107db96d56Sopenharmony_ci "set_%.50s(func): argument not callable", 4117db96d56Sopenharmony_ci funcname); 4127db96d56Sopenharmony_ci return NULL; 4137db96d56Sopenharmony_ci } 4147db96d56Sopenharmony_ci Py_RETURN_NONE; 4157db96d56Sopenharmony_ci} 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ci/*[clinic input] 4187db96d56Sopenharmony_cireadline.set_completion_display_matches_hook 4197db96d56Sopenharmony_ci 4207db96d56Sopenharmony_ci function: object = None 4217db96d56Sopenharmony_ci / 4227db96d56Sopenharmony_ci 4237db96d56Sopenharmony_ciSet or remove the completion display function. 4247db96d56Sopenharmony_ci 4257db96d56Sopenharmony_ciThe function is called as 4267db96d56Sopenharmony_ci function(substitution, [matches], longest_match_length) 4277db96d56Sopenharmony_cionce each time matches need to be displayed. 4287db96d56Sopenharmony_ci[clinic start generated code]*/ 4297db96d56Sopenharmony_ci 4307db96d56Sopenharmony_cistatic PyObject * 4317db96d56Sopenharmony_cireadline_set_completion_display_matches_hook_impl(PyObject *module, 4327db96d56Sopenharmony_ci PyObject *function) 4337db96d56Sopenharmony_ci/*[clinic end generated code: output=516e5cb8db75a328 input=4f0bfd5ab0179a26]*/ 4347db96d56Sopenharmony_ci{ 4357db96d56Sopenharmony_ci PyObject *result = set_hook("completion_display_matches_hook", 4367db96d56Sopenharmony_ci &readlinestate_global->completion_display_matches_hook, 4377db96d56Sopenharmony_ci function); 4387db96d56Sopenharmony_ci#ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 4397db96d56Sopenharmony_ci /* We cannot set this hook globally, since it replaces the 4407db96d56Sopenharmony_ci default completion display. */ 4417db96d56Sopenharmony_ci rl_completion_display_matches_hook = 4427db96d56Sopenharmony_ci readlinestate_global->completion_display_matches_hook ? 4437db96d56Sopenharmony_ci#if defined(_RL_FUNCTION_TYPEDEF) 4447db96d56Sopenharmony_ci (rl_compdisp_func_t *)on_completion_display_matches_hook : 0; 4457db96d56Sopenharmony_ci#else 4467db96d56Sopenharmony_ci (VFunction *)on_completion_display_matches_hook : 0; 4477db96d56Sopenharmony_ci#endif 4487db96d56Sopenharmony_ci#endif 4497db96d56Sopenharmony_ci return result; 4507db96d56Sopenharmony_ci 4517db96d56Sopenharmony_ci} 4527db96d56Sopenharmony_ci 4537db96d56Sopenharmony_ci/*[clinic input] 4547db96d56Sopenharmony_cireadline.set_startup_hook 4557db96d56Sopenharmony_ci 4567db96d56Sopenharmony_ci function: object = None 4577db96d56Sopenharmony_ci / 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_ciSet or remove the function invoked by the rl_startup_hook callback. 4607db96d56Sopenharmony_ci 4617db96d56Sopenharmony_ciThe function is called with no arguments just 4627db96d56Sopenharmony_cibefore readline prints the first prompt. 4637db96d56Sopenharmony_ci[clinic start generated code]*/ 4647db96d56Sopenharmony_ci 4657db96d56Sopenharmony_cistatic PyObject * 4667db96d56Sopenharmony_cireadline_set_startup_hook_impl(PyObject *module, PyObject *function) 4677db96d56Sopenharmony_ci/*[clinic end generated code: output=02cd0e0c4fa082ad input=7783b4334b26d16d]*/ 4687db96d56Sopenharmony_ci{ 4697db96d56Sopenharmony_ci return set_hook("startup_hook", &readlinestate_global->startup_hook, 4707db96d56Sopenharmony_ci function); 4717db96d56Sopenharmony_ci} 4727db96d56Sopenharmony_ci 4737db96d56Sopenharmony_ci#ifdef HAVE_RL_PRE_INPUT_HOOK 4747db96d56Sopenharmony_ci 4757db96d56Sopenharmony_ci/* Set pre-input hook */ 4767db96d56Sopenharmony_ci 4777db96d56Sopenharmony_ci/*[clinic input] 4787db96d56Sopenharmony_cireadline.set_pre_input_hook 4797db96d56Sopenharmony_ci 4807db96d56Sopenharmony_ci function: object = None 4817db96d56Sopenharmony_ci / 4827db96d56Sopenharmony_ci 4837db96d56Sopenharmony_ciSet or remove the function invoked by the rl_pre_input_hook callback. 4847db96d56Sopenharmony_ci 4857db96d56Sopenharmony_ciThe function is called with no arguments after the first prompt 4867db96d56Sopenharmony_cihas been printed and just before readline starts reading input 4877db96d56Sopenharmony_cicharacters. 4887db96d56Sopenharmony_ci[clinic start generated code]*/ 4897db96d56Sopenharmony_ci 4907db96d56Sopenharmony_cistatic PyObject * 4917db96d56Sopenharmony_cireadline_set_pre_input_hook_impl(PyObject *module, PyObject *function) 4927db96d56Sopenharmony_ci/*[clinic end generated code: output=fe1a96505096f464 input=4f3eaeaf7ce1fdbe]*/ 4937db96d56Sopenharmony_ci{ 4947db96d56Sopenharmony_ci return set_hook("pre_input_hook", &readlinestate_global->pre_input_hook, 4957db96d56Sopenharmony_ci function); 4967db96d56Sopenharmony_ci} 4977db96d56Sopenharmony_ci#endif 4987db96d56Sopenharmony_ci 4997db96d56Sopenharmony_ci 5007db96d56Sopenharmony_ci/* Get the completion type for the scope of the tab-completion */ 5017db96d56Sopenharmony_ci 5027db96d56Sopenharmony_ci/*[clinic input] 5037db96d56Sopenharmony_cireadline.get_completion_type 5047db96d56Sopenharmony_ci 5057db96d56Sopenharmony_ciGet the type of completion being attempted. 5067db96d56Sopenharmony_ci[clinic start generated code]*/ 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_cistatic PyObject * 5097db96d56Sopenharmony_cireadline_get_completion_type_impl(PyObject *module) 5107db96d56Sopenharmony_ci/*[clinic end generated code: output=5c54d58a04997c07 input=04b92bc7a82dac91]*/ 5117db96d56Sopenharmony_ci{ 5127db96d56Sopenharmony_ci return PyLong_FromLong(rl_completion_type); 5137db96d56Sopenharmony_ci} 5147db96d56Sopenharmony_ci 5157db96d56Sopenharmony_ci/* Get the beginning index for the scope of the tab-completion */ 5167db96d56Sopenharmony_ci 5177db96d56Sopenharmony_ci/*[clinic input] 5187db96d56Sopenharmony_cireadline.get_begidx 5197db96d56Sopenharmony_ci 5207db96d56Sopenharmony_ciGet the beginning index of the completion scope. 5217db96d56Sopenharmony_ci[clinic start generated code]*/ 5227db96d56Sopenharmony_ci 5237db96d56Sopenharmony_cistatic PyObject * 5247db96d56Sopenharmony_cireadline_get_begidx_impl(PyObject *module) 5257db96d56Sopenharmony_ci/*[clinic end generated code: output=362616ee8ed1b2b1 input=e083b81c8eb4bac3]*/ 5267db96d56Sopenharmony_ci{ 5277db96d56Sopenharmony_ci Py_INCREF(readlinestate_global->begidx); 5287db96d56Sopenharmony_ci return readlinestate_global->begidx; 5297db96d56Sopenharmony_ci} 5307db96d56Sopenharmony_ci 5317db96d56Sopenharmony_ci/* Get the ending index for the scope of the tab-completion */ 5327db96d56Sopenharmony_ci 5337db96d56Sopenharmony_ci/*[clinic input] 5347db96d56Sopenharmony_cireadline.get_endidx 5357db96d56Sopenharmony_ci 5367db96d56Sopenharmony_ciGet the ending index of the completion scope. 5377db96d56Sopenharmony_ci[clinic start generated code]*/ 5387db96d56Sopenharmony_ci 5397db96d56Sopenharmony_cistatic PyObject * 5407db96d56Sopenharmony_cireadline_get_endidx_impl(PyObject *module) 5417db96d56Sopenharmony_ci/*[clinic end generated code: output=7f763350b12d7517 input=d4c7e34a625fd770]*/ 5427db96d56Sopenharmony_ci{ 5437db96d56Sopenharmony_ci Py_INCREF(readlinestate_global->endidx); 5447db96d56Sopenharmony_ci return readlinestate_global->endidx; 5457db96d56Sopenharmony_ci} 5467db96d56Sopenharmony_ci 5477db96d56Sopenharmony_ci/* Set the tab-completion word-delimiters that readline uses */ 5487db96d56Sopenharmony_ci 5497db96d56Sopenharmony_ci/*[clinic input] 5507db96d56Sopenharmony_cireadline.set_completer_delims 5517db96d56Sopenharmony_ci 5527db96d56Sopenharmony_ci string: object 5537db96d56Sopenharmony_ci / 5547db96d56Sopenharmony_ci 5557db96d56Sopenharmony_ciSet the word delimiters for completion. 5567db96d56Sopenharmony_ci[clinic start generated code]*/ 5577db96d56Sopenharmony_ci 5587db96d56Sopenharmony_cistatic PyObject * 5597db96d56Sopenharmony_cireadline_set_completer_delims(PyObject *module, PyObject *string) 5607db96d56Sopenharmony_ci/*[clinic end generated code: output=4305b266106c4f1f input=ae945337ebd01e20]*/ 5617db96d56Sopenharmony_ci{ 5627db96d56Sopenharmony_ci char *break_chars; 5637db96d56Sopenharmony_ci PyObject *encoded = encode(string); 5647db96d56Sopenharmony_ci if (encoded == NULL) { 5657db96d56Sopenharmony_ci return NULL; 5667db96d56Sopenharmony_ci } 5677db96d56Sopenharmony_ci /* Keep a reference to the allocated memory in the module state in case 5687db96d56Sopenharmony_ci some other module modifies rl_completer_word_break_characters 5697db96d56Sopenharmony_ci (see issue #17289). */ 5707db96d56Sopenharmony_ci break_chars = strdup(PyBytes_AS_STRING(encoded)); 5717db96d56Sopenharmony_ci Py_DECREF(encoded); 5727db96d56Sopenharmony_ci if (break_chars) { 5737db96d56Sopenharmony_ci free(completer_word_break_characters); 5747db96d56Sopenharmony_ci completer_word_break_characters = break_chars; 5757db96d56Sopenharmony_ci rl_completer_word_break_characters = break_chars; 5767db96d56Sopenharmony_ci Py_RETURN_NONE; 5777db96d56Sopenharmony_ci } 5787db96d56Sopenharmony_ci else 5797db96d56Sopenharmony_ci return PyErr_NoMemory(); 5807db96d56Sopenharmony_ci} 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_ci/* _py_free_history_entry: Utility function to free a history entry. */ 5837db96d56Sopenharmony_ci 5847db96d56Sopenharmony_ci#if defined(RL_READLINE_VERSION) && RL_READLINE_VERSION >= 0x0500 5857db96d56Sopenharmony_ci 5867db96d56Sopenharmony_ci/* Readline version >= 5.0 introduced a timestamp field into the history entry 5877db96d56Sopenharmony_ci structure; this needs to be freed to avoid a memory leak. This version of 5887db96d56Sopenharmony_ci readline also introduced the handy 'free_history_entry' function, which 5897db96d56Sopenharmony_ci takes care of the timestamp. */ 5907db96d56Sopenharmony_ci 5917db96d56Sopenharmony_cistatic void 5927db96d56Sopenharmony_ci_py_free_history_entry(HIST_ENTRY *entry) 5937db96d56Sopenharmony_ci{ 5947db96d56Sopenharmony_ci histdata_t data = free_history_entry(entry); 5957db96d56Sopenharmony_ci free(data); 5967db96d56Sopenharmony_ci} 5977db96d56Sopenharmony_ci 5987db96d56Sopenharmony_ci#else 5997db96d56Sopenharmony_ci 6007db96d56Sopenharmony_ci/* No free_history_entry function; free everything manually. */ 6017db96d56Sopenharmony_ci 6027db96d56Sopenharmony_cistatic void 6037db96d56Sopenharmony_ci_py_free_history_entry(HIST_ENTRY *entry) 6047db96d56Sopenharmony_ci{ 6057db96d56Sopenharmony_ci if (entry->line) 6067db96d56Sopenharmony_ci free((void *)entry->line); 6077db96d56Sopenharmony_ci if (entry->data) 6087db96d56Sopenharmony_ci free(entry->data); 6097db96d56Sopenharmony_ci free(entry); 6107db96d56Sopenharmony_ci} 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ci#endif 6137db96d56Sopenharmony_ci 6147db96d56Sopenharmony_ci/*[clinic input] 6157db96d56Sopenharmony_cireadline.remove_history_item 6167db96d56Sopenharmony_ci 6177db96d56Sopenharmony_ci pos as entry_number: int 6187db96d56Sopenharmony_ci / 6197db96d56Sopenharmony_ci 6207db96d56Sopenharmony_ciRemove history item given by its zero-based position. 6217db96d56Sopenharmony_ci[clinic start generated code]*/ 6227db96d56Sopenharmony_ci 6237db96d56Sopenharmony_cistatic PyObject * 6247db96d56Sopenharmony_cireadline_remove_history_item_impl(PyObject *module, int entry_number) 6257db96d56Sopenharmony_ci/*[clinic end generated code: output=ab114f029208c7e8 input=f248beb720ff1838]*/ 6267db96d56Sopenharmony_ci{ 6277db96d56Sopenharmony_ci HIST_ENTRY *entry; 6287db96d56Sopenharmony_ci 6297db96d56Sopenharmony_ci if (entry_number < 0) { 6307db96d56Sopenharmony_ci PyErr_SetString(PyExc_ValueError, 6317db96d56Sopenharmony_ci "History index cannot be negative"); 6327db96d56Sopenharmony_ci return NULL; 6337db96d56Sopenharmony_ci } 6347db96d56Sopenharmony_ci entry = remove_history(entry_number); 6357db96d56Sopenharmony_ci if (!entry) { 6367db96d56Sopenharmony_ci PyErr_Format(PyExc_ValueError, 6377db96d56Sopenharmony_ci "No history item at position %d", 6387db96d56Sopenharmony_ci entry_number); 6397db96d56Sopenharmony_ci return NULL; 6407db96d56Sopenharmony_ci } 6417db96d56Sopenharmony_ci /* free memory allocated for the history entry */ 6427db96d56Sopenharmony_ci _py_free_history_entry(entry); 6437db96d56Sopenharmony_ci Py_RETURN_NONE; 6447db96d56Sopenharmony_ci} 6457db96d56Sopenharmony_ci 6467db96d56Sopenharmony_ci/*[clinic input] 6477db96d56Sopenharmony_cireadline.replace_history_item 6487db96d56Sopenharmony_ci 6497db96d56Sopenharmony_ci pos as entry_number: int 6507db96d56Sopenharmony_ci line: unicode 6517db96d56Sopenharmony_ci / 6527db96d56Sopenharmony_ci 6537db96d56Sopenharmony_ciReplaces history item given by its position with contents of line. 6547db96d56Sopenharmony_ci 6557db96d56Sopenharmony_cipos is zero-based. 6567db96d56Sopenharmony_ci[clinic start generated code]*/ 6577db96d56Sopenharmony_ci 6587db96d56Sopenharmony_cistatic PyObject * 6597db96d56Sopenharmony_cireadline_replace_history_item_impl(PyObject *module, int entry_number, 6607db96d56Sopenharmony_ci PyObject *line) 6617db96d56Sopenharmony_ci/*[clinic end generated code: output=f8cec2770ca125eb input=368bb66fe5ee5222]*/ 6627db96d56Sopenharmony_ci{ 6637db96d56Sopenharmony_ci PyObject *encoded; 6647db96d56Sopenharmony_ci HIST_ENTRY *old_entry; 6657db96d56Sopenharmony_ci 6667db96d56Sopenharmony_ci if (entry_number < 0) { 6677db96d56Sopenharmony_ci PyErr_SetString(PyExc_ValueError, 6687db96d56Sopenharmony_ci "History index cannot be negative"); 6697db96d56Sopenharmony_ci return NULL; 6707db96d56Sopenharmony_ci } 6717db96d56Sopenharmony_ci encoded = encode(line); 6727db96d56Sopenharmony_ci if (encoded == NULL) { 6737db96d56Sopenharmony_ci return NULL; 6747db96d56Sopenharmony_ci } 6757db96d56Sopenharmony_ci old_entry = replace_history_entry( 6767db96d56Sopenharmony_ci entry_number + libedit_append_replace_history_offset, 6777db96d56Sopenharmony_ci PyBytes_AS_STRING(encoded), (void *)NULL); 6787db96d56Sopenharmony_ci Py_DECREF(encoded); 6797db96d56Sopenharmony_ci if (!old_entry) { 6807db96d56Sopenharmony_ci PyErr_Format(PyExc_ValueError, 6817db96d56Sopenharmony_ci "No history item at position %d", 6827db96d56Sopenharmony_ci entry_number); 6837db96d56Sopenharmony_ci return NULL; 6847db96d56Sopenharmony_ci } 6857db96d56Sopenharmony_ci /* free memory allocated for the old history entry */ 6867db96d56Sopenharmony_ci _py_free_history_entry(old_entry); 6877db96d56Sopenharmony_ci Py_RETURN_NONE; 6887db96d56Sopenharmony_ci} 6897db96d56Sopenharmony_ci 6907db96d56Sopenharmony_ci/* Add a line to the history buffer */ 6917db96d56Sopenharmony_ci 6927db96d56Sopenharmony_ci/*[clinic input] 6937db96d56Sopenharmony_cireadline.add_history 6947db96d56Sopenharmony_ci 6957db96d56Sopenharmony_ci string: object 6967db96d56Sopenharmony_ci / 6977db96d56Sopenharmony_ci 6987db96d56Sopenharmony_ciAdd an item to the history buffer. 6997db96d56Sopenharmony_ci[clinic start generated code]*/ 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_cistatic PyObject * 7027db96d56Sopenharmony_cireadline_add_history(PyObject *module, PyObject *string) 7037db96d56Sopenharmony_ci/*[clinic end generated code: output=b107b7e8106e803d input=e57c1cf6bc68d7e3]*/ 7047db96d56Sopenharmony_ci{ 7057db96d56Sopenharmony_ci PyObject *encoded = encode(string); 7067db96d56Sopenharmony_ci if (encoded == NULL) { 7077db96d56Sopenharmony_ci return NULL; 7087db96d56Sopenharmony_ci } 7097db96d56Sopenharmony_ci add_history(PyBytes_AS_STRING(encoded)); 7107db96d56Sopenharmony_ci Py_DECREF(encoded); 7117db96d56Sopenharmony_ci Py_RETURN_NONE; 7127db96d56Sopenharmony_ci} 7137db96d56Sopenharmony_ci 7147db96d56Sopenharmony_cistatic int should_auto_add_history = 1; 7157db96d56Sopenharmony_ci 7167db96d56Sopenharmony_ci/* Enable or disable automatic history */ 7177db96d56Sopenharmony_ci 7187db96d56Sopenharmony_ci/*[clinic input] 7197db96d56Sopenharmony_cireadline.set_auto_history 7207db96d56Sopenharmony_ci 7217db96d56Sopenharmony_ci enabled as _should_auto_add_history: bool 7227db96d56Sopenharmony_ci / 7237db96d56Sopenharmony_ci 7247db96d56Sopenharmony_ciEnables or disables automatic history. 7257db96d56Sopenharmony_ci[clinic start generated code]*/ 7267db96d56Sopenharmony_ci 7277db96d56Sopenharmony_cistatic PyObject * 7287db96d56Sopenharmony_cireadline_set_auto_history_impl(PyObject *module, 7297db96d56Sopenharmony_ci int _should_auto_add_history) 7307db96d56Sopenharmony_ci/*[clinic end generated code: output=619c6968246fd82b input=3d413073a1a03355]*/ 7317db96d56Sopenharmony_ci{ 7327db96d56Sopenharmony_ci should_auto_add_history = _should_auto_add_history; 7337db96d56Sopenharmony_ci Py_RETURN_NONE; 7347db96d56Sopenharmony_ci} 7357db96d56Sopenharmony_ci 7367db96d56Sopenharmony_ci 7377db96d56Sopenharmony_ci/* Get the tab-completion word-delimiters that readline uses */ 7387db96d56Sopenharmony_ci 7397db96d56Sopenharmony_ci/*[clinic input] 7407db96d56Sopenharmony_cireadline.get_completer_delims 7417db96d56Sopenharmony_ci 7427db96d56Sopenharmony_ciGet the word delimiters for completion. 7437db96d56Sopenharmony_ci[clinic start generated code]*/ 7447db96d56Sopenharmony_ci 7457db96d56Sopenharmony_cistatic PyObject * 7467db96d56Sopenharmony_cireadline_get_completer_delims_impl(PyObject *module) 7477db96d56Sopenharmony_ci/*[clinic end generated code: output=6b060280fa68ef43 input=e36eb14fb8a1f08a]*/ 7487db96d56Sopenharmony_ci{ 7497db96d56Sopenharmony_ci return decode(rl_completer_word_break_characters); 7507db96d56Sopenharmony_ci} 7517db96d56Sopenharmony_ci 7527db96d56Sopenharmony_ci/* Set the completer function */ 7537db96d56Sopenharmony_ci 7547db96d56Sopenharmony_ci/*[clinic input] 7557db96d56Sopenharmony_cireadline.set_completer 7567db96d56Sopenharmony_ci 7577db96d56Sopenharmony_ci function: object = None 7587db96d56Sopenharmony_ci / 7597db96d56Sopenharmony_ci 7607db96d56Sopenharmony_ciSet or remove the completer function. 7617db96d56Sopenharmony_ci 7627db96d56Sopenharmony_ciThe function is called as function(text, state), 7637db96d56Sopenharmony_cifor state in 0, 1, 2, ..., until it returns a non-string. 7647db96d56Sopenharmony_ciIt should return the next possible completion starting with 'text'. 7657db96d56Sopenharmony_ci[clinic start generated code]*/ 7667db96d56Sopenharmony_ci 7677db96d56Sopenharmony_cistatic PyObject * 7687db96d56Sopenharmony_cireadline_set_completer_impl(PyObject *module, PyObject *function) 7697db96d56Sopenharmony_ci/*[clinic end generated code: output=171a2a60f81d3204 input=51e81e13118eb877]*/ 7707db96d56Sopenharmony_ci{ 7717db96d56Sopenharmony_ci return set_hook("completer", &readlinestate_global->completer, function); 7727db96d56Sopenharmony_ci} 7737db96d56Sopenharmony_ci 7747db96d56Sopenharmony_ci/*[clinic input] 7757db96d56Sopenharmony_cireadline.get_completer 7767db96d56Sopenharmony_ci 7777db96d56Sopenharmony_ciGet the current completer function. 7787db96d56Sopenharmony_ci[clinic start generated code]*/ 7797db96d56Sopenharmony_ci 7807db96d56Sopenharmony_cistatic PyObject * 7817db96d56Sopenharmony_cireadline_get_completer_impl(PyObject *module) 7827db96d56Sopenharmony_ci/*[clinic end generated code: output=6e6bbd8226d14475 input=6457522e56d70d13]*/ 7837db96d56Sopenharmony_ci{ 7847db96d56Sopenharmony_ci if (readlinestate_global->completer == NULL) { 7857db96d56Sopenharmony_ci Py_RETURN_NONE; 7867db96d56Sopenharmony_ci } 7877db96d56Sopenharmony_ci Py_INCREF(readlinestate_global->completer); 7887db96d56Sopenharmony_ci return readlinestate_global->completer; 7897db96d56Sopenharmony_ci} 7907db96d56Sopenharmony_ci 7917db96d56Sopenharmony_ci/* Private function to get current length of history. XXX It may be 7927db96d56Sopenharmony_ci * possible to replace this with a direct use of history_length instead, 7937db96d56Sopenharmony_ci * but it's not clear whether BSD's libedit keeps history_length up to date. 7947db96d56Sopenharmony_ci * See issue #8065.*/ 7957db96d56Sopenharmony_ci 7967db96d56Sopenharmony_cistatic int 7977db96d56Sopenharmony_ci_py_get_history_length(void) 7987db96d56Sopenharmony_ci{ 7997db96d56Sopenharmony_ci HISTORY_STATE *hist_st = history_get_history_state(); 8007db96d56Sopenharmony_ci int length = hist_st->length; 8017db96d56Sopenharmony_ci /* the history docs don't say so, but the address of hist_st changes each 8027db96d56Sopenharmony_ci time history_get_history_state is called which makes me think it's 8037db96d56Sopenharmony_ci freshly malloc'd memory... on the other hand, the address of the last 8047db96d56Sopenharmony_ci line stays the same as long as history isn't extended, so it appears to 8057db96d56Sopenharmony_ci be malloc'd but managed by the history package... */ 8067db96d56Sopenharmony_ci free(hist_st); 8077db96d56Sopenharmony_ci return length; 8087db96d56Sopenharmony_ci} 8097db96d56Sopenharmony_ci 8107db96d56Sopenharmony_ci/* Exported function to get any element of history */ 8117db96d56Sopenharmony_ci 8127db96d56Sopenharmony_ci/*[clinic input] 8137db96d56Sopenharmony_cireadline.get_history_item 8147db96d56Sopenharmony_ci 8157db96d56Sopenharmony_ci index as idx: int 8167db96d56Sopenharmony_ci / 8177db96d56Sopenharmony_ci 8187db96d56Sopenharmony_ciReturn the current contents of history item at one-based index. 8197db96d56Sopenharmony_ci[clinic start generated code]*/ 8207db96d56Sopenharmony_ci 8217db96d56Sopenharmony_cistatic PyObject * 8227db96d56Sopenharmony_cireadline_get_history_item_impl(PyObject *module, int idx) 8237db96d56Sopenharmony_ci/*[clinic end generated code: output=83d3e53ea5f34b3d input=8adf5c80e6c7ff2b]*/ 8247db96d56Sopenharmony_ci{ 8257db96d56Sopenharmony_ci HIST_ENTRY *hist_ent; 8267db96d56Sopenharmony_ci 8277db96d56Sopenharmony_ci if (using_libedit_emulation) { 8287db96d56Sopenharmony_ci /* Older versions of libedit's readline emulation 8297db96d56Sopenharmony_ci * use 0-based indexes, while readline and newer 8307db96d56Sopenharmony_ci * versions of libedit use 1-based indexes. 8317db96d56Sopenharmony_ci */ 8327db96d56Sopenharmony_ci int length = _py_get_history_length(); 8337db96d56Sopenharmony_ci 8347db96d56Sopenharmony_ci idx = idx - 1 + libedit_history_start; 8357db96d56Sopenharmony_ci 8367db96d56Sopenharmony_ci /* 8377db96d56Sopenharmony_ci * Apple's readline emulation crashes when 8387db96d56Sopenharmony_ci * the index is out of range, therefore 8397db96d56Sopenharmony_ci * test for that and fail gracefully. 8407db96d56Sopenharmony_ci */ 8417db96d56Sopenharmony_ci if (idx < (0 + libedit_history_start) 8427db96d56Sopenharmony_ci || idx >= (length + libedit_history_start)) { 8437db96d56Sopenharmony_ci Py_RETURN_NONE; 8447db96d56Sopenharmony_ci } 8457db96d56Sopenharmony_ci } 8467db96d56Sopenharmony_ci if ((hist_ent = history_get(idx))) 8477db96d56Sopenharmony_ci return decode(hist_ent->line); 8487db96d56Sopenharmony_ci else { 8497db96d56Sopenharmony_ci Py_RETURN_NONE; 8507db96d56Sopenharmony_ci } 8517db96d56Sopenharmony_ci} 8527db96d56Sopenharmony_ci 8537db96d56Sopenharmony_ci/* Exported function to get current length of history */ 8547db96d56Sopenharmony_ci 8557db96d56Sopenharmony_ci/*[clinic input] 8567db96d56Sopenharmony_cireadline.get_current_history_length 8577db96d56Sopenharmony_ci 8587db96d56Sopenharmony_ciReturn the current (not the maximum) length of history. 8597db96d56Sopenharmony_ci[clinic start generated code]*/ 8607db96d56Sopenharmony_ci 8617db96d56Sopenharmony_cistatic PyObject * 8627db96d56Sopenharmony_cireadline_get_current_history_length_impl(PyObject *module) 8637db96d56Sopenharmony_ci/*[clinic end generated code: output=436b294f12ba1e3f input=9cb3f431a68d071f]*/ 8647db96d56Sopenharmony_ci{ 8657db96d56Sopenharmony_ci return PyLong_FromLong((long)_py_get_history_length()); 8667db96d56Sopenharmony_ci} 8677db96d56Sopenharmony_ci 8687db96d56Sopenharmony_ci/* Exported function to read the current line buffer */ 8697db96d56Sopenharmony_ci 8707db96d56Sopenharmony_ci/*[clinic input] 8717db96d56Sopenharmony_cireadline.get_line_buffer 8727db96d56Sopenharmony_ci 8737db96d56Sopenharmony_ciReturn the current contents of the line buffer. 8747db96d56Sopenharmony_ci[clinic start generated code]*/ 8757db96d56Sopenharmony_ci 8767db96d56Sopenharmony_cistatic PyObject * 8777db96d56Sopenharmony_cireadline_get_line_buffer_impl(PyObject *module) 8787db96d56Sopenharmony_ci/*[clinic end generated code: output=d22f9025ecad80e4 input=5f5fbc0d12c69412]*/ 8797db96d56Sopenharmony_ci{ 8807db96d56Sopenharmony_ci return decode(rl_line_buffer); 8817db96d56Sopenharmony_ci} 8827db96d56Sopenharmony_ci 8837db96d56Sopenharmony_ci#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER 8847db96d56Sopenharmony_ci 8857db96d56Sopenharmony_ci/* Exported function to clear the current history */ 8867db96d56Sopenharmony_ci 8877db96d56Sopenharmony_ci/*[clinic input] 8887db96d56Sopenharmony_cireadline.clear_history 8897db96d56Sopenharmony_ci 8907db96d56Sopenharmony_ciClear the current readline history. 8917db96d56Sopenharmony_ci[clinic start generated code]*/ 8927db96d56Sopenharmony_ci 8937db96d56Sopenharmony_cistatic PyObject * 8947db96d56Sopenharmony_cireadline_clear_history_impl(PyObject *module) 8957db96d56Sopenharmony_ci/*[clinic end generated code: output=1f2dbb0dfa5d5ebb input=208962c4393f5d16]*/ 8967db96d56Sopenharmony_ci{ 8977db96d56Sopenharmony_ci clear_history(); 8987db96d56Sopenharmony_ci Py_RETURN_NONE; 8997db96d56Sopenharmony_ci} 9007db96d56Sopenharmony_ci#endif 9017db96d56Sopenharmony_ci 9027db96d56Sopenharmony_ci 9037db96d56Sopenharmony_ci/* Exported function to insert text into the line buffer */ 9047db96d56Sopenharmony_ci 9057db96d56Sopenharmony_ci/*[clinic input] 9067db96d56Sopenharmony_cireadline.insert_text 9077db96d56Sopenharmony_ci 9087db96d56Sopenharmony_ci string: object 9097db96d56Sopenharmony_ci / 9107db96d56Sopenharmony_ci 9117db96d56Sopenharmony_ciInsert text into the line buffer at the cursor position. 9127db96d56Sopenharmony_ci[clinic start generated code]*/ 9137db96d56Sopenharmony_ci 9147db96d56Sopenharmony_cistatic PyObject * 9157db96d56Sopenharmony_cireadline_insert_text(PyObject *module, PyObject *string) 9167db96d56Sopenharmony_ci/*[clinic end generated code: output=23d792821d320c19 input=bc96c3c848d5ccb5]*/ 9177db96d56Sopenharmony_ci{ 9187db96d56Sopenharmony_ci PyObject *encoded = encode(string); 9197db96d56Sopenharmony_ci if (encoded == NULL) { 9207db96d56Sopenharmony_ci return NULL; 9217db96d56Sopenharmony_ci } 9227db96d56Sopenharmony_ci rl_insert_text(PyBytes_AS_STRING(encoded)); 9237db96d56Sopenharmony_ci Py_DECREF(encoded); 9247db96d56Sopenharmony_ci Py_RETURN_NONE; 9257db96d56Sopenharmony_ci} 9267db96d56Sopenharmony_ci 9277db96d56Sopenharmony_ci/* Redisplay the line buffer */ 9287db96d56Sopenharmony_ci 9297db96d56Sopenharmony_ci/*[clinic input] 9307db96d56Sopenharmony_cireadline.redisplay 9317db96d56Sopenharmony_ci 9327db96d56Sopenharmony_ciChange what's displayed on the screen to reflect contents of the line buffer. 9337db96d56Sopenharmony_ci[clinic start generated code]*/ 9347db96d56Sopenharmony_ci 9357db96d56Sopenharmony_cistatic PyObject * 9367db96d56Sopenharmony_cireadline_redisplay_impl(PyObject *module) 9377db96d56Sopenharmony_ci/*[clinic end generated code: output=a8b9725827c3c34b input=b485151058d75edc]*/ 9387db96d56Sopenharmony_ci{ 9397db96d56Sopenharmony_ci rl_redisplay(); 9407db96d56Sopenharmony_ci Py_RETURN_NONE; 9417db96d56Sopenharmony_ci} 9427db96d56Sopenharmony_ci 9437db96d56Sopenharmony_ci#include "clinic/readline.c.h" 9447db96d56Sopenharmony_ci 9457db96d56Sopenharmony_ci/* Table of functions exported by the module */ 9467db96d56Sopenharmony_ci 9477db96d56Sopenharmony_cistatic struct PyMethodDef readline_methods[] = 9487db96d56Sopenharmony_ci{ 9497db96d56Sopenharmony_ci READLINE_PARSE_AND_BIND_METHODDEF 9507db96d56Sopenharmony_ci READLINE_GET_LINE_BUFFER_METHODDEF 9517db96d56Sopenharmony_ci READLINE_INSERT_TEXT_METHODDEF 9527db96d56Sopenharmony_ci READLINE_REDISPLAY_METHODDEF 9537db96d56Sopenharmony_ci READLINE_READ_INIT_FILE_METHODDEF 9547db96d56Sopenharmony_ci READLINE_READ_HISTORY_FILE_METHODDEF 9557db96d56Sopenharmony_ci READLINE_WRITE_HISTORY_FILE_METHODDEF 9567db96d56Sopenharmony_ci#ifdef HAVE_RL_APPEND_HISTORY 9577db96d56Sopenharmony_ci READLINE_APPEND_HISTORY_FILE_METHODDEF 9587db96d56Sopenharmony_ci#endif 9597db96d56Sopenharmony_ci READLINE_GET_HISTORY_ITEM_METHODDEF 9607db96d56Sopenharmony_ci READLINE_GET_CURRENT_HISTORY_LENGTH_METHODDEF 9617db96d56Sopenharmony_ci READLINE_SET_HISTORY_LENGTH_METHODDEF 9627db96d56Sopenharmony_ci READLINE_GET_HISTORY_LENGTH_METHODDEF 9637db96d56Sopenharmony_ci READLINE_SET_COMPLETER_METHODDEF 9647db96d56Sopenharmony_ci READLINE_GET_COMPLETER_METHODDEF 9657db96d56Sopenharmony_ci READLINE_GET_COMPLETION_TYPE_METHODDEF 9667db96d56Sopenharmony_ci READLINE_GET_BEGIDX_METHODDEF 9677db96d56Sopenharmony_ci READLINE_GET_ENDIDX_METHODDEF 9687db96d56Sopenharmony_ci READLINE_SET_COMPLETER_DELIMS_METHODDEF 9697db96d56Sopenharmony_ci READLINE_SET_AUTO_HISTORY_METHODDEF 9707db96d56Sopenharmony_ci READLINE_ADD_HISTORY_METHODDEF 9717db96d56Sopenharmony_ci READLINE_REMOVE_HISTORY_ITEM_METHODDEF 9727db96d56Sopenharmony_ci READLINE_REPLACE_HISTORY_ITEM_METHODDEF 9737db96d56Sopenharmony_ci READLINE_GET_COMPLETER_DELIMS_METHODDEF 9747db96d56Sopenharmony_ci READLINE_SET_COMPLETION_DISPLAY_MATCHES_HOOK_METHODDEF 9757db96d56Sopenharmony_ci READLINE_SET_STARTUP_HOOK_METHODDEF 9767db96d56Sopenharmony_ci#ifdef HAVE_RL_PRE_INPUT_HOOK 9777db96d56Sopenharmony_ci READLINE_SET_PRE_INPUT_HOOK_METHODDEF 9787db96d56Sopenharmony_ci#endif 9797db96d56Sopenharmony_ci#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER 9807db96d56Sopenharmony_ci READLINE_CLEAR_HISTORY_METHODDEF 9817db96d56Sopenharmony_ci#endif 9827db96d56Sopenharmony_ci {0, 0} 9837db96d56Sopenharmony_ci}; 9847db96d56Sopenharmony_ci 9857db96d56Sopenharmony_ci 9867db96d56Sopenharmony_ci/* C function to call the Python hooks. */ 9877db96d56Sopenharmony_ci 9887db96d56Sopenharmony_cistatic int 9897db96d56Sopenharmony_cion_hook(PyObject *func) 9907db96d56Sopenharmony_ci{ 9917db96d56Sopenharmony_ci int result = 0; 9927db96d56Sopenharmony_ci if (func != NULL) { 9937db96d56Sopenharmony_ci PyObject *r; 9947db96d56Sopenharmony_ci r = PyObject_CallNoArgs(func); 9957db96d56Sopenharmony_ci if (r == NULL) 9967db96d56Sopenharmony_ci goto error; 9977db96d56Sopenharmony_ci if (r == Py_None) 9987db96d56Sopenharmony_ci result = 0; 9997db96d56Sopenharmony_ci else { 10007db96d56Sopenharmony_ci result = _PyLong_AsInt(r); 10017db96d56Sopenharmony_ci if (result == -1 && PyErr_Occurred()) 10027db96d56Sopenharmony_ci goto error; 10037db96d56Sopenharmony_ci } 10047db96d56Sopenharmony_ci Py_DECREF(r); 10057db96d56Sopenharmony_ci goto done; 10067db96d56Sopenharmony_ci error: 10077db96d56Sopenharmony_ci PyErr_Clear(); 10087db96d56Sopenharmony_ci Py_XDECREF(r); 10097db96d56Sopenharmony_ci done: 10107db96d56Sopenharmony_ci return result; 10117db96d56Sopenharmony_ci } 10127db96d56Sopenharmony_ci return result; 10137db96d56Sopenharmony_ci} 10147db96d56Sopenharmony_ci 10157db96d56Sopenharmony_cistatic int 10167db96d56Sopenharmony_ci#if defined(_RL_FUNCTION_TYPEDEF) 10177db96d56Sopenharmony_cion_startup_hook(void) 10187db96d56Sopenharmony_ci#else 10197db96d56Sopenharmony_cion_startup_hook() 10207db96d56Sopenharmony_ci#endif 10217db96d56Sopenharmony_ci{ 10227db96d56Sopenharmony_ci int r; 10237db96d56Sopenharmony_ci PyGILState_STATE gilstate = PyGILState_Ensure(); 10247db96d56Sopenharmony_ci r = on_hook(readlinestate_global->startup_hook); 10257db96d56Sopenharmony_ci PyGILState_Release(gilstate); 10267db96d56Sopenharmony_ci return r; 10277db96d56Sopenharmony_ci} 10287db96d56Sopenharmony_ci 10297db96d56Sopenharmony_ci#ifdef HAVE_RL_PRE_INPUT_HOOK 10307db96d56Sopenharmony_cistatic int 10317db96d56Sopenharmony_ci#if defined(_RL_FUNCTION_TYPEDEF) 10327db96d56Sopenharmony_cion_pre_input_hook(void) 10337db96d56Sopenharmony_ci#else 10347db96d56Sopenharmony_cion_pre_input_hook() 10357db96d56Sopenharmony_ci#endif 10367db96d56Sopenharmony_ci{ 10377db96d56Sopenharmony_ci int r; 10387db96d56Sopenharmony_ci PyGILState_STATE gilstate = PyGILState_Ensure(); 10397db96d56Sopenharmony_ci r = on_hook(readlinestate_global->pre_input_hook); 10407db96d56Sopenharmony_ci PyGILState_Release(gilstate); 10417db96d56Sopenharmony_ci return r; 10427db96d56Sopenharmony_ci} 10437db96d56Sopenharmony_ci#endif 10447db96d56Sopenharmony_ci 10457db96d56Sopenharmony_ci 10467db96d56Sopenharmony_ci/* C function to call the Python completion_display_matches */ 10477db96d56Sopenharmony_ci 10487db96d56Sopenharmony_ci#ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 10497db96d56Sopenharmony_cistatic void 10507db96d56Sopenharmony_cion_completion_display_matches_hook(char **matches, 10517db96d56Sopenharmony_ci int num_matches, int max_length) 10527db96d56Sopenharmony_ci{ 10537db96d56Sopenharmony_ci int i; 10547db96d56Sopenharmony_ci PyObject *sub, *m=NULL, *s=NULL, *r=NULL; 10557db96d56Sopenharmony_ci PyGILState_STATE gilstate = PyGILState_Ensure(); 10567db96d56Sopenharmony_ci m = PyList_New(num_matches); 10577db96d56Sopenharmony_ci if (m == NULL) 10587db96d56Sopenharmony_ci goto error; 10597db96d56Sopenharmony_ci for (i = 0; i < num_matches; i++) { 10607db96d56Sopenharmony_ci s = decode(matches[i+1]); 10617db96d56Sopenharmony_ci if (s == NULL) 10627db96d56Sopenharmony_ci goto error; 10637db96d56Sopenharmony_ci PyList_SET_ITEM(m, i, s); 10647db96d56Sopenharmony_ci } 10657db96d56Sopenharmony_ci sub = decode(matches[0]); 10667db96d56Sopenharmony_ci r = PyObject_CallFunction(readlinestate_global->completion_display_matches_hook, 10677db96d56Sopenharmony_ci "NNi", sub, m, max_length); 10687db96d56Sopenharmony_ci 10697db96d56Sopenharmony_ci m=NULL; 10707db96d56Sopenharmony_ci 10717db96d56Sopenharmony_ci if (r == NULL || 10727db96d56Sopenharmony_ci (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { 10737db96d56Sopenharmony_ci goto error; 10747db96d56Sopenharmony_ci } 10757db96d56Sopenharmony_ci Py_CLEAR(r); 10767db96d56Sopenharmony_ci 10777db96d56Sopenharmony_ci if (0) { 10787db96d56Sopenharmony_ci error: 10797db96d56Sopenharmony_ci PyErr_Clear(); 10807db96d56Sopenharmony_ci Py_XDECREF(m); 10817db96d56Sopenharmony_ci Py_XDECREF(r); 10827db96d56Sopenharmony_ci } 10837db96d56Sopenharmony_ci PyGILState_Release(gilstate); 10847db96d56Sopenharmony_ci} 10857db96d56Sopenharmony_ci 10867db96d56Sopenharmony_ci#endif 10877db96d56Sopenharmony_ci 10887db96d56Sopenharmony_ci#ifdef HAVE_RL_RESIZE_TERMINAL 10897db96d56Sopenharmony_cistatic volatile sig_atomic_t sigwinch_received; 10907db96d56Sopenharmony_cistatic PyOS_sighandler_t sigwinch_ohandler; 10917db96d56Sopenharmony_ci 10927db96d56Sopenharmony_cistatic void 10937db96d56Sopenharmony_cireadline_sigwinch_handler(int signum) 10947db96d56Sopenharmony_ci{ 10957db96d56Sopenharmony_ci sigwinch_received = 1; 10967db96d56Sopenharmony_ci if (sigwinch_ohandler && 10977db96d56Sopenharmony_ci sigwinch_ohandler != SIG_IGN && sigwinch_ohandler != SIG_DFL) 10987db96d56Sopenharmony_ci sigwinch_ohandler(signum); 10997db96d56Sopenharmony_ci 11007db96d56Sopenharmony_ci#ifndef HAVE_SIGACTION 11017db96d56Sopenharmony_ci /* If the handler was installed with signal() rather than sigaction(), 11027db96d56Sopenharmony_ci we need to reinstall it. */ 11037db96d56Sopenharmony_ci PyOS_setsig(SIGWINCH, readline_sigwinch_handler); 11047db96d56Sopenharmony_ci#endif 11057db96d56Sopenharmony_ci} 11067db96d56Sopenharmony_ci#endif 11077db96d56Sopenharmony_ci 11087db96d56Sopenharmony_ci/* C function to call the Python completer. */ 11097db96d56Sopenharmony_ci 11107db96d56Sopenharmony_cistatic char * 11117db96d56Sopenharmony_cion_completion(const char *text, int state) 11127db96d56Sopenharmony_ci{ 11137db96d56Sopenharmony_ci char *result = NULL; 11147db96d56Sopenharmony_ci if (readlinestate_global->completer != NULL) { 11157db96d56Sopenharmony_ci PyObject *r = NULL, *t; 11167db96d56Sopenharmony_ci PyGILState_STATE gilstate = PyGILState_Ensure(); 11177db96d56Sopenharmony_ci rl_attempted_completion_over = 1; 11187db96d56Sopenharmony_ci t = decode(text); 11197db96d56Sopenharmony_ci r = PyObject_CallFunction(readlinestate_global->completer, "Ni", t, state); 11207db96d56Sopenharmony_ci if (r == NULL) 11217db96d56Sopenharmony_ci goto error; 11227db96d56Sopenharmony_ci if (r == Py_None) { 11237db96d56Sopenharmony_ci result = NULL; 11247db96d56Sopenharmony_ci } 11257db96d56Sopenharmony_ci else { 11267db96d56Sopenharmony_ci PyObject *encoded = encode(r); 11277db96d56Sopenharmony_ci if (encoded == NULL) 11287db96d56Sopenharmony_ci goto error; 11297db96d56Sopenharmony_ci result = strdup(PyBytes_AS_STRING(encoded)); 11307db96d56Sopenharmony_ci Py_DECREF(encoded); 11317db96d56Sopenharmony_ci } 11327db96d56Sopenharmony_ci Py_DECREF(r); 11337db96d56Sopenharmony_ci goto done; 11347db96d56Sopenharmony_ci error: 11357db96d56Sopenharmony_ci PyErr_Clear(); 11367db96d56Sopenharmony_ci Py_XDECREF(r); 11377db96d56Sopenharmony_ci done: 11387db96d56Sopenharmony_ci PyGILState_Release(gilstate); 11397db96d56Sopenharmony_ci return result; 11407db96d56Sopenharmony_ci } 11417db96d56Sopenharmony_ci return result; 11427db96d56Sopenharmony_ci} 11437db96d56Sopenharmony_ci 11447db96d56Sopenharmony_ci 11457db96d56Sopenharmony_ci/* A more flexible constructor that saves the "begidx" and "endidx" 11467db96d56Sopenharmony_ci * before calling the normal completer */ 11477db96d56Sopenharmony_ci 11487db96d56Sopenharmony_cistatic char ** 11497db96d56Sopenharmony_ciflex_complete(const char *text, int start, int end) 11507db96d56Sopenharmony_ci{ 11517db96d56Sopenharmony_ci char **result; 11527db96d56Sopenharmony_ci char saved; 11537db96d56Sopenharmony_ci size_t start_size, end_size; 11547db96d56Sopenharmony_ci wchar_t *s; 11557db96d56Sopenharmony_ci PyGILState_STATE gilstate = PyGILState_Ensure(); 11567db96d56Sopenharmony_ci#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER 11577db96d56Sopenharmony_ci rl_completion_append_character ='\0'; 11587db96d56Sopenharmony_ci#endif 11597db96d56Sopenharmony_ci#ifdef HAVE_RL_COMPLETION_SUPPRESS_APPEND 11607db96d56Sopenharmony_ci rl_completion_suppress_append = 0; 11617db96d56Sopenharmony_ci#endif 11627db96d56Sopenharmony_ci 11637db96d56Sopenharmony_ci saved = rl_line_buffer[start]; 11647db96d56Sopenharmony_ci rl_line_buffer[start] = 0; 11657db96d56Sopenharmony_ci s = Py_DecodeLocale(rl_line_buffer, &start_size); 11667db96d56Sopenharmony_ci rl_line_buffer[start] = saved; 11677db96d56Sopenharmony_ci if (s == NULL) { 11687db96d56Sopenharmony_ci goto done; 11697db96d56Sopenharmony_ci } 11707db96d56Sopenharmony_ci PyMem_RawFree(s); 11717db96d56Sopenharmony_ci saved = rl_line_buffer[end]; 11727db96d56Sopenharmony_ci rl_line_buffer[end] = 0; 11737db96d56Sopenharmony_ci s = Py_DecodeLocale(rl_line_buffer + start, &end_size); 11747db96d56Sopenharmony_ci rl_line_buffer[end] = saved; 11757db96d56Sopenharmony_ci if (s == NULL) { 11767db96d56Sopenharmony_ci goto done; 11777db96d56Sopenharmony_ci } 11787db96d56Sopenharmony_ci PyMem_RawFree(s); 11797db96d56Sopenharmony_ci start = (int)start_size; 11807db96d56Sopenharmony_ci end = start + (int)end_size; 11817db96d56Sopenharmony_ci 11827db96d56Sopenharmony_cidone: 11837db96d56Sopenharmony_ci Py_XDECREF(readlinestate_global->begidx); 11847db96d56Sopenharmony_ci Py_XDECREF(readlinestate_global->endidx); 11857db96d56Sopenharmony_ci readlinestate_global->begidx = PyLong_FromLong((long) start); 11867db96d56Sopenharmony_ci readlinestate_global->endidx = PyLong_FromLong((long) end); 11877db96d56Sopenharmony_ci result = completion_matches((char *)text, *on_completion); 11887db96d56Sopenharmony_ci PyGILState_Release(gilstate); 11897db96d56Sopenharmony_ci return result; 11907db96d56Sopenharmony_ci} 11917db96d56Sopenharmony_ci 11927db96d56Sopenharmony_ci 11937db96d56Sopenharmony_ci/* Helper to initialize GNU readline properly. 11947db96d56Sopenharmony_ci Return -1 on memory allocation failure, return 0 on success. */ 11957db96d56Sopenharmony_cistatic int 11967db96d56Sopenharmony_cisetup_readline(readlinestate *mod_state) 11977db96d56Sopenharmony_ci{ 11987db96d56Sopenharmony_ci#ifdef SAVE_LOCALE 11997db96d56Sopenharmony_ci char *saved_locale = strdup(setlocale(LC_CTYPE, NULL)); 12007db96d56Sopenharmony_ci if (!saved_locale) { 12017db96d56Sopenharmony_ci return -1; 12027db96d56Sopenharmony_ci } 12037db96d56Sopenharmony_ci#endif 12047db96d56Sopenharmony_ci 12057db96d56Sopenharmony_ci /* The name must be defined before initialization */ 12067db96d56Sopenharmony_ci rl_readline_name = "python"; 12077db96d56Sopenharmony_ci 12087db96d56Sopenharmony_ci /* the libedit readline emulation resets key bindings etc 12097db96d56Sopenharmony_ci * when calling rl_initialize. So call it upfront 12107db96d56Sopenharmony_ci */ 12117db96d56Sopenharmony_ci if (using_libedit_emulation) 12127db96d56Sopenharmony_ci rl_initialize(); 12137db96d56Sopenharmony_ci 12147db96d56Sopenharmony_ci /* Detect if libedit's readline emulation uses 0-based 12157db96d56Sopenharmony_ci * indexing or 1-based indexing. 12167db96d56Sopenharmony_ci */ 12177db96d56Sopenharmony_ci add_history("1"); 12187db96d56Sopenharmony_ci if (history_get(1) == NULL) { 12197db96d56Sopenharmony_ci libedit_history_start = 0; 12207db96d56Sopenharmony_ci } else { 12217db96d56Sopenharmony_ci libedit_history_start = 1; 12227db96d56Sopenharmony_ci } 12237db96d56Sopenharmony_ci /* Some libedit implementations use 1 based indexing on 12247db96d56Sopenharmony_ci * replace_history_entry where libreadline uses 0 based. 12257db96d56Sopenharmony_ci * The API our module presents is supposed to be 0 based. 12267db96d56Sopenharmony_ci * It's a mad mad mad mad world. 12277db96d56Sopenharmony_ci */ 12287db96d56Sopenharmony_ci { 12297db96d56Sopenharmony_ci add_history("2"); 12307db96d56Sopenharmony_ci HIST_ENTRY *old_entry = replace_history_entry(1, "X", NULL); 12317db96d56Sopenharmony_ci _py_free_history_entry(old_entry); 12327db96d56Sopenharmony_ci HIST_ENTRY *item = history_get(libedit_history_start); 12337db96d56Sopenharmony_ci if (item && item->line && strcmp(item->line, "X")) { 12347db96d56Sopenharmony_ci libedit_append_replace_history_offset = 0; 12357db96d56Sopenharmony_ci } else { 12367db96d56Sopenharmony_ci libedit_append_replace_history_offset = 1; 12377db96d56Sopenharmony_ci } 12387db96d56Sopenharmony_ci } 12397db96d56Sopenharmony_ci clear_history(); 12407db96d56Sopenharmony_ci 12417db96d56Sopenharmony_ci using_history(); 12427db96d56Sopenharmony_ci 12437db96d56Sopenharmony_ci /* Force rebind of TAB to insert-tab */ 12447db96d56Sopenharmony_ci rl_bind_key('\t', rl_insert); 12457db96d56Sopenharmony_ci /* Bind both ESC-TAB and ESC-ESC to the completion function */ 12467db96d56Sopenharmony_ci rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); 12477db96d56Sopenharmony_ci rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); 12487db96d56Sopenharmony_ci#ifdef HAVE_RL_RESIZE_TERMINAL 12497db96d56Sopenharmony_ci /* Set up signal handler for window resize */ 12507db96d56Sopenharmony_ci sigwinch_ohandler = PyOS_setsig(SIGWINCH, readline_sigwinch_handler); 12517db96d56Sopenharmony_ci#endif 12527db96d56Sopenharmony_ci /* Set our hook functions */ 12537db96d56Sopenharmony_ci rl_startup_hook = on_startup_hook; 12547db96d56Sopenharmony_ci#ifdef HAVE_RL_PRE_INPUT_HOOK 12557db96d56Sopenharmony_ci rl_pre_input_hook = on_pre_input_hook; 12567db96d56Sopenharmony_ci#endif 12577db96d56Sopenharmony_ci /* Set our completion function */ 12587db96d56Sopenharmony_ci rl_attempted_completion_function = flex_complete; 12597db96d56Sopenharmony_ci /* Set Python word break characters */ 12607db96d56Sopenharmony_ci completer_word_break_characters = 12617db96d56Sopenharmony_ci strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); 12627db96d56Sopenharmony_ci /* All nonalphanums except '.' */ 12637db96d56Sopenharmony_ci rl_completer_word_break_characters = completer_word_break_characters; 12647db96d56Sopenharmony_ci 12657db96d56Sopenharmony_ci mod_state->begidx = PyLong_FromLong(0L); 12667db96d56Sopenharmony_ci mod_state->endidx = PyLong_FromLong(0L); 12677db96d56Sopenharmony_ci 12687db96d56Sopenharmony_ci if (!using_libedit_emulation) 12697db96d56Sopenharmony_ci { 12707db96d56Sopenharmony_ci if (!isatty(STDOUT_FILENO)) { 12717db96d56Sopenharmony_ci /* Issue #19884: stdout is not a terminal. Disable meta modifier 12727db96d56Sopenharmony_ci keys to not write the ANSI sequence "\033[1034h" into stdout. On 12737db96d56Sopenharmony_ci terminals supporting 8 bit characters like TERM=xterm-256color 12747db96d56Sopenharmony_ci (which is now the default Fedora since Fedora 18), the meta key is 12757db96d56Sopenharmony_ci used to enable support of 8 bit characters (ANSI sequence 12767db96d56Sopenharmony_ci "\033[1034h"). 12777db96d56Sopenharmony_ci 12787db96d56Sopenharmony_ci With libedit, this call makes readline() crash. */ 12797db96d56Sopenharmony_ci rl_variable_bind ("enable-meta-key", "off"); 12807db96d56Sopenharmony_ci } 12817db96d56Sopenharmony_ci } 12827db96d56Sopenharmony_ci 12837db96d56Sopenharmony_ci /* Initialize (allows .inputrc to override) 12847db96d56Sopenharmony_ci * 12857db96d56Sopenharmony_ci * XXX: A bug in the readline-2.2 library causes a memory leak 12867db96d56Sopenharmony_ci * inside this function. Nothing we can do about it. 12877db96d56Sopenharmony_ci */ 12887db96d56Sopenharmony_ci if (using_libedit_emulation) 12897db96d56Sopenharmony_ci rl_read_init_file(NULL); 12907db96d56Sopenharmony_ci else 12917db96d56Sopenharmony_ci rl_initialize(); 12927db96d56Sopenharmony_ci 12937db96d56Sopenharmony_ci disable_bracketed_paste(); 12947db96d56Sopenharmony_ci 12957db96d56Sopenharmony_ci RESTORE_LOCALE(saved_locale) 12967db96d56Sopenharmony_ci return 0; 12977db96d56Sopenharmony_ci} 12987db96d56Sopenharmony_ci 12997db96d56Sopenharmony_ci/* Wrapper around GNU readline that handles signals differently. */ 13007db96d56Sopenharmony_ci 13017db96d56Sopenharmony_cistatic char *completed_input_string; 13027db96d56Sopenharmony_cistatic void 13037db96d56Sopenharmony_cirlhandler(char *text) 13047db96d56Sopenharmony_ci{ 13057db96d56Sopenharmony_ci completed_input_string = text; 13067db96d56Sopenharmony_ci rl_callback_handler_remove(); 13077db96d56Sopenharmony_ci} 13087db96d56Sopenharmony_ci 13097db96d56Sopenharmony_cistatic char * 13107db96d56Sopenharmony_cireadline_until_enter_or_signal(const char *prompt, int *signal) 13117db96d56Sopenharmony_ci{ 13127db96d56Sopenharmony_ci char * not_done_reading = ""; 13137db96d56Sopenharmony_ci fd_set selectset; 13147db96d56Sopenharmony_ci 13157db96d56Sopenharmony_ci *signal = 0; 13167db96d56Sopenharmony_ci#ifdef HAVE_RL_CATCH_SIGNAL 13177db96d56Sopenharmony_ci rl_catch_signals = 0; 13187db96d56Sopenharmony_ci#endif 13197db96d56Sopenharmony_ci 13207db96d56Sopenharmony_ci rl_callback_handler_install (prompt, rlhandler); 13217db96d56Sopenharmony_ci FD_ZERO(&selectset); 13227db96d56Sopenharmony_ci 13237db96d56Sopenharmony_ci completed_input_string = not_done_reading; 13247db96d56Sopenharmony_ci 13257db96d56Sopenharmony_ci while (completed_input_string == not_done_reading) { 13267db96d56Sopenharmony_ci int has_input = 0, err = 0; 13277db96d56Sopenharmony_ci 13287db96d56Sopenharmony_ci while (!has_input) 13297db96d56Sopenharmony_ci { struct timeval timeout = {0, 100000}; /* 0.1 seconds */ 13307db96d56Sopenharmony_ci 13317db96d56Sopenharmony_ci /* [Bug #1552726] Only limit the pause if an input hook has been 13327db96d56Sopenharmony_ci defined. */ 13337db96d56Sopenharmony_ci struct timeval *timeoutp = NULL; 13347db96d56Sopenharmony_ci if (PyOS_InputHook) 13357db96d56Sopenharmony_ci timeoutp = &timeout; 13367db96d56Sopenharmony_ci#ifdef HAVE_RL_RESIZE_TERMINAL 13377db96d56Sopenharmony_ci /* Update readline's view of the window size after SIGWINCH */ 13387db96d56Sopenharmony_ci if (sigwinch_received) { 13397db96d56Sopenharmony_ci sigwinch_received = 0; 13407db96d56Sopenharmony_ci rl_resize_terminal(); 13417db96d56Sopenharmony_ci } 13427db96d56Sopenharmony_ci#endif 13437db96d56Sopenharmony_ci FD_SET(fileno(rl_instream), &selectset); 13447db96d56Sopenharmony_ci /* select resets selectset if no input was available */ 13457db96d56Sopenharmony_ci has_input = select(fileno(rl_instream) + 1, &selectset, 13467db96d56Sopenharmony_ci NULL, NULL, timeoutp); 13477db96d56Sopenharmony_ci err = errno; 13487db96d56Sopenharmony_ci if(PyOS_InputHook) PyOS_InputHook(); 13497db96d56Sopenharmony_ci } 13507db96d56Sopenharmony_ci 13517db96d56Sopenharmony_ci if (has_input > 0) { 13527db96d56Sopenharmony_ci rl_callback_read_char(); 13537db96d56Sopenharmony_ci } 13547db96d56Sopenharmony_ci else if (err == EINTR) { 13557db96d56Sopenharmony_ci int s; 13567db96d56Sopenharmony_ci PyEval_RestoreThread(_PyOS_ReadlineTState); 13577db96d56Sopenharmony_ci s = PyErr_CheckSignals(); 13587db96d56Sopenharmony_ci PyEval_SaveThread(); 13597db96d56Sopenharmony_ci if (s < 0) { 13607db96d56Sopenharmony_ci rl_free_line_state(); 13617db96d56Sopenharmony_ci#if defined(RL_READLINE_VERSION) && RL_READLINE_VERSION >= 0x0700 13627db96d56Sopenharmony_ci rl_callback_sigcleanup(); 13637db96d56Sopenharmony_ci#endif 13647db96d56Sopenharmony_ci rl_cleanup_after_signal(); 13657db96d56Sopenharmony_ci rl_callback_handler_remove(); 13667db96d56Sopenharmony_ci *signal = 1; 13677db96d56Sopenharmony_ci completed_input_string = NULL; 13687db96d56Sopenharmony_ci } 13697db96d56Sopenharmony_ci } 13707db96d56Sopenharmony_ci } 13717db96d56Sopenharmony_ci 13727db96d56Sopenharmony_ci return completed_input_string; 13737db96d56Sopenharmony_ci} 13747db96d56Sopenharmony_ci 13757db96d56Sopenharmony_ci 13767db96d56Sopenharmony_cistatic char * 13777db96d56Sopenharmony_cicall_readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) 13787db96d56Sopenharmony_ci{ 13797db96d56Sopenharmony_ci size_t n; 13807db96d56Sopenharmony_ci char *p; 13817db96d56Sopenharmony_ci int signal; 13827db96d56Sopenharmony_ci 13837db96d56Sopenharmony_ci#ifdef SAVE_LOCALE 13847db96d56Sopenharmony_ci char *saved_locale = strdup(setlocale(LC_CTYPE, NULL)); 13857db96d56Sopenharmony_ci if (!saved_locale) 13867db96d56Sopenharmony_ci Py_FatalError("not enough memory to save locale"); 13877db96d56Sopenharmony_ci _Py_SetLocaleFromEnv(LC_CTYPE); 13887db96d56Sopenharmony_ci#endif 13897db96d56Sopenharmony_ci 13907db96d56Sopenharmony_ci if (sys_stdin != rl_instream || sys_stdout != rl_outstream) { 13917db96d56Sopenharmony_ci rl_instream = sys_stdin; 13927db96d56Sopenharmony_ci rl_outstream = sys_stdout; 13937db96d56Sopenharmony_ci#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER 13947db96d56Sopenharmony_ci rl_prep_terminal (1); 13957db96d56Sopenharmony_ci#endif 13967db96d56Sopenharmony_ci } 13977db96d56Sopenharmony_ci 13987db96d56Sopenharmony_ci p = readline_until_enter_or_signal(prompt, &signal); 13997db96d56Sopenharmony_ci 14007db96d56Sopenharmony_ci /* we got an interrupt signal */ 14017db96d56Sopenharmony_ci if (signal) { 14027db96d56Sopenharmony_ci RESTORE_LOCALE(saved_locale) 14037db96d56Sopenharmony_ci return NULL; 14047db96d56Sopenharmony_ci } 14057db96d56Sopenharmony_ci 14067db96d56Sopenharmony_ci /* We got an EOF, return an empty string. */ 14077db96d56Sopenharmony_ci if (p == NULL) { 14087db96d56Sopenharmony_ci p = PyMem_RawMalloc(1); 14097db96d56Sopenharmony_ci if (p != NULL) 14107db96d56Sopenharmony_ci *p = '\0'; 14117db96d56Sopenharmony_ci RESTORE_LOCALE(saved_locale) 14127db96d56Sopenharmony_ci return p; 14137db96d56Sopenharmony_ci } 14147db96d56Sopenharmony_ci 14157db96d56Sopenharmony_ci /* we have a valid line */ 14167db96d56Sopenharmony_ci n = strlen(p); 14177db96d56Sopenharmony_ci if (should_auto_add_history && n > 0) { 14187db96d56Sopenharmony_ci const char *line; 14197db96d56Sopenharmony_ci int length = _py_get_history_length(); 14207db96d56Sopenharmony_ci if (length > 0) { 14217db96d56Sopenharmony_ci HIST_ENTRY *hist_ent; 14227db96d56Sopenharmony_ci if (using_libedit_emulation) { 14237db96d56Sopenharmony_ci /* handle older 0-based or newer 1-based indexing */ 14247db96d56Sopenharmony_ci hist_ent = history_get(length + libedit_history_start - 1); 14257db96d56Sopenharmony_ci } else 14267db96d56Sopenharmony_ci hist_ent = history_get(length); 14277db96d56Sopenharmony_ci line = hist_ent ? hist_ent->line : ""; 14287db96d56Sopenharmony_ci } else 14297db96d56Sopenharmony_ci line = ""; 14307db96d56Sopenharmony_ci if (strcmp(p, line)) 14317db96d56Sopenharmony_ci add_history(p); 14327db96d56Sopenharmony_ci } 14337db96d56Sopenharmony_ci /* Copy the malloc'ed buffer into a PyMem_Malloc'ed one and 14347db96d56Sopenharmony_ci release the original. */ 14357db96d56Sopenharmony_ci char *q = p; 14367db96d56Sopenharmony_ci p = PyMem_RawMalloc(n+2); 14377db96d56Sopenharmony_ci if (p != NULL) { 14387db96d56Sopenharmony_ci memcpy(p, q, n); 14397db96d56Sopenharmony_ci p[n] = '\n'; 14407db96d56Sopenharmony_ci p[n+1] = '\0'; 14417db96d56Sopenharmony_ci } 14427db96d56Sopenharmony_ci free(q); 14437db96d56Sopenharmony_ci RESTORE_LOCALE(saved_locale) 14447db96d56Sopenharmony_ci return p; 14457db96d56Sopenharmony_ci} 14467db96d56Sopenharmony_ci 14477db96d56Sopenharmony_ci 14487db96d56Sopenharmony_ci/* Initialize the module */ 14497db96d56Sopenharmony_ci 14507db96d56Sopenharmony_ciPyDoc_STRVAR(doc_module, 14517db96d56Sopenharmony_ci"Importing this module enables command line editing using GNU readline."); 14527db96d56Sopenharmony_ci 14537db96d56Sopenharmony_ciPyDoc_STRVAR(doc_module_le, 14547db96d56Sopenharmony_ci"Importing this module enables command line editing using libedit readline."); 14557db96d56Sopenharmony_ci 14567db96d56Sopenharmony_cistatic struct PyModuleDef readlinemodule = { 14577db96d56Sopenharmony_ci PyModuleDef_HEAD_INIT, 14587db96d56Sopenharmony_ci "readline", 14597db96d56Sopenharmony_ci doc_module, 14607db96d56Sopenharmony_ci sizeof(readlinestate), 14617db96d56Sopenharmony_ci readline_methods, 14627db96d56Sopenharmony_ci NULL, 14637db96d56Sopenharmony_ci readline_traverse, 14647db96d56Sopenharmony_ci readline_clear, 14657db96d56Sopenharmony_ci readline_free 14667db96d56Sopenharmony_ci}; 14677db96d56Sopenharmony_ci 14687db96d56Sopenharmony_ci 14697db96d56Sopenharmony_ciPyMODINIT_FUNC 14707db96d56Sopenharmony_ciPyInit_readline(void) 14717db96d56Sopenharmony_ci{ 14727db96d56Sopenharmony_ci PyObject *m; 14737db96d56Sopenharmony_ci readlinestate *mod_state; 14747db96d56Sopenharmony_ci 14757db96d56Sopenharmony_ci if (strncmp(rl_library_version, libedit_version_tag, strlen(libedit_version_tag)) == 0) { 14767db96d56Sopenharmony_ci using_libedit_emulation = 1; 14777db96d56Sopenharmony_ci } 14787db96d56Sopenharmony_ci 14797db96d56Sopenharmony_ci if (using_libedit_emulation) 14807db96d56Sopenharmony_ci readlinemodule.m_doc = doc_module_le; 14817db96d56Sopenharmony_ci 14827db96d56Sopenharmony_ci 14837db96d56Sopenharmony_ci m = PyModule_Create(&readlinemodule); 14847db96d56Sopenharmony_ci 14857db96d56Sopenharmony_ci if (m == NULL) 14867db96d56Sopenharmony_ci return NULL; 14877db96d56Sopenharmony_ci 14887db96d56Sopenharmony_ci if (PyModule_AddIntConstant(m, "_READLINE_VERSION", 14897db96d56Sopenharmony_ci RL_READLINE_VERSION) < 0) { 14907db96d56Sopenharmony_ci goto error; 14917db96d56Sopenharmony_ci } 14927db96d56Sopenharmony_ci if (PyModule_AddIntConstant(m, "_READLINE_RUNTIME_VERSION", 14937db96d56Sopenharmony_ci rl_readline_version) < 0) { 14947db96d56Sopenharmony_ci goto error; 14957db96d56Sopenharmony_ci } 14967db96d56Sopenharmony_ci if (PyModule_AddStringConstant(m, "_READLINE_LIBRARY_VERSION", 14977db96d56Sopenharmony_ci rl_library_version) < 0) 14987db96d56Sopenharmony_ci { 14997db96d56Sopenharmony_ci goto error; 15007db96d56Sopenharmony_ci } 15017db96d56Sopenharmony_ci 15027db96d56Sopenharmony_ci mod_state = (readlinestate *) PyModule_GetState(m); 15037db96d56Sopenharmony_ci PyOS_ReadlineFunctionPointer = call_readline; 15047db96d56Sopenharmony_ci if (setup_readline(mod_state) < 0) { 15057db96d56Sopenharmony_ci PyErr_NoMemory(); 15067db96d56Sopenharmony_ci goto error; 15077db96d56Sopenharmony_ci } 15087db96d56Sopenharmony_ci 15097db96d56Sopenharmony_ci return m; 15107db96d56Sopenharmony_ci 15117db96d56Sopenharmony_cierror: 15127db96d56Sopenharmony_ci Py_DECREF(m); 15137db96d56Sopenharmony_ci return NULL; 15147db96d56Sopenharmony_ci} 1515