wez Tue Aug 24 08:52:08 2004 EDT
Modified files:
/php-src/ext/readline config.m4 readline.c
Log:
Add support for the readline callback interface, allowing you to interleave
IO and user input. Sample script:
<?php
dl("readline.so");
function handle_user_input($line)
{
echo "You typed: '$line'\n";
if ($line == 'exit')
exit;
}
readline_callback_handler_install('type! > ', 'handle_user_input');
while (true) {
$n = stream_select($r = array(STDIN), $w = null, $e = null, null);
if ($n && in_array(STDIN, $r)) {
readline_callback_read_char();
}
}
http://cvs.php.net/diff.php/php-src/ext/readline/config.m4?r1=1.22&r2=1.23&ty=u
Index: php-src/ext/readline/config.m4
diff -u php-src/ext/readline/config.m4:1.22 php-src/ext/readline/config.m4:1.23
--- php-src/ext/readline/config.m4:1.22 Tue Aug 24 08:28:46 2004
+++ php-src/ext/readline/config.m4 Tue Aug 24 08:52:07 2004
@@ -1,5 +1,5 @@
dnl
-dnl $Id: config.m4,v 1.22 2004/08/24 12:28:46 derick Exp $
+dnl $Id: config.m4,v 1.23 2004/08/24 12:52:07 wez Exp $
dnl
PHP_ARG_WITH(libedit,for libedit readline replacement,
@@ -38,6 +38,13 @@
], [
AC_MSG_ERROR(readline library not found)
], [
+ -L$READLINE_DIR/lib $PHP_READLINE_LIBS
+ ])
+
+ PHP_CHECK_LIBRARY(readline, rl_callback_read_char,
+ [
+ AC_DEFINE(HAVE_RL_CALLBACK_READ_CHAR, 1, [ ])
+ ],[],[
-L$READLINE_DIR/lib $PHP_READLINE_LIBS
])
http://cvs.php.net/diff.php/php-src/ext/readline/readline.c?r1=1.35&r2=1.36&ty=u
Index: php-src/ext/readline/readline.c
diff -u php-src/ext/readline/readline.c:1.35 php-src/ext/readline/readline.c:1.36
--- php-src/ext/readline/readline.c:1.35 Thu Jan 8 03:17:16 2004
+++ php-src/ext/readline/readline.c Tue Aug 24 08:52:07 2004
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: readline.c,v 1.35 2004/01/08 08:17:16 andi Exp $ */
+/* $Id: readline.c,v 1.36 2004/08/24 12:52:07 wez Exp $ */
/* {{{ includes & prototypes */
@@ -45,6 +45,15 @@
PHP_FUNCTION(readline_write_history);
PHP_FUNCTION(readline_completion_function);
+#if HAVE_RL_CALLBACK_READ_CHAR
+PHP_FUNCTION(readline_callback_handler_install);
+PHP_FUNCTION(readline_callback_read_char);
+PHP_FUNCTION(readline_callback_handler_remove);
+
+static zval *_prepped_callback = NULL;
+
+#endif
+
static char *_readline_completion = NULL;
static zval _readline_array;
@@ -65,6 +74,11 @@
PHP_FE(readline_read_history, NULL)
PHP_FE(readline_write_history, NULL)
PHP_FE(readline_completion_function,NULL)
+#if HAVE_RL_CALLBACK_READ_CHAR
+ PHP_FE(readline_callback_handler_install, NULL)
+ PHP_FE(readline_callback_read_char, NULL)
+ PHP_FE(readline_callback_handler_remove, NULL)
+#endif
{NULL, NULL, NULL}
};
@@ -95,6 +109,13 @@
{
if (_readline_completion)
efree(_readline_completion);
+#if HAVE_RL_CALLBACK_READ_CHAR
+ if (_prepped_callback) {
+ rl_callback_handler_remove();
+ FREE_ZVAL(_prepped_callback);
+ _prepped_callback = 0;
+ }
+#endif
return SUCCESS;
}
@@ -428,6 +449,83 @@
}
/* }}} */
+
+#if HAVE_RL_CALLBACK_READ_CHAR
+
+static void php_rl_callback_handler(char *the_line)
+{
+ zval *params[1];
+ zval dummy;
+ TSRMLS_FETCH();
+
+ ZVAL_NULL(&dummy);
+
+ params[0] = _readline_string_zval(the_line);
+
+ call_user_function(CG(function_table), NULL, _prepped_callback, &dummy, 1,
params TSRMLS_CC);
+
+ zval_ptr_dtor(¶ms[0]);
+ zval_dtor(&dummy);
+}
+
+/* {{{ proto void readline_callback_handler_install(string prompt, mixed callback)
+ Initializes the readline callback interface and terminal, prints the prompt and
returns immediately */
+PHP_FUNCTION(readline_callback_handler_install)
+{
+ zval *callback;
+ char *name = NULL;
+ char *prompt;
+ int prompt_len;
+
+ if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &prompt,
&prompt_len, &callback)) {
+ return;
+ }
+
+ if (!zend_is_callable(callback, 0, &name)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s is not callable",
name);
+ RETURN_FALSE;
+ }
+
+ if (_prepped_callback) {
+ rl_callback_handler_remove();
+ FREE_ZVAL(_prepped_callback);
+ }
+
+ MAKE_STD_ZVAL(_prepped_callback);
+ *_prepped_callback = *callback;
+ zval_copy_ctor(_prepped_callback);
+
+ rl_callback_handler_install(prompt, php_rl_callback_handler);
+
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto void readline_callback_read_char()
+ Informs the readline callback interface that a character is ready for input */
+PHP_FUNCTION(readline_callback_read_char)
+{
+ if (_prepped_callback) {
+ rl_callback_read_char();
+ }
+}
+/* }}} */
+
+/* {{{ proto bool readline_callback_handler_remove()
+ Removes a previously installed callback handler and restores terminal settings */
+PHP_FUNCTION(readline_callback_handler_remove)
+{
+ if (_prepped_callback) {
+ rl_callback_handler_remove();
+ FREE_ZVAL(_prepped_callback);
+ _prepped_callback = 0;
+ RETURN_TRUE;
+ }
+ RETURN_FALSE;
+}
+/* }}} */
+#endif
+
#endif /* HAVE_LIBREADLINE */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php