]> granicus.if.org Git - php/commitdiff
argc/argv started
authorkrakjoe <joe.watkins@live.co.uk>
Tue, 19 Nov 2013 17:18:58 +0000 (17:18 +0000)
committerkrakjoe <joe.watkins@live.co.uk>
Tue, 19 Nov 2013 17:18:58 +0000 (17:18 +0000)
phpdbg_cmd.c
phpdbg_cmd.h
phpdbg_prompt.c

index e192c2b953e3d5030f27ddc445f773b1b25dba16..b03aecc24625ccdbeb550ddf7e751a843b88908f 100644 (file)
@@ -118,6 +118,73 @@ void phpdbg_clear_param(phpdbg_param_t *param TSRMLS_DC) /* {{{ */
        
 } /* }}} */
 
+static inline phpdbg_input_t** phpdbg_read_argv(char *buffer, int *count TSRMLS_DC) /* {{{ */
+{
+       char *p, *s;
+       enum states { 
+               IN_BETWEEN, 
+               IN_WORD, 
+               IN_STRING 
+       } state = IN_BETWEEN;
+       phpdbg_input_t **inputs;
+       
+       (*count) = 0;   
+       inputs = (phpdbg_input_t**) emalloc(
+               sizeof(phpdbg_input_t*) * 1);
+
+#define RESET_STATE() do {\
+       phpdbg_input_t *next = emalloc(sizeof(phpdbg_input_t));\
+    if (next) {\
+       next->string = estrndup(\
+               s, ((p-1) - s)+1);\
+       inputs[(*count)++] = next;\
+    }\
+    state = IN_BETWEEN;\
+} while(0);
+
+       for (p = buffer; *p != '\0'; p++) {
+               int c = (unsigned char) *p;
+               switch (state) {
+                       case IN_BETWEEN:
+                               if (isspace(c)) {
+                                   continue;
+                               }
+                               if (c == '"') {
+                                   state = IN_STRING;
+                                   s = p + 1;
+                                   continue;
+                               }
+                               state = IN_WORD;
+                               s = p;
+                               continue;
+
+                       case IN_STRING:
+                               if (c == '"') {
+                                   RESET_STATE();
+                               }
+                               continue;
+
+                       case IN_WORD:
+                               if (isspace(c)) {
+                                   RESET_STATE();
+                               }
+                               continue;
+               }
+       }
+       
+       switch (state) {
+               case IN_WORD: {
+                       RESET_STATE();
+               } break;
+               
+               case IN_STRING:
+                       phpdbg_error("Malformed command line !");
+               break;
+       }
+       
+       return inputs;
+} /* }}} */
+
 phpdbg_input_t* phpdbg_read_input(TSRMLS_D) /* {{{ */
 {
        if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) {
@@ -169,6 +236,26 @@ phpdbg_input_t* phpdbg_read_input(TSRMLS_D) /* {{{ */
                                buffer->string[buffer->length] = '\0';
                                /* store constant pointer to start of buffer */
                                buffer->start = (char* const*) buffer->string;
+                               {       
+                                       /* temporary, when we switch to argv/argc handling 
+                                               will be unnecessary */
+                                       char *store = (char*) estrdup(buffer->string);
+                                       
+                                       buffer->argv = phpdbg_read_argv(
+                                               store, &buffer->argc TSRMLS_CC);
+                                       
+                                       if (buffer->argc) {
+                                               int arg = 0;
+                                               
+                                               while (arg < buffer->argc) {
+                                                       phpdbg_debug(
+                                                               "argv %d=%s", arg, buffer->argv[arg]->string);
+                                                       arg++;
+                                               }
+                                       }
+                                       
+                                       efree(store);
+                               }
                        }
                }
 
index 03fbd0afc8b295683f4ed651725b8a68951960a4..a8865ced931e4c6199a834536c2a23344a7dbfb3 100644 (file)
@@ -40,11 +40,16 @@ typedef enum {
        NUMERIC_PARAM
 } phpdbg_param_type;
 
-typedef struct {
-       char* const*  start;
-       char            *string;
-       size_t           length;
-} phpdbg_input_t;
+typedef struct _phpdbg_input_t phpdbg_input_t;
+
+struct _phpdbg_input_t {
+       char* const*    start;
+       char              *string;
+       size_t             length;
+       
+       phpdbg_input_t **argv;
+       int                              argc;
+};
 
 typedef struct _phpdbg_param {
     phpdbg_param_type type;
index 9a12454e7cf1b4fdc2565ce2b577b824ac17aa83..f84ced0a2caba962b666490924cec6556d710080 100644 (file)
@@ -690,7 +690,7 @@ static PHPDBG_COMMAND(register) /* {{{ */
                                        phpdbg_notice(
                                                "Registered %s", lcname);
                                } else {
-                                       phpdbg_error("Failed to find function %s", param->str);
+                                       phpdbg_error("The requested function (%s) could not be found", param->str);
                                }
                        } else {
                                phpdbg_error(