]> granicus.if.org Git - php/commitdiff
- New parameter parsing API (for mb_convert_variables())
authorFelipe Pena <felipe@php.net>
Mon, 18 Aug 2008 00:37:16 +0000 (00:37 +0000)
committerFelipe Pena <felipe@php.net>
Mon, 18 Aug 2008 00:37:16 +0000 (00:37 +0000)
ext/mbstring/mbstring.c

index 199a0e8915722cfc7184c3638fa57eab613cee7e..009631e77f479cd6158fcf73abbdfcd6b071b3fa 100644 (file)
@@ -3600,37 +3600,30 @@ PHP_FUNCTION(mb_convert_kana)
 
 #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;
-       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;
+       char *name, *to_enc;
+       void *ptmp;     
+       
+       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;
        }
 
@@ -3644,13 +3637,13 @@ PHP_FUNCTION(mb_convert_variables)
        /* 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) {
@@ -3665,7 +3658,7 @@ PHP_FUNCTION(mb_convert_variables)
                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++];
@@ -3746,7 +3739,7 @@ detect_end:
                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++];
@@ -3812,7 +3805,7 @@ detect_end:
                mbfl_buffer_converter_delete(convd);
        }
 
-       efree((void *)args);
+       efree(args);
 
        name = (char *)mbfl_no_encoding2name(from_encoding);
        if (name != NULL) {