(command->alias &&
(input->argv[0]->length == 1) &&
(command->alias == *input->argv[0]->string))) {
- if (command->subs && input->argc > 1) {
- phpdbg_input_t sub;
-
- sub.argc = input->argc-1;
- sub.argv = &input->argv[1];
+
+ phpdbg_param_t param;
+
+ param.type = EMPTY_PARAM;
+
+ if (input->argc > 1) {
+ if (command->subs) {
+ phpdbg_input_t sub;
+
+ sub.argc = input->argc-1;
+ sub.argv = &input->argv[1];
+
+ phpdbg_debug(
+ "trying sub commands in \"%s\" for \"%s\" with %d arguments",
+ command->name, sub.argv[0]->string, sub.argc-1);
- return phpdbg_do_cmd_ex(command->subs, &sub TSRMLS_CC);
+ return phpdbg_do_cmd_ex(command->subs, &sub TSRMLS_CC);
+ } else {
+ phpdbg_parse_param(
+ input->argv[1]->string,
+ input->argv[1]->length,
+ ¶m TSRMLS_CC);
+ }
}
phpdbg_debug(
- "found command %s for %s with %d arguments",
+ "found command \"%s\" for \"%s\" have %d arguments",
command->name, input->argv[0]->string, input->argc-1);
{
int arg;
input->argv[arg]->length);
}
}
+
+ PHPDBG_G(lcmd) = (phpdbg_command_t*) command;
+ phpdbg_clear_param(
+ &PHPDBG_G(lparam) TSRMLS_CC);
+ PHPDBG_G(lparam) = param;
+
+ rc = command->handler(¶m TSRMLS_CC);
+
break;
}
command++;
}
goto next_line;
}
-
+
switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) {
case FAILURE:
phpdbg_error(
static inline int phpdbg_call_register(phpdbg_input_t *input TSRMLS_DC) /* {{{ */
{
- /* temporary, until we can handle arrays of strings */
- const char *cmd = input->string;
- size_t cmd_len = input->length;
- const char *start = (const char*) input->start;
- size_t offset = strlen(cmd)+(sizeof(" ")-1);
+ phpdbg_input_t *function = input->argv[0];
- if (zend_hash_exists(&PHPDBG_G(registered), cmd, strlen(cmd)+1)) {
- zval fname, *fretval, *farg = NULL;
+ if (zend_hash_exists(
+ &PHPDBG_G(registered), function->string, function->length+1)) {
+ zval fname, *fretval;
zend_fcall_info fci;
- zend_fcall_info_cache fcic;
-
- zval **params[1];
+ zval **params = NULL;
- if (offset < cmd_len) {
- ALLOC_INIT_ZVAL(farg);
- ZVAL_STRING(farg, &start[offset], 1);
- params[0] = &farg;
+ if (input->argc > 1) {
+ int arg;
+
+ params = emalloc(sizeof(zval*) * input->argc);
+
+ for (arg = 1; arg <= (input->argc-1); arg++) {
+ MAKE_STD_ZVAL((params[arg-1]));
+ ZVAL_STRINGL(
+ (params[arg-1]),
+ input->argv[arg]->string,
+ input->argv[arg]->length, 1);
+ }
}
- ZVAL_STRINGL(&fname, cmd, strlen(cmd), 1);
+ ZVAL_STRINGL(&fname, function->string, function->length, 1);
fci.size = sizeof(fci);
fci.function_table = &PHPDBG_G(registered);
fci.object_ptr = NULL;
fci.retval_ptr_ptr = &fretval;
- /* todo parse parameters better */
- fci.param_count = (offset < cmd_len) ? 1 : 0;
- fci.params = (offset < cmd_len) ? params : NULL;
+ fci.param_count = (input->argc > 1) ? (input->argc-1) : 0;
+ fci.params = (input->argc > 1) ? ¶ms : NULL;
fci.no_separation = 1;
zend_call_function(
&fci, NULL TSRMLS_CC);
zval_dtor(&fname);
- if (offset < cmd_len) {
- zval_ptr_dtor(&farg);
+
+ if (input->argc > 1) {
+ int arg;
+
+ for (arg = 1; arg <= (input->argc-1); arg++) {
+ zval_ptr_dtor(¶ms[arg-1]);
+ }
+ efree(params);
}
if (fretval) {
zend_print_zval_r(
if (input && input->length > 0L) {
do {
- phpdbg_do_cmd_ex(phpdbg_prompt_commands, input TSRMLS_CC);
-
- switch (ret = phpdbg_do_cmd(phpdbg_prompt_commands, input->string, input->length TSRMLS_CC)) {
+ switch (ret = phpdbg_do_cmd_ex(phpdbg_prompt_commands, input TSRMLS_CC)) {
case FAILURE:
if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) {
if (phpdbg_call_register(input TSRMLS_CC) == FAILURE) {