diff options
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/standard/basic_functions.c | 2 | ||||
| -rw-r--r-- | ext/standard/string.c | 37 | 
2 files changed, 33 insertions, 6 deletions
| diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 7e50c73e9e..d047a59c75 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -182,7 +182,7 @@ function_entry basic_functions[] = {  	PHP_FE(levenshtein,									NULL)  	PHP_FE(chr,										NULL)  	PHP_FE(ord,										NULL) -	PHP_FE(parse_str,								NULL) +	PHP_FE(parse_str,								second_arg_force_ref)  	PHP_FE(str_pad,									NULL)  	PHP_FALIAS(rtrim,			chop,				NULL)  	PHP_FALIAS(strchr,			strstr,				NULL) diff --git a/ext/standard/string.c b/ext/standard/string.c index fc538b1f88..3465ef7975 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -775,6 +775,11 @@ PHP_FUNCTION(pathinfo)  		}  	} +	if (opt == PHP_PATHINFO_DIRNAME || argc < 2) { +		ret = php_basename(Z_STRVAL_PP(str), len); +		add_assoc_string(tmp, "dirname", ret, 1); +	}			 +	  	if (argc == 2) {  		zval **element;  		zend_hash_get_current_data(Z_ARRVAL_P(tmp), (void **)&element); @@ -2397,23 +2402,45 @@ PHP_FUNCTION(setlocale)  }  /* }}} */ -/* {{{ proto void parse_str(string encoded_string) +/* {{{ proto void parse_str(string encoded_string, [array result])     Parses GET/POST/COOKIE data and sets global variables */  PHP_FUNCTION(parse_str)  {  	zval **arg; +	zval **arrayArg; +	zval *sarg;  	char *res = NULL; +	int argCount; +	  	PLS_FETCH();  	SLS_FETCH(); -	if (zend_get_parameters_ex(1, &arg) == FAILURE) { +	argCount = ARG_COUNT(ht); +	if(argCount < 1 || argCount > 2 || zend_get_parameters_ex(argCount, &arg, &arrayArg) == FAILURE) {  		WRONG_PARAM_COUNT;  	} +  	convert_to_string_ex(arg); -	if ((*arg)->value.str.val && *(*arg)->value.str.val) { -		res = estrndup((*arg)->value.str.val,(*arg)->value.str.len); +	sarg = *arg; +	if (sarg->value.str.val && *sarg->value.str.val) { +		res = estrndup(sarg->value.str.val, sarg->value.str.len); +	} + +	if(argCount == 1) +		php_treat_data(PARSE_STRING, res, NULL ELS_CC PLS_CC SLS_CC); +	else +	{ +		if(!ParameterPassedByReference(ht, 2)){ +			php_error(E_WARNING, "Array not passed by reference in call to parse_str()"); +			return; +		} +		 +		/* Clear out the array that was passed in. */ +		zval_dtor(*arrayArg); +		array_init(*arrayArg); +		 +		php_treat_data(PARSE_STRING, res, *arrayArg ELS_CC PLS_CC SLS_CC);  	} -	php_treat_data(PARSE_STRING, res ELS_CC PLS_CC SLS_CC);  }  /* }}} */ | 
