Skip to content

Commit 94fde15

Browse files
committed
Move implementation of mb_strlen to mbstring.c
mbfl_strlen (in mbfilter.c) is still being used in a couple of places but will go away soon.
1 parent c63f18d commit 94fde15

File tree

1 file changed

+36
-8
lines changed

1 file changed

+36
-8
lines changed

ext/mbstring/mbstring.c

+36-8
Original file line numberDiff line numberDiff line change
@@ -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 */
18211852
PHP_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

Comments
 (0)