Merge branch 'PHP-7.0' into PHP-7.1

This commit is contained in:
Bob Weinand 2016-10-01 19:14:26 +01:00
commit 3fe1010cee
5 changed files with 571 additions and 117 deletions

View file

@ -294,6 +294,11 @@ static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */
static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */
{
if (PHPDBG_G(stdin_file)) {
fclose(PHPDBG_G(stdin_file));
PHPDBG_G(stdin_file) = NULL;
}
return SUCCESS;
} /* }}} */
@ -1307,6 +1312,27 @@ void *phpdbg_realloc_wrapper(void *ptr, size_t size ZEND_FILE_LINE_DC ZEND_FILE_
return _zend_mm_realloc(zend_mm_get_heap(), ptr, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
} /* }}} */
php_stream *phpdbg_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC) /* {{{ */
{
if (!strncasecmp(path, "php://", 6)) {
path += 6;
}
if (!strncasecmp(path, "stdin", 6) && PHPDBG_G(stdin_file)) {
php_stream *stream =stream = php_stream_fopen_from_file(PHPDBG_G(stdin_file), "r");
#ifdef PHP_WIN32
zval *blocking_pipes = php_stream_context_get_option(context, "pipe", "blocking");
if (blocking_pipes) {
convert_to_long(blocking_pipes);
php_stream_set_option(stream, PHP_STREAM_OPTION_PIPE_BLOCKING, Z_LVAL_P(blocking_pipes), NULL);
}
#endif
return stream;
}
return PHPDBG_G(orig_url_wrap_php)(wrapper, path, mode, options, opened_path, context STREAMS_CC);
} /* }}} */
int main(int argc, char **argv) /* {{{ */
{
sapi_module_struct *phpdbg = &phpdbg_sapi_module;
@ -1787,6 +1813,13 @@ phpdbg_main:
/* set default prompt */
phpdbg_set_prompt(PHPDBG_DEFAULT_PROMPT);
/* refactor to preserve run commands on force run command */
{
php_stream_wrapper *wrapper = zend_hash_str_find_ptr(php_stream_get_url_stream_wrappers_hash(), ZEND_STRL("php"));
PHPDBG_G(orig_url_wrap_php) = wrapper->wops->stream_opener;
wrapper->wops->stream_opener = phpdbg_stream_url_wrap_php;
}
/* Make stdin, stdout and stderr accessible from PHP scripts */
phpdbg_register_file_handles();
@ -2015,6 +2048,11 @@ phpdbg_out:
}
}
{
php_stream_wrapper *wrapper = zend_hash_str_find_ptr(php_stream_get_url_stream_wrappers_hash(), ZEND_STRL("php"));
wrapper->wops->stream_opener = PHPDBG_G(orig_url_wrap_php);
}
zend_try {
php_module_shutdown();
} zend_end_try();

View file

@ -306,6 +306,9 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
char *buffer; /* buffer */
zend_bool last_was_newline; /* check if we don't need to output a newline upon next phpdbg_error or phpdbg_notice */
FILE *stdin_file; /* FILE pointer to stdin source file */
php_stream *(*orig_url_wrap_php)(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC);
char input_buffer[PHPDBG_MAX_CMD]; /* stdin input buffer */
int input_buflen; /* length of stdin input buffer */
phpdbg_signal_safe_mem sigsafe_mem; /* memory to use in async safe environment (only once!) */

View file

