static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */
{
- pg->prompt = NULL;
- pg->prompt_raw = NULL;
- pg->prompt_color = NULL;
+ pg->prompt[0] = NULL;
+ pg->prompt[1] = NULL;
+
+ pg->colors[0] = NULL;
+ pg->colors[1] = NULL;
+ pg->colors[2] = NULL;
+
pg->exec = NULL;
pg->exec_len = 0;
pg->ops = NULL;
PHPDBG_G(exec) = NULL;
}
- if (PHPDBG_G(prompt)) {
- efree(PHPDBG_G(prompt));
- PHPDBG_G(prompt) = NULL;
+ if (PHPDBG_G(prompt)[0]) {
+ free(PHPDBG_G(prompt)[0]);
}
-
- if (PHPDBG_G(prompt_raw)) {
- efree(PHPDBG_G(prompt_raw));
- PHPDBG_G(prompt_raw) = NULL;
- }
-
- if (PHPDBG_G(prompt_color)) {
- efree(PHPDBG_G(prompt_color));
- PHPDBG_G(prompt_color) = NULL;
+ if (PHPDBG_G(prompt)[1]) {
+ free(PHPDBG_G(prompt)[1]);
}
+
+ PHPDBG_G(prompt)[0] = NULL;
+ PHPDBG_G(prompt)[1] = NULL;
if (PHPDBG_G(oplog)) {
fclose(
/* set flags from command line */
PHPDBG_G(flags) = flags;
- /* set default prompt */
- phpdbg_set_prompt(PROMPT, "1;64" TSRMLS_CC);
+ /* set default colors */
+ phpdbg_set_color_ex(PHPDBG_COLOR_PROMPT, "white-bold", sizeof("white-bold")-1 TSRMLS_CC);
+ phpdbg_set_color_ex(PHPDBG_COLOR_ERROR, "red", sizeof("red")-1 TSRMLS_CC);
+ phpdbg_set_color_ex(PHPDBG_COLOR_NOTICE, "green", sizeof("green")-1 TSRMLS_CC);
+ /* set default prompt */
+ phpdbg_set_prompt(PROMPT TSRMLS_CC);
+
zend_try {
zend_activate_modules(TSRMLS_C);
} zend_end_try();
#endif
#include "phpdbg_cmd.h"
+#include "phpdbg_utils.h"
#ifdef ZTS
# define PHPDBG_G(v) TSRMG(phpdbg_globals_id, zend_phpdbg_globals *, v)
#define PHPDBG_IS_SIGNALED (1<<20)
#define PHPDBG_IS_INTERACTIVE (1<<21)
-
#ifndef _WIN32
# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET|PHPDBG_IS_COLOURED)
#else
/* {{{ output descriptors */
#define PHPDBG_STDIN 0
#define PHPDBG_STDOUT 1
-#define PHPDBG_STDERR 2 /* }}} */
+#define PHPDBG_STDERR 2
+#define PHPDBG_IO_FDS 3 /* }}} */
/* {{{ structs */
ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
- HashTable bp[PHPDBG_BREAK_TABLES]; /* break points */
- char *prompt; /* prompt */
- char *prompt_raw; /* prompt unmodified */
- char *prompt_color; /* prompt color */
- char *exec; /* file to execute */
- size_t exec_len; /* size of exec */
- zend_op_array *ops; /* op_array */
- zval *retval; /* return value */
- int bp_count; /* breakpoint count */
- int del_bp_num; /* breakpoint to delete */
- int vmret; /* return from last opcode handler execution */
- phpdbg_command_t *lcmd; /* last command */
- phpdbg_param_t lparam; /* last param */
- FILE *oplog; /* opline log */
- HashTable seek; /* seek oplines */
- zend_ulong flags; /* phpdbg flags */
- HashTable registered; /* registered */
- phpdbg_frame_t frame; /* frame */
- FILE *io[3]; /* stdin/stdout/stderr */
+ HashTable bp[PHPDBG_BREAK_TABLES]; /* break points */
+ HashTable registered; /* registered */
+ HashTable seek; /* seek oplines */
+ phpdbg_frame_t frame; /* frame */
+
+ char *exec; /* file to execute */
+ size_t exec_len; /* size of exec */
+ zend_op_array *ops; /* op_array */
+ zval *retval; /* return value */
+ int bp_count; /* breakpoint count */
+ int del_bp_num; /* breakpoint to delete */
+ int vmret; /* return from last opcode handler execution */
+
+ FILE *oplog; /* opline log */
+ FILE *io[PHPDBG_IO_FDS]; /* io */
+
+ char *prompt[2]; /* prompt */
+ const phpdbg_color_t *colors[PHPDBG_COLORS]; /* colors */
+
+ phpdbg_command_t *lcmd; /* last command */
+ phpdbg_param_t lparam; /* last param */
+
+ zend_ulong flags; /* phpdbg flags */
ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */
#endif /* PHPDBG_H */
} phpdbg_frame_t;
/* }}} */
+
+
/*
* Workflow:
* 1) read input
PHPDBG_API phpdbg_input_t* phpdbg_read_input(char *buffered TSRMLS_DC);
PHPDBG_API phpdbg_input_t** phpdbg_read_argv(char *buffer, int *argc TSRMLS_DC);
PHPDBG_API void phpdbg_destroy_input(phpdbg_input_t** TSRMLS_DC);
+#define phpdbg_argv_is(n, s) \
+ (memcmp(input->argv[n]->string, s, input->argv[n]->length-1) == SUCCESS)
/*
* Parameter Management
ZEND_EXTERN_MODULE_GLOBALS(phpdbg);
-void phpdbg_set_prompt(const char *prompt, const char *color TSRMLS_DC) /* {{{ */
-{
- char *old_prompt_raw = PHPDBG_G(prompt_raw);
-
- if (PHPDBG_G(prompt)) {
- efree(PHPDBG_G(prompt));
- PHPDBG_G(prompt) = NULL;
- }
-
- if (color) {
- if (PHPDBG_G(prompt_color)) {
- efree(PHPDBG_G(prompt_color));
- }
- PHPDBG_G(prompt_color) = estrdup(color);
- }
-
- if (PHPDBG_G(flags) & PHPDBG_IS_COLOURED) {
- spprintf(&PHPDBG_G(prompt), 0, "\033[%sm%s\033[0m ",
- PHPDBG_G(prompt_color) ? PHPDBG_G(prompt_color) : "1;64", prompt);
- } else {
- spprintf(&PHPDBG_G(prompt), 0, "%s ", prompt);
- }
-
- PHPDBG_G(prompt_raw) = estrdup(prompt);
-
- if (old_prompt_raw) {
- efree(old_prompt_raw);
- }
-} /* }}} */
-
-const char *phpdbg_get_prompt(TSRMLS_D) /* {{{ */
-{
- return PHPDBG_G(prompt);
-} /* }}} */
-
-void phpdbg_set_prompt_color(const char *color TSRMLS_DC) /* {{{ */
-{
- static const char *colors[] = {
- "blue", "0;34",
- "green", "0;32",
- "red", "0;31",
- "cyan", "0;36",
- "purple", "0;35",
- NULL, NULL
- };
- const char **p = colors;
-
- do {
- if (memcmp(color, *p, strlen(*p)+1) == 0) {
- PHPDBG_G(prompt_color) = estrdup(*p);
- phpdbg_set_prompt(PHPDBG_G(prompt_raw), *(p+1) TSRMLS_CC);
- return;
- }
- } while (++p && *(++p));
-} /* }}} */
-
-const char* phpdbg_get_prompt_color(TSRMLS_D) /* {{{ */
-{
- return PHPDBG_G(prompt_color);
-} /* }}} */
-
PHPDBG_SET(prompt) /* {{{ */
{
switch (param->type) {
break;
case STR_PARAM:
- phpdbg_set_prompt(param->str, NULL TSRMLS_CC);
+ phpdbg_set_prompt(param->str TSRMLS_CC);
break;
phpdbg_default_switch_case();
return SUCCESS;
} /* }}} */
-PHPDBG_SET(prompt_color) /* {{{ */
+PHPDBG_SET(color) /* {{{ */
{
- switch (param->type) {
- case EMPTY_PARAM:
- phpdbg_writeln(phpdbg_get_prompt_color(TSRMLS_C));
- break;
-
- case STR_PARAM:
- phpdbg_set_prompt_color(param->str TSRMLS_CC);
- break;
-
- phpdbg_default_switch_case();
+ if ((param->type == STR_PARAM) && (input->argc == 3)) {
+ const phpdbg_color_t *color = phpdbg_get_color(
+ input->argv[2]->string, input->argv[2]->length TSRMLS_CC);
+ int element = PHPDBG_COLOR_INVALID;
+
+ if (color) {
+ if (phpdbg_argv_is(1, "prompt")) {
+ phpdbg_notice(
+ "setting prompt color to %s (%s)", color->name, color->code);
+ element = PHPDBG_COLOR_PROMPT;
+ if (PHPDBG_G(prompt)[1]) {
+ free(PHPDBG_G(prompt)[1]);
+ PHPDBG_G(prompt)[1]=NULL;
+ }
+ } else if (phpdbg_argv_is(1, "error")) {
+ phpdbg_notice(
+ "setting error color to %s (%s)", color->name, color->code);
+ element = PHPDBG_COLOR_ERROR;
+
+ } else if (phpdbg_argv_is(1, "notice")) {
+ phpdbg_notice(
+ "setting notice color to %s (%s)", color->name, color->code);
+ element = PHPDBG_COLOR_NOTICE;
+
+ } else goto usage;
+
+ /* set color for element */
+ phpdbg_set_color(element, color TSRMLS_CC);
+ } else {
+ phpdbg_error(
+ "Failed to find the requested color (%s)", input->argv[2]->string);
+ }
+ } else {
+usage:
+ phpdbg_error(
+ "set color used incorrected: set color <prompt|error|notice> <color>");
}
-
return SUCCESS;
} /* }}} */
#define PHPDBG_SET(name) PHPDBG_COMMAND(set_##name)
-void phpdbg_set_prompt(const char*, const char* TSRMLS_DC);
-const char *phpdbg_get_prompt(TSRMLS_D);
-
-void phpdbg_set_prompt_color(const char* TSRMLS_DC);
-const char *phpdbg_get_prompt_color(TSRMLS_D);
-
PHPDBG_SET(prompt);
-PHPDBG_SET(prompt_color);
+PHPDBG_SET(color);
PHPDBG_SET(oplog);
static const phpdbg_command_t phpdbg_set_commands[] = {
- PHPDBG_COMMAND_D_EX(prompt, "set prompt", 'p', set_prompt, NULL, 0),
- PHPDBG_COMMAND_D_EX(prompt_color, "set prompt color", 'c', set_prompt_color, NULL, 0),
- PHPDBG_COMMAND_D_EX(oplog, "set oplog output", 'O', set_oplog, NULL, 0),
+ PHPDBG_COMMAND_D_EX(prompt, "set prompt <string>", 'p', set_prompt, NULL, 0),
+ PHPDBG_COMMAND_D_EX(color, "set color <element> <color>", 'C', set_color, NULL, 1),
+ PHPDBG_COMMAND_D_EX(oplog, "set oplog <output>", 'O', set_oplog, NULL, 0),
PHPDBG_END_COMMAND
};
-
#endif /* PHPDBG_SET_H */
/* {{{ color structures */
const static phpdbg_color_t colors[] = {
- PHPDBG_COLOR_D("white", "0:0"),
- PHPDBG_COLOR_D("red", "0:31"),
- PHPDBG_COLOR_D("green", "0:32"),
- PHPDBG_COLOR_D("blue", "0;34"),
- PHPDBG_COLOR_D("purple", "0;35"),
- PHPDBG_COLOR_D("cyan", "0;36"),
+ PHPDBG_COLOR_D("none", "0;0"),
+
+ PHPDBG_COLOR_D("white", "0;64"),
+ PHPDBG_COLOR_D("white-bold", "1;64"),
+ PHPDBG_COLOR_D("red", "0;31"),
+ PHPDBG_COLOR_D("red-bold", "1;31"),
+ PHPDBG_COLOR_D("green", "0;32"),
+ PHPDBG_COLOR_D("green-bold", "1;32"),
+ PHPDBG_COLOR_D("blue", "0;34"),
+ PHPDBG_COLOR_D("blue-bold", "1;34"),
+ PHPDBG_COLOR_D("purple", "0;35"),
+ PHPDBG_COLOR_D("purple-bold", "1;35"),
+ PHPDBG_COLOR_D("cyan", "0;36"),
+ PHPDBG_COLOR_D("cyan-bold", "1;36"),
PHPDBG_COLOR_END
}; /* }}} */
switch (type) {
case P_ERROR:
- rc = fprintf(fp, "%s%s%s\n",
- ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "["),
- buffer,
- ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]"));
+ if (PHPDBG_G(flags) & PHPDBG_IS_COLOURED) {
+ rc = fprintf(fp,
+ "\033[%sm[%s]\033[0m\n",
+ PHPDBG_G(colors)[PHPDBG_COLOR_ERROR]->code, buffer);
+ } else {
+ rc = fprintf(fp, "[%s]\n", buffer);
+ }
break;
case P_NOTICE:
- rc = fprintf(fp, "%s%s%s\n",
- ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "["),
- buffer,
- ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]"));
+ if (PHPDBG_G(flags) & PHPDBG_IS_COLOURED) {
+ rc = fprintf(fp,
+ "\033[%sm[%s]\033[0m\n",
+ PHPDBG_G(colors)[PHPDBG_COLOR_NOTICE]->code, buffer);
+ } else {
+ rc = fprintf(fp, "[%s]\n", buffer);
+ }
break;
case P_WRITELN: {
if (buffer) {
- rc = fprintf(fp, "%s%s%s\n",
- ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""),
- buffer,
- ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : ""));
+ rc = fprintf(fp, "%s\n", buffer);
} else {
rc = fprintf(fp, "\n");
}
} break;
case P_WRITE: if (buffer) {
- rc = fprintf(fp, "%s%s%s",
- ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""),
- buffer,
- ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : ""));
+ rc = fprintf(fp, "%s", buffer);
} break;
/* no formatting on logging output */
return rc;
} /* }}} */
-PHPDBG_API const phpdbg_color_t* phpdbg_get_color(const char *name, size_t name_length) /* {{{ */
+PHPDBG_API const phpdbg_color_t* phpdbg_get_color(const char *name, size_t name_length TSRMLS_DC) /* {{{ */
{
const phpdbg_color_t *color = colors;
while (color && color->name) {
if (name_length == color->name_length &&
memcmp(name, color->name, name_length) == SUCCESS) {
+ phpdbg_debug(
+ "phpdbg_get_color(%s, %lu): %s", name, name_length, color->code);
return color;
}
++color;
}
+ phpdbg_debug(
+ "phpdbg_get_color(%s, %lu): failed", name, name_length);
+
return NULL;
} /* }}} */
+
+PHPDBG_API void phpdbg_set_color(int element, const phpdbg_color_t *color TSRMLS_DC) /* {{{ */
+{
+ PHPDBG_G(colors)[element] = color;
+} /* }}} */
+
+PHPDBG_API void phpdbg_set_color_ex(int element, const char *name, size_t name_length TSRMLS_DC) /* {{{ */
+{
+ const phpdbg_color_t *color = phpdbg_get_color(name, name_length TSRMLS_CC);
+ if (color) {
+ phpdbg_set_color(element, color TSRMLS_CC);
+ } else PHPDBG_G(colors)[element] = colors;
+} /* }}} */
+
+PHPDBG_API void phpdbg_set_prompt(const char *prompt TSRMLS_DC) /* {{{ */
+{
+ /* free formatted prompt */
+ if (PHPDBG_G(prompt)[1]) {
+ free(PHPDBG_G(prompt)[1]);
+ PHPDBG_G(prompt)[1] = NULL;
+ }
+ /* free old prompt */
+ if (PHPDBG_G(prompt)[0]) {
+ free(PHPDBG_G(prompt)[0]);
+ PHPDBG_G(prompt)[0] = NULL;
+ }
+
+ /* copy new prompt */
+ PHPDBG_G(prompt)[0] = strdup(prompt);
+} /* }}} */
+
+PHPDBG_API const char *phpdbg_get_prompt(TSRMLS_D) /* {{{ */
+{
+ /* find cached prompt */
+ if (PHPDBG_G(prompt)[1]) {
+ return PHPDBG_G(prompt)[1];
+ }
+
+ /* create cached prompt */
+ if ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED)) {
+ asprintf(
+ &PHPDBG_G(prompt)[1], "\033[%sm%s\033[0m ",
+ PHPDBG_G(colors)[PHPDBG_COLOR_PROMPT]->code,
+ PHPDBG_G(prompt)[0]);
+ } else {
+ asprintf(
+ &PHPDBG_G(prompt)[1], "%s ",
+ PHPDBG_G(prompt)[0]);
+ }
+
+ return PHPDBG_G(prompt)[1];
+} /* }}} */
#ifndef PHPDBG_UTILS_H
#define PHPDBG_UTILS_H
-/* {{{ color management */
-#define PHPDBG_COLOR_LEN 12
-#define PHPDBG_COLOR_D(color, code) \
- {color, sizeof(color), code}
-#define PHPDBG_COLOR_END \
- {NULL, 0L, {0}}
-
-typedef struct _phpdbg_color_t {
- char *name;
- size_t name_length;
- const char code[PHPDBG_COLOR_LEN];
-} phpdbg_color_t;
-
-PHPDBG_API const phpdbg_color_t* phpdbg_get_color(const char *name, size_t name_length); /* }}} */
-
/**
* Input scan functions
*/
/* {{{ For separation */
#define SEPARATE "------------------------------------------------" /* }}} */
+/* {{{ Color Management */
+#define PHPDBG_COLOR_LEN 12
+#define PHPDBG_COLOR_D(color, code) \
+ {color, sizeof(color)-1, code}
+#define PHPDBG_COLOR_END \
+ {NULL, 0L, {0}}
+
+#define PHPDBG_COLOR_INVALID -1
+#define PHPDBG_COLOR_PROMPT 0
+#define PHPDBG_COLOR_ERROR 1
+#define PHPDBG_COLOR_NOTICE 2
+#define PHPDBG_COLORS 3
+
+typedef struct _phpdbg_color_t {
+ char *name;
+ size_t name_length;
+ const char code[PHPDBG_COLOR_LEN];
+} phpdbg_color_t;
+
+PHPDBG_API const phpdbg_color_t* phpdbg_get_color(const char *name, size_t name_length TSRMLS_DC);
+PHPDBG_API void phpdbg_set_color(int element, const phpdbg_color_t *color TSRMLS_DC);
+PHPDBG_API void phpdbg_set_color_ex(int element, const char *name, size_t name_length TSRMLS_DC); /* }}} */
+
+/* {{{ Prompt Management */
+PHPDBG_API void phpdbg_set_prompt(const char* TSRMLS_DC);
+PHPDBG_API const char *phpdbg_get_prompt(TSRMLS_D); /* }}} */
+
#endif /* PHPDBG_UTILS_H */