diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2017-08-04 18:38:36 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2017-08-04 22:22:58 +0200 |
commit | f24db7686ecc72d344b42b186839f3ea9086ee19 (patch) | |
tree | e7f7f7aea3f4583aa63544ad058c6abd09f02c41 /ext/mbstring/libmbfl | |
parent | 633a471ba0c9acc6d1cca04880c1e69e7b2dc18e (diff) | |
download | php-git-f24db7686ecc72d344b42b186839f3ea9086ee19.tar.gz |
Optimize mb_ord()
Don't perform a full encoding conversion into UCS4-BE, instead only
perform an input conversion into a wchar device.
Diffstat (limited to 'ext/mbstring/libmbfl')
-rw-r--r-- | ext/mbstring/libmbfl/mbfl/mbfilter.c | 12 | ||||
-rw-r--r-- | ext/mbstring/libmbfl/mbfl/mbfl_convert.c | 11 | ||||
-rw-r--r-- | ext/mbstring/libmbfl/mbfl/mbfl_convert.h | 1 |
3 files changed, 13 insertions, 11 deletions
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index 8f18525feb..94ecc57491 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -1,6 +1,5 @@ /* * charset=UTF-8 - * vim600: encoding=utf-8 */ /* @@ -1053,16 +1052,7 @@ mbfl_substr_count( if (filter == NULL) { return (size_t) -4; } - p = needle->val; - n = needle->len; - if (p != NULL) { - while (n > 0) { - if ((*filter->filter_function)(*p++, filter) < 0) { - break; - } - n--; - } - } + mbfl_convert_filter_feed_string(filter, needle->val, needle->len); mbfl_convert_filter_flush(filter); mbfl_convert_filter_delete(filter); pc.needle_len = pc.needle.pos; diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c index 1f4d81ae66..7a0fb60264 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c @@ -239,6 +239,17 @@ mbfl_convert_filter_feed(int c, mbfl_convert_filter *filter) } int +mbfl_convert_filter_feed_string(mbfl_convert_filter *filter, const unsigned char *p, size_t len) { + while (len > 0) { + if ((*filter->filter_function)(*p++, filter) < 0) { + return -1; + } + len--; + } + return 0; +} + +int mbfl_convert_filter_flush(mbfl_convert_filter *filter) { (*filter->filter_flush)(filter); diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_convert.h b/ext/mbstring/libmbfl/mbfl/mbfl_convert.h index af440becd2..31e54c61d1 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.h @@ -69,6 +69,7 @@ MBFLAPI extern mbfl_convert_filter *mbfl_convert_filter_new2( void *data ); MBFLAPI extern void mbfl_convert_filter_delete(mbfl_convert_filter *filter); MBFLAPI extern int mbfl_convert_filter_feed(int c, mbfl_convert_filter *filter); +MBFLAPI extern int mbfl_convert_filter_feed_string(mbfl_convert_filter *filter, const unsigned char *p, size_t len); MBFLAPI extern int mbfl_convert_filter_flush(mbfl_convert_filter *filter); MBFLAPI extern void mbfl_convert_filter_reset(mbfl_convert_filter *filter, const mbfl_encoding *from, const mbfl_encoding *to); MBFLAPI extern void mbfl_convert_filter_copy(mbfl_convert_filter *src, mbfl_convert_filter *dist); |