- PGSQL / PDO PGSQL:
. The PGSQL and PDO PGSQL extensions now require at least libpq 9.1.
+- Readline:
+ . Calling readline_completion_function() before the interactive prompt starts
+ (e.g. in auto_prepend_file) will now override the default interactive prompt
+ completion function. Previously, readline_completion_function() only worked
+ when called after starting the interactive prompt.
+
- SimpleXML:
. SimpleXMLElement now implements RecursiveIterator and absorbed the
functionality of SimpleXMLIterator. SimpleXMLIterator is an empty extension
--- /dev/null
+readline
+========
+
+Provides generic line editing, history, and tokenization functions.
+See https://www.php.net/manual/en/book.readline.php
+
+Implementation Details
+----------------------
+
+C variables starting with `rl_*` are declared by the readline library
+(or are macros referring to variables from the libedit library).
+See http://web.mit.edu/gnu/doc/html/rlman_2.html
+
+This should only be used in the CLI SAPI.
+Historically, the code lived in sapi/cli,
+but many distributions build readline as a shared extension.
+Therefore, that code was split into ext/readline so that this can dynamically
+be loaded. With other SAPIs, readline is/should be disabled.
+
+`readline_cli.c` implements most of the interactive shell(`php -a`).
ZVAL_LONG(ret, l);
}
-static char **_readline_completion_cb(const char *text, int start, int end)
+char **php_readline_completion_cb(const char *text, int start, int end)
{
zval params[3];
char **matches = NULL;
zval_ptr_dtor(&_readline_completion);
ZVAL_COPY(&_readline_completion, &fci.function_name);
- rl_attempted_completion_function = _readline_completion_cb;
+ /* NOTE: The rl_attempted_completion_function variable (and others) are part of the readline library, not php */
+ rl_attempted_completion_function = php_readline_completion_cb;
if (rl_attempted_completion_function == NULL) {
RETURN_FALSE;
}
#else
spprintf(&history_file, MAX_PATH, "%s/.php_history", getenv("USERPROFILE"));
#endif
- rl_attempted_completion_function = cli_code_completion;
+ /* Install the default completion function for 'php -a'.
+ *
+ * But if readline_completion_function() was called by PHP code prior to the shell starting
+ * (e.g. with 'php -d auto_prepend_file=prepend.php -a'),
+ * then use that instead of PHP's default. */
+ if (rl_attempted_completion_function != php_readline_completion_cb) {
+ rl_attempted_completion_function = cli_code_completion;
+ }
#ifndef PHP_WIN32
rl_special_prefixes = "$";
#endif
extern PHP_MSHUTDOWN_FUNCTION(cli_readline);
extern PHP_MINFO_FUNCTION(cli_readline);
+char **php_readline_completion_cb(const char *text, int start, int end);
+
ZEND_EXTERN_MODULE_GLOBALS(cli_readline)