[Python-checkins] r74971 - in python/branches/py3k: Doc/library/readline.rst Lib/test/test_readline.py Misc/NEWS Modules/readline.c setup.py

ronald.oussoren python-checkins at python.org
Sun Sep 20 16:53:23 CEST 2009


Author: ronald.oussoren
Date: Sun Sep 20 16:53:22 2009
New Revision: 74971
Log:
Merged revisions 74970 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk
........
 r74970 | ronald.oussoren | 2009年09月20日 16:18:15 +0200 (2009年9月20日) | 7 lines
 
 Issue 6877: this patch makes it possible to link the readline extension
 to the libedit emulation of the readline API on OSX 10.5 or later.
 
 This also adds a minimal testsuite for readline to check that the 
 history manipuation functions have the same interface with both
 C libraries.
........
Added:
 python/branches/py3k/Lib/test/test_readline.py
 - copied, changed from r74970, /python/trunk/Lib/test/test_readline.py
Modified:
 python/branches/py3k/ (props changed)
 python/branches/py3k/Doc/library/readline.rst
 python/branches/py3k/Misc/NEWS
 python/branches/py3k/Modules/readline.c
 python/branches/py3k/setup.py
Modified: python/branches/py3k/Doc/library/readline.rst
==============================================================================
--- python/branches/py3k/Doc/library/readline.rst	(original)
+++ python/branches/py3k/Doc/library/readline.rst	Sun Sep 20 16:53:22 2009
@@ -14,6 +14,17 @@
 interactive prompt and the prompts offered by the built-in :func:`input`
 function.
 
+..note::
+
+ On MacOS X the :mod:`readline` module can be implemented using
+ the ``libedit`` library instead of GNU readline.
+
+ The configuration file for ``libedit`` is different from that
+ of GNU readline. If you programmaticly load configuration strings
+ you can check for the text "libedit" in :const:`readline.__doc__`
+ to differentiate between GNU readline and libedit.
+
+
 The :mod:`readline` module defines the following functions:
 
 
@@ -166,7 +177,6 @@
 
 Append a line to the history buffer, as if it was the last line typed.
 
-
 .. seealso::
 
 Module :mod:`rlcompleter`
