From: krakjoe Date: Sun, 24 Nov 2013 19:34:18 +0000 (+0000) Subject: get good control over colors and prompt X-Git-Tag: php-5.6.0alpha1~110^2~85 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ddcfa42f15217d8e8e21248cc5c7e1ee2007e7f6;p=php get good control over colors and prompt --- diff --git a/phpdbg.c b/phpdbg.c index 72478e0535..c09e49f6ed 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -37,9 +37,13 @@ void (*zend_execute_old)(zend_op_array *op_array TSRMLS_DC); 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; @@ -151,20 +155,15 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ 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( @@ -698,9 +697,14 @@ phpdbg_main: /* 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(); diff --git a/phpdbg.h b/phpdbg.h index 327116d6f4..7b8e0c0c4b 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -62,6 +62,7 @@ #endif #include "phpdbg_cmd.h" +#include "phpdbg_utils.h" #ifdef ZTS # define PHPDBG_G(v) TSRMG(phpdbg_globals_id, zend_phpdbg_globals *, v) @@ -112,7 +113,6 @@ #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 @@ -126,29 +126,34 @@ /* {{{ 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 */ diff --git a/phpdbg_cmd.h b/phpdbg_cmd.h index 57ec73fff5..1205437253 100644 --- a/phpdbg_cmd.h +++ b/phpdbg_cmd.h @@ -92,6 +92,8 @@ typedef struct { } phpdbg_frame_t; /* }}} */ + + /* * Workflow: * 1) read input @@ -112,6 +114,8 @@ typedef struct { 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 diff --git a/phpdbg_set.c b/phpdbg_set.c index 2cbb616777..0c3381e694 100644 --- a/phpdbg_set.c +++ b/phpdbg_set.c @@ -24,67 +24,6 @@ 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) { @@ -93,7 +32,7 @@ PHPDBG_SET(prompt) /* {{{ */ break; case STR_PARAM: - phpdbg_set_prompt(param->str, NULL TSRMLS_CC); + phpdbg_set_prompt(param->str TSRMLS_CC); break; phpdbg_default_switch_case(); @@ -102,20 +41,45 @@ PHPDBG_SET(prompt) /* {{{ */ 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 "); } - return SUCCESS; } /* }}} */ diff --git a/phpdbg_set.h b/phpdbg_set.h index a78558c636..fe8ff9cb89 100644 --- a/phpdbg_set.h +++ b/phpdbg_set.h @@ -24,22 +24,15 @@ #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 ", 'p', set_prompt, NULL, 0), + PHPDBG_COMMAND_D_EX(color, "set color ", 'C', set_color, NULL, 1), + PHPDBG_COMMAND_D_EX(oplog, "set oplog ", 'O', set_oplog, NULL, 0), PHPDBG_END_COMMAND }; - #endif /* PHPDBG_SET_H */ diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 12e39a99fa..17bc04ca42 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -34,12 +34,20 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg); /* {{{ 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 }; /* }}} */ @@ -170,35 +178,35 @@ PHPDBG_API int phpdbg_print(int type TSRMLS_DC, FILE *fp, const char *format, .. 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 */ @@ -218,17 +226,74 @@ PHPDBG_API int phpdbg_print(int type TSRMLS_DC, FILE *fp, const char *format, .. 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]; +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 07ff8712a4..18b6a47141 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -20,21 +20,6 @@ #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 */ @@ -90,4 +75,31 @@ PHPDBG_API int phpdbg_print(int TSRMLS_DC, FILE*, const char*, ...) PHP_ATTRIBUT /* {{{ 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 */