@@ -1817,26 +1817,54 @@ PHP_FUNCTION(mb_str_split)
1817
1817
}
1818
1818
/* }}} */
1819
1819
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
+
1820
1851
/* {{{ Get character numbers of a string */
1821
1852
PHP_FUNCTION (mb_strlen )
1822
1853
{
1823
- mbfl_string string ;
1824
- char * str ;
1825
- zend_string * enc_name = NULL ;
1854
+ zend_string * string , * enc_name = NULL ;
1826
1855
1827
1856
ZEND_PARSE_PARAMETERS_START (1 , 2 )
1828
- Z_PARAM_STRING ( str , string . len )
1857
+ Z_PARAM_STR ( string )
1829
1858
Z_PARAM_OPTIONAL
1830
1859
Z_PARAM_STR_OR_NULL (enc_name )
1831
1860
ZEND_PARSE_PARAMETERS_END ();
1832
1861
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 ) {
1836
1864
RETURN_THROWS ();
1837
1865
}
1838
1866
1839
- RETVAL_LONG (mbfl_strlen ( & string ));
1867
+ RETVAL_LONG (mb_get_strlen ( string , enc ));
1840
1868
}
1841
1869
/* }}} */
1842
1870
0 commit comments