From: krakjoe Date: Fri, 15 Nov 2013 14:53:40 +0000 (+0000) Subject: embed code in .phpdbginit X-Git-Tag: php-5.6.0alpha1~110^2~307 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b63fd6d26158eee50cdabc4ef12b26b3fa0dfa88;p=php embed code in .phpdbginit --- diff --git a/.phpdbginit b/.phpdbginit index 5e7bffbf1d..3e44053b20 100644 --- a/.phpdbginit +++ b/.phpdbginit @@ -13,3 +13,6 @@ # b m my::method # e my.php # c +php: + +end; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 3d693afa58..ed5b61f0e2 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -73,10 +73,71 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { ZEND_EXTERN_MODULE_GLOBALS(phpdbg); +int phpdbg_confirm(char *message TSRMLS_DC) +{ + char cmd[PHPDBG_MAX_CMD]; + + zend_bool confirmed = 0, + result = 0; + + phpdbg_writeln(message); + + do { + phpdbg_error("Confirm (y or n) ?"); + + if ((fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL)) { + switch (cmd[0]) { + case 'y': + case 'Y': { + result = 1; + confirmed = 1; + } break; + + case 'n': + case 'N': { + confirmed = 1; + } break; + } + } + } while (!confirmed); + + return result; +} + +void phpdbg_sigint_handler(int signum) +{ + TSRMLS_FETCH(); + + phpdbg_writeln(EMPTY); + + signal(signum, SIG_IGN); + + if (EG(in_execution)) { + if (phpdbg_confirm( + "Do you really want to quit while executing ?" TSRMLS_CC)) { + PHPDBG_G(flags) |= PHPDBG_IS_QUITTING; + + zend_bailout(); + } else { + signal( + SIGINT, phpdbg_sigint_handler); + phpdbg_interactive(TSRMLS_C); + } + } else { + phpdbg_notice("Interrupted ..."); + + PHPDBG_G(flags) = PHPDBG_IS_QUITTING; + + zend_bailout(); + } +} + void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default TSRMLS_DC) /* {{{ */ { zend_bool init_default = 0; + signal(SIGINT, phpdbg_sigint_handler); + if (!init_file && use_default) { struct stat sb; @@ -90,9 +151,13 @@ void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default TS if (init_file) { FILE *fp = fopen(init_file, "r"); if (fp) { + int line = 1; + char cmd[PHPDBG_MAX_CMD]; size_t cmd_len = 0L; - int line = 1; + char *code = NULL; + size_t code_len = 0L; + zend_bool in_code = 0; while (fgets(cmd, PHPDBG_MAX_CMD, fp) != NULL) { cmd_len = strlen(cmd)-1; @@ -103,15 +168,56 @@ void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default TS cmd[cmd_len] = '\0'; if (*cmd && cmd_len > 0L && cmd[0] != '#') { - switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { - case FAILURE: - phpdbg_error( - "Unrecognized command in %s:%d: %s!", init_file, line, cmd); - break; + if (cmd_len == 2) { + if (memcmp(cmd, "<:", sizeof("<:")-1) == SUCCESS) { + in_code = 1; + goto next_line; + } else { + if (memcmp(cmd, ":>", sizeof(":>")-1) == SUCCESS) { + in_code = 0; + code[code_len] = '\0'; + { + zend_eval_stringl( + code, code_len, NULL, "phpdbginit code" TSRMLS_CC); + } + free(code); + code = NULL; + goto next_line; + } + } + } + + if (in_code) { + if (code == NULL) { + code = malloc(cmd_len); + } else code = realloc(code, code_len + cmd_len); + + if (code) { + memcpy( + &code[code_len], cmd, cmd_len); + code_len += cmd_len; + } + goto next_line; + } + + switch (cmd[0]) { + + default: switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { + case FAILURE: + phpdbg_error( + "Unrecognized command in %s:%d: %s!", init_file, line, cmd); + break; + } } } +next_line: line++; } + + if (code) { + free(code); + } + fclose(fp); } else { phpdbg_error( diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 690d767693..3937940bba 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -63,6 +63,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default TSRMLS_DC); void phpdbg_welcome(zend_bool cleaning TSRMLS_DC); +int phpdbg_confirm(char *message TSRMLS_DC); int phpdbg_interactive(TSRMLS_D); void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC); void phpdbg_clean(zend_bool full TSRMLS_DC);