]> granicus.if.org Git - php/commitdiff
handle strings better
authorkrakjoe <joe.watkins@live.co.uk>
Sat, 15 Feb 2014 22:53:20 +0000 (22:53 +0000)
committerkrakjoe <joe.watkins@live.co.uk>
Sat, 15 Feb 2014 22:53:20 +0000 (22:53 +0000)
phpdbg_lexer.l
phpdbg_parser.y

index 6915ab62e0499ad0826fa9491e6e96b34a31de62..f916a0bc6aa1c53654ef659cca6b212ab99c89ac 100644 (file)
 #include "phpdbg_parser.h"
 #include <stdio.h>
 #include <string.h>
+
+static inline void phpdbg_param_append(phpdbg_param_t *param, const char *next, size_t nlen) {
+       if (param->len + nlen > param->addr) {
+               param->str = realloc(
+                       param->str, param->len + 1024);
+               param->addr += 1024;
+       }
+       memcpy(&param->str[param->len], next, nlen);
+       param->len += nlen;
+       param->str[param->len] = 0;
+}
 %}
 
 %s RAW
+%s STRING
 
 %option outfile="phpdbg_lexer.c" header-file="phpdbg_lexer.h"
 %option warn nodefault
@@ -29,6 +41,7 @@ C_FALSE               "false"
 C_NO           "no"
 C_OFF          "off"
 C_DISABLED     "disabled"
+
 C_EVAL         "eval"
 C_SHELL                "shell"
 
@@ -37,7 +50,6 @@ ID                    [a-zA-Z][a-zA-Z0-9_]+
 METHOD         {ID}::{ID}
 FILE           [^ :0-9]{1,}:[0-9]+
 OPLINE         0x[a-fA-F0-9]+
-LITERAL                \"(\\.|[^\\"])*\"
 WS          [ \r\n\t]+
 INPUT          [^\n]+
 %%
@@ -55,11 +67,11 @@ INPUT               [^\n]+
        }
        {C_EVAL}                { 
                BEGIN(RAW);
-               return C_EVAL; 
+               return C_EVAL;
        }
        {C_SHELL}               { 
                BEGIN(RAW);
-               return C_SHELL; 
+               return C_SHELL;
        }
        {DIGITS}         { 
                yylval->type = NUMERIC_PARAM;
@@ -83,18 +95,27 @@ INPUT               [^\n]+
                yylval->addr = strtoul(yytext, NULL, 10);
                return T_OPLINE; 
        }
-       {LITERAL}               { 
-               yylval->type = STR_PARAM;
-               yylval->str = strndup(yytext, yyleng);
-               yylval->len = yyleng;
-               return T_LITERAL; 
-       }
        {ID}            {
                yylval->type = STR_PARAM;
                yylval->str = strndup(yytext, yyleng);
                yylval->len = yyleng;
                return T_ID; 
        }
+       \"                                      {
+       BEGIN(STRING);
+               yylval->type = STR_PARAM;
+               yylval->str = (char*) malloc(28);
+               yylval->len = 0;
+               yylval->addr = 28;
+       }
+       <STRING>[^\\"\n]*       { phpdbg_param_append(yylval, yytext); }
+       <STRING>\\n                     { phpdbg_param_append(yylval, "\n");   }
+       <STRING>\\t                     { phpdbg_param_append(yylval, "\t");   }
+       <STRING>\\[\\"]         { phpdbg_param_append(yylval, "\\");   }
+       <STRING>\"                      {
+               BEGIN(INITIAL);
+               return T_STRING;
+       }
 }
 <RAW>{INPUT}           {
        yylval->type = STR_PARAM;
index 9b87847ebc9a2c9967959d364eb2102c49321ff1..f8fc5a0a7d99425b324e3516b382c208f9efdac5 100644 (file)
@@ -98,7 +98,7 @@ typedef void* yyscan_t;
 %token C_SHELL         "shell"
 
 %token T_DIGITS         "digits (numbers)"
-%token T_LITERAL "literal (T_LITERAL)"
+%token T_STRING  "literal (T_LITERAL)"
 %token T_METHOD         "method (T_METHOD)"
 %token T_OPLINE         "opline (T_OPLINE)"
 %token T_FILE   "file (T_FILE)"
@@ -135,7 +135,7 @@ parameter
        | T_METHOD                                                              { $$ = $1; }
        | T_OPLINE                                                              { $$ = $1; }
        | T_ID                                                                  { $$ = $1; } 
-       | T_LITERAL                                                             { $$ = $1; }
+       | T_STRING                                                              { $$ = $1; }
        | C_TRUTHY                                                              { $$ = $1; }
        | C_FALSY                                                               { $$ = $1; }
        ;