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(¶ms[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