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