@@ -1817,26 +1817,54 @@ PHP_FUNCTION(mb_str_split)
18171817}
18181818/* }}} */
18191819
1820+ static size_t mb_get_strlen (zend_string * string , const mbfl_encoding * encoding )
1821+ {
1822+ size_t len = 0 ;
1823+
1824+ if (encoding -> flag & MBFL_ENCTYPE_SBCS ) {
1825+ return ZSTR_LEN (string );
1826+ } else if (encoding -> flag & MBFL_ENCTYPE_WCS2 ) {
1827+ return ZSTR_LEN (string ) / 2 ;
1828+ } else if (encoding -> flag & MBFL_ENCTYPE_WCS4 ) {
1829+ return ZSTR_LEN (string ) / 4 ;
1830+ } else if (encoding -> mblen_table ) {
1831+ const unsigned char * mbtab = encoding -> mblen_table ;
1832+ unsigned char * p = (unsigned char * )ZSTR_VAL (string ), * e = p + ZSTR_LEN (string );
1833+ while (p < e ) {
1834+ p += mbtab [* p ];
1835+ len ++ ;
1836+ }
1837+ } else {
1838+ uint32_t wchar_buf [128 ];
1839+ unsigned char * in = (unsigned char * )ZSTR_VAL (string );
1840+ size_t in_len = ZSTR_LEN (string );
1841+ unsigned int state = 0 ;
1842+
1843+ while (in_len ) {
1844+ len += encoding -> to_wchar (& in , & in_len , wchar_buf , 128 , & state );
1845+ }
1846+ }
1847+
1848+ return len ;
1849+ }
1850+
18201851/* {{{ Get character numbers of a string */
18211852PHP_FUNCTION (mb_strlen )
18221853{
1823- mbfl_string string ;
1824- char * str ;
1825- zend_string * enc_name = NULL ;
1854+ zend_string * string , * enc_name = NULL ;
18261855
18271856 ZEND_PARSE_PARAMETERS_START (1 , 2 )
1828- Z_PARAM_STRING ( str , string . len )
1857+ Z_PARAM_STR ( string )
18291858 Z_PARAM_OPTIONAL
18301859 Z_PARAM_STR_OR_NULL (enc_name )
18311860 ZEND_PARSE_PARAMETERS_END ();
18321861
1833- string .val = (unsigned char * )str ;
1834- string .encoding = php_mb_get_encoding (enc_name , 2 );
1835- if (!string .encoding ) {
1862+ const mbfl_encoding * enc = php_mb_get_encoding (enc_name , 2 );
1863+ if (!enc ) {
18361864 RETURN_THROWS ();
18371865 }
18381866
1839- RETVAL_LONG (mbfl_strlen ( & string ));
1867+ RETVAL_LONG (mb_get_strlen ( string , enc ));
18401868}
18411869/* }}} */
18421870
0 commit comments