@ -534,7 +534,7 @@ yy39:
#line 161 "sapi/phpdbg/phpdbg_lexer.l"
{
phpdbg_init_param(yylval, STR_PARAM);
yylval->str = estrndup(yytext, yyleng - unescape_string(yytext));
yylval->str = estrndup(yytext + (*yytext == '\'' || *yytext == '\"'), yyleng - unescape_string(yytext));
yylval->len = yyleng;
return T_ID;
}
@ -1655,56 +1655,61 @@ yy165:
yyc_RAW:
{
static const unsigned char yybm[] = {
0, 224, 224, 224, 224, 224, 224, 224,
224, 240, 0, 224, 224, 240, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
240, 224, 64, 192, 224, 224, 224, 128,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 32, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 224, 224, 224,
0, 232, 232, 232, 232, 232, 232, 232,
232, 236, 0, 232, 232, 236, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
236, 232, 32, 224, 232, 232, 232, 64,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 16, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
};
YYDEBUG(168, *YYCURSOR);
YYFILL(1);
yych = *YYCURSOR;
if (yybm[0+yych] & 16) {
if (yybm[0+yych] & 4) {
goto yy170;
}
if (yych <= '!') {
if (yych <= '"') {
if (yych <= 0x08) {
if (yych <= 0x00) goto yy175;
if (yych <= 0x08) goto yy177;
if (yych <= '\n') goto yy175;
goto yy177;
} else {
if (yych <= '#') {
if (yych <= '"') goto yy179;
goto yy173;
if (yych <= '\n') goto yy175;
if (yych <= '!') goto yy177;
goto yy181;
}
} else {
if (yych == '\'') goto yy181;
if (yych <= '\'') {
if (yych <= '#') goto yy173;
if (yych <= '&') goto yy177;
goto yy183;
} else {
if (yych == '\\') goto yy179;
goto yy177;
}
}
@ -1715,18 +1720,24 @@ yy170:
YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(171, *YYCURSOR);
if (yybm[0+yych] & 16) {
if (yybm[0+yych] & 4) {
goto yy170;
}
if (yych <= '!') {
if (yych <= 0x00) goto yy172;
if (yych <= 0x08) goto yy177;
if (yych >= '\v') goto yy177;
if (yych <= '"') {
if (yych <= 0x08) {
if (yych >= 0x01) goto yy177;
} else {
if (yych <= '#') {
if (yych <= '"') goto yy179;
if (yych <= '\n') goto yy172;
if (yych <= '!') goto yy177;
goto yy181;
}
} else {
if (yych == '\'') goto yy181;
if (yych <= '\'') {
if (yych <= '#') goto yy172;
if (yych <= '&') goto yy177;
goto yy183;
} else {
if (yych == '\\') goto yy179;
goto yy177;
}
}
@ -1736,11 +1747,11 @@ yy172:
#line 168 "sapi/phpdbg/phpdbg_lexer.l"
{
phpdbg_init_param(yylval, STR_PARAM);
yylval->str = estrndup(yytext, yyleng - unescape_string(yytext));
yylval->str = estrdup(yytext);
yylval->len = yyleng;
return T_INPUT;
}
#line 1744 "sapi/phpdbg/phpdbg_lexer.c"
#line 1755 "sapi/phpdbg/phpdbg_lexer.c"
yy173:
YYDEBUG(173, *YYCURSOR);
++YYCURSOR;
@ -1751,7 +1762,7 @@ yy173:
YYSETCONDITION(INITIAL);
return T_SEPARATOR;
}
#line 1755 "sapi/phpdbg/phpdbg_lexer.c"
#line 1766 "sapi/phpdbg/phpdbg_lexer.c"
yy175:
YYDEBUG(175, *YYCURSOR);
++YYCURSOR;
@ -1761,7 +1772,7 @@ yy175:
{
return 0;
}
#line 1765 "sapi/phpdbg/phpdbg_lexer.c"
#line 1776 "sapi/phpdbg/phpdbg_lexer.c"
yy177:
YYDEBUG(177, *YYCURSOR);
yyaccept = 0;
@ -1769,74 +1780,412 @@ yy177:
YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(178, *YYCURSOR);
if (yybm[0+yych] & 32) {
if (yybm[0+yych] & 8) {
goto yy177;
}
if (yych <= '\n') goto yy172;
if (yych <= '"') goto yy179;
if (yych <= '"') goto yy181;
if (yych <= '#') goto yy172;
goto yy181;
if (yych <= '\'') goto yy183;
yy179:
YYDEBUG(179, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yybm[0+yych] & 128) {
goto yy185;
}
if (yych >= '#') goto yy187;
yy180:
YYDEBUG(180, *YYCURSOR);
YYCURSOR = YYMARKER;
goto yy172;
if (yybm[0+yych] & 8) {
goto yy177;
}
if (yych <= '\n') goto yy172;
if (yych <= '"') goto yy190;
if (yych <= '#') goto yy172;
if (yych <= '\'') goto yy191;
goto yy179;
yy181:
YYDEBUG(181, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yybm[0+yych] & 64) {
goto yy182;
goto yy187;
}
if (yych <= '\'') goto yy180;
goto yy184;
if (yych >= '#') goto yy189;
yy182:
YYDEBUG(182, *YYCURSOR);
YYCURSOR = YYMARKER;
goto yy172;
yy183:
YYDEBUG(183, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(183, *YYCURSOR);
if (yybm[0+yych] & 64) {
goto yy182;
if (yybm[0+yych] & 32) {
goto yy184;
}
if (yych <= '\n') goto yy180;
if (yych <= '\'') goto yy177;
if (yych <= '\'') goto yy182;
goto yy186;
yy184:
YYDEBUG(184, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych == '\'') goto yy182;
if (yych == '\\') goto yy182;
goto yy180;
yy185:
YYDEBUG(185, *YYCURSOR);
if (yybm[0+yych] & 32) {
goto yy184;
}
if (yych <= '\n') goto yy182;
if (yych <= '\'') goto yy177;
yy186:
YYDEBUG(186, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(186, *YYCURSOR);
if (yybm[0+yych] & 128) {
goto yy185;
}
if (yych <= '\n') goto yy180;
if (yych <= '"') goto yy177;
if (yych == '\'') goto yy184;
if (yych == '\\') goto yy184;
goto yy182;
yy187:
YYDEBUG(187, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych == '"') goto yy185;
if (yych == '\\') goto yy185;
goto yy180;
YYDEBUG(188, *YYCURSOR);
if (yybm[0+yych] & 64) {
goto yy187;
}
if (yych <= '\n') goto yy182;
if (yych <= '"') goto yy177;
yy189:
YYDEBUG(189, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych == '"') goto yy187;
if (yych == '\\') goto yy187;
goto yy182;
yy190:
YYDEBUG(190, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
goto yy205;
} else {
if (yych <= '\n') goto yy172;
if (yych <= '!') goto yy205;
goto yy181;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy187;
if (yych <= '&') goto yy205;
goto yy207;
} else {
if (yych == '\\') goto yy208;
goto yy205;
}
}
yy191:
YYDEBUG(191, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
} else {
if (yych <= '\n') goto yy172;
if (yych >= '"') goto yy194;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy184;
if (yych >= '\'') goto yy183;
} else {
if (yych == '\\') goto yy195;
}
}
yy192:
YYDEBUG(192, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(193, *YYCURSOR);
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
goto yy192;
} else {
if (yych <= '\n') goto yy172;
if (yych <= '!') goto yy192;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy184;
if (yych <= '&') goto yy192;
goto yy191;
} else {
if (yych == '\\') goto yy195;
goto yy192;
}
}
yy194:
YYDEBUG(194, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yybm[0+yych] & 128) {
goto yy200;
}
if (yych <= '\n') goto yy182;
if (yych <= '"') goto yy184;
if (yych <= '\'') goto yy205;
goto yy210;
yy195:
YYDEBUG(195, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yybm[0+yych] & 8) {
goto yy177;
}
if (yych <= '\n') goto yy172;
if (yych <= '"') goto yy190;
if (yych <= '#') goto yy172;
if (yych <= '\'') goto yy192;
YYDEBUG(196, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
goto yy192;
} else {
if (yych <= '\n') goto yy172;
if (yych <= '!') goto yy192;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy184;
if (yych <= '&') goto yy192;
goto yy191;
} else {
if (yych == '\\') goto yy195;
goto yy192;
}
}
yy197:
YYDEBUG(197, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
} else {
if (yych <= '\n') goto yy172;
if (yych >= '"') goto yy194;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy200;
if (yych >= '\'') goto yy202;
} else {
if (yych == '\\') goto yy203;
}
}
yy198:
YYDEBUG(198, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(199, *YYCURSOR);
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
goto yy198;
} else {
if (yych <= '\n') goto yy172;
if (yych <= '!') goto yy198;
goto yy197;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy200;
if (yych <= '&') goto yy198;
goto yy202;
} else {
if (yych == '\\') goto yy203;
goto yy198;
}
}
yy200:
YYDEBUG(200, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(201, *YYCURSOR);
if (yybm[0+yych] & 128) {
goto yy200;
}
if (yych <= '\n') goto yy182;
if (yych <= '"') goto yy192;
if (yych <= '\'') goto yy205;
goto yy210;
yy202:
YYDEBUG(202, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
goto yy198;
} else {
if (yych <= '\n') goto yy172;
if (yych <= '!') goto yy198;
goto yy197;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy200;
if (yych <= '&') goto yy198;
goto yy207;
} else {
if (yych != '\\') goto yy198;
}
}
yy203:
YYDEBUG(203, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yybm[0+yych] & 8) {
goto yy177;
}
if (yych <= '\n') goto yy172;
if (yych <= '"') goto yy205;
if (yych <= '#') goto yy172;
if (yych <= '\'') goto yy192;
YYDEBUG(204, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
goto yy198;
} else {
if (yych <= '\n') goto yy172;
if (yych <= '!') goto yy198;
goto yy197;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy200;
if (yych <= '&') goto yy198;
goto yy202;
} else {
if (yych == '\\') goto yy203;
goto yy198;
}
}
yy205:
YYDEBUG(205, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(206, *YYCURSOR);
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
goto yy205;
} else {
if (yych <= '\n') goto yy172;
if (yych <= '!') goto yy205;
goto yy190;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy187;
if (yych <= '&') goto yy205;
} else {
if (yych == '\\') goto yy208;
goto yy205;
}
}
yy207:
YYDEBUG(207, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yybm[0+yych] & 128) {
goto yy200;
}
if (yych <= '\n') goto yy182;
if (yych <= '"') goto yy192;
if (yych <= '\'') goto yy187;
goto yy210;
yy208:
YYDEBUG(208, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yybm[0+yych] & 8) {
goto yy177;
}
if (yych <= '\n') goto yy172;
if (yych <= '"') goto yy205;
if (yych <= '#') goto yy172;
if (yych <= '\'') goto yy191;
YYDEBUG(209, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
goto yy205;
} else {
if (yych <= '\n') goto yy172;
if (yych <= '!') goto yy205;
goto yy190;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy187;
if (yych <= '&') goto yy205;
goto yy202;
} else {
if (yych == '\\') goto yy208;
goto yy205;
}
}
yy210:
YYDEBUG(210, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
if (yych <= '&') {
if (yych == '"') goto yy187;
goto yy182;
} else {
if (yych <= '\'') goto yy184;
if (yych == '\\') goto yy200;
goto yy182;
}
}
}
#line 213 "sapi/phpdbg/phpdbg_lexer.l"

