mirror of
https://github.com/php/php-src.git
synced 2024-09-24 03:17:26 +00:00
handle strings better
This commit is contained in:
parent
cdf1dcc497
commit
a32f1b4654
@ -11,9 +11,21 @@
|
||||
#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(¶m->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;
|
||||
|
@ -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; }
|
||||
;
|
||||
|
Loading…
Reference in New Issue
Block a user