@@ -2351,30 +2351,18 @@ static inline bool php_mb_is_no_encoding_utf8(enum mbfl_no_encoding no_enc)
2351
2351
return (no_enc >= mbfl_no_encoding_utf8 && no_enc <= mbfl_no_encoding_utf8_sb );
2352
2352
}
2353
2353
2354
- MBSTRING_API char * php_mb_convert_encoding_ex (const char * input , size_t length , const mbfl_encoding * to_encoding , const mbfl_encoding * from_encoding , size_t * output_len )
2354
+ MBSTRING_API zend_string * php_mb_convert_encoding_ex (const char * input , size_t length , const mbfl_encoding * to_encoding , const mbfl_encoding * from_encoding )
2355
2355
{
2356
2356
unsigned int num_errors = 0 ;
2357
2357
zend_string * result = mb_fast_convert ((unsigned char * )input , length , from_encoding , to_encoding , MBSTRG (current_filter_illegal_substchar ), MBSTRG (current_filter_illegal_mode ), & num_errors );
2358
-
2359
2358
MBSTRG (illegalchars ) += num_errors ;
2360
- * output_len = ZSTR_LEN (result );
2361
-
2362
- char * output = emalloc (ZSTR_LEN (result ) + 1 );
2363
- memcpy (output , ZSTR_VAL (result ), ZSTR_LEN (result ) + 1 );
2364
- efree (result );
2365
- return output ;
2359
+ return result ;
2366
2360
}
2367
- /* }}} */
2368
2361
2369
- /* {{{ MBSTRING_API char *php_mb_convert_encoding() */
2370
- MBSTRING_API char * php_mb_convert_encoding (const char * input , size_t length , const mbfl_encoding * to_encoding , const mbfl_encoding * * from_encodings , size_t num_from_encodings , size_t * output_len )
2362
+ MBSTRING_API zend_string * php_mb_convert_encoding (const char * input , size_t length , const mbfl_encoding * to_encoding , const mbfl_encoding * * from_encodings , size_t num_from_encodings )
2371
2363
{
2372
2364
const mbfl_encoding * from_encoding ;
2373
2365
2374
- if (output_len ) {
2375
- * output_len = 0 ;
2376
- }
2377
-
2378
2366
/* pre-conversion encoding */
2379
2367
ZEND_ASSERT (num_from_encodings >= 1 );
2380
2368
if (num_from_encodings == 1 ) {
@@ -2393,18 +2381,15 @@ MBSTRING_API char *php_mb_convert_encoding(const char *input, size_t length, con
2393
2381
}
2394
2382
}
2395
2383
2396
- return php_mb_convert_encoding_ex (input , length , to_encoding , from_encoding , output_len );
2384
+ return php_mb_convert_encoding_ex (input , length , to_encoding , from_encoding );
2397
2385
}
2398
- /* }}} */
2399
2386
2400
2387
MBSTRING_API HashTable * php_mb_convert_encoding_recursive (HashTable * input , const mbfl_encoding * to_encoding , const mbfl_encoding * * from_encodings , size_t num_from_encodings )
2401
2388
{
2402
2389
HashTable * output , * chash ;
2403
2390
zend_long idx ;
2404
2391
zend_string * key ;
2405
2392
zval * entry , entry_tmp ;
2406
- size_t ckey_len , cval_len ;
2407
- char * ckey , * cval ;
2408
2393
2409
2394
if (!input ) {
2410
2395
return NULL ;
@@ -2420,22 +2405,14 @@ MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, cons
2420
2405
ZEND_HASH_FOREACH_KEY_VAL (input , idx , key , entry ) {
2421
2406
/* convert key */
2422
2407
if (key ) {
2423
- ckey = php_mb_convert_encoding (
2424
- ZSTR_VAL (key ), ZSTR_LEN (key ),
2425
- to_encoding , from_encodings , num_from_encodings , & ckey_len );
2426
- key = zend_string_init (ckey , ckey_len , 0 );
2427
- efree (ckey );
2408
+ key = php_mb_convert_encoding (ZSTR_VAL (key ), ZSTR_LEN (key ), to_encoding , from_encodings , num_from_encodings );
2428
2409
}
2429
2410
/* convert value */
2430
2411
ZEND_ASSERT (entry );
2431
2412
try_again :
2432
2413
switch (Z_TYPE_P (entry )) {
2433
2414
case IS_STRING :
2434
- cval = php_mb_convert_encoding (
2435
- Z_STRVAL_P (entry ), Z_STRLEN_P (entry ),
2436
- to_encoding , from_encodings , num_from_encodings , & cval_len );
2437
- ZVAL_STRINGL (& entry_tmp , cval , cval_len );
2438
- efree (cval );
2415
+ ZVAL_STR (& entry_tmp , php_mb_convert_encoding (Z_STRVAL_P (entry ), Z_STRLEN_P (entry ), to_encoding , from_encodings , num_from_encodings ));
2439
2416
break ;
2440
2417
case IS_NULL :
2441
2418
case IS_TRUE :
@@ -2545,23 +2522,9 @@ PHP_FUNCTION(mb_convert_encoding)
2545
2522
}
2546
2523
2547
2524
if (input_str ) {
2548
- if (num_from_encodings == 1 ) {
2549
- const mbfl_encoding * from_encoding = from_encodings [0 ];
2550
- if (from_encoding -> to_wchar && to_encoding -> from_wchar ) {
2551
- unsigned int num_errors = 0 ;
2552
- RETVAL_STR (mb_fast_convert ((unsigned char * )ZSTR_VAL (input_str ), ZSTR_LEN (input_str ), from_encoding , to_encoding , MBSTRG (current_filter_illegal_substchar ), MBSTRG (current_filter_illegal_mode ), & num_errors ));
2553
- MBSTRG (illegalchars ) += num_errors ;
2554
- goto out ;
2555
- }
2556
- }
2557
-
2558
- size_t size ;
2559
- char * ret = php_mb_convert_encoding (ZSTR_VAL (input_str ), ZSTR_LEN (input_str ),
2560
- to_encoding , from_encodings , num_from_encodings , & size );
2525
+ zend_string * ret = php_mb_convert_encoding (ZSTR_VAL (input_str ), ZSTR_LEN (input_str ), to_encoding , from_encodings , num_from_encodings );
2561
2526
if (ret != NULL ) {
2562
- // TODO: avoid reallocation ???
2563
- RETVAL_STRINGL (ret , size ); /* the string is already strdup()'ed */
2564
- efree (ret );
2527
+ RETVAL_STR (ret );
2565
2528
} else {
2566
2529
RETVAL_FALSE ;
2567
2530
}
@@ -2572,7 +2535,6 @@ PHP_FUNCTION(mb_convert_encoding)
2572
2535
RETVAL_ARR (tmp );
2573
2536
}
2574
2537
2575
- out :
2576
2538
if (free_from_encodings ) {
2577
2539
efree (ZEND_VOIDP (from_encodings ));
2578
2540
}
@@ -4135,20 +4097,16 @@ static inline zend_string *php_mb_chr(zend_long cp, zend_string *enc_name, uint3
4135
4097
buf [2 ] = (cp >> 8 ) & 0xff ;
4136
4098
buf [3 ] = cp & 0xff ;
4137
4099
4138
- size_t ret_len ;
4139
4100
long orig_illegalchars = MBSTRG (illegalchars );
4140
4101
MBSTRG (illegalchars ) = 0 ;
4141
- char * ret_str = php_mb_convert_encoding_ex (buf , 4 , enc , & mbfl_encoding_ucs4be , & ret_len );
4102
+ ret = php_mb_convert_encoding_ex (buf , 4 , enc , & mbfl_encoding_ucs4be );
4103
+
4142
4104
if (MBSTRG (illegalchars ) != 0 ) {
4143
- efree (ret_str );
4144
- MBSTRG (illegalchars ) = orig_illegalchars ;
4145
- return NULL ;
4105
+ zend_string_release (ret );
4106
+ ret = NULL ;
4146
4107
}
4147
4108
4148
- ret = zend_string_init (ret_str , ret_len , 0 );
4149
- efree (ret_str );
4150
4109
MBSTRG (illegalchars ) = orig_illegalchars ;
4151
-
4152
4110
return ret ;
4153
4111
}
4154
4112
@@ -4192,11 +4150,7 @@ PHP_FUNCTION(mb_scrub)
4192
4150
RETURN_THROWS ();
4193
4151
}
4194
4152
4195
- size_t ret_len ;
4196
- char * ret = php_mb_convert_encoding_ex (str , str_len , enc , enc , & ret_len );
4197
-
4198
- RETVAL_STRINGL (ret , ret_len );
4199
- efree (ret );
4153
+ RETURN_STR (php_mb_convert_encoding_ex (str , str_len , enc , enc ));
4200
4154
}
4201
4155
/* }}} */
4202
4156
0 commit comments