View file

@ -82,7 +82,7 @@ ID [^ \r\n\t:#\000]+
GENERIC_ID ([^ \r\n\t:#\000"']|":\\")+|["]([^\n\000"\\]|"\\\\"|"\\"["])+["]|[']([^\n\000'\\]|"\\\\"|"\\"['])+[']
ADDR [0][x][a-fA-F0-9]+
OPCODE (ZEND_|zend_)([A-Za-z])+
INPUT ([^\n\000#"']|["]([^\n\000"\\]|"\\\\"|"\\"["])+["]|[']([^\n\000'\\]|"\\\\"|"\\"['])+['])+
INPUT ([^\n\000#"']|"\\"["']|["]([^\n\000"\\]|"\\\\"|"\\"["])+["]|[']([^\n\000'\\]|"\\\\"|"\\"['])+['])+
<!*> := yyleng = (size_t) YYCURSOR - (size_t) yytext;
@ -160,14 +160,14 @@ INPUT ([^\n\000#"']|["]([^\n\000"\\]|"\\\\"|"\\"["])+["]|[']([^\n\000'\\]|
<NORMAL>{GENERIC_ID} {
phpdbg_init_param(yylval, STR_PARAM);
yylval->str = estrndup(yytext, yyleng - unescape_string(yytext));
yylval->str = estrndup(yytext + (*yytext == '\'' || *yytext == '\"'), yyleng - unescape_string(yytext));
yylval->len = yyleng;
return T_ID;
}
<RAW>{INPUT} {
phpdbg_init_param(yylval, STR_PARAM);
yylval->str = estrndup(yytext, yyleng - unescape_string(yytext));
yylval->str = estrdup(yytext);
yylval->len = yyleng;
return T_INPUT;
}

View file

@ -687,6 +687,96 @@ PHPDBG_COMMAND(run) /* {{{ */
}
}
if (param && param->type != EMPTY_PARAM && param->len != 0) {
char **argv = emalloc(5 * sizeof(char *));
char *end = param->str + param->len, *p = param->str;
int argc = 0;
int i;
while (*end == '\r' || *end == '\n') *(end--) = 0;
while (*p == ' ') p++;
while (*p) {
char sep = ' ';
char *buf = emalloc(end - p + 1), *q = buf;
if (*p == '<') {
/* use as STDIN */
do p++; while (*p == ' ');
if (*p == '\'' || *p == '"') {
sep = *(p++);
}
while (*p && *p != sep) {
if (*p == '\\' && (p[1] == sep || p[1] == '\\')) {
p++;
}
*(q++) = *(p++);
}
*(q++) = 0;
if (*p) {
do p++; while (*p == ' ');
}
if (*p) {
phpdbg_error("cmd", "", "Invalid run command, cannot put further arguments after stdin");
goto free_cmd;
}
PHPDBG_G(stdin_file) = fopen(buf, "r");
if (PHPDBG_G(stdin_file) == NULL) {
phpdbg_error("stdin", "path=\"%s\"", "Could not open '%s' for reading from stdin", buf);
goto free_cmd;
}
efree(buf);
break;
}
if (argc >= 4 && argc == (argc & -argc)) {
argv = erealloc(argv, (argc * 2 + 1) * sizeof(char *));
}
if (*p == '\'' || *p == '"') {
sep = *(p++);
}
if (*p == '\\' && (p[1] == '<' || p[1] == '\'' || p[1] == '"')) {
p++;
}
while (*p && *p != sep) {
if (*p == '\\' && (p[1] == sep || p[1] == '\\')) {
p++;
}
*(q++) = *(p++);
}
if (!*p && sep != ' ') {
phpdbg_error("cmd", "", "Invalid run command, unterminated escape sequence");
free_cmd:
efree(buf);
for (i = 0; i < argc; i++) {
efree(argv[i]);
}
efree(argv);
return SUCCESS;
}
*(q++) = 0;
argv[++argc] = erealloc(buf, q - buf);
if (*p) {
do p++; while (*p == ' ');
}
}
argv[0] = SG(request_info).argv[0];
for (i = SG(request_info).argc; --i;) {
efree(SG(request_info).argv[i]);
}
efree(SG(request_info).argv);
SG(request_info).argv = erealloc(argv, ++argc * sizeof(char *));
SG(request_info).argc = argc;
php_build_argv(NULL, &PG(http_globals)[TRACK_VARS_SERVER]);
}
/* clean up from last execution */
if (ex && (ZEND_CALL_INFO(ex) & ZEND_CALL_HAS_SYMBOL_TABLE)) {
zend_hash_clean(ex->symbol_table);
@ -702,32 +792,6 @@ PHPDBG_COMMAND(run) /* {{{ */
/* reset hit counters */
phpdbg_reset_breakpoints();
if (param && param->type != EMPTY_PARAM && param->len != 0) {
char **argv = emalloc(5 * sizeof(char *));
int argc = 0;
int i;
/* TODO allow proper escaping with \, "" and '' here */
char *argv_str = strtok(param->str, " ");
while (argv_str) {
if (argc >= 4 && argc == (argc & -argc)) {
argv = erealloc(argv, (argc * 2 + 1) * sizeof(char *));
}
argv[++argc] = argv_str;
argv_str = strtok(0, " ");
argv[argc] = estrdup(argv[argc]);
}
argv[0] = SG(request_info).argv[0];
for (i = SG(request_info).argc; --i;) {
efree(SG(request_info).argv[i]);
}
efree(SG(request_info).argv);
SG(request_info).argv = erealloc(argv, ++argc * sizeof(char *));
SG(request_info).argc = argc;
php_build_argv(NULL, &PG(http_globals)[TRACK_VARS_SERVER]);
}
zend_try {
PHPDBG_G(flags) ^= PHPDBG_IS_INTERACTIVE;
PHPDBG_G(flags) |= PHPDBG_IS_RUNNING;