wez             Fri Sep 17 07:26:43 2004 EDT

  Modified files:              
    /php-src/ext/readline       readline.c 
  Log:
  standardize the callback support to allow array($obj, 'method') callbacks.
  Add a couple of utility functions.
  
  
http://cvs.php.net/diff.php/php-src/ext/readline/readline.c?r1=1.36&r2=1.37&ty=u
Index: php-src/ext/readline/readline.c
diff -u php-src/ext/readline/readline.c:1.36 php-src/ext/readline/readline.c:1.37
--- php-src/ext/readline/readline.c:1.36        Tue Aug 24 08:52:07 2004
+++ php-src/ext/readline/readline.c     Fri Sep 17 07:26:43 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: readline.c,v 1.36 2004/08/24 12:52:07 wez Exp $ */
+/* $Id: readline.c,v 1.37 2004/09/17 11:26:43 wez Exp $ */
 
 /* {{{ includes & prototypes */
 
@@ -49,12 +49,14 @@
 PHP_FUNCTION(readline_callback_handler_install);
 PHP_FUNCTION(readline_callback_read_char);
 PHP_FUNCTION(readline_callback_handler_remove);
+PHP_FUNCTION(readline_redisplay);
+PHP_FUNCTION(readline_on_new_line);
 
 static zval *_prepped_callback = NULL;
 
 #endif
 
-static char *_readline_completion = NULL;
+static zval *_readline_completion = NULL;
 static zval _readline_array;
 
 PHP_MINIT_FUNCTION(readline);
@@ -78,6 +80,8 @@
        PHP_FE(readline_callback_handler_install, NULL)
        PHP_FE(readline_callback_read_char,                     NULL)
        PHP_FE(readline_callback_handler_remove,        NULL)
+       PHP_FE(readline_redisplay, NULL)
+       PHP_FE(readline_on_new_line, NULL)
 #endif
        {NULL, NULL, NULL}
 };
@@ -108,7 +112,7 @@
 PHP_RSHUTDOWN_FUNCTION(readline)
 {
        if (_readline_completion) 
-               efree(_readline_completion);
+               FREE_ZVAL(_readline_completion);
 #if HAVE_RL_CALLBACK_READ_CHAR
        if (_prepped_callback) {
                rl_callback_handler_remove();
@@ -121,23 +125,20 @@
 }
 
 /* }}} */
+
 /* {{{ proto string readline([string prompt]) 
    Reads a line */
 PHP_FUNCTION(readline)
 {
+       char *prompt = NULL;
+       int prompt_len;
        char *result;
-       pval **arg;
-       int ac = ZEND_NUM_ARGS();
-
-       if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &arg) == FAILURE) {
-               WRONG_PARAM_COUNT;
-       }
 
-       if (ac == 1) {
-               convert_to_string_ex(arg);
+       if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s!", &prompt, 
&prompt_len)) {
+               RETURN_FALSE;
        }
 
-       result = readline(ac?Z_STRVAL_PP(arg):NULL);
+       result = readline(prompt);
 
        if (! result) {
                RETURN_FALSE;
@@ -148,10 +149,11 @@
 }
 
 /* }}} */
+
 /* {{{ proto mixed readline_info([string varname] [, string newvalue]) 
    Gets/sets various internal readline variables. */
 
-#define SAFE_STRING(s) ((s)?(s):"")
+#define SAFE_STRING(s) ((s)?(char*)(s):"")
 
 PHP_FUNCTION(readline_info)
 {
@@ -231,7 +233,7 @@
                } else if (! strcasecmp(Z_STRVAL_PP(what),"library_version")) {
                        RETVAL_STRING(SAFE_STRING(rl_library_version),1);
                } else if (! strcasecmp(Z_STRVAL_PP(what),"readline_name")) {
-                       oldstr = rl_readline_name;
+                       oldstr = (char*)rl_readline_name;
                        if (ac == 2) {
                                /* XXX if (rl_readline_name) free(rl_readline_name); */
                                convert_to_string_ex(value);
@@ -381,12 +383,17 @@
 static zval *_readline_string_zval(const char *str)
 {
        zval *ret;
-       int len = strlen(str);
+       int len;
+       
        MAKE_STD_ZVAL(ret);
+       
+       if (str) {
+               len = strlen(str);
+               ZVAL_STRINGL(ret, (char*)str, len, 1);
+       } else {
+               ZVAL_NULL(ret);
+       }
 
-       Z_TYPE_P(ret) = IS_STRING;
-       Z_STRLEN_P(ret) = len;
-       Z_STRVAL_P(ret) = estrndup(str, len);
        return ret;
 }
 
@@ -400,25 +407,24 @@
        return ret;
 }
 
-static char **_readline_completion_cb(char *text, int start, int end)
+static char **_readline_completion_cb(const char *text, int start, int end)
 { 
-       zval *params[4];
+       zval *params[3];
        int i;
        char **matches = NULL;
        TSRMLS_FETCH();
 
-       params[0]=_readline_string_zval(_readline_completion);
-       params[1]=_readline_string_zval(text);
-       params[2]=_readline_long_zval(start);
-       params[3]=_readline_long_zval(end);
+       params[0]=_readline_string_zval(text);
+       params[1]=_readline_long_zval(start);
+       params[2]=_readline_long_zval(end);
 
-       if (call_user_function(CG(function_table), NULL, params[0], &_readline_array, 
3, params+1 TSRMLS_CC) == SUCCESS) {
+       if (call_user_function(CG(function_table), NULL, _readline_completion, 
&_readline_array, 3, params TSRMLS_CC) == SUCCESS) {
                if (Z_TYPE(_readline_array) == IS_ARRAY) {
                        matches = completion_matches(text,_readline_command_generator);
                }
        }
        
-       for (i = 0; i < 4; i++) {
+       for (i = 0; i < 3; i++) {
                zval_ptr_dtor(&params[i]);
        }
        zval_dtor(&_readline_array);
@@ -428,22 +434,26 @@
 
 PHP_FUNCTION(readline_completion_function)
 {
-       pval **arg;
-       int ac = ZEND_NUM_ARGS();
+       zval *arg = NULL;
 
-       if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &arg) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &arg)) {
+               RETURN_FALSE;
        }
 
-       if (ac == 1) {
-               convert_to_string_ex(arg);
+       char *name = NULL;
+       if (!zend_is_callable(arg, 0, &name)) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s is not callable", 
name);
+               RETURN_FALSE;
+       }
 
-               if (_readline_completion)
-                       efree(_readline_completion);
+       if (_readline_completion)
+               FREE_ZVAL(_readline_completion);
 
-               _readline_completion = estrdup(Z_STRVAL_PP(arg));
-               rl_attempted_completion_function = _readline_completion_cb;
-       }
+       MAKE_STD_ZVAL(_readline_completion);
+       *_readline_completion = *arg;
+       zval_copy_ctor(_readline_completion);
+
+       rl_attempted_completion_function = _readline_completion_cb;
 
        RETURN_TRUE;
 }
@@ -524,6 +534,23 @@
        RETURN_FALSE;
 }
 /* }}} */
+
+/* {{{ proto void readline_redisplay(void)
+   Ask readline to redraw the display */
+PHP_FUNCTION(readline_redisplay)
+{
+       rl_redisplay();
+}
+/* }}} */
+
+/* {{{ proto void readline_on_new_line(void)
+   Inform readline that the cursor has moved to a new line */
+PHP_FUNCTION(readline_on_new_line)
+{
+       rl_on_new_line();
+}
+/* }}} */
+
 #endif
 
 

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to