mirror of
https://github.com/php/php-src.git
synced 2026-03-31 12:42:29 +02:00
embed code in .phpdbginit
This commit is contained in:
@@ -13,3 +13,6 @@
|
||||
# b m my::method
|
||||
# e my.php
|
||||
# c
|
||||
php:
|
||||
|
||||
end;
|
||||
|
||||
118
phpdbg_prompt.c
118
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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user