]> granicus.if.org Git - php/commitdiff
get good control over colors and prompt
authorkrakjoe <joe.watkins@live.co.uk>
Sun, 24 Nov 2013 19:34:18 +0000 (19:34 +0000)
committerkrakjoe <joe.watkins@live.co.uk>
Sun, 24 Nov 2013 19:34:18 +0000 (19:34 +0000)
phpdbg.c
phpdbg.h
phpdbg_cmd.h
phpdbg_set.c
phpdbg_set.h
phpdbg_utils.c
phpdbg_utils.h

index 72478e0535a1cc89634dafa22c5033f96508b80d..c09e49f6ed371d9669a235426ce9dbf1819a2fb1 100644 (file)
--- 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();
index 327116d6f49567ea576dd57e9b9b60cc51c7a3a7..7b8e0c0c4ba384a6cebbcd584b1ea6b5f8362a87 100644 (file)
--- 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)
 #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 */
index 57ec73fff5e1186e4c80aa529c348f5a801ba571..12054372539104a826adc378d9b2e4d3910c592d 100644 (file)
@@ -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
index 2cbb616777ca36be5b0fc4f0c1f79762ee006eee..0c3381e694c1fb6cf1de4b25d6d0ba85da3f53f6 100644 (file)
 
 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 <prompt|error|notice> <color>");
        }
-
        return SUCCESS;
 } /* }}} */
 
index a78558c6360dd43eb4d7c30b8dbcd2a886076088..fe8ff9cb894c5f892d9ff0fcf019568882a14b48 100644 (file)
 
 #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 */
index 12e39a99faaa2eb194b6629b1f837ba23a97a712..17bc04ca42c30f82d0cc0ee2b3c990ec6a9b70fe 100644 (file)
@@ -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];
+} /* }}} */
index 07ff8712a4527be445a13748b980c6b1c8d3b7e5..18b6a47141f6aef77d483ddbb6bf4bf4ed08063a 100644 (file)
 #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 */