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;
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;
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(