Copied: python/branches/py3k/Lib/test/test_readline.py (from r74970, /python/trunk/Lib/test/test_readline.py)
==============================================================================
--- /python/trunk/Lib/test/test_readline.py	(original)
+++ python/branches/py3k/Lib/test/test_readline.py	Sun Sep 20 16:53:22 2009
@@ -6,7 +6,7 @@
 why the tests cover only a small subset of the interface.
 """
 import unittest
-from test.test_support import run_unittest
+from test.support import run_unittest
 
 import readline
 
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Sun Sep 20 16:53:22 2009
@@ -194,6 +194,8 @@
 
 Extension Modules
 -----------------
+- Issue #6877: It is now possible to link the readline extension to the
+ libedit readline emulation on OSX 10.5 or later.
 
 - Issue #6848: Fix curses module build failure on OS X 10.6.
 
Modified: python/branches/py3k/Modules/readline.c
==============================================================================
--- python/branches/py3k/Modules/readline.c	(original)
+++ python/branches/py3k/Modules/readline.c	Sun Sep 20 16:53:22 2009
@@ -42,6 +42,25 @@
 #endif
 #endif
 
+#ifdef __APPLE__
+/*
+ * It is possible to link the readline module to the readline
+ * emulation library of editline/libedit. 
+ * 
+ * On OSX this emulation library is not 100% API compatible
+ * with the "real" readline and cannot be detected at compile-time,
+ * hence we use a runtime check to detect if we're using libedit
+ *
+ * Currently there is one know API incompatibility: 
+ * - 'get_history' has a 1-based index with GNU readline, and a 0-based
+ * index with libedit's emulation.
+ * - Note that replace_history and remove_history use a 0-based index
+ * with both implementation.
+ */
+static int using_libedit_emulation = 0;
+static const char libedit_version_tag[] = "EditLine wrapper";
+#endif /* __APPLE__ */
+
 static void
 on_completion_display_matches_hook(char **matches,
 				 int num_matches, int max_length);
@@ -478,6 +497,29 @@
 
 	if (!PyArg_ParseTuple(args, "i:index", &idx))
 		return NULL;
+#ifdef __APPLE__
+	if (using_libedit_emulation) {
+		/* Libedit emulation uses 0-based indexes,
+		 * the real one uses 1-based indexes,
+		 * adjust the index to ensure that Python
+		 * code doesn't have to worry about the
+		 * difference.
+		 */
+		HISTORY_STATE *hist_st;
+		hist_st = history_get_history_state();
+
+		idx --;
+
+		/*
+		 * Apple's readline emulation crashes when
+		 * the index is out of range, therefore 
+		 * test for that and fail gracefully.
+		 */
+		if (idx < 0 || idx >= hist_st->length) {
+			Py_RETURN_NONE;
+		}
+	}
+#endif /* __APPLE__ */
 	if ((hist_ent = history_get(idx)))
 		return PyUnicode_FromString(hist_ent->line);
 	else {
@@ -977,6 +1019,15 @@
 		char *line;
 		HISTORY_STATE *state = history_get_history_state();
 		if (state->length > 0)
+#ifdef __APPLE__
+			if (using_libedit_emulation) {
+				/* 
+				 * Libedit's emulation uses 0-based indexes,
+				 * the real readline uses 1-based indexes.
+				 */
+				line = history_get(state->length - 1)->line;
+			} else 
+#endif /* __APPLE__ */
 			line = history_get(state->length)->line;
 		else
 			line = "";
@@ -1010,6 +1061,10 @@
 PyDoc_STRVAR(doc_module,
 "Importing this module enables command line editing using GNU readline.");
 
+#ifdef __APPLE__
+PyDoc_STRVAR(doc_module_le,
+"Importing this module enables command line editing using libedit readline.");
+#endif /* __APPLE__ */
 
 static struct PyModuleDef readlinemodule = {
 	PyModuleDef_HEAD_INIT,
@@ -1023,15 +1078,29 @@
 	NULL
 };
 
+
 PyMODINIT_FUNC
 PyInit_readline(void)
 {
 	PyObject *m;
 
+#ifdef __APPLE__
+	if (strncmp(rl_library_version, libedit_version_tag, strlen(libedit_version_tag)) == 0) {
+		using_libedit_emulation = 1;
+	}
+
+	if (using_libedit_emulation) 
+		readlinemodule.m_doc = doc_module_le;
+
+#endif /* __APPLE__ */
+
 	m = PyModule_Create(&readlinemodule);
+
 	if (m == NULL)
 		return NULL;
 
+
+
 	PyOS_ReadlineFunctionPointer = call_readline;
 	setup_readline();
 	return m;
Modified: python/branches/py3k/setup.py
==============================================================================
--- python/branches/py3k/setup.py	(original)
+++ python/branches/py3k/setup.py	Sun Sep 20 16:53:22 2009
@@ -493,16 +493,16 @@
 
 # readline
 do_readline = self.compiler_obj.find_library_file(lib_dirs, 'readline')
- if platform == 'darwin': # and os.uname()[2] < '9.':
- # MacOSX 10.4 has a broken readline. Don't try to build
- # the readline module unless the user has installed a fixed
- # readline package
- # FIXME: The readline emulation on 10.5 is better, but the
- # readline module doesn't compile out of the box.
- if find_file('readline/rlconf.h', inc_dirs, []) is None:
- do_readline = False
+ if platform == 'darwin':
+ os_release = int(os.uname()[2].split('.')[0])
+ if os_release < 9:
+ # MacOSX 10.4 has a broken readline. Don't try to build
+ # the readline module unless the user has installed a fixed
+ # readline package
+ if find_file('readline/rlconf.h', inc_dirs, []) is None:
+ do_readline = False
 if do_readline:
- if sys.platform == 'darwin':
+ if platform == 'darwin' and os_release < 9:
 # In every directory on the search path search for a dynamic
 # library and then a static library, instead of first looking
 # for dynamic libraries on the entire path.


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /