#define PHP_MBSTR_STACK_BLOCK_SIZE 32
-/* {{{ proto string mb_convert_variables(string to-encoding, mixed from-encoding [, mixed ...])
+/* {{{ proto string mb_convert_variables(string to-encoding, mixed from-encoding, mixed vars [, ...])
Converts the string resource in variables to desired encoding */
PHP_FUNCTION(mb_convert_variables)
{
- zval ***args, ***stack, **var, **hash_entry;
+ zval ***args, ***stack, **var, **hash_entry, **zfrom_enc;
HashTable *target_hash;
mbfl_string string, result, *ret;
enum mbfl_no_encoding from_encoding, to_encoding;
mbfl_encoding_detector *identd;
mbfl_buffer_converter *convd;
- int n, argc, stack_level, stack_max, elistsz;
+ int n, to_enc_len, argc, stack_level, stack_max, elistsz;
enum mbfl_no_encoding *elist;
- char *name;
+ char *name, *to_enc;
void *ptmp;
- argc = ZEND_NUM_ARGS();
- if (argc < 3) {
- WRONG_PARAM_COUNT;
- }
- args = (zval ***)ecalloc(argc, sizeof(zval **));
- if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
- efree((void *)args);
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sZ+", &to_enc, &to_enc_len, &zfrom_enc, &args, &argc) == FAILURE) {
+ return;
}
/* new encoding */
- convert_to_string_ex(args[0]);
- to_encoding = mbfl_name2no_encoding(Z_STRVAL_PP(args[0]));
+ to_encoding = mbfl_name2no_encoding(to_enc);
if (to_encoding == mbfl_no_encoding_invalid) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", Z_STRVAL_PP(args[0]));
- efree((void *)args);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", to_enc);
+ efree(args);
RETURN_FALSE;
}
/* pre-conversion encoding */
elist = NULL;
elistsz = 0;
- switch (Z_TYPE_PP(args[1])) {
+ switch (Z_TYPE_PP(zfrom_enc)) {
case IS_ARRAY:
- php_mb_parse_encoding_array(*args[1], &elist, &elistsz, 0 TSRMLS_CC);
+ php_mb_parse_encoding_array(*zfrom_enc, &elist, &elistsz, 0 TSRMLS_CC);
break;
default:
- convert_to_string_ex(args[1]);
- php_mb_parse_encoding_list(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1]), &elist, &elistsz, 0 TSRMLS_CC);
+ convert_to_string_ex(zfrom_enc);
+ php_mb_parse_encoding_list(Z_STRVAL_PP(zfrom_enc), Z_STRLEN_PP(zfrom_enc), &elist, &elistsz, 0 TSRMLS_CC);
break;
}
if (elistsz <= 0) {
stack_level = 0;
identd = mbfl_encoding_detector_new(elist, elistsz, MBSTRG(strict_detection));
if (identd != NULL) {
- n = 2;
+ n = 0;
while (n < argc || stack_level > 0) {
if (stack_level <= 0) {
var = args[n++];
stack_max = PHP_MBSTR_STACK_BLOCK_SIZE;
stack = (zval ***)safe_emalloc(stack_max, sizeof(zval **), 0);
stack_level = 0;
- n = 2;
+ n = 0;
while (n < argc || stack_level > 0) {
if (stack_level <= 0) {
var = args[n++];
mbfl_buffer_converter_delete(convd);
}
- efree((void *)args);
+ efree(args);
name = (char *)mbfl_no_encoding2name(from_encoding);
if (name != NULL) {
Returns the current encoding for regex as a string. */
PHP_FUNCTION(mb_regex_encoding)
{
- zval **arg1;
+ size_t argc = ZEND_NUM_ARGS();
+ char *encoding;
+ int encoding_len;
OnigEncoding mbctype;
- if (ZEND_NUM_ARGS() == 0) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &encoding, &encoding_len) == FAILURE) {
+ return;
+ }
+
+ if (argc == 0) {
const char *retval = _php_mb_regex_mbctype2name(MBREX(current_mbctype));
- if ( retval != NULL ) {
- RETVAL_STRING((char *)retval, 1);
- } else {
- RETVAL_FALSE;
+
+ if (retval == NULL) {
+ RETURN_FALSE;
}
- } else if (ZEND_NUM_ARGS() == 1 &&
- zend_get_parameters_ex(1, &arg1) != FAILURE) {
- convert_to_string_ex(arg1);
- mbctype = _php_mb_regex_name2mbctype(Z_STRVAL_PP(arg1));
+
+ RETURN_STRING((char *)retval, 1);
+ } else if (argc == 1) {
+ mbctype = _php_mb_regex_name2mbctype(encoding);
+
if (mbctype == ONIG_ENCODING_UNDEF) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", Z_STRVAL_PP(arg1));
- RETVAL_FALSE;
- } else {
- MBREX(current_mbctype) = mbctype;
- RETVAL_TRUE;
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", encoding);
+ RETURN_FALSE;
}
- } else {
- WRONG_PARAM_COUNT;
+
+ MBREX(current_mbctype) = mbctype;
+ RETURN_TRUE;
}
}
/* }}} */
static void
_php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
- zval **arg_pattern, **arg_options;
+ size_t argc = ZEND_NUM_ARGS();
+ char *arg_pattern, *arg_options;
+ int arg_pattern_len, arg_options_len;
int n, i, err, pos, len, beg, end;
OnigOptionType option;
OnigUChar *str;
OnigSyntaxType *syntax;
+ if (zend_parse_parameters(argc TSRMLS_CC, "|ss", &arg_pattern, &arg_pattern_len, &arg_options, &arg_options_len) == FAILURE) {
+ return;
+ }
+
option = MBREX(regex_default_options);
- switch (ZEND_NUM_ARGS()) {
- case 0:
- break;
- case 1:
- if (zend_get_parameters_ex(1, &arg_pattern) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- break;
- case 2:
- if (zend_get_parameters_ex(2, &arg_pattern, &arg_options) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- convert_to_string_ex(arg_options);
+
+ if (argc == 2) {
option = 0;
- _php_mb_regex_init_options(Z_STRVAL_PP(arg_options), Z_STRLEN_PP(arg_options), &option, &syntax, NULL);
- break;
- default:
- WRONG_PARAM_COUNT;
- break;
+ _php_mb_regex_init_options(arg_options, arg_options_len, &option, &syntax, NULL);
}
- if (ZEND_NUM_ARGS() > 0) {
- /* create regex pattern buffer */
- convert_to_string_ex(arg_pattern);
- if ((MBREX(search_re) = php_mbregex_compile_pattern(Z_STRVAL_PP(arg_pattern), Z_STRLEN_PP(arg_pattern), option, MBREX(current_mbctype), MBREX(regex_default_syntax) TSRMLS_CC)) == NULL) {
+ if (argc > 0) {
+ /* create regex pattern buffer */
+ if ((MBREX(search_re) = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), MBREX(regex_default_syntax) TSRMLS_CC)) == NULL) {
RETURN_FALSE;
}
}
Initialize string and regular expression for search. */
PHP_FUNCTION(mb_ereg_search_init)
{
- zval **arg_str, **arg_pattern, **arg_options;
+ size_t argc = ZEND_NUM_ARGS();
+ zval *arg_str;
+ char *arg_pattern, *arg_options;
+ int arg_pattern_len, arg_options_len;
OnigSyntaxType *syntax = NULL;
OnigOptionType option;
+ if (zend_parse_parameters(argc TSRMLS_CC, "z|ss", &arg_str, &arg_pattern, &arg_pattern_len, &arg_options, &arg_options_len) == FAILURE) {
+ return;
+ }
+
option = MBREX(regex_default_options);
syntax = MBREX(regex_default_syntax);
- switch (ZEND_NUM_ARGS()) {
- case 1:
- if (zend_get_parameters_ex(1, &arg_str) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- break;
- case 2:
- if (zend_get_parameters_ex(2, &arg_str, &arg_pattern) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- break;
- case 3:
- if (zend_get_parameters_ex(3, &arg_str, &arg_pattern, &arg_options) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- convert_to_string_ex(arg_options);
+
+ if (argc == 3) {
option = 0;
- _php_mb_regex_init_options(Z_STRVAL_PP(arg_options), Z_STRLEN_PP(arg_options), &option, &syntax, NULL);
- break;
- default:
- WRONG_PARAM_COUNT;
- break;
- }
- convert_to_string_ex(arg_str);
- if (ZEND_NUM_ARGS() > 1) {
- /* create regex pattern buffer */
- convert_to_string_ex(arg_pattern);
+ _php_mb_regex_init_options(arg_options, arg_options_len, &option, &syntax, NULL);
+ }
- if ((MBREX(search_re) = php_mbregex_compile_pattern(Z_STRVAL_PP(arg_pattern), Z_STRLEN_PP(arg_pattern), option, MBREX(current_mbctype), syntax TSRMLS_CC)) == NULL) {
+ if (argc > 1) {
+ /* create regex pattern buffer */
+ if ((MBREX(search_re) = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), syntax TSRMLS_CC)) == NULL) {
RETURN_FALSE;
}
}
MBREX(search_str) = (zval *)NULL;
}
- MBREX(search_str) = *arg_str;
+ MBREX(search_str) = arg_str;
Z_ADDREF_P(MBREX(search_str));
SEPARATE_ZVAL_IF_NOT_REF(&MBREX(search_str));
Set search start position */
PHP_FUNCTION(mb_ereg_search_setpos)
{
- zval **arg_pos;
- int n;
+ long position;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg_pos) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &position) == FAILURE) {
+ return;
}
- convert_to_long_ex(arg_pos);
- n = Z_LVAL_PP(arg_pos);
- if (n < 0 || (MBREX(search_str) != NULL && Z_TYPE_P(MBREX(search_str)) == IS_STRING && n >= Z_STRLEN_P(MBREX(search_str)))) {
+
+ if (position < 0 || (MBREX(search_str) != NULL && Z_TYPE_P(MBREX(search_str)) == IS_STRING && position >= Z_STRLEN_P(MBREX(search_str)))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Position is out of range");
MBREX(search_pos) = 0;
- RETVAL_FALSE;
- } else {
- MBREX(search_pos) = n;
- RETVAL_TRUE;
+ RETURN_FALSE;
}
+
+ MBREX(search_pos) = position;
+ RETURN_TRUE;
}
/* }}} */