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(&params[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

Reply via email to