summaryrefslogtreecommitdiff
path: root/ext/mbstring
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mbstring')
-rw-r--r--ext/mbstring/config.m427
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp932.c2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp936.c2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_htmlent.c17
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis.c2
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter.c253
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_convert.c60
-rw-r--r--ext/mbstring/mb_gpc.c4
-rw-r--r--ext/mbstring/mbstring.c540
-rw-r--r--ext/mbstring/mbstring.h7
-rwxr-xr-xext/mbstring/oniguruma/enc/utf16_be.c2
-rwxr-xr-xext/mbstring/oniguruma/enc/utf16_le.c2
-rwxr-xr-xext/mbstring/oniguruma/enc/utf32_be.c2
-rwxr-xr-xext/mbstring/oniguruma/enc/utf32_le.c2
-rw-r--r--ext/mbstring/oniguruma/enc/utf8.c2
-rw-r--r--ext/mbstring/oniguruma/oniguruma.h2
-rw-r--r--ext/mbstring/oniguruma/regcomp.c2
-rw-r--r--ext/mbstring/oniguruma/regenc.h2
-rw-r--r--ext/mbstring/oniguruma/regerror.c2
-rw-r--r--ext/mbstring/oniguruma/regexec.c2
-rwxr-xr-xext/mbstring/oniguruma/regext.c2
-rw-r--r--ext/mbstring/oniguruma/reggnu.c2
-rw-r--r--ext/mbstring/oniguruma/regint.h2
-rw-r--r--ext/mbstring/oniguruma/regparse.c2
-rw-r--r--ext/mbstring/oniguruma/regparse.h2
-rw-r--r--ext/mbstring/oniguruma/regposix.c2
-rw-r--r--ext/mbstring/oniguruma/regsyntax.c2
-rw-r--r--ext/mbstring/oniguruma/regversion.c4
-rw-r--r--ext/mbstring/php_mbregex.c6
-rw-r--r--ext/mbstring/php_mbregex.h4
-rw-r--r--ext/mbstring/php_unicode.c4
-rw-r--r--ext/mbstring/php_unicode.h2
-rw-r--r--ext/mbstring/tests/bug43840.phpt75
-rw-r--r--ext/mbstring/tests/bug43841.phpt85
-rw-r--r--ext/mbstring/tests/bug43993.phpt26
-rw-r--r--ext/mbstring/tests/bug43994.phpt129
-rw-r--r--ext/mbstring/tests/bug43998.phpt71
-rw-r--r--ext/mbstring/tests/bug45239.phpt18
-rw-r--r--ext/mbstring/tests/bug45722.phpt8
-rw-r--r--ext/mbstring/tests/bug45923.phpt202
-rw-r--r--ext/mbstring/tests/bug46843.phpt12
-rw-r--r--ext/mbstring/tests/bug47399.phpt523
-rw-r--r--ext/mbstring/tests/mb_convert_encoding_variation1.phpt206
-rw-r--r--ext/mbstring/tests/mb_decode_mimeheader_basic.phpt35
-rw-r--r--ext/mbstring/tests/mb_decode_mimeheader_error.phpt42
-rw-r--r--ext/mbstring/tests/mb_decode_mimeheader_variation1.phpt209
-rw-r--r--ext/mbstring/tests/mb_decode_mimeheader_variation2.phpt51
-rw-r--r--ext/mbstring/tests/mb_decode_mimeheader_variation3.phpt29
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_basic.phpt17
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_basic2.phpt73
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_basic3.phpt69
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_indent.phpt901
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_variation1.phpt2
-rw-r--r--ext/mbstring/tests/mb_ereg.phpt35
-rw-r--r--ext/mbstring/tests/mb_ereg_basic.phpt18
-rw-r--r--ext/mbstring/tests/mb_ereg_error.phpt6
-rw-r--r--ext/mbstring/tests/mb_ereg_match_basic.phpt59
-rw-r--r--ext/mbstring/tests/mb_ereg_match_error1.phpt58
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_basic.phpt62
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_error.phpt48
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_variation1.phpt170
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_variation2.phpt178
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_variation3.phpt179
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_variation4.phpt179
-rw-r--r--ext/mbstring/tests/mb_ereg_variation3.phpt52
-rw-r--r--ext/mbstring/tests/mb_ereg_variation4.phpt26
-rw-r--r--ext/mbstring/tests/mb_ereg_variation5.phpt8
-rw-r--r--ext/mbstring/tests/mb_ereg_variation6.phpt33
-rw-r--r--ext/mbstring/tests/mb_ereg_variation7.phpt18
-rw-r--r--ext/mbstring/tests/mb_internal_encoding_ini_basic2.phpt29
-rw-r--r--ext/mbstring/tests/mb_regex_encoding_variation2.phpt420
-rw-r--r--ext/mbstring/tests/mb_split.phpt8
-rw-r--r--ext/mbstring/tests/mb_split_error.phpt50
-rw-r--r--ext/mbstring/tests/mb_split_variation1.phpt262
-rw-r--r--ext/mbstring/tests/mb_split_variation2.phpt248
-rw-r--r--ext/mbstring/tests/mb_split_variation3.phpt331
-rw-r--r--ext/mbstring/tests/mb_stripos.phpt178
-rw-r--r--ext/mbstring/tests/mb_stripos_basic.phpt158
-rw-r--r--ext/mbstring/tests/mb_stripos_basic2.phpt129
-rw-r--r--ext/mbstring/tests/mb_stripos_error1.phpt51
-rw-r--r--ext/mbstring/tests/mb_stripos_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_stripos_variation1.phpt183
-rw-r--r--ext/mbstring/tests/mb_stripos_variation2.phpt183
-rw-r--r--ext/mbstring/tests/mb_stripos_variation3.phpt203
-rw-r--r--ext/mbstring/tests/mb_stripos_variation4.phpt223
-rw-r--r--ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt119
-rw-r--r--ext/mbstring/tests/mb_stristr_basic.phpt70
-rw-r--r--ext/mbstring/tests/mb_stristr_error1.phpt47
-rw-r--r--ext/mbstring/tests/mb_stristr_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_stristr_variation1.phpt207
-rw-r--r--ext/mbstring/tests/mb_stristr_variation2.phpt215
-rw-r--r--ext/mbstring/tests/mb_stristr_variation3.phpt232
-rw-r--r--ext/mbstring/tests/mb_stristr_variation4.phpt227
-rw-r--r--ext/mbstring/tests/mb_stristr_variation5.phpt69
-rw-r--r--ext/mbstring/tests/mb_strlen_basic.phpt2
-rw-r--r--ext/mbstring/tests/mb_strlen_variation1.phpt8
-rw-r--r--ext/mbstring/tests/mb_strpos.phpt42
-rw-r--r--ext/mbstring/tests/mb_strpos_basic.phpt6
-rw-r--r--ext/mbstring/tests/mb_strpos_variation2.phpt28
-rw-r--r--ext/mbstring/tests/mb_strpos_variation3.phpt14
-rw-r--r--ext/mbstring/tests/mb_strpos_variation4.phpt4
-rw-r--r--ext/mbstring/tests/mb_strpos_variation5.phpt117
-rw-r--r--ext/mbstring/tests/mb_strrchr_basic.phpt64
-rw-r--r--ext/mbstring/tests/mb_strrchr_error1.phpt47
-rw-r--r--ext/mbstring/tests/mb_strrchr_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation1.phpt207
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation2.phpt207
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation3.phpt232
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation4.phpt227
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation5.phpt59
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation6.phpt65
-rw-r--r--ext/mbstring/tests/mb_strrichr_basic.phpt70
-rw-r--r--ext/mbstring/tests/mb_strrichr_error1.phpt47
-rw-r--r--ext/mbstring/tests/mb_strrichr_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_strrichr_variation1.phpt207
-rw-r--r--ext/mbstring/tests/mb_strrichr_variation2.phpt207
-rw-r--r--ext/mbstring/tests/mb_strrichr_variation3.phpt232
-rw-r--r--ext/mbstring/tests/mb_strrichr_variation4.phpt227
-rw-r--r--ext/mbstring/tests/mb_strrichr_variation5.phpt69
-rw-r--r--ext/mbstring/tests/mb_strripos_basic.phpt158
-rw-r--r--ext/mbstring/tests/mb_strripos_basic2.phpt128
-rw-r--r--ext/mbstring/tests/mb_strripos_error1.phpt51
-rw-r--r--ext/mbstring/tests/mb_strripos_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_strripos_variation1.phpt183
-rw-r--r--ext/mbstring/tests/mb_strripos_variation2.phpt183
-rw-r--r--ext/mbstring/tests/mb_strripos_variation3_Bug45923.phpt206
-rw-r--r--ext/mbstring/tests/mb_strripos_variation4.phpt223
-rw-r--r--ext/mbstring/tests/mb_strripos_variation5_Bug45923.phpt115
-rw-r--r--ext/mbstring/tests/mb_strrpos_basic.phpt6
-rw-r--r--ext/mbstring/tests/mb_strrpos_variation1.phpt10
-rw-r--r--ext/mbstring/tests/mb_strrpos_variation3.phpt16
-rw-r--r--ext/mbstring/tests/mb_strrpos_variation4.phpt4
-rw-r--r--ext/mbstring/tests/mb_strstr_basic.phpt64
-rw-r--r--ext/mbstring/tests/mb_strstr_error1.phpt47
-rw-r--r--ext/mbstring/tests/mb_strstr_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_strstr_variation1.phpt207
-rw-r--r--ext/mbstring/tests/mb_strstr_variation2.phpt215
-rw-r--r--ext/mbstring/tests/mb_strstr_variation3.phpt232
-rw-r--r--ext/mbstring/tests/mb_strstr_variation4.phpt227
-rw-r--r--ext/mbstring/tests/mb_strstr_variation5.phpt59
-rw-r--r--ext/mbstring/tests/mb_strstr_variation6.phpt65
-rw-r--r--ext/mbstring/tests/mb_strtolower_variation1.phpt4
-rw-r--r--ext/mbstring/tests/mb_strtolower_variation2.phpt18
-rw-r--r--ext/mbstring/tests/mb_strtolower_variation4.phpt4
-rw-r--r--ext/mbstring/tests/mb_strtoupper_basic.phpt10
-rw-r--r--ext/mbstring/tests/mb_strtoupper_variation1.phpt3
-rw-r--r--ext/mbstring/tests/mb_strtoupper_variation2.phpt18
-rw-r--r--ext/mbstring/tests/mb_strtoupper_variation4.phpt4
-rw-r--r--ext/mbstring/tests/mb_substitute_character.phpt56
-rw-r--r--ext/mbstring/tests/mb_substitute_character_basic.phpt43
-rw-r--r--ext/mbstring/tests/mb_substitute_character_error.phpt34
-rw-r--r--ext/mbstring/tests/mb_substitute_character_variation1.phpt238
-rw-r--r--ext/mbstring/tests/mb_substitute_character_variation2.phpt39
-rw-r--r--ext/mbstring/tests/mb_substr.phpt16
-rw-r--r--ext/mbstring/tests/mb_substr_basic.phpt4
-rw-r--r--ext/mbstring/tests/mb_substr_count_variation1.phpt3
-rw-r--r--ext/mbstring/tests/mb_substr_count_variation2.phpt21
-rw-r--r--ext/mbstring/tests/mb_substr_count_variation3.phpt4
-rw-r--r--ext/mbstring/tests/mb_substr_count_variation4.phpt44
-rw-r--r--ext/mbstring/tests/mb_substr_variation1.phpt3
-rw-r--r--ext/mbstring/tests/mb_substr_variation2.phpt18
-rw-r--r--ext/mbstring/tests/mb_substr_variation4.phpt25
-rw-r--r--ext/mbstring/tests/mb_substr_variation5.phpt23
-rw-r--r--ext/mbstring/tests/mb_substr_variation6.phpt137
-rw-r--r--ext/mbstring/tests/mb_substr_variation7.phpt138
165 files changed, 13880 insertions, 746 deletions
diff --git a/ext/mbstring/config.m4 b/ext/mbstring/config.m4
index a2d607497..6fa586f39 100644
--- a/ext/mbstring/config.m4
+++ b/ext/mbstring/config.m4
@@ -1,5 +1,5 @@
dnl
-dnl $Id: config.m4,v 1.58.2.4.2.11 2007/09/18 21:35:39 hirokawa Exp $
+dnl $Id: config.m4,v 1.58.2.4.2.12 2008/07/15 18:07:42 moriyoshi Exp $
dnl
AC_DEFUN([PHP_MBSTRING_ADD_SOURCES], [
@@ -72,19 +72,17 @@ int foo(int x, ...) {
return 0;
}
int main() { return foo(10, "", 3.14); }
- ], [cv_php_mbstring_stdarg=yes], [cv_php_mbstring_stdarg=no],
- [
- dnl cross-compile needs something here
-case $host_alias in
-*netware*)
-cv_php_mbstring_stdarg=yes
-;;
-*)
-cv_php_mbstring_stdarg=no
-;;
-esac
-]
-)
+ ], [cv_php_mbstring_stdarg=yes], [cv_php_mbstring_stdarg=no], [
+ dnl cross-compile needs something here
+ case $host_alias in
+ *netware*)
+ cv_php_mbstring_stdarg=yes
+ ;;
+ *)
+ cv_php_mbstring_stdarg=no
+ ;;
+ esac
+ ])
])
AC_CHECK_HEADERS([stdlib.h string.h strings.h unistd.h sys/time.h sys/times.h stdarg.h])
@@ -98,7 +96,6 @@ esac
AC_DEFINE([HAVE_MBREGEX], 1, [whether to have multibyte regex support])
-
if test "$PHP_MBREGEX_BACKTRACK" != "no"; then
AC_DEFINE([USE_COMBINATION_EXPLOSION_CHECK],1,[whether to check multibyte regex backtrack])
fi
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c
index 80f7bfbc6..8fa254b6c 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c
@@ -167,7 +167,7 @@ mbfl_filt_conv_sjiswin_wchar(int c, mbfl_convert_filter *filter)
case 1: /* kanji second char */
filter->status = 0;
c1 = filter->cache;
- if (c > 0x39 && c < 0xfd && c != 0x7f) {
+ if (c >= 0x40 && c <= 0xfc && c != 0x7f) {
w = 0;
SJIS_DECODE(c1, c, s1, s2);
s = (s1 - 0x21)*94 + s2 - 0x21;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c
index 9cdd0520e..561dc3003 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c
@@ -192,7 +192,7 @@ mbfl_filt_conv_wchar_cp936(int c, mbfl_convert_filter *filter)
}
}
if (s >= 0) {
- if (s < 0x80) { /* latin */
+ if (s <= 0x80) { /* latin */
CK((*filter->output_function)(s, filter->data));
} else {
CK((*filter->output_function)((s >> 8) & 0xff, filter->data));
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c b/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c
index 40c24c342..6c6654a1b 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c
@@ -232,8 +232,7 @@ int mbfl_filt_conv_html_dec(int c, mbfl_convert_filter *filter)
mbfl_filt_conv_html_dec_flush(filter);
if (c=='&')
{
- filter->status = 1;
- buffer[0] = '&';
+ buffer[filter->status++] = '&';
}
}
}
@@ -244,17 +243,19 @@ int mbfl_filt_conv_html_dec(int c, mbfl_convert_filter *filter)
int mbfl_filt_conv_html_dec_flush(mbfl_convert_filter *filter)
{
int status, pos = 0;
- char *buffer;
+ unsigned char *buffer;
+ int err = 0;
- buffer = (char*)filter->opaque;
+ buffer = (unsigned char*)filter->opaque;
status = filter->status;
+ filter->status = 0;
/* flush fragments */
while (status--) {
- CK((*filter->output_function)(buffer[pos++], filter->data));
+ int e = (*filter->output_function)(buffer[pos++], filter->data);
+ if (e != 0)
+ err = e;
}
- filter->status = 0;
- /*filter->buffer = 0; of cause NOT*/
- return 0;
+ return err;
}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c
index f9d7ff671..83ef56592 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c
@@ -167,7 +167,7 @@ mbfl_filt_conv_sjis_wchar(int c, mbfl_convert_filter *filter)
case 1: /* kanji second char */
filter->status = 0;
c1 = filter->cache;
- if (c > 0x39 && c < 0xfd && c != 0x7f) {
+ if (c >= 0x40 && c <= 0xfc && c != 0x7f) {
SJIS_DECODE(c1, c, s1, s2);
w = (s1 - 0x21)*94 + s2 - 0x21;
if (w >= 0 && w < jisx0208_ucs_table_size) {
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c
index 97d2f048c..1aeb38cc9 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c
@@ -462,10 +462,9 @@ enum mbfl_no_encoding mbfl_encoding_detector_judge(mbfl_encoding_detector *ident
while (n >= 0) {
filter = identd->filter_list[n];
if (!filter->flag) {
- if (identd->strict && filter->status) {
- continue;
+ if (!identd->strict || !filter->status) {
+ encoding = filter->encoding->no_encoding;
}
- encoding = filter->encoding->no_encoding;
}
n--;
}
@@ -779,7 +778,7 @@ retry:
for (;;) {
pc->found_pos++;
p = h;
- m = pc->needle.buffer;
+ m = (int *)pc->needle.buffer;
n = pc->needle_pos - 1;
while (n > 0 && *p == *m) {
n--;
@@ -858,84 +857,203 @@ mbfl_strpos(
int offset,
int reverse)
{
- int n, result, negative_offset = 0;
- unsigned char *p;
- mbfl_convert_filter *filter;
- struct collector_strpos_data pc;
+ int result;
+ mbfl_string _haystack_u8, _needle_u8;
+ const mbfl_string *haystack_u8, *needle_u8;
+ const unsigned char *u8_tbl;
- if (haystack == NULL || needle == NULL) {
+ if (haystack == NULL || haystack->val == NULL || needle == NULL || needle->val == NULL) {
return -8;
}
- /* needle is converted into wchar */
- mbfl_wchar_device_init(&pc.needle);
- filter = mbfl_convert_filter_new(
- needle->no_encoding,
- mbfl_no_encoding_wchar,
- mbfl_wchar_device_output, 0, &pc.needle);
- if (filter == NULL) {
- return -4;
- }
- p = needle->val;
- n = needle->len;
- if (p != NULL) {
- while (n > 0) {
- if ((*filter->filter_function)(*p++, filter) < 0) {
- break;
- }
- n--;
+
+ {
+ const mbfl_encoding *u8_enc;
+ u8_enc = mbfl_no2encoding(mbfl_no_encoding_utf8);
+ if (u8_enc == NULL || u8_enc->mblen_table == NULL) {
+ return -8;
}
+ u8_tbl = u8_enc->mblen_table;
}
- mbfl_convert_filter_flush(filter);
- mbfl_convert_filter_delete(filter);
- pc.needle_len = pc.needle.pos;
- if (pc.needle.buffer == NULL) {
- return -4;
- }
- if (pc.needle_len <= 0) {
- mbfl_wchar_device_clear(&pc.needle);
- return -2;
+
+ if (haystack->no_encoding != mbfl_no_encoding_utf8) {
+ mbfl_string_init(&_haystack_u8);
+ haystack_u8 = mbfl_convert_encoding(haystack, &_haystack_u8, mbfl_no_encoding_utf8);
+ if (haystack_u8 == NULL) {
+ result = -4;
+ goto out;
+ }
+ } else {
+ haystack_u8 = haystack;
}
- /* initialize filter and collector data */
- filter = mbfl_convert_filter_new(
- haystack->no_encoding,
- mbfl_no_encoding_wchar,
- collector_strpos, 0, &pc);
- if (filter == NULL) {
- mbfl_wchar_device_clear(&pc.needle);
- return -4;
+
+ if (needle->no_encoding != mbfl_no_encoding_utf8) {
+ mbfl_string_init(&_needle_u8);
+ needle_u8 = mbfl_convert_encoding(needle, &_needle_u8, mbfl_no_encoding_utf8);
+ if (needle_u8 == NULL) {
+ result = -4;
+ goto out;
+ }
+ } else {
+ needle_u8 = needle;
}
- if (offset < 0) {
- negative_offset = -offset-1;
- offset = 0;
+ if (needle_u8->len < 1) {
+ result = -8;
+ goto out;
}
- pc.start = offset;
- pc.output = 0;
- pc.needle_pos = 0;
- pc.found_pos = 0;
- pc.matched_pos = -1;
+ result = -1;
+ if (haystack_u8->len < needle_u8->len) {
+ goto out;
+ }
- /* feed data */
- p = haystack->val;
- n = haystack->len - negative_offset;
- if (p != NULL) {
- while (n > 0) {
- if ((*filter->filter_function)(*p++, filter) < 0) {
- pc.matched_pos = -4;
- break;
+ if (!reverse) {
+ unsigned int jtbl[1 << (sizeof(unsigned char) * 8)];
+ unsigned int needle_u8_len = needle_u8->len;
+ unsigned int i;
+ const unsigned char *p, *q, *e;
+ const unsigned char *haystack_u8_val = haystack_u8->val,
+ *needle_u8_val = needle_u8->val;
+ for (i = 0; i < sizeof(jtbl) / sizeof(*jtbl); ++i) {
+ jtbl[i] = needle_u8_len + 1;
+ }
+ for (i = 0; i < needle_u8_len - 1; ++i) {
+ jtbl[needle_u8_val[i]] = needle_u8_len - i;
+ }
+ e = haystack_u8_val + haystack_u8->len;
+ p = haystack_u8_val;
+ while (--offset >= 0) {
+ if (p >= e) {
+ result = -16;
+ goto out;
}
- if (pc.matched_pos >= 0 && !reverse) {
- break;
+ p += u8_tbl[*p];
+ }
+ p += needle_u8_len;
+ if (p > e) {
+ goto out;
+ }
+ while (p <= e) {
+ const unsigned char *pv = p;
+ q = needle_u8_val + needle_u8_len;
+ for (;;) {
+ if (q == needle_u8_val) {
+ result = 0;
+ while (p > haystack_u8_val) {
+ unsigned char c = *--p;
+ if (c < 0x80) {
+ ++result;
+ } else if ((c & 0xc0) != 0x80) {
+ ++result;
+ }
+ }
+ goto out;
+ }
+ if (*--q != *--p) {
+ break;
+ }
+ }
+ p += jtbl[*p];
+ if (p <= pv) {
+ p = pv + 1;
+ }
+ }
+ } else {
+ unsigned int jtbl[1 << (sizeof(unsigned char) * 8)];
+ unsigned int needle_u8_len = needle_u8->len, needle_len = 0;
+ unsigned int i;
+ const unsigned char *p, *e, *q, *qe;
+ const unsigned char *haystack_u8_val = haystack_u8->val,
+ *needle_u8_val = needle_u8->val;
+ for (i = 0; i < sizeof(jtbl) / sizeof(*jtbl); ++i) {
+ jtbl[i] = needle_u8_len;
+ }
+ for (i = needle_u8_len - 1; i > 0; --i) {
+ unsigned char c = needle_u8_val[i];
+ jtbl[c] = i;
+ if (c < 0x80) {
+ ++needle_len;
+ } else if ((c & 0xc0) != 0x80) {
+ ++needle_len;
+ }
+ }
+ {
+ unsigned char c = needle_u8_val[0];
+ if (c < 0x80) {
+ ++needle_len;
+ } else if ((c & 0xc0) != 0x80) {
+ ++needle_len;
+ }
+ }
+ e = haystack_u8_val;
+ p = e + haystack_u8->len;
+ qe = needle_u8_val + needle_u8_len;
+ if (offset < 0) {
+ if (-offset > needle_len) {
+ offset += needle_len;
+ while (offset < 0) {
+ unsigned char c;
+ if (p <= e) {
+ result = -16;
+ goto out;
+ }
+ c = *(--p);
+ if (c < 0x80) {
+ ++offset;
+ } else if ((c & 0xc0) != 0x80) {
+ ++offset;
+ }
+ }
+ }
+ } else {
+ const unsigned char *ee = haystack_u8_val + haystack_u8->len;
+ while (--offset >= 0) {
+ if (e >= ee) {
+ result = -16;
+ goto out;
+ }
+ e += u8_tbl[*e];
+ }
+ }
+ if (p < e + needle_u8_len) {
+ goto out;
+ }
+ p -= needle_u8_len;
+ while (p >= e) {
+ const unsigned char *pv = p;
+ q = needle_u8_val;
+ for (;;) {
+ if (q == qe) {
+ result = 0;
+ p -= needle_u8_len;
+ while (p > haystack_u8_val) {
+ unsigned char c = *--p;
+ if (c < 0x80) {
+ ++result;
+ } else if ((c & 0xc0) != 0x80) {
+ ++result;
+ }
+ }
+ goto out;
+ }
+ if (*q != *p) {
+ break;
+ }
+ ++p, ++q;
+ }
+ p -= jtbl[*p];
+ if (p >= pv) {
+ p = pv - 1;
}
- n--;
}
}
- mbfl_convert_filter_flush(filter);
- result = pc.matched_pos;
- mbfl_convert_filter_delete(filter);
- mbfl_wchar_device_clear(&pc.needle);
-
+out:
+ if (haystack_u8 == &_haystack_u8) {
+ mbfl_string_clear(&_haystack_u8);
+ }
+ if (needle_u8 == &_needle_u8) {
+ mbfl_string_clear(&_needle_u8);
+ }
return result;
}
@@ -1013,6 +1131,7 @@ mbfl_substr_count(
if (pc.matched_pos >= 0) {
++result;
pc.matched_pos = -1;
+ pc.needle_pos = 0;
}
n--;
}
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
index f6810738f..8c3a9758d 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
@@ -357,22 +357,6 @@ int mbfl_convert_filter_strcat(mbfl_convert_filter *filter, const unsigned char
return 0;
}
-#if 0
-static int
-mbfl_convert_filter_strncat(mbfl_convert_filter *filter, const unsigned char *p,
- int n)
-{
- while (n > 0) {
- if ((*filter->filter_function)(*p++, filter) < 0) {
- return -1;
- }
- n--;
- }
-
- return n;
-}
-#endif
-
/* illegal character output function for conv-filter */
int
mbfl_filt_conv_illegal_output(int c, mbfl_convert_filter *filter)
@@ -387,14 +371,9 @@ mbfl_filt_conv_illegal_output(int c, mbfl_convert_filter *filter)
ret = (*filter->filter_function)(filter->illegal_substchar, filter);
break;
case MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG:
- case MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY:
if (c >= 0) {
if (c < MBFL_WCSGROUP_UCS4MAX) { /* unicode */
- if (mode_backup == MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG) {
- ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"U+");
- } else { /* entity */
- ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"&#");
- }
+ ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"U+");
} else {
if (c < MBFL_WCSGROUP_WCHARMAX) {
m = c & ~MBFL_WCSPLANE_MASK;
@@ -438,9 +417,38 @@ mbfl_filt_conv_illegal_output(int c, mbfl_convert_filter *filter)
if (m == 0 && ret >= 0) {
ret = (*filter->filter_function)(mbfl_hexchar_table[0], filter);
}
- if (mode_backup == MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY) {
- ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)";");
+ }
+ }
+ break;
+ case MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY:
+ if (c >= 0) {
+ if (c < MBFL_WCSGROUP_UCS4MAX) { /* unicode */
+ ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"&#x");
+ if (ret < 0)
+ break;
+
+ m = 0;
+ r = 28;
+ while (r >= 0) {
+ n = (c >> r) & 0xf;
+ if (n || m) {
+ m = 1;
+ ret = (*filter->filter_function)(mbfl_hexchar_table[n], filter);
+ if (ret < 0) {
+ break;
+ }
+ }
+ r -= 4;
+ }
+ if (ret < 0) {
+ break;
+ }
+ if (m == 0) {
+ ret = (*filter->filter_function)(mbfl_hexchar_table[0], filter);
}
+ ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)";");
+ } else {
+ ret = (*filter->filter_function)(filter->illegal_substchar, filter);
}
}
break;
@@ -462,8 +470,8 @@ const struct mbfl_convert_vtbl * mbfl_convert_filter_get_vtbl(enum mbfl_no_encod
to == mbfl_no_encoding_7bit) {
from = mbfl_no_encoding_8bit;
} else if (from == mbfl_no_encoding_base64 ||
- from == mbfl_no_encoding_qprint ||
- from == mbfl_no_encoding_uuencode) {
+ from == mbfl_no_encoding_qprint ||
+ from == mbfl_no_encoding_uuencode) {
to = mbfl_no_encoding_8bit;
}
diff --git a/ext/mbstring/mb_gpc.c b/ext/mbstring/mb_gpc.c
index f6a175d8d..98efdcbe1 100644
--- a/ext/mbstring/mb_gpc.c
+++ b/ext/mbstring/mb_gpc.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2008 The PHP Group |
+ | Copyright (c) 1997-2009 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: mb_gpc.c,v 1.17.2.2.2.4 2007/12/31 07:20:07 sebastian Exp $ */
+/* $Id: mb_gpc.c,v 1.17.2.2.2.5 2008/12/31 11:17:39 sebastian Exp $ */
/* {{{ includes */
#ifdef HAVE_CONFIG_H
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index 7d2e2840c..211b2d63b 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2008 The PHP Group |
+ | Copyright (c) 1997-2009 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: mbstring.c,v 1.224.2.22.2.30 2008/02/17 02:06:56 hirokawa Exp $ */
+/* $Id: mbstring.c,v 1.224.2.22.2.46 2009/02/15 07:11:23 moriyoshi Exp $ */
/*
* PHP 4 Multibyte String module "mbstring"
@@ -89,7 +89,7 @@ static PHP_GSHUTDOWN_FUNCTION(mbstring);
/* {{{ php_mb_default_identify_list */
typedef struct _php_mb_nls_ident_list {
enum mbfl_no_language lang;
- enum mbfl_no_encoding* list;
+ const enum mbfl_no_encoding* list;
int list_size;
} php_mb_nls_ident_list;
@@ -560,7 +560,7 @@ static int php_mb_nls_get_default_detect_order_list(enum mbfl_no_language lang,
for (i = 0; i < sizeof(php_mb_default_identify_list) / sizeof(php_mb_default_identify_list[0]); i++) {
if (php_mb_default_identify_list[i].lang == lang) {
- *plist = php_mb_default_identify_list[i].list;
+ *plist = (enum mbfl_no_encoding *)php_mb_default_identify_list[i].list;
*plist_size = php_mb_default_identify_list[i].list_size;
return 1;
}
@@ -576,6 +576,7 @@ static PHP_INI_MH(OnUpdate_mbstring_language)
no_language = mbfl_name2no_language(new_value);
if (no_language == mbfl_no_language_invalid) {
+ MBSTRG(language) = mbfl_no_language_neutral;
return FAILURE;
}
MBSTRG(language) = no_language;
@@ -591,12 +592,16 @@ static PHP_INI_MH(OnUpdate_mbstring_detect_order)
int size;
if (php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1 TSRMLS_CC)) {
- if (MBSTRG(detect_order_list) != NULL) {
+ if (MBSTRG(detect_order_list)) {
free(MBSTRG(detect_order_list));
}
MBSTRG(detect_order_list) = list;
MBSTRG(detect_order_list_size) = size;
} else {
+ if (MBSTRG(detect_order_list)) {
+ free(MBSTRG(detect_order_list));
+ MBSTRG(detect_order_list) = NULL;
+ }
return FAILURE;
}
@@ -611,12 +616,17 @@ static PHP_INI_MH(OnUpdate_mbstring_http_input)
int size;
if (php_mb_parse_encoding_list(new_value, new_value_length, &list, &size, 1 TSRMLS_CC)) {
- if (MBSTRG(http_input_list) != NULL) {
+ if (MBSTRG(http_input_list)) {
free(MBSTRG(http_input_list));
}
MBSTRG(http_input_list) = list;
MBSTRG(http_input_list_size) = size;
} else {
+ if (MBSTRG(http_input_list)) {
+ free(MBSTRG(http_input_list));
+ MBSTRG(http_input_list) = NULL;
+ }
+ MBSTRG(http_input_list_size) = 0;
return FAILURE;
}
@@ -634,6 +644,8 @@ static PHP_INI_MH(OnUpdate_mbstring_http_output)
MBSTRG(http_output_encoding) = no_encoding;
MBSTRG(current_http_output_encoding) = no_encoding;
} else {
+ MBSTRG(http_output_encoding) = mbfl_no_encoding_pass;
+ MBSTRG(current_http_output_encoding) = mbfl_no_encoding_pass;
if (new_value != NULL && new_value_length > 0) {
return FAILURE;
}
@@ -643,41 +655,101 @@ static PHP_INI_MH(OnUpdate_mbstring_http_output)
}
/* }}} */
-/* {{{ static PHP_INI_MH(OnUpdate_mbstring_internal_encoding) */
-static PHP_INI_MH(OnUpdate_mbstring_internal_encoding)
+/* {{{ static _php_mb_ini_mbstring_internal_encoding_set */
+static int _php_mb_ini_mbstring_internal_encoding_set(const char *new_value, uint new_value_length TSRMLS_DC)
{
enum mbfl_no_encoding no_encoding;
- if (new_value == NULL) {
- return SUCCESS;
- }
+ const char *enc_name = NULL;
+ uint enc_name_len = 0;
- no_encoding = mbfl_name2no_encoding(new_value);
+ no_encoding = new_value ? mbfl_name2no_encoding(new_value):
+ mbfl_no_encoding_invalid;
if (no_encoding != mbfl_no_encoding_invalid) {
- MBSTRG(internal_encoding) = no_encoding;
- MBSTRG(current_internal_encoding) = no_encoding;
+ enc_name = new_value;
+ enc_name_len = new_value_length;
+ } else {
+ switch (MBSTRG(language)) {
+ case mbfl_no_language_uni:
+ enc_name = "UTF-8";
+ enc_name_len = sizeof("UTF-8") - 1;
+ break;
+ case mbfl_no_language_japanese:
+ enc_name = "EUC-JP";
+ enc_name_len = sizeof("EUC-JP") - 1;
+ break;
+ case mbfl_no_language_korean:
+ enc_name = "EUC-KR";
+ enc_name_len = sizeof("EUC-KR") - 1;
+ break;
+ case mbfl_no_language_simplified_chinese:
+ enc_name = "EUC-CN";
+ enc_name_len = sizeof("EUC-CN") - 1;
+ break;
+ case mbfl_no_language_traditional_chinese:
+ enc_name = "EUC-TW";
+ enc_name_len = sizeof("EUC-TW") - 1;
+ break;
+ case mbfl_no_language_russian:
+ enc_name = "KOI8-R";
+ enc_name_len = sizeof("KOI8-R") - 1;
+ break;
+ case mbfl_no_language_german:
+ enc_name = "ISO-8859-15";
+ enc_name_len = sizeof("ISO-8859-15") - 1;
+ break;
+ case mbfl_no_language_armenian:
+ enc_name = "ArmSCII-8";
+ enc_name_len = sizeof("ArmSCII-8") - 1;
+ break;
+ case mbfl_no_language_turkish:
+ enc_name = "ISO-8859-9";
+ enc_name_len = sizeof("ISO-8859-9") - 1;
+ break;
+ default:
+ enc_name = "ISO-8859-1";
+ enc_name_len = sizeof("ISO-8859-1") - 1;
+ break;
+ }
+ no_encoding = mbfl_name2no_encoding(enc_name);
+ }
+ MBSTRG(internal_encoding) = no_encoding;
+ MBSTRG(current_internal_encoding) = no_encoding;
#if HAVE_MBREGEX
- {
- OnigEncoding mbctype;
- mbctype = php_mb_regex_name2mbctype(new_value);
- if (mbctype == ONIG_ENCODING_UNDEF) {
- mbctype = ONIG_ENCODING_EUC_JP;
- }
- MBSTRG(current_mbctype) = MBSTRG(default_mbctype) = mbctype;
+ {
+ OnigEncoding mbctype;
+ mbctype = php_mb_regex_name2mbctype(enc_name);
+ if (mbctype == ONIG_ENCODING_UNDEF) {
+ mbctype = ONIG_ENCODING_EUC_JP;
}
+ MBSTRG(current_mbctype) = MBSTRG(default_mbctype) = mbctype;
+ }
#endif
#ifdef ZEND_MULTIBYTE
- zend_multibyte_set_internal_encoding(new_value, new_value_length TSRMLS_CC);
+ zend_multibyte_set_internal_encoding((char *)enc_name, enc_name_len TSRMLS_CC);
#endif /* ZEND_MULTIBYTE */
- } else {
- if (new_value != NULL && new_value_length > 0) {
- return FAILURE;
- }
- }
return SUCCESS;
}
/* }}} */
+/* {{{ static PHP_INI_MH(OnUpdate_mbstring_internal_encoding) */
+static PHP_INI_MH(OnUpdate_mbstring_internal_encoding)
+{
+ if (stage == PHP_INI_STAGE_STARTUP || stage == PHP_INI_STAGE_SHUTDOWN
+ || stage == PHP_INI_STAGE_RUNTIME) {
+ return _php_mb_ini_mbstring_internal_encoding_set(new_value, new_value_length TSRMLS_CC);
+ } else {
+ /* the corresponding mbstring globals needs to be set according to the
+ * ini value in the later stage because it never falls back to the
+ * default value if 1. no value for mbstring.internal_encoding is given,
+ * 2. mbstring.language directive is processed in per-dir or runtime
+ * context and 3. call to the handler for mbstring.language is done
+ * after mbstring.internal_encoding is handled. */
+ return SUCCESS;
+ }
+}
+/* }}} */
+
#ifdef ZEND_MULTIBYTE
/* {{{ static PHP_INI_MH(OnUpdate_mbstring_script_encoding) */
static PHP_INI_MH(OnUpdate_mbstring_script_encoding)
@@ -691,6 +763,11 @@ static PHP_INI_MH(OnUpdate_mbstring_script_encoding)
MBSTRG(script_encoding_list) = list;
MBSTRG(script_encoding_list_size) = size;
} else {
+ if (MBSTRG(script_encoding_list) != NULL) {
+ free(MBSTRG(script_encoding_list));
+ }
+ MBSTRG(script_encoding_list) = NULL;
+ MBSTRG(script_encoding_list_size) = 0;
return FAILURE;
}
@@ -726,6 +803,11 @@ static PHP_INI_MH(OnUpdate_mbstring_substitute_character)
}
}
}
+ } else {
+ MBSTRG(filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
+ MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
+ MBSTRG(filter_illegal_substchar) = 0x3f; /* '?' */
+ MBSTRG(current_filter_illegal_substchar) = 0x3f; /* '?' */
}
return SUCCESS;
@@ -756,7 +838,7 @@ static PHP_INI_MH(OnUpdate_mbstring_encoding_translation)
/* {{{ php.ini directive registration */
PHP_INI_BEGIN()
- PHP_INI_ENTRY("mbstring.language", "neutral", PHP_INI_SYSTEM | PHP_INI_PERDIR, OnUpdate_mbstring_language)
+ PHP_INI_ENTRY("mbstring.language", "neutral", PHP_INI_ALL, OnUpdate_mbstring_language)
PHP_INI_ENTRY("mbstring.detect_order", NULL, PHP_INI_ALL, OnUpdate_mbstring_detect_order)
PHP_INI_ENTRY("mbstring.http_input", "pass", PHP_INI_ALL, OnUpdate_mbstring_http_input)
PHP_INI_ENTRY("mbstring.http_output", "pass", PHP_INI_ALL, OnUpdate_mbstring_http_output)
@@ -765,8 +847,8 @@ PHP_INI_BEGIN()
PHP_INI_ENTRY("mbstring.script_encoding", NULL, PHP_INI_ALL, OnUpdate_mbstring_script_encoding)
#endif /* ZEND_MULTIBYTE */
PHP_INI_ENTRY("mbstring.substitute_character", NULL, PHP_INI_ALL, OnUpdate_mbstring_substitute_character)
- STD_PHP_INI_ENTRY("mbstring.func_overload", "0", PHP_INI_SYSTEM |
- PHP_INI_PERDIR, OnUpdateLong, func_overload, zend_mbstring_globals, mbstring_globals)
+ STD_PHP_INI_ENTRY("mbstring.func_overload", "0",
+ PHP_INI_SYSTEM, OnUpdateLong, func_overload, zend_mbstring_globals, mbstring_globals)
STD_PHP_INI_BOOLEAN("mbstring.encoding_translation", "0",
PHP_INI_SYSTEM | PHP_INI_PERDIR, OnUpdate_mbstring_encoding_translation,
@@ -781,7 +863,6 @@ PHP_INI_END()
static PHP_GINIT_FUNCTION(mbstring)
{
mbstring_globals->language = mbfl_no_language_uni;
- mbstring_globals->current_language = mbstring_globals->language;
mbstring_globals->internal_encoding = mbfl_no_encoding_invalid;
mbstring_globals->current_internal_encoding = mbstring_globals->internal_encoding;
#ifdef ZEND_MULTIBYTE
@@ -821,6 +902,18 @@ static PHP_GINIT_FUNCTION(mbstring)
/* {{{ PHP_GSHUTDOWN_FUNCTION */
static PHP_GSHUTDOWN_FUNCTION(mbstring)
{
+ if (mbstring_globals->http_input_list) {
+ free(mbstring_globals->http_input_list);
+ }
+#ifdef ZEND_MULTIBYTE
+ if (mbstring_globals->script_encoding_list) {
+ free(mbstring_globals->script_encoding_list);
+ }
+#endif /* ZEND_MULTIBYTE */
+ if (mbstring_globals->detect_order_list) {
+ free(mbstring_globals->detect_order_list);
+ }
+
#if HAVE_MBREGEX
_php_mb_regex_globals_dtor(mbstring_globals TSRMLS_CC);
#endif
@@ -859,18 +952,6 @@ PHP_MSHUTDOWN_FUNCTION(mbstring)
{
UNREGISTER_INI_ENTRIES();
- if (MBSTRG(http_input_list)) {
- free(MBSTRG(http_input_list));
- }
-#ifdef ZEND_MULTIBYTE
- if (MBSTRG(script_encoding_list)) {
- free(MBSTRG(script_encoding_list));
- }
-#endif /* ZEND_MULTIBYTE */
- if (MBSTRG(detect_order_list)) {
- free(MBSTRG(detect_order_list));
- }
-
#if HAVE_MBREGEX
PHP_MSHUTDOWN(mb_regex) (INIT_FUNC_ARGS_PASSTHRU);
#endif
@@ -887,51 +968,9 @@ PHP_RINIT_FUNCTION(mbstring)
zend_function *func, *orig;
const struct mb_overload_def *p;
- MBSTRG(current_language) = MBSTRG(language);
- php_mb_nls_get_default_detect_order_list(MBSTRG(language),
- &MBSTRG(default_detect_order_list), &MBSTRG(default_detect_order_list_size));
-
- if (MBSTRG(internal_encoding) == mbfl_no_encoding_invalid) {
- char *default_enc = NULL;
- switch (MBSTRG(current_language)) {
- case mbfl_no_language_uni:
- default_enc = "UTF-8";
- break;
- case mbfl_no_language_japanese:
- default_enc = "EUC-JP";
- break;
- case mbfl_no_language_korean:
- default_enc = "EUC-KR";
- break;
- case mbfl_no_language_simplified_chinese:
- default_enc = "EUC-CN";
- break;
- case mbfl_no_language_traditional_chinese:
- default_enc = "EUC-TW";
- break;
- case mbfl_no_language_russian:
- default_enc = "KOI8-R";
- break;
- case mbfl_no_language_german:
- default_enc = "ISO-8859-15";
- break;
- case mbfl_no_language_armenian:
- default_enc = "ArmSCII-8";
- break;
- case mbfl_no_language_turkish:
- default_enc = "ISO-8859-9";
- break;
- case mbfl_no_language_english:
- default:
- default_enc = "ISO-8859-1";
- break;
- }
- if (default_enc) {
- zend_alter_ini_entry("mbstring.internal_encoding",
- sizeof("mbstring.internal_encoding"),
- default_enc, strlen(default_enc),
- PHP_INI_PERDIR, PHP_INI_STAGE_RUNTIME);
- }
+ {
+ char *value = zend_ini_string("mbstring.internal_encoding", sizeof("mbstring.internal_encoding"), 0);
+ _php_mb_ini_mbstring_internal_encoding_set(value, value ? strlen(value): 0 TSRMLS_CC);
}
MBSTRG(current_internal_encoding) = MBSTRG(internal_encoding);
@@ -939,9 +978,7 @@ PHP_RINIT_FUNCTION(mbstring)
MBSTRG(current_filter_illegal_mode) = MBSTRG(filter_illegal_mode);
MBSTRG(current_filter_illegal_substchar) = MBSTRG(filter_illegal_substchar);
- if (!MBSTRG(encoding_translation)) {
- MBSTRG(illegalchars) = 0;
- }
+ MBSTRG(illegalchars) = 0;
n = 0;
if (MBSTRG(detect_order_list)) {
@@ -1025,9 +1062,14 @@ PHP_RSHUTDOWN_FUNCTION(mbstring)
/* clear overloaded function. */
if (MBSTRG(func_overload)){
p = &(mb_ovld[0]);
- while (p->type > 0 && zend_hash_find(EG(function_table), p->save_func, strlen(p->save_func)+1 , (void **)&orig) == SUCCESS) {
- zend_hash_update(EG(function_table), p->orig_func, strlen(p->orig_func)+1, orig, sizeof(zend_function), NULL);
- zend_hash_del(EG(function_table), p->save_func, strlen(p->save_func)+1);
+ while (p->type > 0) {
+ if ((MBSTRG(func_overload) & p->type) == p->type &&
+ zend_hash_find(EG(function_table), p->save_func,
+ strlen(p->save_func)+1, (void **)&orig) == SUCCESS) {
+
+ zend_hash_update(EG(function_table), p->orig_func, strlen(p->orig_func)+1, orig, sizeof(zend_function), NULL);
+ zend_hash_del(EG(function_table), p->save_func, strlen(p->save_func)+1);
+ }
p++;
}
}
@@ -1079,22 +1121,20 @@ PHP_FUNCTION(mb_language)
{
char *name = NULL;
int name_len = 0;
- enum mbfl_no_language no_language;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, &name_len) == FAILURE) {
return;
}
if (name == NULL) {
- RETURN_STRING((char *)mbfl_no_language2name(MBSTRG(current_language)), 1);
+ RETVAL_STRING((char *)mbfl_no_language2name(MBSTRG(language)), 1);
} else {
- no_language = mbfl_name2no_language(name);
- if (no_language == mbfl_no_language_invalid) {
+ if (FAILURE == zend_alter_ini_entry(
+ "mbstring.language", sizeof("mbstring.language"),
+ name, name_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown language \"%s\"", name);
- RETURN_FALSE;
+ RETVAL_FALSE;
} else {
- php_mb_nls_get_default_detect_order_list(no_language, &MBSTRG(default_detect_order_list), &MBSTRG(default_detect_order_list_size));
- MBSTRG(current_language) = no_language;
- RETURN_TRUE;
+ RETVAL_TRUE;
}
}
}
@@ -1412,7 +1452,7 @@ PHP_FUNCTION(mb_preferred_mime_name)
Parses GET/POST/COOKIE data and sets global variables */
PHP_FUNCTION(mb_parse_str)
{
- zval *track_vars_array;
+ zval *track_vars_array = NULL;
char *encstr = NULL;
int encstr_len;
php_mb_encoding_handler_info_t info;
@@ -1436,10 +1476,10 @@ PHP_FUNCTION(mb_parse_str)
info.force_register_globals = (track_vars_array == NULL);
info.report_errors = 1;
info.to_encoding = MBSTRG(current_internal_encoding);
- info.to_language = MBSTRG(current_language);
+ info.to_language = MBSTRG(language);
info.from_encodings = MBSTRG(http_input_list);
info.num_from_encodings = MBSTRG(http_input_list_size);
- info.from_language = MBSTRG(current_language);
+ info.from_language = MBSTRG(language);
detected = _php_mb_encoding_handler_ex(&info, track_vars_array, encstr TSRMLS_CC);
@@ -1527,7 +1567,7 @@ PHP_FUNCTION(mb_output_handler)
/* feed the string */
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.no_encoding = MBSTRG(current_internal_encoding);
string.val = (unsigned char *)arg_string;
string.len = arg_string_len;
@@ -1563,7 +1603,7 @@ PHP_FUNCTION(mb_strlen)
RETURN_FALSE;
}
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
if (enc_name == NULL) {
string.no_encoding = MBSTRG(current_internal_encoding);
} else {
@@ -1595,9 +1635,9 @@ PHP_FUNCTION(mb_strpos)
mbfl_string_init(&haystack);
mbfl_string_init(&needle);
- haystack.no_language = MBSTRG(current_language);
+ haystack.no_language = MBSTRG(language);
haystack.no_encoding = MBSTRG(current_internal_encoding);
- needle.no_language = MBSTRG(current_language);
+ needle.no_language = MBSTRG(language);
needle.no_encoding = MBSTRG(current_internal_encoding);
offset = 0;
@@ -1613,12 +1653,12 @@ PHP_FUNCTION(mb_strpos)
}
}
- if (offset < 0 || (unsigned long)offset > (unsigned long)mbfl_strlen(&haystack)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset not contained in string.");
+ if (offset < 0 || offset > mbfl_strlen(&haystack)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset not contained in string");
RETURN_FALSE;
}
if (needle.len == 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter.");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter");
RETURN_FALSE;
}
@@ -1630,17 +1670,17 @@ PHP_FUNCTION(mb_strpos)
case 1:
break;
case 2:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Needle has not positive length.");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Needle has not positive length");
break;
case 4:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding or conversion error.");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding or conversion error");
break;
case 8:
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Argument is empty.");
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Argument is empty");
break;
default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown error in mb_strpos.");
- break;
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown error in mb_strpos");
+ break;
}
RETVAL_FALSE;
}
@@ -1662,9 +1702,9 @@ PHP_FUNCTION(mb_strrpos)
mbfl_string_init(&haystack);
mbfl_string_init(&needle);
- haystack.no_language = MBSTRG(current_language);
+ haystack.no_language = MBSTRG(language);
haystack.no_encoding = MBSTRG(current_internal_encoding);
- needle.no_language = MBSTRG(current_language);
+ needle.no_language = MBSTRG(language);
needle.no_encoding = MBSTRG(current_internal_encoding);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|Zs", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &zoffset, &enc_name, &enc_name_len) == FAILURE) {
@@ -1727,10 +1767,13 @@ PHP_FUNCTION(mb_strrpos)
RETURN_FALSE;
}
- if ((offset > 0 && offset > mbfl_strlen(&haystack)) ||
- (offset < 0 && -offset > mbfl_strlen(&haystack))) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Offset is greater than the length of haystack string");
- RETURN_FALSE;
+ {
+ int haystack_char_len = mbfl_strlen(&haystack);
+ if ((offset > 0 && offset > haystack_char_len) ||
+ (offset < 0 && -offset > haystack_char_len)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset is greater than the length of haystack string");
+ RETURN_FALSE;
+ }
}
n = mbfl_strpos(&haystack, &needle, offset, 1);
@@ -1784,10 +1827,6 @@ PHP_FUNCTION(mb_strripos)
RETURN_FALSE;
}
- if(offset > old_haystack_len){
- RETURN_FALSE;
- }
-
n = php_mb_stripos(1, old_haystack, old_haystack_len, old_needle, old_needle_len, offset, from_encoding TSRMLS_CC);
if (n >= 0) {
@@ -1810,9 +1849,9 @@ PHP_FUNCTION(mb_strstr)
mbfl_string_init(&haystack);
mbfl_string_init(&needle);
- haystack.no_language = MBSTRG(current_language);
+ haystack.no_language = MBSTRG(language);
haystack.no_encoding = MBSTRG(current_internal_encoding);
- needle.no_language = MBSTRG(current_language);
+ needle.no_language = MBSTRG(language);
needle.no_encoding = MBSTRG(current_internal_encoding);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|bs", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &part, &enc_name, &enc_name_len) == FAILURE) {
@@ -1828,7 +1867,7 @@ PHP_FUNCTION(mb_strstr)
}
if (needle.len <= 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING,"Empty delimiter.");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter");
RETURN_FALSE;
}
n = mbfl_strpos(&haystack, &needle, 0, 0);
@@ -1868,9 +1907,9 @@ PHP_FUNCTION(mb_strrchr)
mbfl_string_init(&haystack);
mbfl_string_init(&needle);
- haystack.no_language = MBSTRG(current_language);
+ haystack.no_language = MBSTRG(language);
haystack.no_encoding = MBSTRG(current_internal_encoding);
- needle.no_language = MBSTRG(current_language);
+ needle.no_language = MBSTRG(language);
needle.no_encoding = MBSTRG(current_internal_encoding);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|bs", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &part, &enc_name, &enc_name_len) == FAILURE) {
@@ -1926,9 +1965,9 @@ PHP_FUNCTION(mb_stristr)
char *from_encoding = (char*)mbfl_no2preferred_mime_name(MBSTRG(current_internal_encoding));
mbfl_string_init(&haystack);
mbfl_string_init(&needle);
- haystack.no_language = MBSTRG(current_language);
+ haystack.no_language = MBSTRG(language);
haystack.no_encoding = MBSTRG(current_internal_encoding);
- needle.no_language = MBSTRG(current_language);
+ needle.no_language = MBSTRG(language);
needle.no_encoding = MBSTRG(current_internal_encoding);
@@ -1937,7 +1976,7 @@ PHP_FUNCTION(mb_stristr)
}
if(!needle.len){
- php_error_docref(NULL TSRMLS_CC, E_WARNING,"Empty delimiter.");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter");
RETURN_FALSE;
}
@@ -1947,7 +1986,7 @@ PHP_FUNCTION(mb_stristr)
RETURN_FALSE;
}
- n = php_mb_stripos(0, haystack.val, haystack.len, needle.val, needle.len, 0, from_encoding TSRMLS_CC);
+ n = php_mb_stripos(0, haystack.val, haystack.len, needle.val, needle.len, 0, from_encoding TSRMLS_CC);
if (n <0) {
RETURN_FALSE;
@@ -1984,9 +2023,9 @@ PHP_FUNCTION(mb_strrichr)
char *from_encoding = (char*)mbfl_no2preferred_mime_name(MBSTRG(current_internal_encoding));
mbfl_string_init(&haystack);
mbfl_string_init(&needle);
- haystack.no_language = MBSTRG(current_language);
+ haystack.no_language = MBSTRG(language);
haystack.no_encoding = MBSTRG(current_internal_encoding);
- needle.no_language = MBSTRG(current_language);
+ needle.no_language = MBSTRG(language);
needle.no_encoding = MBSTRG(current_internal_encoding);
@@ -2038,9 +2077,9 @@ PHP_FUNCTION(mb_substr_count)
mbfl_string_init(&haystack);
mbfl_string_init(&needle);
- haystack.no_language = MBSTRG(current_language);
+ haystack.no_language = MBSTRG(language);
haystack.no_encoding = MBSTRG(current_internal_encoding);
- needle.no_language = MBSTRG(current_language);
+ needle.no_language = MBSTRG(language);
needle.no_encoding = MBSTRG(current_internal_encoding);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name, &enc_name_len) == FAILURE) {
@@ -2056,7 +2095,7 @@ PHP_FUNCTION(mb_substr_count)
}
if (needle.len <= 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING,"Empty substring.");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty substring");
RETURN_FALSE;
}
@@ -2078,7 +2117,7 @@ PHP_FUNCTION(mb_substr)
mbfl_string string, result, *ret;
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.no_encoding = MBSTRG(current_internal_encoding);
argc = ZEND_NUM_ARGS();
@@ -2170,7 +2209,7 @@ PHP_FUNCTION(mb_strcut)
mbfl_string string, result, *ret;
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.no_encoding = MBSTRG(current_internal_encoding);
argc = ZEND_NUM_ARGS();
@@ -2260,7 +2299,7 @@ PHP_FUNCTION(mb_strwidth)
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.no_encoding = MBSTRG(current_internal_encoding);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", (char **)&string.val, &string.len, &enc_name, &enc_name_len) == FAILURE) {
@@ -2294,9 +2333,9 @@ PHP_FUNCTION(mb_strimwidth)
mbfl_string_init(&string);
mbfl_string_init(&marker);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.no_encoding = MBSTRG(current_internal_encoding);
- marker.no_language = MBSTRG(current_language);
+ marker.no_language = MBSTRG(language);
marker.no_encoding = MBSTRG(current_internal_encoding);
marker.val = NULL;
marker.len = 0;
@@ -2392,7 +2431,7 @@ MBSTRING_API char * php_mb_convert_encoding(char *input, size_t length, char *_t
mbfl_string_init(&result);
from_encoding = MBSTRG(current_internal_encoding);
string.no_encoding = from_encoding;
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.val = (unsigned char *)input;
string.len = length;
@@ -2626,6 +2665,7 @@ PHP_FUNCTION(mb_detect_encoding)
if (!php_mb_parse_encoding_array(*arg_list, &list, &size, 0 TSRMLS_CC)) {
if (list) {
efree(list);
+ list = NULL;
size = 0;
}
}
@@ -2635,6 +2675,7 @@ PHP_FUNCTION(mb_detect_encoding)
if (!php_mb_parse_encoding_list(Z_STRVAL_PP(arg_list), Z_STRLEN_PP(arg_list), &list, &size, 0 TSRMLS_CC)) {
if (list) {
efree(list);
+ list = NULL;
size = 0;
}
}
@@ -2662,7 +2703,7 @@ PHP_FUNCTION(mb_detect_encoding)
convert_to_string_ex(arg_str);
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.val = (unsigned char *)Z_STRVAL_PP(arg_str);
string.len = Z_STRLEN_PP(arg_str);
ret = mbfl_identify_encoding_name(&string, elist, size, strict);
@@ -2694,122 +2735,6 @@ PHP_FUNCTION(mb_list_encodings)
}
/* }}} */
-/* {{{ proto array mb_list_encodings_alias_names([string encoding])
- Returns an array of all supported alias encodings */
-PHP_FUNCTION(mb_list_encodings_alias_names)
-{
- const mbfl_encoding **encodings;
- const mbfl_encoding *encoding;
- enum mbfl_no_encoding no_encoding;
- int i, j;
- zval *row;
- char *name = NULL;
- int name_len;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, &name_len) == FAILURE) {
- RETURN_FALSE;
- }
-
- if (name == NULL) {
- array_init(return_value);
- i = 0;
- encodings = mbfl_get_supported_encodings();
- while ((encoding = encodings[i++]) != NULL) {
- MAKE_STD_ZVAL(row);
- array_init(row);
- if (encoding->aliases != NULL) {
- j = 0;
- while ((*encoding->aliases)[j] != NULL) {
- add_next_index_string(row, (char *)(*encoding->aliases)[j], 1);
- j++;
- }
- }
- add_assoc_zval(return_value, (char *) encoding->name, row);
- }
- } else {
- no_encoding = mbfl_name2no_encoding(name);
- if (no_encoding == mbfl_no_encoding_invalid) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", name);
- RETURN_FALSE;
- }
-
- name = (char *)mbfl_no_encoding2name(no_encoding);
- if (name != NULL) {
- i = 0;
- encodings = mbfl_get_supported_encodings();
- while ((encoding = encodings[i++]) != NULL) {
- if (strcmp(encoding->name, name) != 0){ continue; }
-
- array_init(return_value);
- if (encoding->aliases != NULL) {
- j = 0;
- while ((*encoding->aliases)[j] != NULL) {
- add_next_index_string(return_value, (char *)(*encoding->aliases)[j], 1);
- j++;
- }
- }
-
- break;
- }
- } else {
- RETURN_FALSE;
- }
- }
-}
-/* }}} */
-
-/* {{{ proto mixed mb_list_mime_names([string encoding])
- Returns an array or string of all supported mime names */
-PHP_FUNCTION(mb_list_mime_names)
-{
- const mbfl_encoding **encodings;
- const mbfl_encoding *encoding;
- enum mbfl_no_encoding no_encoding;
- int i;
- char *name = NULL;
- int name_len;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, &name_len) == FAILURE) {
- RETURN_FALSE;
- }
-
- if (name == NULL) {
- array_init(return_value);
- i = 0;
- encodings = mbfl_get_supported_encodings();
- while ((encoding = encodings[i++]) != NULL) {
- if(encoding->mime_name != NULL) {
- add_assoc_string(return_value, (char *) encoding->name, (char *) encoding->mime_name, 1);
- } else{
- add_assoc_string(return_value, (char *) encoding->name, "", 1);
- }
- }
- } else {
- no_encoding = mbfl_name2no_encoding(name);
- if (no_encoding == mbfl_no_encoding_invalid) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", name);
- RETURN_FALSE;
- }
-
- name = (char *)mbfl_no_encoding2name(no_encoding);
- if (name != NULL) {
- i = 0;
- encodings = mbfl_get_supported_encodings();
- while ((encoding = encodings[i++]) != NULL) {
- if (strcmp(encoding->name, name) != 0){ continue; }
- if(encoding->mime_name != NULL) {
- RETURN_STRING((char *) encoding->mime_name, 1);
- }
- break;
- }
- RETURN_STRING("", 1);
- } else {
- RETURN_FALSE;
- }
- }
-}
-/* }}} */
-
/* {{{ proto string mb_encode_mimeheader(string str [, string charset [, string transfer-encoding [, string linefeed [, int indent]]]])
Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?= */
PHP_FUNCTION(mb_encode_mimeheader)
@@ -2825,7 +2750,7 @@ PHP_FUNCTION(mb_encode_mimeheader)
long indent = 0;
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.no_encoding = MBSTRG(current_internal_encoding);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sssl", (char **)&string.val, &string.len, &charset_name, &charset_name_len, &trans_enc_name, &trans_enc_name_len, &linefeed, &linefeed_len, &indent) == FAILURE) {
@@ -2842,7 +2767,7 @@ PHP_FUNCTION(mb_encode_mimeheader)
RETURN_FALSE;
}
} else {
- const mbfl_language *lang = mbfl_no2language(MBSTRG(current_language));
+ const mbfl_language *lang = mbfl_no2language(MBSTRG(language));
if (lang != NULL) {
charset = lang->mail_charset;
transenc = lang->mail_header_encoding;
@@ -2874,7 +2799,7 @@ PHP_FUNCTION(mb_decode_mimeheader)
mbfl_string string, result, *ret;
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.no_encoding = MBSTRG(current_internal_encoding);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", (char **)&string.val, &string.len) == FAILURE) {
@@ -2903,7 +2828,7 @@ PHP_FUNCTION(mb_convert_kana)
int encname_len;
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.no_encoding = MBSTRG(current_internal_encoding);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ss", (char **)&string.val, &string.len, &optstr, &optstr_len, &encname, &encname_len) == FAILURE) {
@@ -3035,7 +2960,7 @@ PHP_FUNCTION(mb_convert_variables)
mbfl_string_init(&result);
from_encoding = MBSTRG(current_internal_encoding);
string.no_encoding = from_encoding;
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
/* pre-conversion encoding */
elist = NULL;
@@ -3239,7 +3164,7 @@ php_mb_numericentity_exec(INTERNAL_FUNCTION_PARAMETERS, int type)
convert_to_string_ex(arg1);
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.no_encoding = MBSTRG(current_internal_encoding);
string.val = (unsigned char *)Z_STRVAL_PP(arg1);
string.len = Z_STRLEN_PP(arg1);
@@ -3578,7 +3503,7 @@ PHP_FUNCTION(mb_send_mail)
tran_cs = mbfl_no_encoding_utf8;
head_enc = mbfl_no_encoding_base64;
body_enc = mbfl_no_encoding_base64;
- lang = mbfl_no2language(MBSTRG(current_language));
+ lang = mbfl_no2language(MBSTRG(language));
if (lang != NULL) {
tran_cs = lang->mail_charset;
head_enc = lang->mail_header_encoding;
@@ -3627,7 +3552,7 @@ PHP_FUNCTION(mb_send_mail)
if (strcasecmp(param_name, "charset") == 0) {
enum mbfl_no_encoding _tran_cs = tran_cs;
- charset = php_strtok_r(NULL, "= ", &tmp);
+ charset = php_strtok_r(NULL, "= \"", &tmp);
if (charset != NULL) {
_tran_cs = mbfl_name2no_encoding(charset);
}
@@ -3696,7 +3621,7 @@ PHP_FUNCTION(mb_send_mail)
/* Subject: */
if (subject != NULL && subject_len >= 0) {
- orig_str.no_language = MBSTRG(current_language);
+ orig_str.no_language = MBSTRG(language);
orig_str.val = (unsigned char *)subject;
orig_str.len = subject_len;
orig_str.no_encoding = MBSTRG(current_internal_encoding);
@@ -3715,7 +3640,7 @@ PHP_FUNCTION(mb_send_mail)
/* message body */
if (message != NULL) {
- orig_str.no_language = MBSTRG(current_language);
+ orig_str.no_language = MBSTRG(language);
orig_str.val = message;
orig_str.len = message_len;
orig_str.no_encoding = MBSTRG(current_internal_encoding);
@@ -3832,7 +3757,7 @@ PHP_FUNCTION(mb_get_info)
char *name;
const struct mb_overload_def *over_func;
zval *row1, *row2;
- const mbfl_language *lang = mbfl_no2language(MBSTRG(current_language));
+ const mbfl_language *lang = mbfl_no2language(MBSTRG(language));
enum mbfl_no_encoding *entry;
#ifdef ZEND_MULTIBYTE
zval *row3;
@@ -3885,7 +3810,7 @@ PHP_FUNCTION(mb_get_info)
} else {
add_assoc_string(return_value, "encoding_translation", "Off", 1);
}
- if ((name = (char *)mbfl_no_language2name(MBSTRG(current_language))) != NULL) {
+ if ((name = (char *)mbfl_no_language2name(MBSTRG(language))) != NULL) {
add_assoc_string(return_value, "language", name, 1);
}
n = MBSTRG(current_detect_order_list_size);
@@ -3980,7 +3905,7 @@ PHP_FUNCTION(mb_get_info)
RETVAL_STRING("Off", 1);
}
} else if (!strcasecmp("language", typ)) {
- if ((name = (char *)mbfl_no_language2name(MBSTRG(current_language))) != NULL) {
+ if ((name = (char *)mbfl_no_language2name(MBSTRG(language))) != NULL) {
RETVAL_STRING(name, 1);
}
} else if (!strcasecmp("detect_order", typ)) {
@@ -4071,14 +3996,12 @@ PHP_FUNCTION(mb_check_encoding)
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create converter");
RETURN_FALSE;
}
- mbfl_buffer_converter_illegal_mode(convd, MBSTRG(current_filter_illegal_mode));
- mbfl_buffer_converter_illegal_substchar(convd, MBSTRG(current_filter_illegal_substchar));
+ mbfl_buffer_converter_illegal_mode(convd, MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE);
+ mbfl_buffer_converter_illegal_substchar(convd, 0);
/* initialize string */
- mbfl_string_init(&string);
+ mbfl_string_init_set(&string, mbfl_no_language_neutral, no_encoding);
mbfl_string_init(&result);
- string.no_encoding = no_encoding;
- string.no_language = MBSTRG(current_language);
string.val = (unsigned char *)var;
string.len = var_len;
@@ -4086,18 +4009,13 @@ PHP_FUNCTION(mb_check_encoding)
illegalchars = mbfl_buffer_illegalchars(convd);
mbfl_buffer_converter_delete(convd);
- if (ret != NULL) {
- MBSTRG(illegalchars) += illegalchars;
- if (illegalchars == 0 && strncmp(string.val, ret->val, string.len) == 0) {
- efree(ret->val);
- RETURN_TRUE;
- } else {
- efree(ret->val);
- RETURN_FALSE;
- }
- } else {
- RETURN_FALSE;
- }
+ RETVAL_FALSE;
+ if (ret != NULL) {
+ if (illegalchars == 0 && string.len == result.len && memcmp(string.val, result.val, string.len) == 0) {
+ RETVAL_TRUE;
+ }
+ mbfl_string_clear(&result);
+ }
}
/* }}} */
@@ -4240,7 +4158,7 @@ MBSTRING_API int php_mb_gpc_encoding_converter(char **str, int *len, int num, co
mbfl_string_init(&string);
mbfl_string_init(&result);
string.no_encoding = from_encoding;
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
for (i=0; i<num; i++){
string.val = (char*)str[i];
@@ -4321,7 +4239,7 @@ MBSTRING_API int php_mb_gpc_encoding_detector(char **arg_string, int *arg_length
}
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
identd = mbfl_encoding_detector_new(elist, size, MBSTRG(strict_detection));
@@ -4359,9 +4277,9 @@ MBSTRING_API int php_mb_stripos(int mode, char *old_haystack, int old_haystack_l
mbfl_string_init(&haystack);
mbfl_string_init(&needle);
- haystack.no_language = MBSTRG(current_language);
+ haystack.no_language = MBSTRG(language);
haystack.no_encoding = MBSTRG(current_internal_encoding);
- needle.no_language = MBSTRG(current_language);
+ needle.no_language = MBSTRG(language);
needle.no_encoding = MBSTRG(current_internal_encoding);
do {
@@ -4391,9 +4309,21 @@ MBSTRING_API int php_mb_stripos(int mode, char *old_haystack, int old_haystack_l
break;
}
- if (offset < 0 || (unsigned long)offset > haystack.len) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset not contained in string.");
- break;
+ {
+ int haystack_char_len = mbfl_strlen(&haystack);
+
+ if (mode) {
+ if ((offset > 0 && offset > haystack_char_len) ||
+ (offset < 0 && -offset > haystack_char_len)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset is greater than the length of haystack string");
+ break;
+ }
+ } else {
+ if (offset < 0 || offset > haystack_char_len) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset not contained in string");
+ break;
+ }
+ }
}
n = mbfl_strpos(&haystack, &needle, offset, mode);
@@ -4407,7 +4337,7 @@ MBSTRING_API int php_mb_stripos(int mode, char *old_haystack, int old_haystack_l
efree(needle.val);
}
- return n;
+ return n;
}
/* }}} */
@@ -4487,7 +4417,7 @@ char* php_mb_encoding_detector(const char *arg_string, int arg_length, char *arg
}
mbfl_string_init(&string);
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.val = (char*)arg_string;
string.len = arg_length;
ret = mbfl_identify_encoding_name(&string, elist, size, 0);
@@ -4525,7 +4455,7 @@ int php_mb_encoding_converter(char **to, int *to_length, const char *from,
mbfl_string_init(&string);
mbfl_string_init(&result);
string.no_encoding = from_encoding;
- string.no_language = MBSTRG(current_language);
+ string.no_language = MBSTRG(language);
string.val = (char*)from;
string.len = from_length;
@@ -4560,7 +4490,7 @@ int php_mb_oddlen(const char *string, int length, const char *encoding TSRMLS_DC
mbfl_string mb_string;
mbfl_string_init(&mb_string);
- mb_string.no_language = MBSTRG(current_language);
+ mb_string.no_language = MBSTRG(language);
mb_string.no_encoding = mbfl_name2no_encoding(encoding);
mb_string.val = (char*)string;
mb_string.len = length;
diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h
index 02765d17f..6585f176d 100644
--- a/ext/mbstring/mbstring.h
+++ b/ext/mbstring/mbstring.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2008 The PHP Group |
+ | Copyright (c) 1997-2009 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: mbstring.h,v 1.66.2.4.2.6 2007/12/31 07:20:07 sebastian Exp $ */
+/* $Id: mbstring.h,v 1.66.2.4.2.9 2008/12/31 11:17:39 sebastian Exp $ */
/*
* PHP 4 Multibyte String module "mbstring" (currently only for Japanese)
@@ -118,8 +118,6 @@ PHP_FUNCTION(mb_strimwidth);
PHP_FUNCTION(mb_convert_encoding);
PHP_FUNCTION(mb_detect_encoding);
PHP_FUNCTION(mb_list_encodings);
-PHP_FUNCTION(mb_list_encodings_alias_names);
-PHP_FUNCTION(mb_list_mime_names);
PHP_FUNCTION(mb_convert_kana);
PHP_FUNCTION(mb_encode_mimeheader);
PHP_FUNCTION(mb_decode_mimeheader);
@@ -163,7 +161,6 @@ MBSTRING_API int php_mb_stripos(int mode, char *old_haystack, int old_haystack_l
ZEND_BEGIN_MODULE_GLOBALS(mbstring)
enum mbfl_no_language language;
- enum mbfl_no_language current_language;
enum mbfl_no_encoding internal_encoding;
enum mbfl_no_encoding current_internal_encoding;
#ifdef ZEND_MULTIBYTE
diff --git a/ext/mbstring/oniguruma/enc/utf16_be.c b/ext/mbstring/oniguruma/enc/utf16_be.c
index 536d107d6..33b520a23 100755
--- a/ext/mbstring/oniguruma/enc/utf16_be.c
+++ b/ext/mbstring/oniguruma/enc/utf16_be.c
@@ -2,7 +2,7 @@
utf16_be.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/enc/utf16_le.c b/ext/mbstring/oniguruma/enc/utf16_le.c
index cefcb60ad..94fa8c3a7 100755
--- a/ext/mbstring/oniguruma/enc/utf16_le.c
+++ b/ext/mbstring/oniguruma/enc/utf16_le.c
@@ -2,7 +2,7 @@
utf16_le.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/enc/utf32_be.c b/ext/mbstring/oniguruma/enc/utf32_be.c
index c1f066897..1ed127087 100755
--- a/ext/mbstring/oniguruma/enc/utf32_be.c
+++ b/ext/mbstring/oniguruma/enc/utf32_be.c
@@ -2,7 +2,7 @@
utf32_be.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/enc/utf32_le.c b/ext/mbstring/oniguruma/enc/utf32_le.c
index c10cbfa77..13fcd65d9 100755
--- a/ext/mbstring/oniguruma/enc/utf32_le.c
+++ b/ext/mbstring/oniguruma/enc/utf32_le.c
@@ -2,7 +2,7 @@
utf32_le.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/enc/utf8.c b/ext/mbstring/oniguruma/enc/utf8.c
index 42ce807f9..ec3e5f76b 100644
--- a/ext/mbstring/oniguruma/enc/utf8.c
+++ b/ext/mbstring/oniguruma/enc/utf8.c
@@ -2,7 +2,7 @@
utf8.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/oniguruma.h b/ext/mbstring/oniguruma/oniguruma.h
index 5fb6ec154..154ec5d74 100644
--- a/ext/mbstring/oniguruma/oniguruma.h
+++ b/ext/mbstring/oniguruma/oniguruma.h
@@ -4,7 +4,7 @@
oniguruma.h - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regcomp.c b/ext/mbstring/oniguruma/regcomp.c
index a679a20b2..726f4b531 100644
--- a/ext/mbstring/oniguruma/regcomp.c
+++ b/ext/mbstring/oniguruma/regcomp.c
@@ -2,7 +2,7 @@
regcomp.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regenc.h b/ext/mbstring/oniguruma/regenc.h
index 833dd2af4..c4ad678ca 100644
--- a/ext/mbstring/oniguruma/regenc.h
+++ b/ext/mbstring/oniguruma/regenc.h
@@ -4,7 +4,7 @@
regenc.h - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regerror.c b/ext/mbstring/oniguruma/regerror.c
index 46dc6ae15..f0db90bb2 100644
--- a/ext/mbstring/oniguruma/regerror.c
+++ b/ext/mbstring/oniguruma/regerror.c
@@ -2,7 +2,7 @@
regerror.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regexec.c b/ext/mbstring/oniguruma/regexec.c
index a1685c8c6..e34c8ea36 100644
--- a/ext/mbstring/oniguruma/regexec.c
+++ b/ext/mbstring/oniguruma/regexec.c
@@ -2,7 +2,7 @@
regexec.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regext.c b/ext/mbstring/oniguruma/regext.c
index 1586012b8..e9ddbdabd 100755
--- a/ext/mbstring/oniguruma/regext.c
+++ b/ext/mbstring/oniguruma/regext.c
@@ -2,7 +2,7 @@
regext.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/reggnu.c b/ext/mbstring/oniguruma/reggnu.c
index fdc7974ae..449b09709 100644
--- a/ext/mbstring/oniguruma/reggnu.c
+++ b/ext/mbstring/oniguruma/reggnu.c
@@ -2,7 +2,7 @@
reggnu.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regint.h b/ext/mbstring/oniguruma/regint.h
index 4eff34c3b..cd238bb51 100644
--- a/ext/mbstring/oniguruma/regint.h
+++ b/ext/mbstring/oniguruma/regint.h
@@ -4,7 +4,7 @@
regint.h - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regparse.c b/ext/mbstring/oniguruma/regparse.c
index 26fc35b11..1f87b2d09 100644
--- a/ext/mbstring/oniguruma/regparse.c
+++ b/ext/mbstring/oniguruma/regparse.c
@@ -2,7 +2,7 @@
regparse.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regparse.h b/ext/mbstring/oniguruma/regparse.h
index c0cdded7b..62e9326e9 100644
--- a/ext/mbstring/oniguruma/regparse.h
+++ b/ext/mbstring/oniguruma/regparse.h
@@ -4,7 +4,7 @@
regparse.h - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regposix.c b/ext/mbstring/oniguruma/regposix.c
index 23ae95693..2362657d3 100644
--- a/ext/mbstring/oniguruma/regposix.c
+++ b/ext/mbstring/oniguruma/regposix.c
@@ -2,7 +2,7 @@
regposix.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regsyntax.c b/ext/mbstring/oniguruma/regsyntax.c
index 542e599c8..54e320a6a 100644
--- a/ext/mbstring/oniguruma/regsyntax.c
+++ b/ext/mbstring/oniguruma/regsyntax.c
@@ -2,7 +2,7 @@
regsyntax.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/ext/mbstring/oniguruma/regversion.c b/ext/mbstring/oniguruma/regversion.c
index cbebdb026..c430bc5c4 100644
--- a/ext/mbstring/oniguruma/regversion.c
+++ b/ext/mbstring/oniguruma/regversion.c
@@ -2,7 +2,7 @@
regversion.c - Oniguruma (regular expression library)
**********************************************************************/
/*-
- * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -47,7 +47,7 @@ onig_copyright(void)
{
static char s[58];
- sprintf(s, "Oniguruma %d.%d.%d : Copyright (C) 2002-2008 K.Kosako",
+ sprintf(s, "Oniguruma %d.%d.%d : Copyright (C) 2002-2009 K.Kosako",
ONIGURUMA_VERSION_MAJOR,
ONIGURUMA_VERSION_MINOR,
ONIGURUMA_VERSION_TEENY);
diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c
index be4921edd..4c61f13db 100644
--- a/ext/mbstring/php_mbregex.c
+++ b/ext/mbstring/php_mbregex.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2008 The PHP Group |
+ | Copyright (c) 1997-2009 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_mbregex.c,v 1.53.2.1.2.7 2008/02/17 02:04:12 hirokawa Exp $ */
+/* $Id: php_mbregex.c,v 1.53.2.1.2.9 2008/12/31 11:17:39 sebastian Exp $ */
#ifdef HAVE_CONFIG_H
@@ -66,6 +66,7 @@ void _php_mb_regex_globals_dtor(zend_mbstring_globals *pglobals TSRMLS_DC)
/* {{{ PHP_MINIT_FUNCTION(mb_regex) */
PHP_MINIT_FUNCTION(mb_regex)
{
+ onig_init();
return SUCCESS;
}
/* }}} */
@@ -73,6 +74,7 @@ PHP_MINIT_FUNCTION(mb_regex)
/* {{{ PHP_MSHUTDOWN_FUNCTION(mb_regex) */
PHP_MSHUTDOWN_FUNCTION(mb_regex)
{
+ onig_end();
return SUCCESS;
}
/* }}} */
diff --git a/ext/mbstring/php_mbregex.h b/ext/mbstring/php_mbregex.h
index e583b0063..11d4d8ba0 100644
--- a/ext/mbstring/php_mbregex.h
+++ b/ext/mbstring/php_mbregex.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2008 The PHP Group |
+ | Copyright (c) 1997-2009 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_mbregex.h,v 1.12.2.1.2.2 2007/12/31 07:20:07 sebastian Exp $ */
+/* $Id: php_mbregex.h,v 1.12.2.1.2.3 2008/12/31 11:17:39 sebastian Exp $ */
#ifndef _PHP_MBREGEX_H
#define _PHP_MBREGEX_H
diff --git a/ext/mbstring/php_unicode.c b/ext/mbstring/php_unicode.c
index d90cabb84..ee22f4c9a 100644
--- a/ext/mbstring/php_unicode.c
+++ b/ext/mbstring/php_unicode.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2008 The PHP Group |
+ | Copyright (c) 1997-2009 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -308,7 +308,7 @@ MBSTRING_API char *php_unicode_convert_case(int case_mode, char *srcstr, size_t
for (i = 0; i < unicode_len; i+=4) {
int res = php_unicode_is_prop(
BE_ARY_TO_UINT32(&unicode_ptr[i]),
- UC_MN|UC_ME|UC_CF|UC_LM|UC_SK|UC_LU|UC_LL|UC_LT, 0);
+ UC_MN|UC_ME|UC_CF|UC_LM|UC_SK|UC_LU|UC_LL|UC_LT|UC_PO|UC_OS, 0);
if (mode) {
if (res) {
UINT32_TO_BE_ARY(&unicode_ptr[i],
diff --git a/ext/mbstring/php_unicode.h b/ext/mbstring/php_unicode.h
index 1bbc77830..3df050009 100644
--- a/ext/mbstring/php_unicode.h
+++ b/ext/mbstring/php_unicode.h
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2008 The PHP Group |
+ | Copyright (c) 1997-2009 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
diff --git a/ext/mbstring/tests/bug43840.phpt b/ext/mbstring/tests/bug43840.phpt
new file mode 100644
index 000000000..626cd70f8
--- /dev/null
+++ b/ext/mbstring/tests/bug43840.phpt
@@ -0,0 +1,75 @@
+--TEST--
+Test mb_strpos() function : mb_strpos bounds check is byte count rather than a character count
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * mb_strpos bounds check is byte count rather than a character count:
+ * The multibyte string should be returning the same results as the ASCII string.
+ * Multibyte string was not returning error message until offset was passed the
+ * byte count of the string. Should return error message when passed character count.
+ */
+
+$offsets = array(20, 21, 22, 53, 54);
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+$needle = base64_decode('44CC');
+
+foreach($offsets as $i) {
+ echo "\n-- Offset is $i --\n";
+ echo "--Multibyte String:--\n";
+ var_dump( mb_strpos($string_mb, $needle, $i, 'UTF-8') );
+ echo"--ASCII String:--\n";
+ var_dump(mb_strpos(b'This is na English ta', b'a', $i));
+}
+?>
+--EXPECTF--
+-- Offset is 20 --
+--Multibyte String:--
+int(20)
+--ASCII String:--
+int(20)
+
+-- Offset is 21 --
+--Multibyte String:--
+bool(false)
+--ASCII String:--
+bool(false)
+
+-- Offset is 22 --
+--Multibyte String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--ASCII String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Offset is 53 --
+--Multibyte String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--ASCII String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Offset is 54 --
+--Multibyte String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--ASCII String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
diff --git a/ext/mbstring/tests/bug43841.phpt b/ext/mbstring/tests/bug43841.phpt
new file mode 100644
index 000000000..9f2583286
--- /dev/null
+++ b/ext/mbstring/tests/bug43841.phpt
@@ -0,0 +1,85 @@
+--TEST--
+Test mb_strrpos() function : mb_strrpos offset is byte count for negative values
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strrpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of last occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test that mb_strrpos offset is byte count for negative values (should be character count)
+ */
+
+$offsets = array(-25, -24, -13, -12);
+$string_mb =
+base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvv
+JfvvJjvvJnjgII=');
+$needle = base64_decode('44CC');
+
+foreach ($offsets as $i) {
+ echo "\n-- Offset is $i --\n";
+ echo "Multibyte String:\n";
+ var_dump( mb_strrpos($string_mb, $needle, $i, 'UTF-8') );
+ echo "ASCII String:\n";
+ echo "mb_strrpos:\n";
+ var_dump(mb_strrpos(b'This is na English ta', b'a', $i));
+ echo "strrpos:\n";
+ var_dump(strrpos(b'This is na English ta', b'a', $i));
+}
+?>
+
+--EXPECTF--
+
+-- Offset is -25 --
+Multibyte String:
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+ASCII String:
+mb_strrpos:
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+strrpos:
+
+Warning: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Offset is -24 --
+Multibyte String:
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+ASCII String:
+mb_strrpos:
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+strrpos:
+
+Warning: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Offset is -13 --
+Multibyte String:
+bool(false)
+ASCII String:
+mb_strrpos:
+bool(false)
+strrpos:
+bool(false)
+
+-- Offset is -12 --
+Multibyte String:
+int(9)
+ASCII String:
+mb_strrpos:
+int(9)
+strrpos:
+int(9)
diff --git a/ext/mbstring/tests/bug43993.phpt b/ext/mbstring/tests/bug43993.phpt
new file mode 100644
index 000000000..662045d3a
--- /dev/null
+++ b/ext/mbstring/tests/bug43993.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug #43993 (mb_substr_count() behaves differently to substr_count() with overlapping needles)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+var_dump(mb_substr_count("abcabcabca", "abcabc"));
+var_dump(mb_substr_count("abcabcabca", "abc"));
+var_dump(mb_substr_count("abcabcabca", "cab"));
+var_dump(mb_substr_count("abcabcabca", "bca"));
+var_dump(mb_substr_count("ababababab", "ba"));
+var_dump(mb_substr_count("ababababab", "ab"));
+var_dump(mb_substr_count("ababababab", "bc"));
+var_dump(mb_substr_count("aaaaaaaaaa", "a"));
+var_dump(mb_substr_count("aaaaaaaaaa", "b"));
+?>
+--EXPECT--
+int(1)
+int(3)
+int(2)
+int(3)
+int(4)
+int(5)
+int(0)
+int(10)
+int(0)
diff --git a/ext/mbstring/tests/bug43994.phpt b/ext/mbstring/tests/bug43994.phpt
new file mode 100644
index 000000000..39a39f642
--- /dev/null
+++ b/ext/mbstring/tests/bug43994.phpt
@@ -0,0 +1,129 @@
+--TEST--
+Test mb_ereg() function : mb_ereg 'successfully' matching incorrectly
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * mb_ereg 'successfully' matching incorrectly:
+ * Bug now seems to be fixed - error message is now generated when an 'empty'
+ * pattern is supplied to mb_ereg. Similar error message to ereg().
+ */
+
+$unset_var = 10;
+unset ($unset_var);
+$inputs = array(NULL, null, false, FALSE, "", '', @$undefined_var,
+@$unset_var);
+
+$iterator = 1;
+foreach($inputs as $input) {
+ if(@is_array($mb_regs)){
+ $mb_regs = '';
+ }
+ echo "\n-- Iteration $iterator --\n";
+ echo "Without \$regs arg:\n";
+ var_dump( mb_ereg($input, 'hello, world') );
+ echo "With \$regs arg:\n";
+ var_dump(mb_ereg($input, 'hello, world', $mb_regs));
+ var_dump($mb_regs);
+ $iterator++;
+};
+?>
+
+--EXPECTF----
+
+-- Iteration 1 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 2 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 3 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 4 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 5 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 6 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 7 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 8 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
diff --git a/ext/mbstring/tests/bug43998.phpt b/ext/mbstring/tests/bug43998.phpt
new file mode 100644
index 000000000..da5e599da
--- /dev/null
+++ b/ext/mbstring/tests/bug43998.phpt
@@ -0,0 +1,71 @@
+--TEST--
+Test mb_strtolower() function : Two error messages returned for incorrect encoding for mb_strto[upper|lower]
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtolower') or die("skip mb_strtolower() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strto[lower|upper](string $sourcestring [, string $encoding])
+ * Description: Returns a [lower|upper]cased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Two error messages returned for incorrect encoding for mb_strto[upper|lower]
+ * Bug now appears to be fixed
+ */
+
+$sourcestring = 'Hello, World';
+
+$inputs = array(12345, 12.3456789000E-10, true, false, "");
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strtolower($sourcestring, $input) );
+ var_dump( mb_strtoupper($sourcestring, $input) );
+ $iterator++;
+};
+?>
+--EXPECTF--
+
+-- Iteration 1 --
+
+Warning: mb_strtolower(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+Warning: mb_strtoupper(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_strtolower(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+Warning: mb_strtoupper(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_strtolower(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+Warning: mb_strtoupper(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
+bool(false)
+
+Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
+bool(false)
+
+Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
+bool(false)
diff --git a/ext/mbstring/tests/bug45239.phpt b/ext/mbstring/tests/bug45239.phpt
new file mode 100644
index 000000000..8d8ef4831
--- /dev/null
+++ b/ext/mbstring/tests/bug45239.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #45239 (encoding detector hangs with mbstring.strict_detection enabled)
+--INI--
+mbstring.strict_detection=1
+mbstring.http_input=UTF-8
+mbstring.internal_encoding=UTF-8
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+?>
+--FILE--
+<?php
+mb_internal_encoding("utf-8");
+mb_parse_str("a=%fc", $dummy);
+var_dump(mb_http_input());
+?>
+--EXPECT--
+string(5) "UTF-8"
diff --git a/ext/mbstring/tests/bug45722.phpt b/ext/mbstring/tests/bug45722.phpt
new file mode 100644
index 000000000..c05a010a8
--- /dev/null
+++ b/ext/mbstring/tests/bug45722.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Bug #45722 (mb_check_encoding() crashes)
+--FILE--
+<?php
+var_dump(mb_check_encoding("&\xc2\xb7 TEST TEST TEST TEST TEST TEST", "HTML-ENTITIES"));
+?>
+--EXPECT--
+bool(false)
diff --git a/ext/mbstring/tests/bug45923.phpt b/ext/mbstring/tests/bug45923.phpt
new file mode 100644
index 000000000..2d184ab01
--- /dev/null
+++ b/ext/mbstring/tests/bug45923.phpt
@@ -0,0 +1,202 @@
+--TEST--
+Bug #45923 (mb_st[r]ripos() offset not handled correctly)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+var_dump(strpos("abc abc abc", "abc", 0));
+var_dump(strpos("abc abc abc", "abc", 3));
+var_dump(strpos("abc abc abc", "abc", 6));
+var_dump(strpos("abc abc abc", "abc", 9));
+var_dump(strpos("abc abc abc", "abc", 11));
+var_dump(strpos("abc abc abc", "abc", 12));
+var_dump(strpos("abc abc abc", "abc", -1));
+var_dump(strpos("abc abc abc", "abc", -3));
+var_dump(strpos("abc abc abc", "abc", -6));
+
+var_dump(mb_strpos(" ", "", 0));
+var_dump(mb_strpos(" ", "", 3));
+var_dump(mb_strpos(" ", "", 6));
+var_dump(mb_strpos(" ", "", 9));
+var_dump(mb_strpos(" ", "", 11));
+var_dump(mb_strpos(" ", "", 12));
+var_dump(mb_strpos(" ", "", -1));
+var_dump(mb_strpos(" ", "", -3));
+var_dump(mb_strpos(" ", "", -6));
+
+var_dump(stripos("abc abc abc", "abc", 0));
+var_dump(stripos("abc abc abc", "abc", 3));
+var_dump(stripos("abc abc abc", "abc", 6));
+var_dump(stripos("abc abc abc", "abc", 9));
+var_dump(stripos("abc abc abc", "abc", 11));
+var_dump(stripos("abc abc abc", "abc", 12));
+var_dump(stripos("abc abc abc", "abc", -1));
+var_dump(stripos("abc abc abc", "abc", -3));
+var_dump(stripos("abc abc abc", "abc", -6));
+
+var_dump(mb_stripos(" ", "", 0));
+var_dump(mb_stripos(" ", "", 3));
+var_dump(mb_stripos(" ", "", 6));
+var_dump(mb_stripos(" ", "", 9));
+var_dump(mb_stripos(" ", "", 11));
+var_dump(mb_stripos(" ", "", 12));
+var_dump(mb_stripos(" ", "", -1));
+var_dump(mb_stripos(" ", "", -3));
+var_dump(mb_stripos(" ", "", -6));
+
+var_dump(strrpos("abc abc abc", "abc", 0));
+var_dump(strrpos("abc abc abc", "abc", 3));
+var_dump(strrpos("abc abc abc", "abc", 6));
+var_dump(strrpos("abc abc abc", "abc", 9));
+var_dump(strrpos("abc abc abc", "abc", 11));
+var_dump(strrpos("abc abc abc", "abc", 12));
+var_dump(strrpos("abc abc abc", "abc", -1));
+var_dump(strrpos("abc abc abc", "abc", -3));
+var_dump(strrpos("abc abc abc", "abc", -6));
+
+var_dump(mb_strrpos(" ", "", 0));
+var_dump(mb_strrpos(" ", "", 3));
+var_dump(mb_strrpos(" ", "", 6));
+var_dump(mb_strrpos(" ", "", 9));
+var_dump(mb_strrpos(" ", "", 11));
+var_dump(mb_strrpos(" ", "", 12));
+var_dump(mb_strrpos(" ", "", -1));
+var_dump(mb_strrpos(" ", "", -3));
+var_dump(mb_strrpos(" ", "", -6));
+
+var_dump(strripos("abc abc abc", "abc", 0));
+var_dump(strripos("abc abc abc", "abc", 3));
+var_dump(strripos("abc abc abc", "abc", 6));
+var_dump(strripos("abc abc abc", "abc", 9));
+var_dump(strripos("abc abc abc", "abc", 11));
+var_dump(strripos("abc abc abc", "abc", 12));
+var_dump(strripos("abc abc abc", "abc", -1));
+var_dump(strripos("abc abc abc", "abc", -3));
+var_dump(strripos("abc abc abc", "abc", -6));
+
+var_dump(mb_strripos(" ", "", 0));
+var_dump(mb_strripos(" ", "", 3));
+var_dump(mb_strripos(" ", "", 6));
+var_dump(mb_strripos(" ", "", 9));
+var_dump(mb_strripos(" ", "", 11));
+var_dump(mb_strripos(" ", "", 12));
+var_dump(mb_strripos(" ", "", -1));
+var_dump(mb_strripos(" ", "", -3));
+var_dump(mb_strripos(" ", "", -6));
+
+?>
+--EXPECTF--
+int(0)
+int(4)
+int(8)
+bool(false)
+bool(false)
+
+Warning: strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: strpos(): Offset not contained in string in %s on line %d
+bool(false)
+int(0)
+int(4)
+int(8)
+bool(false)
+bool(false)
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+int(0)
+int(4)
+int(8)
+bool(false)
+bool(false)
+
+Warning: stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: stripos(): Offset not contained in string in %s on line %d
+bool(false)
+int(0)
+int(4)
+int(8)
+bool(false)
+bool(false)
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+int(8)
+int(8)
+int(8)
+bool(false)
+bool(false)
+
+Warning: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+int(8)
+int(8)
+int(4)
+int(8)
+int(8)
+int(8)
+bool(false)
+bool(false)
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+int(8)
+int(8)
+int(4)
+int(8)
+int(8)
+int(8)
+bool(false)
+bool(false)
+
+Warning: strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+int(8)
+int(8)
+int(4)
+int(8)
+int(8)
+int(8)
+bool(false)
+bool(false)
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+int(8)
+int(8)
+int(4)
diff --git a/ext/mbstring/tests/bug46843.phpt b/ext/mbstring/tests/bug46843.phpt
new file mode 100644
index 000000000..136195cfe
--- /dev/null
+++ b/ext/mbstring/tests/bug46843.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Bug #46843 (CP936 euro symbol is not converted properly)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+var_dump(bin2hex(mb_convert_encoding("\x80", 'UCS-2BE', 'CP936')));
+var_dump(bin2hex(mb_convert_encoding("\x20\xac", 'CP936', 'UCS-2BE')));
+?>
+--EXPECT--
+string(4) "20ac"
+string(2) "80"
diff --git a/ext/mbstring/tests/bug47399.phpt b/ext/mbstring/tests/bug47399.phpt
new file mode 100644
index 000000000..79618688a
--- /dev/null
+++ b/ext/mbstring/tests/bug47399.phpt
@@ -0,0 +1,523 @@
+--TEST--
+Bug #47399 (mb_check_encoding() returns true for some illegal SJIS characters)
+--FILE--
+<?php
+foreach (array("Shift_JIS", "CP932") as $enc) {
+ for ($a = 0; $a < 256; $a++) {
+ var_dump(mb_check_encoding("\x81".pack("c", $a), $enc));
+ }
+}
+?>
+--EXPECT--
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
diff --git a/ext/mbstring/tests/mb_convert_encoding_variation1.phpt b/ext/mbstring/tests/mb_convert_encoding_variation1.phpt
new file mode 100644
index 000000000..74cd12869
--- /dev/null
+++ b/ext/mbstring/tests/mb_convert_encoding_variation1.phpt
@@ -0,0 +1,206 @@
+--TEST--
+Test mb_convert_encoding() function : usage variations - pass different data types as $to_encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_convert_encoding') or die("skip mb_convert_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_convert_encoding(string $str, string $to_encoding [, mixed $from_encoding])
+ * Description: Returns converted string in desired encoding
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+
+/*
+ * Pass different data types to $to_encoding arg to test behaviour of mb_convert_encoding
+ */
+
+echo "*** Testing mb_convert_encoding() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+mb_internal_encoding('utf-8');
+$sourcestring = b'hello, world';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $to_encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behaviour of mb_convert_encoding()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump(bin2hex( mb_convert_encoding($sourcestring, $input, 'ISO-8859-1') ));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_convert_encoding() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_convert_encoding(): Unknown encoding "0" in %s on line %d
+string(0) ""
+
+-- Iteration 2 --
+
+Warning: mb_convert_encoding(): Unknown encoding "1" in %s on line %d
+string(0) ""
+
+-- Iteration 3 --
+
+Warning: mb_convert_encoding(): Unknown encoding "12345" in %s on line %d
+string(0) ""
+
+-- Iteration 4 --
+
+Warning: mb_convert_encoding(): Unknown encoding "-2345" in %s on line %d
+string(0) ""
+
+-- Iteration 5 --
+
+Warning: mb_convert_encoding(): Unknown encoding "10.5" in %s on line %d
+string(0) ""
+
+-- Iteration 6 --
+
+Warning: mb_convert_encoding(): Unknown encoding "-10.5" in %s on line %d
+string(0) ""
+
+-- Iteration 7 --
+
+Warning: mb_convert_encoding(): Unknown encoding "123456789000" in %s on line %d
+string(0) ""
+
+-- Iteration 8 --
+
+Warning: mb_convert_encoding(): Unknown encoding "1.23456789E-9" in %s on line %d
+string(0) ""
+
+-- Iteration 9 --
+
+Warning: mb_convert_encoding(): Unknown encoding "0.5" in %s on line %d
+string(0) ""
+
+-- Iteration 10 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 11 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 12 --
+
+Warning: mb_convert_encoding(): Unknown encoding "1" in %s on line %d
+string(0) ""
+
+-- Iteration 13 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 14 --
+
+Warning: mb_convert_encoding(): Unknown encoding "1" in %s on line %d
+string(0) ""
+
+-- Iteration 15 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 16 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 17 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 18 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 19 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 20 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 21 --
+
+Warning: mb_convert_encoding(): Unknown encoding "Class A object" in %s on line %d
+string(0) ""
+
+-- Iteration 22 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 23 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 24 --
+
+Warning: mb_convert_encoding(): Unknown encoding "Resource id #%d" in %s on line %d
+string(0) ""
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_decode_mimeheader_basic.phpt b/ext/mbstring/tests/mb_decode_mimeheader_basic.phpt
new file mode 100644
index 000000000..5374c31c1
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_mimeheader_basic.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_decode_mimeheader() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_decode_mimeheader') or die("skip mb_decode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_decode_mimeheader(string string)
+ * Description: Decodes the MIME "encoded-word" in the string
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_decode_mimeheader() : basic functionality ***\n";
+mb_internal_encoding('utf-8');
+
+//the following encoded-words are identical and are UTF-8 Japanese.
+$a = "=?UTF-8?b?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?=";
+$b = mb_decode_mimeheader($a);
+var_dump(bin2hex($b));
+
+$a = "=?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88?=
+=?UTF-8?Q?=E3=81=A7=E3=81=99=E3=80=82?=";
+$b = mb_decode_mimeheader($a);
+var_dump(bin2hex($b));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_decode_mimeheader() : basic functionality ***
+string(60) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e38082"
+string(60) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e38082"
+===DONE===
diff --git a/ext/mbstring/tests/mb_decode_mimeheader_error.phpt b/ext/mbstring/tests/mb_decode_mimeheader_error.phpt
new file mode 100644
index 000000000..c40cdbd64
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_mimeheader_error.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Test mb_decode_mimeheader() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_decode_mimeheader') or die("skip mb_decode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_decode_mimeheader(string string)
+ * Description: Decodes the MIME "encoded-word" in the string
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_decode_mimeheader() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing mb_decode_mimeheader() function with Zero arguments --\n";
+var_dump( mb_decode_mimeheader() );
+
+//Test mb_decode_mimeheader with one more than the expected number of arguments
+echo "\n-- Testing mb_decode_mimeheader() function with more than expected no. of arguments --\n";
+$string = 'string_val';
+$extra_arg = 10;
+var_dump( mb_decode_mimeheader($string, $extra_arg) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_decode_mimeheader() : error conditions ***
+
+-- Testing mb_decode_mimeheader() function with Zero arguments --
+
+Warning: mb_decode_mimeheader() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing mb_decode_mimeheader() function with more than expected no. of arguments --
+
+Warning: mb_decode_mimeheader() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/mbstring/tests/mb_decode_mimeheader_variation1.phpt b/ext/mbstring/tests/mb_decode_mimeheader_variation1.phpt
new file mode 100644
index 000000000..7a1c8868c
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_mimeheader_variation1.phpt
@@ -0,0 +1,209 @@
+--TEST--
+p8_only
+Title: Test mb_decode_mimeheader() function : usage variation
+Internal Reason: we output an extra warning message
+P8 only feature: Yes
+Author: D. Kelsey
+Date: 01/09/2008
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_decode_mimeheader') or die("skip mb_decode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_decode_mimeheader(string string)
+ * Description: Decodes the MIME "encoded-word" in the string
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_decode_mimeheader() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for string
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_decode_mimeheader($value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_decode_mimeheader() : usage variation ***
+
+--int 0--
+string(1) "0"
+
+--int 1--
+string(1) "1"
+
+--int 12345--
+string(5) "12345"
+
+--int -12345--
+string(5) "-2345"
+
+--float 10.5--
+string(4) "10.5"
+
+--float -10.5--
+string(5) "-10.5"
+
+--float 12.3456789000e10--
+string(12) "123456789000"
+
+--float -12.3456789000e10--
+string(13) "-123456789000"
+
+--float .5--
+string(3) "0.5"
+
+--empty array--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, array given, %s(%d)
+NULL
+
+--int indexed array--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, array given, %s(%d)
+NULL
+
+--associative array--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, array given, %s(%d)
+NULL
+
+--nested arrays--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, array given, %s(%d)
+NULL
+
+--uppercase NULL--
+string(0) ""
+
+--lowercase null--
+string(0) ""
+
+--lowercase true--
+string(1) "1"
+
+--lowercase false--
+string(0) ""
+
+--uppercase TRUE--
+string(1) "1"
+
+--uppercase FALSE--
+string(0) ""
+
+--empty string DQ--
+string(0) ""
+
+--empty string SQ--
+string(0) ""
+
+--instance of classWithToString--
+string(14) "Class A object"
+
+--instance of classWithoutToString--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, object given, %s(%d)
+NULL
+
+--undefined var--
+string(0) ""
+
+--unset var--
+string(0) ""
+
+--resource--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, resource given, %s(%d)
+NULL
+===DONE===
diff --git a/ext/mbstring/tests/mb_decode_mimeheader_variation2.phpt b/ext/mbstring/tests/mb_decode_mimeheader_variation2.phpt
new file mode 100644
index 000000000..7527c9aa5
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_mimeheader_variation2.phpt
@@ -0,0 +1,51 @@
+--TEST--
+Test mb_decode_mimeheader() function : variation
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_decode_mimeheader') or die("skip mb_decode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_decode_mimeheader(string string)
+ * Description: Decodes the MIME "encoded-word" in the string
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_decode_mimeheader() : variation ***\n";
+mb_internal_encoding('utf-8');
+
+//all the following are identical, we will convert to utf-8
+
+$encoded_words = array(
+"=?Shift_JIS?B?k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==?=",
+"=?Shift_JIS?Q?=93=FA=96=7B=8C=EA=83e=83L=83X=83g=82=C5=82=B7=81B=30=31=32?=
+=?Shift_JIS?Q?=33=34=82T=82U=82V=82W=82X=81B?=",
+
+"=?ISO-2022-JP?B?GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYbKEI=?=
+=?ISO-2022-JP?B?GyRCIzcjOCM5ISMbKEI=?=",
+"=?ISO-2022-JP?Q?=1B=24BF=7CK=5C=38l=25F=25-=25=39=25H=24G=24=39=1B=28B?=
+=?ISO-2022-JP?Q?=1B=24B!=23=1B=28B=30=31=32=33=34=1B=24B=23=35=1B=28B?=
+=?ISO-2022-JP?Q?=1B=24B=23=36=23=37=23=38=23=39!=23=1B=28B?=",
+
+"=?EUC-JP?B?xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow==?=",
+"=?EUC-JP?Q?=C6=FC=CB=DC=B8=EC=A5=C6=A5=AD=A5=B9=A5=C8=A4=C7=A4=B9=A1=A3?=
+=?EUC-JP?Q?=30=31=32=33=34=A3=B5=A3=B6=A3=B7=A3=B8=A3=B9=A1=A3?="
+ );
+
+ foreach ($encoded_words as $word) {
+ var_dump(bin2hex(mb_decode_mimeheader($word)));
+}
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_decode_mimeheader() : variation ***
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+===DONE===
diff --git a/ext/mbstring/tests/mb_decode_mimeheader_variation3.phpt b/ext/mbstring/tests/mb_decode_mimeheader_variation3.phpt
new file mode 100644
index 000000000..968e76eaf
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_mimeheader_variation3.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test mb_decode_mimeheader() function : variation
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_decode_mimeheader') or die("skip mb_decode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_decode_mimeheader(string string)
+ * Description: Decodes the MIME "encoded-word" in the string
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_decode_mimeheader() : variation ***\n";
+mb_internal_encoding('iso-8859-7');
+
+//greek in UTF-8 to be converted to iso-8859-7
+$encoded_word = "=?UTF-8?B?zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J?=";
+var_dump(bin2hex(mb_decode_mimeheader($encoded_word)));
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_decode_mimeheader() : variation ***
+string(48) "e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f3f4f5f6f7f8f9"
+===DONE===
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_basic.phpt b/ext/mbstring/tests/mb_encode_mimeheader_basic.phpt
index fb0c28166..0487a194f 100644
--- a/ext/mbstring/tests/mb_encode_mimeheader_basic.phpt
+++ b/ext/mbstring/tests/mb_encode_mimeheader_basic.phpt
@@ -21,13 +21,22 @@ function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is n
*/
echo "*** Testing mb_encode_mimeheader() : basic ***\n";
-mb_internal_encoding('utf-8');
-$inputs = array('English' => 'This is an English string. 0123456789',
- 'Japanese' => base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC'),
+$english = array('English' => 'This is an English string. 0123456789');
+$nonEnglish = array('Japanese' => base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC'),
'Greek' => base64_decode('zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg=='));
-foreach ($inputs as $lang => $input) {
+foreach ($english as $lang => $input) {
+ echo "\nLanguage: $lang\n";
+ echo "-- Base 64: --\n";
+ var_dump(mb_encode_mimeheader($input, 'UTF-8', 'B'));
+ echo "-- Quoted-Printable --\n";
+ var_dump(mb_encode_mimeheader($input, 'UTF-8', 'Q'));
+}
+
+mb_internal_encoding('utf-8');
+
+foreach ($nonEnglish as $lang => $input) {
echo "\nLanguage: $lang\n";
echo "-- Base 64: --\n";
var_dump(mb_encode_mimeheader($input, 'UTF-8', 'B'));
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_basic2.phpt b/ext/mbstring/tests/mb_encode_mimeheader_basic2.phpt
new file mode 100644
index 000000000..cd52fa526
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_basic2.phpt
@@ -0,0 +1,73 @@
+--TEST--
+Test mb_encode_mimeheader() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader(string $str [, string $charset
+ * [, string $transfer-encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test mb_encode_header() with different strings
+ */
+
+echo "*** Testing mb_encode_mimeheader() : basic2 ***\n";
+
+//All strings are the same when displayed in their respective encodings
+$sjis_string = base64_decode('k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==');
+$jis_string = base64_decode('GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==');
+$euc_jp_string = base64_decode('xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow==');
+
+$inputs = array('SJIS' => $sjis_string,
+ 'JIS' => $jis_string,
+ 'EUC_JP' => $euc_jp_string);
+
+foreach ($inputs as $lang => $input) {
+ echo "\nLanguage: $lang\n";
+ echo "-- Base 64: --\n";
+ mb_internal_encoding($lang);
+ $outEncoding = "UTF-8";
+ var_dump(mb_encode_mimeheader($input, $outEncoding, 'B'));
+ echo "-- Quoted-Printable --\n";
+ var_dump(mb_encode_mimeheader($input, $outEncoding, 'Q'));
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : basic2 ***
+
+Language: SJIS
+-- Base 64: --
+string(99) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJc=?=
+ =?UTF-8?B?77yY77yZ44CC?="
+-- Quoted-Printable --
+string(201) "=?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88?=
+ =?UTF-8?Q?=E3=81=A7=E3=81=99=E3=80=82=30=31=32=33=34=EF=BC=95=EF=BC=96?=
+ =?UTF-8?Q?=EF=BC=97=EF=BC=98=EF=BC=99=E3=80=82?="
+
+Language: JIS
+-- Base 64: --
+string(99) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJc=?=
+ =?UTF-8?B?77yY77yZ44CC?="
+-- Quoted-Printable --
+string(201) "=?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88?=
+ =?UTF-8?Q?=E3=81=A7=E3=81=99=E3=80=82=30=31=32=33=34=EF=BC=95=EF=BC=96?=
+ =?UTF-8?Q?=EF=BC=97=EF=BC=98=EF=BC=99=E3=80=82?="
+
+Language: EUC_JP
+-- Base 64: --
+string(99) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJc=?=
+ =?UTF-8?B?77yY77yZ44CC?="
+-- Quoted-Printable --
+string(201) "=?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88?=
+ =?UTF-8?Q?=E3=81=A7=E3=81=99=E3=80=82=30=31=32=33=34=EF=BC=95=EF=BC=96?=
+ =?UTF-8?Q?=EF=BC=97=EF=BC=98=EF=BC=99=E3=80=82?="
+Done
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_basic3.phpt b/ext/mbstring/tests/mb_encode_mimeheader_basic3.phpt
new file mode 100644
index 000000000..b2f0c8b7d
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_basic3.phpt
@@ -0,0 +1,69 @@
+--TEST--
+Test mb_encode_mimeheader() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader(string $str [, string $charset
+ * [, string $transfer-encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test mb_encode_header() with different strings
+ */
+
+echo "*** Testing mb_encode_mimeheader() : basic2 ***\n";
+
+//All strings are the same when displayed in their respective encodings
+$sjis_string = base64_decode('k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==');
+$jis_string = base64_decode('GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==');
+$euc_jp_string = base64_decode('xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow==');
+
+$inputs = array('SJIS' => $sjis_string,
+ 'JIS' => $jis_string,
+ 'EUC_JP' => $euc_jp_string);
+
+foreach ($inputs as $lang => $input) {
+ echo "\nLanguage: $lang\n";
+ echo "-- Base 64: --\n";
+ mb_internal_encoding($lang);
+ $outEncoding = $lang;
+ var_dump(mb_encode_mimeheader($input, $outEncoding, 'B'));
+ echo "-- Quoted-Printable --\n";
+ var_dump(mb_encode_mimeheader($input, $outEncoding, 'Q'));
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : basic2 ***
+
+Language: SJIS
+-- Base 64: --
+string(68) "=?Shift_JIS?B?k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==?="
+-- Quoted-Printable --
+string(124) "=?Shift_JIS?Q?=93=FA=96=7B=8C=EA=83e=83L=83X=83g=82=C5=82=B7=81B=30=31=32?=
+ =?Shift_JIS?Q?=33=34=82T=82U=82V=82W=82X=81B?="
+
+Language: JIS
+-- Base 64: --
+string(115) "=?ISO-2022-JP?B?GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYbKEI=?=
+ =?ISO-2022-JP?B?GyRCIzcjOCM5ISMbKEI=?="
+-- Quoted-Printable --
+string(209) "=?ISO-2022-JP?Q?=1B=24BF=7CK=5C=38l=25F=25-=25=39=25H=24G=24=39=1B=28B?=
+ =?ISO-2022-JP?Q?=1B=24B!=23=1B=28B=30=31=32=33=34=1B=24B=23=35=1B=28B?=
+ =?ISO-2022-JP?Q?=1B=24B=23=36=23=37=23=38=23=39!=23=1B=28B?="
+
+Language: EUC_JP
+-- Base 64: --
+string(65) "=?EUC-JP?B?xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow==?="
+-- Quoted-Printable --
+string(140) "=?EUC-JP?Q?=C6=FC=CB=DC=B8=EC=A5=C6=A5=AD=A5=B9=A5=C8=A4=C7=A4=B9=A1=A3?=
+ =?EUC-JP?Q?=30=31=32=33=34=A3=B5=A3=B6=A3=B7=A3=B8=A3=B9=A1=A3?="
+Done
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_indent.phpt b/ext/mbstring/tests/mb_encode_mimeheader_indent.phpt
new file mode 100644
index 000000000..11fe23f53
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_indent.phpt
@@ -0,0 +1,901 @@
+--TEST--
+Test mb_encode_mimeheader() function : basic functionality, indent
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader
+ * (string $str [, string $charset [, string $transfer_encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types to $indent argument to see how mb_encode_mimeheader() behaves
+ */
+
+echo "*** Testing mb_encode_mimeheader() : indent ***\n";
+
+mb_internal_encoding('utf-8');
+
+// Initialise function arguments not being substituted
+$str = base64_decode('zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==');
+$charset = 'utf-8';
+$linefeed = "\r\n";
+
+for ($i = 0; $i < 100; $i++) {
+ echo "\n-- Iteration $i --\n";
+ var_dump( mb_encode_mimeheader($str, $charset, "B", $linefeed, $i));
+ var_dump( mb_encode_mimeheader($str, $charset, "Q", $linefeed, $i));
+};
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_encode_mimeheader() : indent ***
+
+-- Iteration 0 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 1 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 2 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 3 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 4 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrU=?=
+ =?UTF-8?B?zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9?=
+ =?UTF-8?Q?=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36?=
+ =?UTF-8?Q?=37=38=39=2E?="
+
+-- Iteration 5 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrU=?=
+ =?UTF-8?B?zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9?=
+ =?UTF-8?Q?=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36?=
+ =?UTF-8?Q?=37=38=39=2E?="
+
+-- Iteration 6 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrU=?=
+ =?UTF-8?B?zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9?=
+ =?UTF-8?Q?=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36?=
+ =?UTF-8?Q?=37=38=39=2E?="
+
+-- Iteration 7 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrU=?=
+ =?UTF-8?B?zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 8 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66?=
+ =?UTF-8?B?zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 9 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66?=
+ =?UTF-8?B?zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 10 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66?=
+ =?UTF-8?B?zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 11 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66?=
+ =?UTF-8?B?zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 12 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+M?=
+ =?UTF-8?B?IM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 13 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+M?=
+ =?UTF-8?B?IM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 14 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+M?=
+ =?UTF-8?B?IM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 15 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+M?=
+ =?UTF-8?B?IM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 16 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrk=?=
+ =?UTF-8?B?zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 17 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrk=?=
+ =?UTF-8?B?zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 18 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrk=?=
+ =?UTF-8?B?zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 19 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrk=?=
+ =?UTF-8?B?zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 20 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869?=
+ =?UTF-8?B?zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 21 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869?=
+ =?UTF-8?B?zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 22 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869?=
+ =?UTF-8?B?zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 23 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869?=
+ =?UTF-8?B?zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 24 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrs=?=
+ =?UTF-8?B?zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 25 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrs=?=
+ =?UTF-8?B?zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 26 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrs=?=
+ =?UTF-8?B?zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 27 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrs=?=
+ =?UTF-8?B?zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 28 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67?=
+ =?UTF-8?B?zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 29 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67?=
+ =?UTF-8?B?zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 30 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67?=
+ =?UTF-8?B?zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 31 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67?=
+ =?UTF-8?B?zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 32 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSA=?=
+ =?UTF-8?B?zrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 33 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSA=?=
+ =?UTF-8?B?zrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 34 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSA=?=
+ =?UTF-8?B?zrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 35 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSA=?=
+ =?UTF-8?B?zrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 36 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrE=?=
+ =?UTF-8?B?zrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4?=
+ =?UTF-8?B?OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 37 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrE=?=
+ =?UTF-8?B?zrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4?=
+ =?UTF-8?B?OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C?=
+ =?UTF-8?Q?=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7?=
+ =?UTF-8?Q?=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD?=
+ =?UTF-8?Q?=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 38 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrE=?=
+ =?UTF-8?B?zrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4?=
+ =?UTF-8?B?OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C?=
+ =?UTF-8?Q?=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7?=
+ =?UTF-8?Q?=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD?=
+ =?UTF-8?Q?=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 39 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrE=?=
+ =?UTF-8?B?zrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4?=
+ =?UTF-8?B?OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C?=
+ =?UTF-8?Q?=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7?=
+ =?UTF-8?Q?=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD?=
+ =?UTF-8?Q?=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 40 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869?=
+ =?UTF-8?B?zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2?=
+ =?UTF-8?B?Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 41 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869?=
+ =?UTF-8?B?zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2?=
+ =?UTF-8?B?Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 42 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869?=
+ =?UTF-8?B?zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2?=
+ =?UTF-8?B?Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 43 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869?=
+ =?UTF-8?B?zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2?=
+ =?UTF-8?B?Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 44 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrU=?=
+ =?UTF-8?B?zq/Ovc6xzrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEy?=
+ =?UTF-8?B?MzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 45 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrU=?=
+ =?UTF-8?B?zq/Ovc6xzrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEy?=
+ =?UTF-8?B?MzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 46 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrU=?=
+ =?UTF-8?B?zq/Ovc6xzrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEy?=
+ =?UTF-8?B?MzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85?=
+ =?UTF-8?Q?=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB?=
+ =?UTF-8?Q?=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC?=
+ =?UTF-8?Q?=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 47 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrU=?=
+ =?UTF-8?B?zq/Ovc6xzrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEy?=
+ =?UTF-8?B?MzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85?=
+ =?UTF-8?Q?=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB?=
+ =?UTF-8?Q?=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC?=
+ =?UTF-8?Q?=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 48 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wg?=
+ =?UTF-8?B?zrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAw?=
+ =?UTF-8?B?MTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85?=
+ =?UTF-8?Q?=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB?=
+ =?UTF-8?Q?=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC?=
+ =?UTF-8?Q?=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 49 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wg?=
+ =?UTF-8?B?zrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAw?=
+ =?UTF-8?B?MTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85?=
+ =?UTF-8?Q?=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB?=
+ =?UTF-8?Q?=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC?=
+ =?UTF-8?Q?=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 50 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wg?=
+ =?UTF-8?B?zrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAw?=
+ =?UTF-8?B?MTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85?=
+ =?UTF-8?Q?=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB?=
+ =?UTF-8?Q?=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC?=
+ =?UTF-8?Q?=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 51 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 52 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 53 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 54 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 55 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 56 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 57 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 58 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 59 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 60 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 61 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 62 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 63 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 64 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 65 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 66 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 67 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 68 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 69 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 70 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 71 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 72 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 73 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 74 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 75 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 76 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 77 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 78 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 79 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 80 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 81 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 82 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 83 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 84 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 85 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 86 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 87 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 88 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 89 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 90 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 91 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 92 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 93 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 94 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 95 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 96 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 97 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 98 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 99 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+Done
+
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_variation1.phpt b/ext/mbstring/tests/mb_encode_mimeheader_variation1.phpt
index f440e1d44..7b5bd3066 100644
--- a/ext/mbstring/tests/mb_encode_mimeheader_variation1.phpt
+++ b/ext/mbstring/tests/mb_encode_mimeheader_variation1.phpt
@@ -19,8 +19,6 @@ function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is n
echo "*** Testing mb_encode_mimeheader() : usage variations ***\n";
-mb_internal_encoding('utf-8');
-
// Initialise function arguments not being substituted
$charset = 'utf-8';
$transfer_encoding = 'B';
diff --git a/ext/mbstring/tests/mb_ereg.phpt b/ext/mbstring/tests/mb_ereg.phpt
index d069b2593..8fc5b94da 100644
--- a/ext/mbstring/tests/mb_ereg.phpt
+++ b/ext/mbstring/tests/mb_ereg.phpt
@@ -17,14 +17,13 @@ output_handler=
mb_regex_encoding( $test_enc );
$pat = mb_convert_encoding( $pat, $test_enc, $in_enc );
$str = mb_convert_encoding( $str, $test_enc, $in_enc );
-
- printf( "(%d)%s\n", mb_ereg( $pat, $str, $reg ), ( is_array( $reg )? mb_convert_encoding( implode( ' ', $reg ), $in_enc, $test_enc ) : '' ) );
+ printf( "(%d)%s\n", mb_ereg( $pat, $str, $reg ), ( is_array( $reg )? bin2hex(mb_convert_encoding( implode( b' ', $reg ), $in_enc, $test_enc )) : '' ) );
}
function do_tests( $enc ) {
- test_ereg( $enc, 'abc ([a-z]+) ([a-z]+) ([a-z]+)$', "abc def ghi jkl" );
- $pat = '([a-z]+) ([ あ-か]+)([か-な]+) ([わ-ん]+)$';
- test_ereg( $enc, $pat, 'abc あおい かこな わゑん' );
- test_ereg( $enc, $pat, 'mzxfp うおか きか をゐ' );
+ test_ereg( $enc, b'abc ([a-z]+) ([a-z]+) ([a-z]+)$', b"abc def ghi jkl" );
+ $pat = b'([a-z]+) ([ あ-か]+)([か-な]+) ([わ-ん]+)$';
+ test_ereg( $enc, $pat, b'abc あおい かこな わゑん' );
+ test_ereg( $enc, $pat, b'mzxfp うおか きか をゐ' );
}
foreach( $encs as $enc ) {
@@ -33,15 +32,15 @@ output_handler=
?>
--EXPECT--
-(15)abc def ghi jkl def ghi jkl
-(27)abc あおい かこな わゑん abc あおい か こな わゑん
-(27)mzxfp うおか きか をゐ mzxfp うおか きか をゐ
-(15)abc def ghi jkl def ghi jkl
-(27)abc あおい かこな わゑん abc あおい か こな わゑん
-(27)mzxfp うおか きか をゐ mzxfp うおか きか をゐ
-(15)abc def ghi jkl def ghi jkl
-(27)abc あおい かこな わゑん abc あおい か こな わゑん
-(27)mzxfp うおか きか をゐ mzxfp うおか きか をゐ
-(15)abc def ghi jkl def ghi jkl
-(39)abc あおい かこな わゑん abc あおい か こな わゑん
-(39)mzxfp うおか きか をゐ mzxfp うおか きか をゐ
+(15)6162632064656620676869206a6b6c2064656620676869206a6b6c
+(27)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+(27)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0
+(15)6162632064656620676869206a6b6c2064656620676869206a6b6c
+(27)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+(27)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0
+(15)6162632064656620676869206a6b6c2064656620676869206a6b6c
+(27)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+(27)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0
+(15)6162632064656620676869206a6b6c2064656620676869206a6b6c
+(39)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+(39)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0 \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_basic.phpt b/ext/mbstring/tests/mb_ereg_basic.phpt
index 0bdaf74ee..db2822339 100644
--- a/ext/mbstring/tests/mb_ereg_basic.phpt
+++ b/ext/mbstring/tests/mb_ereg_basic.phpt
@@ -23,9 +23,9 @@ if(mb_regex_encoding('utf-8') == true) {
} else {
echo "Could not set regex encoding to utf-8\n";
}
-$string_ascii = 'This is an English string. 0123456789.';
-$regex_ascii1 = '(.*is)+.*\.[[:blank:]][0-9]{9}';
-$regex_ascii2 = '.*is+';
+$string_ascii = b'This is an English string. 0123456789.';
+$regex_ascii1 = b'(.*is)+.*\.[[:blank:]][0-9]{9}';
+$regex_ascii2 = b'.*is+';
$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
$regex_mb1 = base64_decode('KOaXpeacrOiqnikuKj8oWzEtOV0rKQ==');
@@ -37,9 +37,9 @@ var_dump(mb_ereg($regex_ascii1, $string_ascii));
var_dump(mb_ereg($regex_ascii2, $string_ascii));
echo "--With \$regs argument --\n";
var_dump(mb_ereg($regex_ascii1, $string_ascii, $regs_ascii1));
-var_dump($regs_ascii1);
+base64_encode_var_dump($regs_ascii1);
var_dump(mb_ereg($regex_ascii2, $string_ascii, $regs_ascii2));
-var_dump($regs_ascii2);
+base64_encode_var_dump($regs_ascii2);
echo "\n**-- Multibyte String --**\n";
echo "-- Without \$regs argument --\n";
@@ -76,7 +76,7 @@ function base64_encode_var_dump($regs) {
}
?>
---EXPECTF--
+--EXPECT--
*** Testing mb_ereg() : basic functionality ***
Regex encoding set to utf-8
@@ -88,14 +88,14 @@ int(1)
int(36)
array(2) {
[0]=>
- string(36) "This is an English string. 012345678"
+ string(48) "VGhpcyBpcyBhbiBFbmdsaXNoIHN0cmluZy4gMDEyMzQ1Njc4"
[1]=>
- string(17) "This is an Englis"
+ string(24) "VGhpcyBpcyBhbiBFbmdsaXM="
}
int(17)
array(1) {
[0]=>
- string(17) "This is an Englis"
+ string(24) "VGhpcyBpcyBhbiBFbmdsaXM="
}
**-- Multibyte String --**
diff --git a/ext/mbstring/tests/mb_ereg_error.phpt b/ext/mbstring/tests/mb_ereg_error.phpt
index 21216257c..3610aea4e 100644
--- a/ext/mbstring/tests/mb_ereg_error.phpt
+++ b/ext/mbstring/tests/mb_ereg_error.phpt
@@ -21,15 +21,15 @@ echo "*** Testing mb_ereg() : error conditions ***\n";
//Test mb_ereg with one more than the expected number of arguments
echo "\n-- Testing mb_ereg() function with more than expected no. of arguments --\n";
-$pattern = 'string_val';
-$string = 'string_val';
+$pattern = b'string_val';
+$string = b'string_val';
$registers = array(1, 2);
$extra_arg = 10;
var_dump( mb_ereg($pattern, $string, $registers, $extra_arg) );
// Testing mb_ereg with one less than the expected number of arguments
echo "\n-- Testing mb_ereg() function with less than expected no. of arguments --\n";
-$pattern = 'string_val';
+$pattern = b'string_val';
var_dump( mb_ereg($pattern) );
echo "Done";
diff --git a/ext/mbstring/tests/mb_ereg_match_basic.phpt b/ext/mbstring/tests/mb_ereg_match_basic.phpt
new file mode 100644
index 000000000..56710a93e
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_match_basic.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Test mb_ereg_match() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_match') or die("skip mb_ereg_match() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : bool mb_ereg_match(string $pattern, string $string [,string $option])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test basic functionality of mb_ereg_match
+ */
+
+mb_internal_encoding('UTF-8');
+mb_regex_encoding('UTF-8');
+
+echo "*** Testing mb_ereg_match() : basic functionality ***\n";
+$string_ascii = b'abc def, 0123456789';
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+//will return true as pattern matches from start of string
+echo "\n-- ASCII string 1 --\n";
+var_dump(mb_ereg_match(b'.*def', $string_ascii));
+
+//will return false as pattern would match half way through string
+echo "\n-- ASCII string 2 --\n";
+var_dump(mb_ereg_match(b'def', $string_ascii));
+
+echo "\n-- Multibyte string 1 --\n";
+$regex1 = base64_decode('5pel5pys6KqeKC4qKT9bMS05XSs=');
+var_dump(mb_ereg_match($regex1, $string_mb, b'i'));
+
+echo "\n-- Multibyte string 2 --\n";
+$regex2 = base64_decode('5LiW55WM');
+var_dump(mb_ereg_match($regex2, $string_mb));
+
+echo "Done";
+?>
+--EXPECTF--
+
+*** Testing mb_ereg_match() : basic functionality ***
+
+-- ASCII string 1 --
+bool(true)
+
+-- ASCII string 2 --
+bool(false)
+
+-- Multibyte string 1 --
+bool(true)
+
+-- Multibyte string 2 --
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_ereg_match_error1.phpt b/ext/mbstring/tests/mb_ereg_match_error1.phpt
new file mode 100644
index 000000000..b36c68621
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_match_error1.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Test mb_ereg_match() function : error conditions - pass function incorrect number of arguments
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_match') or die("skip mb_ereg_match() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : bool mb_ereg_match(string $pattern, string $string [,string $option])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test mb_ereg_match by passing an incorrect number of arguments
+ */
+
+echo "*** Testing mb_ereg_match() : error conditions ***\n";
+
+
+//Test mb_ereg_match with one more than the expected number of arguments
+echo "\n-- Testing mb_ereg_match() function with more than expected no. of arguments --\n";
+$pattern = b'string_val';
+$string = b'string_val';
+$option = 'string_val';
+$extra_arg = 10;
+var_dump( mb_ereg_match($pattern, $string, $option, $extra_arg) );
+
+// Testing mb_ereg_match with one less than the expected number of arguments
+echo "\n-- Testing mb_ereg_match() function with less than expected no. of arguments --\n";
+$pattern = b'string_val';
+var_dump( mb_ereg_match($pattern) );
+
+// Testing mb_ereg_match with zero arguments
+echo "\n-- Testing mb_ereg_match() function with zero arguments --\n";
+var_dump( mb_ereg_match() );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_match() : error conditions ***
+
+-- Testing mb_ereg_match() function with more than expected no. of arguments --
+
+Warning: mb_ereg_match() expects at most 3 parameters, 4 given in %s on line %d
+bool(false)
+
+-- Testing mb_ereg_match() function with less than expected no. of arguments --
+
+Warning: mb_ereg_match() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+
+-- Testing mb_ereg_match() function with zero arguments --
+
+Warning: mb_ereg_match() expects at least 2 parameters, 0 given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_replace_basic.phpt b/ext/mbstring/tests/mb_ereg_replace_basic.phpt
new file mode 100644
index 000000000..5a07004d5
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_basic.phpt
@@ -0,0 +1,62 @@
+--TEST--
+Test mb_ereg_replace() function : basic
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_ereg_replace(string $pattern, string $replacement,
+ * string $string [, string o$ption])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test Basic Functionality of mb_ereg_replace()
+ */
+
+echo "*** Testing mb_ereg_replace() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+mb_regex_encoding('UTF-8');
+
+$string_ascii = b'abc def';
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- ASCII string 1 --\n";
+$result_1 = mb_ereg_replace(b'(.*)def', b'\\1 123', $string_ascii);
+var_dump(bin2hex($result_1));
+
+echo "\n-- ASCII string 2 --\n";
+$result_2 = mb_ereg_replace(b'123', b'abc', $string_ascii);
+var_dump(bin2hex($result_2));
+
+echo "\n-- Multibyte string 1 --\n";
+$regex1 = base64_decode('KOaXpeacrOiqnikuKj8oWzEtOV0rKQ=='); //Japanese regex in UTF-8
+$result_3 = mb_ereg_replace($regex1, b'\\1_____\\2', $string_mb);
+var_dump(bin2hex($result_3));
+
+echo "\n-- Multibyte string 2 --\n";
+$regex2 = base64_decode('5LiW55WM');
+$result_4 = mb_ereg_replace($regex2, b'_____', $string_mb);
+var_dump(bin2hex($result_4));
+
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_ereg_replace() : basic functionality ***
+
+-- ASCII string 1 --
+string(16) "6162632020313233"
+
+-- ASCII string 2 --
+string(14) "61626320646566"
+
+-- Multibyte string 1 --
+string(72) "e697a5e69cace8aa9e5f5f5f5f5f31323334efbc95efbc96efbc97efbc98efbc99e38082"
+
+-- Multibyte string 2 --
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_replace_error.phpt b/ext/mbstring/tests/mb_ereg_replace_error.phpt
new file mode 100644
index 000000000..bc98be8ba
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_error.phpt
@@ -0,0 +1,48 @@
+--TEST--
+Test mb_ereg_replace() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_ereg_replace(string pattern, string replacement, string string [, string option])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_ereg_replace() : error conditions ***\n";
+
+
+//Test mb_ereg_replace with one more than the expected number of arguments
+echo "\n-- Testing mb_ereg_replace() function with more than expected no. of arguments --\n";
+$pattern = b'[a-k]';
+$replacement = b'1';
+$string = b'string_val';
+$option = '';
+$extra_arg = 10;
+var_dump( mb_ereg_replace($pattern, $replacement, $string, $option, $extra_arg) );
+
+// Testing mb_ereg_replace with one less than the expected number of arguments
+echo "\n-- Testing mb_ereg_replace() function with less than expected no. of arguments --\n";
+$pattern = b'string_val';
+$replacement = b'string_val';
+var_dump( mb_ereg_replace($pattern, $replacement) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_replace() : error conditions ***
+
+-- Testing mb_ereg_replace() function with more than expected no. of arguments --
+
+Warning: mb_ereg_replace() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_ereg_replace() function with less than expected no. of arguments --
+
+Warning: mb_ereg_replace() expects at least 3 parameters, 2 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_ereg_replace_variation1.phpt b/ext/mbstring/tests/mb_ereg_replace_variation1.phpt
new file mode 100644
index 000000000..3e24979cd
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_variation1.phpt
@@ -0,0 +1,170 @@
+--TEST--
+Test mb_ereg_replace() function : usage variations - <type here specifics of this variation>
+--INI--
+error_reporting=E_ALL & ~E_NOTICE
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_ereg_replace(string pattern, string replacement, string string [, string option])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_ereg_replace() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$replacement = 'string_val';
+$string = 'string_val';
+$option = '';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_ereg_replace($input, $replacement, $string, $option) );
+ $iterator++;
+};
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_replace() : usage variations ***
+
+-- Iteration 1 --
+string(10) "string_val"
+
+-- Iteration 2 --
+string(10) "string_val"
+
+-- Iteration 3 --
+string(10) "string_val"
+
+-- Iteration 4 --
+string(10) "string_val"
+
+-- Iteration 5 --
+string(10) "string_val"
+
+-- Iteration 6 --
+string(10) "string_val"
+
+-- Iteration 7 --
+string(10) "string_val"
+
+-- Iteration 8 --
+string(10) "string_val"
+
+-- Iteration 9 --
+string(10) "string_val"
+
+-- Iteration 10 --
+string(10) "string_val"
+
+-- Iteration 11 --
+string(10) "string_val"
+
+-- Iteration 12 --
+string(10) "string_val"
+
+-- Iteration 13 --
+string(10) "string_val"
+
+-- Iteration 14 --
+string(10) "string_val"
+
+-- Iteration 15 --
+string(10) "string_val"
+
+-- Iteration 16 --
+string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
+
+-- Iteration 17 --
+string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
+
+-- Iteration 18 --
+string(10) "string_val"
+
+-- Iteration 19 --
+string(10) "string_val"
+
+-- Iteration 20 --
+string(10) "string_val"
+
+-- Iteration 21 --
+string(10) "string_val"
+
+-- Iteration 22 --
+string(10) "string_val"
+
+-- Iteration 23 --
+string(10) "string_val"
+Done
diff --git a/ext/mbstring/tests/mb_ereg_replace_variation2.phpt b/ext/mbstring/tests/mb_ereg_replace_variation2.phpt
new file mode 100644
index 000000000..37a89fcba
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_variation2.phpt
@@ -0,0 +1,178 @@
+--TEST--
+Test mb_ereg_replace() function : usage variations
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_ereg_replace(string pattern, string replacement, string string [, string option])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_ereg_replace() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$pattern = '[a-z]';
+$string = 'string_val';
+$option = '';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_ereg_replace($pattern, $input, $string, $option) );
+ $iterator++;
+};
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_replace() : usage variations ***
+
+-- Iteration 1 --
+string(10) "000000_000"
+
+-- Iteration 2 --
+string(10) "111111_111"
+
+-- Iteration 3 --
+string(46) "123451234512345123451234512345_123451234512345"
+
+-- Iteration 4 --
+string(46) "-2345-2345-2345-2345-2345-2345_-2345-2345-2345"
+
+-- Iteration 5 --
+string(37) "10.510.510.510.510.510.5_10.510.510.5"
+
+-- Iteration 6 --
+string(46) "-10.5-10.5-10.5-10.5-10.5-10.5_-10.5-10.5-10.5"
+
+-- Iteration 7 --
+string(109) "123456789000123456789000123456789000123456789000123456789000123456789000_123456789000123456789000123456789000"
+
+-- Iteration 8 --
+string(118) "1.23456789E-91.23456789E-91.23456789E-91.23456789E-91.23456789E-91.23456789E-9_1.23456789E-91.23456789E-91.23456789E-9"
+
+-- Iteration 9 --
+string(28) "0.50.50.50.50.50.5_0.50.50.5"
+
+-- Iteration 10 --
+string(1) "_"
+
+-- Iteration 11 --
+string(1) "_"
+
+-- Iteration 12 --
+string(10) "111111_111"
+
+-- Iteration 13 --
+string(1) "_"
+
+-- Iteration 14 --
+string(10) "111111_111"
+
+-- Iteration 15 --
+string(1) "_"
+
+-- Iteration 16 --
+string(1) "_"
+
+-- Iteration 17 --
+string(1) "_"
+
+-- Iteration 18 --
+string(46) "UTF-8UTF-8UTF-8UTF-8UTF-8UTF-8_UTF-8UTF-8UTF-8"
+
+-- Iteration 19 --
+string(46) "UTF-8UTF-8UTF-8UTF-8UTF-8UTF-8_UTF-8UTF-8UTF-8"
+
+-- Iteration 20 --
+string(46) "UTF-8UTF-8UTF-8UTF-8UTF-8UTF-8_UTF-8UTF-8UTF-8"
+
+-- Iteration 21 --
+string(46) "UTF-8UTF-8UTF-8UTF-8UTF-8UTF-8_UTF-8UTF-8UTF-8"
+
+-- Iteration 22 --
+string(1) "_"
+
+-- Iteration 23 --
+string(1) "_"
+
+-- Iteration 24 --
+
+Warning: mb_ereg_replace() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_replace_variation3.phpt b/ext/mbstring/tests/mb_ereg_replace_variation3.phpt
new file mode 100644
index 000000000..09da6cd3e
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_variation3.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test mb_ereg_replace() function : usage variations
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_ereg_replace(string pattern, string replacement, string string [, string option])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_ereg_replace() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$pattern = '[a-z]';
+$replacement = 'string_val';
+$option = '';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_ereg_replace($pattern, $replacement, $input, $option) );
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_replace() : usage variations ***
+
+-- Iteration 1 --
+string(1) "0"
+
+-- Iteration 2 --
+string(1) "1"
+
+-- Iteration 3 --
+string(5) "12345"
+
+-- Iteration 4 --
+string(5) "-2345"
+
+-- Iteration 5 --
+string(4) "10.5"
+
+-- Iteration 6 --
+string(5) "-10.5"
+
+-- Iteration 7 --
+string(12) "123456789000"
+
+-- Iteration 8 --
+string(13) "1.23456789E-9"
+
+-- Iteration 9 --
+string(3) "0.5"
+
+-- Iteration 10 --
+string(0) ""
+
+-- Iteration 11 --
+string(0) ""
+
+-- Iteration 12 --
+string(1) "1"
+
+-- Iteration 13 --
+string(0) ""
+
+-- Iteration 14 --
+string(1) "1"
+
+-- Iteration 15 --
+string(0) ""
+
+-- Iteration 16 --
+string(0) ""
+
+-- Iteration 17 --
+string(0) ""
+
+-- Iteration 18 --
+string(5) "UTF-8"
+
+-- Iteration 19 --
+string(5) "UTF-8"
+
+-- Iteration 20 --
+string(5) "UTF-8"
+
+-- Iteration 21 --
+string(5) "UTF-8"
+
+-- Iteration 22 --
+string(0) ""
+
+-- Iteration 23 --
+string(0) ""
+
+-- Iteration 24 --
+
+Warning: mb_ereg_replace() expects parameter 3 to be string, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_ereg_replace_variation4.phpt b/ext/mbstring/tests/mb_ereg_replace_variation4.phpt
new file mode 100644
index 000000000..05b4f60da
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_variation4.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test mb_ereg_replace() function : usage variations
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_ereg_replace(string pattern, string replacement, string string [, string option])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_ereg_replace() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$pattern = '[a-k]';
+$replacement = '1';
+$string = 'string_val';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_ereg_replace($pattern, $replacement, $string, $input) );
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_replace() : usage variations ***
+
+-- Iteration 1 --
+string(10) "str1n1_v1l"
+
+-- Iteration 2 --
+string(10) "str1n1_v1l"
+
+-- Iteration 3 --
+string(10) "str1n1_v1l"
+
+-- Iteration 4 --
+string(10) "str1n1_v1l"
+
+-- Iteration 5 --
+string(10) "str1n1_v1l"
+
+-- Iteration 6 --
+string(10) "str1n1_v1l"
+
+-- Iteration 7 --
+string(10) "str1n1_v1l"
+
+-- Iteration 8 --
+string(10) "str1n1_v1l"
+
+-- Iteration 9 --
+string(10) "str1n1_v1l"
+
+-- Iteration 10 --
+string(10) "str1n1_v1l"
+
+-- Iteration 11 --
+string(10) "str1n1_v1l"
+
+-- Iteration 12 --
+string(10) "str1n1_v1l"
+
+-- Iteration 13 --
+string(10) "str1n1_v1l"
+
+-- Iteration 14 --
+string(10) "str1n1_v1l"
+
+-- Iteration 15 --
+string(10) "str1n1_v1l"
+
+-- Iteration 16 --
+string(10) "str1n1_v1l"
+
+-- Iteration 17 --
+string(10) "str1n1_v1l"
+
+-- Iteration 18 --
+string(10) "str1n1_v1l"
+
+-- Iteration 19 --
+string(10) "str1n1_v1l"
+
+-- Iteration 20 --
+string(10) "str1n1_v1l"
+
+-- Iteration 21 --
+string(10) "str1n1_v1l"
+
+-- Iteration 22 --
+string(10) "str1n1_v1l"
+
+-- Iteration 23 --
+string(10) "str1n1_v1l"
+
+-- Iteration 24 --
+
+Warning: mb_ereg_replace() expects parameter 4 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_variation3.phpt b/ext/mbstring/tests/mb_ereg_variation3.phpt
index 0236e4410..d30ddc786 100644
--- a/ext/mbstring/tests/mb_ereg_variation3.phpt
+++ b/ext/mbstring/tests/mb_ereg_variation3.phpt
@@ -21,18 +21,18 @@ echo "*** Testing mb_ereg() : variation ***\n";
mb_regex_encoding('utf-8'); // have to set otherwise won't match $mb properly
$mb = base64_decode('5pel5pys6Kqe');
-$character_classes = array ('aB1' => '[[:alnum:]]+', /*1*/
- 'aBcD' => '[[:alpha:]]+',
- 'ab/=' => '[[:ascii:]]+',
- " \t" => '[[:blank:]]+',
- '234' => '[[:digit:]]+', /*5*/
- "$mb" => '[[:graph:]]+',
- 'fjds' => '[[:lower:]]+',
- "$mb\t" => '[[:print:]]+',
- '.!"*@' => '[[:punct:]]+',
- "\t" => '[[:space:]]+', /*10*/
- 'IDSJV' => '[[:upper:]]+',
- '3b5D' => '[[:xdigit:]]+'); /*12*/
+$character_classes = array (b'aB1' => b'[[:alnum:]]+', /*1*/
+ b'aBcD' => b'[[:alpha:]]+',
+ b'ab/=' => b'[[:ascii:]]+',
+ b" \t" => b'[[:blank:]]+',
+ b'234' => b'[[:digit:]]+', /*5*/
+ "$mb" => b'[[:graph:]]+',
+ b'fjds' => b'[[:lower:]]+',
+ b"$mb\t" => b'[[:print:]]+',
+ b'.!"*@' => b'[[:punct:]]+',
+ b"\t" => b'[[:space:]]+', /*10*/
+ b'IDSJV' => b'[[:upper:]]+',
+ b'3b5D' => b'[[:xdigit:]]+'); /*12*/
$iterator = 1;
foreach($character_classes as $string => $pattern) {
@@ -42,11 +42,7 @@ foreach($character_classes as $string => $pattern) {
// make sure any multibyte output is in base 64
echo "\n-- Iteration $iterator --\n";
var_dump(mb_ereg($pattern, $string, $regs));
- if (strpos($string, $mb) === FALSE) {
- var_dump($regs);
- } else {
- base64_encode_var_dump($regs);
- }
+ base64_encode_var_dump($regs);
$iterator++;
}
/**
@@ -74,42 +70,42 @@ function base64_encode_var_dump($regs) {
echo "Done";
?>
---EXPECTF--
+--EXPECT--
*** Testing mb_ereg() : variation ***
-- Iteration 1 --
int(3)
array(1) {
[0]=>
- string(3) "aB1"
+ string(4) "YUIx"
}
-- Iteration 2 --
int(4)
array(1) {
[0]=>
- string(4) "aBcD"
+ string(8) "YUJjRA=="
}
-- Iteration 3 --
int(4)
array(1) {
[0]=>
- string(4) "ab/="
+ string(8) "YWIvPQ=="
}
-- Iteration 4 --
int(2)
array(1) {
[0]=>
- string(2) " "
+ string(4) "IAk="
}
-- Iteration 5 --
int(3)
array(1) {
[0]=>
- string(3) "234"
+ string(4) "MjM0"
}
-- Iteration 6 --
@@ -123,7 +119,7 @@ array(1) {
int(4)
array(1) {
[0]=>
- string(4) "fjds"
+ string(8) "Zmpkcw=="
}
-- Iteration 8 --
@@ -137,27 +133,27 @@ array(1) {
int(5)
array(1) {
[0]=>
- string(5) ".!"*@"
+ string(8) "LiEiKkA="
}
-- Iteration 10 --
int(1)
array(1) {
[0]=>
- string(1) " "
+ string(4) "CQ=="
}
-- Iteration 11 --
int(5)
array(1) {
[0]=>
- string(5) "IDSJV"
+ string(8) "SURTSlY="
}
-- Iteration 12 --
int(4)
array(1) {
[0]=>
- string(4) "3b5D"
+ string(8) "M2I1RA=="
}
Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_variation4.phpt b/ext/mbstring/tests/mb_ereg_variation4.phpt
index 7f7d6dfc9..788d4feff 100644
--- a/ext/mbstring/tests/mb_ereg_variation4.phpt
+++ b/ext/mbstring/tests/mb_ereg_variation4.phpt
@@ -23,19 +23,19 @@ mb_regex_encoding('utf-8');
//contains japanese characters, ASCII digits and different, UTF-8 encoded digits
$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
-$character_classes = array ('[[:alnum:]]+', /*1*/
- '[[:alpha:]]+',
- '[[:ascii:]]+',
- '[[:blank:]]+',
- '[[:cntrl:]]+',/*5*/
- '[[:digit:]]+',
- '[[:graph:]]+',
- '[[:lower:]]+',
- '[[:print:]]+',
- '[[:punct:]]+', /*10*/
- '[[:space:]]+',
- '[[:upper:]]+',
- '[[:xdigit:]]+'); /*13*/
+$character_classes = array (b'[[:alnum:]]+', /*1*/
+ b'[[:alpha:]]+',
+ b'[[:ascii:]]+',
+ b'[[:blank:]]+',
+ b'[[:cntrl:]]+',/*5*/
+ b'[[:digit:]]+',
+ b'[[:graph:]]+',
+ b'[[:lower:]]+',
+ b'[[:print:]]+',
+ b'[[:punct:]]+', /*10*/
+ b'[[:space:]]+',
+ b'[[:upper:]]+',
+ b'[[:xdigit:]]+'); /*13*/
$iterator = 1;
foreach ($character_classes as $pattern) {
diff --git a/ext/mbstring/tests/mb_ereg_variation5.phpt b/ext/mbstring/tests/mb_ereg_variation5.phpt
index 95bc59919..1cecb0942 100644
--- a/ext/mbstring/tests/mb_ereg_variation5.phpt
+++ b/ext/mbstring/tests/mb_ereg_variation5.phpt
@@ -20,16 +20,16 @@ echo "*** Testing mb_ereg() : usage variations ***\n";
mb_regex_encoding('utf-8');
-$string_ascii = 'This is an English string. 0123456789.';
+$string_ascii = b'This is an English string. 0123456789.';
$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
-$regex = '^.*?[[:blank:]]?[[:punct:][:digit:]]+\.?$';
+$regex = b'^.*?[[:blank:]]?[[:punct:][:digit:]]+\.?$';
echo "\nASCII String without \$regs arg:\t\t";
var_dump(mb_ereg($regex, $string_ascii));
echo "ASCII String with \$regs arg:\n";
var_dump(mb_ereg($regex, $string_ascii, $regs_ascii));
-var_dump($regs_ascii);
+base64_encode_var_dump($regs_ascii);
echo "\nMultibyte String without \$regs arg:\t";
var_dump(mb_ereg($regex, $string_mb));
@@ -69,7 +69,7 @@ ASCII String with $regs arg:
int(38)
array(1) {
[0]=>
- string(38) "This is an English string. 0123456789."
+ string(52) "VGhpcyBpcyBhbiBFbmdsaXNoIHN0cmluZy4gMDEyMzQ1Njc4OS4="
}
Multibyte String without $regs arg: int(1)
diff --git a/ext/mbstring/tests/mb_ereg_variation6.phpt b/ext/mbstring/tests/mb_ereg_variation6.phpt
index 33d2ee571..0d8687b95 100644
--- a/ext/mbstring/tests/mb_ereg_variation6.phpt
+++ b/ext/mbstring/tests/mb_ereg_variation6.phpt
@@ -24,20 +24,27 @@ if(mb_regex_encoding('utf-8') == true) {
echo "Could not set regex encoding to utf-8\n";
}
-$regex_char = array ('\w+', '\W+', '\s+', '\S+', '\d+', '\D+', '\b', '\B');
-
-$string_ascii = 'This is an English string. 0123456789.';
+$regex_char = array ('\w+' => b'\w+',
+ '\W+' => b'\W+',
+ '\s+' => b'\s+',
+ '\S+' => b'\S+',
+ '\d+' => b'\d+',
+ '\D+' => b'\D+',
+ '\b' => b'\b',
+ '\B' => b'\B');
+
+$string_ascii = b'This is an English string. 0123456789.';
$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
-foreach ($regex_char as $char) {
- echo "\n--** Pattern is: $char **--\n";
+foreach ($regex_char as $displayChar => $char) {
+ echo "\n--** Pattern is: $displayChar **--\n";
if (@$regs_ascii || @$regs_mb) {
$regs_ascii = null;
$regs_mb = null;
}
echo "-- ASCII String: --\n";
var_dump(mb_ereg($char, $string_ascii, $regs_ascii));
- var_dump($regs_ascii);
+ base64_encode_var_dump($regs_ascii);
echo "-- Multibyte String: --\n";
var_dump(mb_ereg($char, $string_mb, $regs_mb));
@@ -70,7 +77,7 @@ function base64_encode_var_dump($regs) {
echo "Done";
?>
---EXPECTF--
+--EXPECT--
*** Testing mb_ereg() : usage variations ***
Regex encoding set to utf-8
@@ -79,7 +86,7 @@ Regex encoding set to utf-8
int(4)
array(1) {
[0]=>
- string(4) "This"
+ string(8) "VGhpcw=="
}
-- Multibyte String: --
int(27)
@@ -93,7 +100,7 @@ array(1) {
int(1)
array(1) {
[0]=>
- string(1) " "
+ string(4) "IA=="
}
-- Multibyte String: --
int(3)
@@ -107,7 +114,7 @@ array(1) {
int(1)
array(1) {
[0]=>
- string(1) " "
+ string(4) "IA=="
}
-- Multibyte String: --
bool(false)
@@ -118,7 +125,7 @@ NULL
int(4)
array(1) {
[0]=>
- string(4) "This"
+ string(8) "VGhpcw=="
}
-- Multibyte String: --
int(53)
@@ -132,7 +139,7 @@ array(1) {
int(10)
array(1) {
[0]=>
- string(10) "0123456789"
+ string(16) "MDEyMzQ1Njc4OQ=="
}
-- Multibyte String: --
int(20)
@@ -146,7 +153,7 @@ array(1) {
int(27)
array(1) {
[0]=>
- string(27) "This is an English string. "
+ string(36) "VGhpcyBpcyBhbiBFbmdsaXNoIHN0cmluZy4g"
}
-- Multibyte String: --
int(30)
diff --git a/ext/mbstring/tests/mb_ereg_variation7.phpt b/ext/mbstring/tests/mb_ereg_variation7.phpt
index 81c958957..170497d80 100644
--- a/ext/mbstring/tests/mb_ereg_variation7.phpt
+++ b/ext/mbstring/tests/mb_ereg_variation7.phpt
@@ -27,10 +27,10 @@ if(mb_regex_encoding('utf-8') == true) {
echo "Could not set regex encoding to utf-8\n";
}
-$string_ascii = 'This is an English string. 0123456789.';
-$regex_ascii = '([A-Z]\w{1,4}is( [aeiou]|h)) ?.*\.\s[0-9]+(5([6-9][79]){2})[[:punct:]]$';
+$string_ascii = b'This is an English string. 0123456789.';
+$regex_ascii = b'([A-Z]\w{1,4}is( [aeiou]|h)) ?.*\.\s[0-9]+(5([6-9][79]){2})[[:punct:]]$';
var_dump(mb_ereg($regex_ascii, $string_ascii, $regs_ascii));
-var_dump($regs_ascii);
+base64_encode_var_dump($regs_ascii);
$string_mb = base64_decode('zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==');
$regex_mb = base64_decode("W86RLc6pXShcdysgKSvOtVvOsS3PiVxzXSvOui4qKM+MfM6/KS4qXC5cc1swLTldKyg1KFs2LTldWzc5XSl7Mn0pW1s6cHVuY3Q6XV0k");
@@ -62,21 +62,21 @@ function base64_encode_var_dump($regs) {
echo "Done";
?>
---EXPECTF--
+--EXPECT--
*** Testing mb_ereg() : usage variations ***
Regex encoding set to utf-8
int(38)
array(5) {
[0]=>
- string(38) "This is an English string. 0123456789."
+ string(52) "VGhpcyBpcyBhbiBFbmdsaXNoIHN0cmluZy4gMDEyMzQ1Njc4OS4="
[1]=>
- string(6) "This i"
+ string(8) "VGhpcyBp"
[2]=>
- string(2) " i"
+ string(4) "IGk="
[3]=>
- string(5) "56789"
+ string(8) "NTY3ODk="
[4]=>
- string(2) "89"
+ string(4) "ODk="
}
int(64)
array(5) {
diff --git a/ext/mbstring/tests/mb_internal_encoding_ini_basic2.phpt b/ext/mbstring/tests/mb_internal_encoding_ini_basic2.phpt
new file mode 100644
index 000000000..241e1a692
--- /dev/null
+++ b/ext/mbstring/tests/mb_internal_encoding_ini_basic2.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test INI mbstring.internal_encoding basic - encoding when valid specified
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--INI--
+mbstring.internal_encoding=ISO-8859-7
+--FILE--
+<?php
+
+echo "*** Testing INI mbstring.internal_encoding : basic functionality ***\n";
+
+echo mb_internal_encoding()."\n";
+echo ini_get('mbstring.internal_encoding')."\n";
+mb_internal_encoding('UTF-8');
+echo mb_internal_encoding()."\n";
+echo ini_get('mbstring.internal_encoding')."\n";
+
+?>
+===DONE===
+--EXPECT--
+*** Testing INI mbstring.internal_encoding : basic functionality ***
+ISO-8859-7
+ISO-8859-7
+UTF-8
+ISO-8859-7
+===DONE===
diff --git a/ext/mbstring/tests/mb_regex_encoding_variation2.phpt b/ext/mbstring/tests/mb_regex_encoding_variation2.phpt
new file mode 100644
index 000000000..fc9c60037
--- /dev/null
+++ b/ext/mbstring/tests/mb_regex_encoding_variation2.phpt
@@ -0,0 +1,420 @@
+--TEST--
+Test mb_regex_encoding() function : usage variations - test different encodings
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_regex_encoding') or die("skip mb_regex_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_regex_encoding([string $encoding])
+ * Description: Returns the current encoding for regex as a string.
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test all listed encoding types from php.net to check all are known to function
+ * NB: The strings passed are *NOT* necessarily encoded in the encoding passed to the function.
+ * This test is purely to see whether the function recognises the encoding.
+ */
+
+echo "*** Testing mb_regex_encoding() : usage variations ***\n";
+
+$encoding = array('UCS-4', /*1*/
+ 'UCS-4BE',
+ 'UCS-4LE',
+ 'UCS-2',
+ 'UCS-2BE', /*5*/
+ 'UCS-2LE',
+ 'UTF-32',
+ 'UTF-32BE',
+ 'UTF-32LE',
+ 'UTF-16', /*10*/
+ 'UTF-16BE',
+ 'UTF-16LE',
+ 'UTF-7',
+ 'UTF7-IMAP',
+ 'UTF-8', /*15*/
+ 'ASCII',
+ 'EUC-JP',
+ 'SJIS',
+ 'eucJP-win',
+ 'SJIS-win', /*20*/
+ 'ISO-2022-JP',
+ 'JIS',
+ 'ISO-8859-1',
+ 'ISO-8859-2',
+ 'ISO-8859-3', /*25*/
+ 'ISO-8859-4',
+ 'ISO-8859-5',
+ 'ISO-8859-6',
+ 'ISO-8859-7',
+ 'ISO-8859-8', /*30*/
+ 'ISO-8859-9',
+ 'ISO-8859-10',
+ 'ISO-8859-13',
+ 'ISO-8859-14',
+ 'ISO-8859-15', /*35*/
+ 'byte2be',
+ 'byte2le',
+ 'byte4be',
+ 'byte4le',
+ 'BASE64', /*40*/
+ 'HTML-ENTITIES',
+ '7bit',
+ '8bit',
+ 'EUC-CN',
+ 'CP936', /*45*/
+ 'HZ',
+ 'EUC-TW',
+ 'CP950',
+ 'BIG-5',
+ 'EUC-KR', /*50*/
+ 'UHC',
+ 'ISO-2022-KR',
+ 'Windows-1251',
+ 'Windows-1252',
+ 'CP866', /*55*/
+ 'KOI8-R'); /*56*/
+
+$iterator = 1;
+foreach($encoding as $enc) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump(mb_regex_encoding());
+ var_dump(mb_regex_encoding($enc));
+ var_dump(mb_regex_encoding());
+ $iterator++;
+}
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_regex_encoding() : usage variations ***
+
+-- Iteration 1 --
+string(%d) "%s"
+bool(true)
+string(5) "UCS-4"
+
+-- Iteration 2 --
+string(5) "UCS-4"
+
+Warning: mb_regex_encoding(): Unknown encoding "UCS-4BE" in %s on line %d
+bool(false)
+string(5) "UCS-4"
+
+-- Iteration 3 --
+string(5) "UCS-4"
+bool(true)
+string(7) "UCS-4LE"
+
+-- Iteration 4 --
+string(7) "UCS-4LE"
+
+Warning: mb_regex_encoding(): Unknown encoding "UCS-2" in %s on line %d
+bool(false)
+string(7) "UCS-4LE"
+
+-- Iteration 5 --
+string(7) "UCS-4LE"
+
+Warning: mb_regex_encoding(): Unknown encoding "UCS-2BE" in %s on line %d
+bool(false)
+string(7) "UCS-4LE"
+
+-- Iteration 6 --
+string(7) "UCS-4LE"
+
+Warning: mb_regex_encoding(): Unknown encoding "UCS-2LE" in %s on line %d
+bool(false)
+string(7) "UCS-4LE"
+
+-- Iteration 7 --
+string(7) "UCS-4LE"
+bool(true)
+string(5) "UCS-4"
+
+-- Iteration 8 --
+string(5) "UCS-4"
+bool(true)
+string(5) "UCS-4"
+
+-- Iteration 9 --
+string(5) "UCS-4"
+bool(true)
+string(7) "UCS-4LE"
+
+-- Iteration 10 --
+string(7) "UCS-4LE"
+bool(true)
+string(6) "UTF-16"
+
+-- Iteration 11 --
+string(6) "UTF-16"
+bool(true)
+string(6) "UTF-16"
+
+-- Iteration 12 --
+string(6) "UTF-16"
+bool(true)
+string(8) "UTF-16LE"
+
+-- Iteration 13 --
+string(8) "UTF-16LE"
+
+Warning: mb_regex_encoding(): Unknown encoding "UTF-7" in %s on line %d
+bool(false)
+string(8) "UTF-16LE"
+
+-- Iteration 14 --
+string(8) "UTF-16LE"
+
+Warning: mb_regex_encoding(): Unknown encoding "UTF7-IMAP" in %s on line %d
+bool(false)
+string(8) "UTF-16LE"
+
+-- Iteration 15 --
+string(8) "UTF-16LE"
+bool(true)
+string(5) "UTF-8"
+
+-- Iteration 16 --
+string(5) "UTF-8"
+bool(true)
+string(5) "ASCII"
+
+-- Iteration 17 --
+string(5) "ASCII"
+bool(true)
+string(6) "EUC-JP"
+
+-- Iteration 18 --
+string(6) "EUC-JP"
+bool(true)
+string(4) "SJIS"
+
+-- Iteration 19 --
+string(4) "SJIS"
+bool(true)
+string(6) "EUC-JP"
+
+-- Iteration 20 --
+string(6) "EUC-JP"
+bool(true)
+string(4) "SJIS"
+
+-- Iteration 21 --
+string(4) "SJIS"
+
+Warning: mb_regex_encoding(): Unknown encoding "ISO-2022-JP" in %s on line %d
+bool(false)
+string(4) "SJIS"
+
+-- Iteration 22 --
+string(4) "SJIS"
+
+Warning: mb_regex_encoding(): Unknown encoding "JIS" in %s on line %d
+bool(false)
+string(4) "SJIS"
+
+-- Iteration 23 --
+string(4) "SJIS"
+bool(true)
+string(10) "ISO-8859-1"
+
+-- Iteration 24 --
+string(10) "ISO-8859-1"
+bool(true)
+string(10) "ISO-8859-2"
+
+-- Iteration 25 --
+string(10) "ISO-8859-2"
+bool(true)
+string(10) "ISO-8859-3"
+
+-- Iteration 26 --
+string(10) "ISO-8859-3"
+bool(true)
+string(10) "ISO-8859-4"
+
+-- Iteration 27 --
+string(10) "ISO-8859-4"
+bool(true)
+string(10) "ISO-8859-5"
+
+-- Iteration 28 --
+string(10) "ISO-8859-5"
+bool(true)
+string(10) "ISO-8859-6"
+
+-- Iteration 29 --
+string(10) "ISO-8859-6"
+bool(true)
+string(10) "ISO-8859-7"
+
+-- Iteration 30 --
+string(10) "ISO-8859-7"
+bool(true)
+string(10) "ISO-8859-8"
+
+-- Iteration 31 --
+string(10) "ISO-8859-8"
+bool(true)
+string(10) "ISO-8859-9"
+
+-- Iteration 32 --
+string(10) "ISO-8859-9"
+bool(true)
+string(11) "ISO-8859-10"
+
+-- Iteration 33 --
+string(11) "ISO-8859-10"
+bool(true)
+string(11) "ISO-8859-13"
+
+-- Iteration 34 --
+string(11) "ISO-8859-13"
+bool(true)
+string(11) "ISO-8859-14"
+
+-- Iteration 35 --
+string(11) "ISO-8859-14"
+bool(true)
+string(11) "ISO-8859-15"
+
+-- Iteration 36 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "byte2be" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 37 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "byte2le" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 38 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "byte4be" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 39 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "byte4le" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 40 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "BASE64" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 41 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "HTML-ENTITIES" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 42 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "7bit" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 43 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "8bit" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 44 --
+string(11) "ISO-8859-15"
+bool(true)
+string(6) "EUC-CN"
+
+-- Iteration 45 --
+string(6) "EUC-CN"
+
+Warning: mb_regex_encoding(): Unknown encoding "CP936" in %s on line %d
+bool(false)
+string(6) "EUC-CN"
+
+-- Iteration 46 --
+string(6) "EUC-CN"
+
+Warning: mb_regex_encoding(): Unknown encoding "HZ" in %s on line %d
+bool(false)
+string(6) "EUC-CN"
+
+-- Iteration 47 --
+string(6) "EUC-CN"
+bool(true)
+string(6) "EUC-TW"
+
+-- Iteration 48 --
+string(6) "EUC-TW"
+
+Warning: mb_regex_encoding(): Unknown encoding "CP950" in %s on line %d
+bool(false)
+string(6) "EUC-TW"
+
+-- Iteration 49 --
+string(6) "EUC-TW"
+bool(true)
+string(4) "BIG5"
+
+-- Iteration 50 --
+string(4) "BIG5"
+bool(true)
+string(6) "EUC-KR"
+
+-- Iteration 51 --
+string(6) "EUC-KR"
+
+Warning: mb_regex_encoding(): Unknown encoding "UHC" in %s on line %d
+bool(false)
+string(6) "EUC-KR"
+
+-- Iteration 52 --
+string(6) "EUC-KR"
+
+Warning: mb_regex_encoding(): Unknown encoding "ISO-2022-KR" in %s on line %d
+bool(false)
+string(6) "EUC-KR"
+
+-- Iteration 53 --
+string(6) "EUC-KR"
+
+Warning: mb_regex_encoding(): Unknown encoding "Windows-1251" in %s on line %d
+bool(false)
+string(6) "EUC-KR"
+
+-- Iteration 54 --
+string(6) "EUC-KR"
+
+Warning: mb_regex_encoding(): Unknown encoding "Windows-1252" in %s on line %d
+bool(false)
+string(6) "EUC-KR"
+
+-- Iteration 55 --
+string(6) "EUC-KR"
+
+Warning: mb_regex_encoding(): Unknown encoding "CP866" in %s on line %d
+bool(false)
+string(6) "EUC-KR"
+
+-- Iteration 56 --
+string(6) "EUC-KR"
+bool(true)
+string(5) "KOI8R"
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_split.phpt b/ext/mbstring/tests/mb_split.phpt
index abe12763e..6c0283fe8 100644
--- a/ext/mbstring/tests/mb_split.phpt
+++ b/ext/mbstring/tests/mb_split.phpt
@@ -23,15 +23,15 @@ mbstring.func_overload=0
}
}
- var_dump( mb_split( " ", "a b c d e f g" )
- == mb_split( "[[:space:]]", "a\nb\tc\nd e f g" ) );
+ var_dump( mb_split( b" ", b"a b c d e f g" )
+ == mb_split( b"[[:space:]]", b"a\nb\tc\nd e f g" ) );
for ( $i = 0; $i < 5; ++$i ) {
- verify_split( " ", "a\tb\tc\td e\tf g", $i );
+ verify_split( b" ", b"a\tb\tc\td e\tf g", $i );
}
for ( $i = 1; $i < 5; ++$i ) {
- verify_split( "\xa1\xa1+", "\xa1\xa1\xa1\xa2\xa2\xa1\xa1\xa1\xa1\xa1\xa1\xa2\xa2\xa1\xa1\xa1", $i );
+ verify_split( b"\xa1\xa1+", b"\xa1\xa1\xa1\xa2\xa2\xa1\xa1\xa1\xa1\xa1\xa1\xa2\xa2\xa1\xa1\xa1", $i );
}
?>
diff --git a/ext/mbstring/tests/mb_split_error.phpt b/ext/mbstring/tests/mb_split_error.phpt
new file mode 100644
index 000000000..b48e21520
--- /dev/null
+++ b/ext/mbstring/tests/mb_split_error.phpt
@@ -0,0 +1,50 @@
+--TEST--
+Test mb_split() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto array mb_split(string pattern, string string [, int limit])
+ * Description: split multibyte string into array by regular expression
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+/*
+ * test too few and too many parameters
+ */
+
+echo "*** Testing mb_split() : error conditions ***\n";
+
+
+//Test mb_split with one more than the expected number of arguments
+echo "\n-- Testing mb_split() function with more than expected no. of arguments --\n";
+$pattern = ' ';
+$string = 'a b c d e f g';
+$limit = 0;
+$extra_arg = 10;
+var_dump( mb_split($pattern, $string, $limit, $extra_arg) );
+
+// Testing mb_split with one less than the expected number of arguments
+echo "\n-- Testing mb_split() function with less than expected no. of arguments --\n";
+$pattern = 'string_val';
+var_dump( mb_split($pattern) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_split() : error conditions ***
+
+-- Testing mb_split() function with more than expected no. of arguments --
+
+Warning: mb_split() expects at most 3 parameters, 4 given in %s on line %d
+bool(false)
+
+-- Testing mb_split() function with less than expected no. of arguments --
+
+Warning: mb_split() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_split_variation1.phpt b/ext/mbstring/tests/mb_split_variation1.phpt
new file mode 100644
index 000000000..be3230e96
--- /dev/null
+++ b/ext/mbstring/tests/mb_split_variation1.phpt
@@ -0,0 +1,262 @@
+--TEST--
+Test mb_split() function : usage variations - different parameter types for pattern
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto array mb_split(string pattern, string string [, int limit])
+ * Description: split multibyte string into array by regular expression
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_split() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$string = 'a b c d e f g';
+$limit = 10;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_split($input, $string, $limit) );
+ $iterator++;
+};
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_split() : usage variations ***
+
+-- Iteration 1 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 2 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 3 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 4 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 5 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 6 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 7 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 8 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 9 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 10 --
+
+Warning: mb_split(): Empty regular expression in %s on line %d
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 11 --
+
+Warning: mb_split(): Empty regular expression in %s on line %d
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 12 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 13 --
+
+Warning: mb_split(): Empty regular expression in %s on line %d
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 14 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 15 --
+
+Warning: mb_split(): Empty regular expression in %s on line %d
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 16 --
+
+Warning: mb_split(): Empty regular expression in %s on line %d
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 17 --
+
+Warning: mb_split(): Empty regular expression in %s on line %d
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 18 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 19 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 20 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 21 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 22 --
+
+Warning: mb_split(): Empty regular expression in %s on line %d
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 23 --
+
+Warning: mb_split(): Empty regular expression in %s on line %d
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 24 --
+
+Warning: mb_split() expects parameter 1 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_split_variation2.phpt b/ext/mbstring/tests/mb_split_variation2.phpt
new file mode 100644
index 000000000..a6db2cc04
--- /dev/null
+++ b/ext/mbstring/tests/mb_split_variation2.phpt
@@ -0,0 +1,248 @@
+--TEST--
+Test mb_split() function : usage variations - different parameter types for string
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto array mb_split(string pattern, string string [, int limit])
+ * Description: split multibyte string into array by regular expression
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+
+echo "*** Testing mb_split() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$pattern = '[a-z]';
+$limit = 10;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_split($pattern, $input, $limit) );
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_split() : usage variations ***
+
+-- Iteration 1 --
+array(1) {
+ [0]=>
+ string(1) "0"
+}
+
+-- Iteration 2 --
+array(1) {
+ [0]=>
+ string(1) "1"
+}
+
+-- Iteration 3 --
+array(1) {
+ [0]=>
+ string(5) "12345"
+}
+
+-- Iteration 4 --
+array(1) {
+ [0]=>
+ string(5) "-2345"
+}
+
+-- Iteration 5 --
+array(1) {
+ [0]=>
+ string(4) "10.5"
+}
+
+-- Iteration 6 --
+array(1) {
+ [0]=>
+ string(5) "-10.5"
+}
+
+-- Iteration 7 --
+array(1) {
+ [0]=>
+ string(12) "123456789000"
+}
+
+-- Iteration 8 --
+array(1) {
+ [0]=>
+ string(13) "1.23456789E-9"
+}
+
+-- Iteration 9 --
+array(1) {
+ [0]=>
+ string(3) "0.5"
+}
+
+-- Iteration 10 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 11 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 12 --
+array(1) {
+ [0]=>
+ string(1) "1"
+}
+
+-- Iteration 13 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 14 --
+array(1) {
+ [0]=>
+ string(1) "1"
+}
+
+-- Iteration 15 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 16 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 17 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 18 --
+array(1) {
+ [0]=>
+ string(5) "UTF-8"
+}
+
+-- Iteration 19 --
+array(1) {
+ [0]=>
+ string(5) "UTF-8"
+}
+
+-- Iteration 20 --
+array(1) {
+ [0]=>
+ string(5) "UTF-8"
+}
+
+-- Iteration 21 --
+array(1) {
+ [0]=>
+ string(5) "UTF-8"
+}
+
+-- Iteration 22 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 23 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 24 --
+
+Warning: mb_split() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_split_variation3.phpt b/ext/mbstring/tests/mb_split_variation3.phpt
new file mode 100644
index 000000000..5422b169c
--- /dev/null
+++ b/ext/mbstring/tests/mb_split_variation3.phpt
@@ -0,0 +1,331 @@
+--TEST--
+Test mb_split() function : usage variations - different parameter types for limit
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto array mb_split(string pattern, string string [, int limit])
+ * Description: split multibyte string into array by regular expression
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_split() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$pattern = '[a-z]';
+$string = 'string_val';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_split($pattern, $string, $input) );
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_split() : usage variations ***
+
+-- Iteration 1 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 2 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 3 --
+array(10) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(0) ""
+ [4]=>
+ string(0) ""
+ [5]=>
+ string(0) ""
+ [6]=>
+ string(1) "_"
+ [7]=>
+ string(0) ""
+ [8]=>
+ string(0) ""
+ [9]=>
+ string(0) ""
+}
+
+-- Iteration 4 --
+array(10) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(0) ""
+ [4]=>
+ string(0) ""
+ [5]=>
+ string(0) ""
+ [6]=>
+ string(1) "_"
+ [7]=>
+ string(0) ""
+ [8]=>
+ string(0) ""
+ [9]=>
+ string(0) ""
+}
+
+-- Iteration 5 --
+array(10) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(0) ""
+ [4]=>
+ string(0) ""
+ [5]=>
+ string(0) ""
+ [6]=>
+ string(1) "_"
+ [7]=>
+ string(0) ""
+ [8]=>
+ string(0) ""
+ [9]=>
+ string(0) ""
+}
+
+-- Iteration 6 --
+array(10) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(0) ""
+ [4]=>
+ string(0) ""
+ [5]=>
+ string(0) ""
+ [6]=>
+ string(1) "_"
+ [7]=>
+ string(0) ""
+ [8]=>
+ string(0) ""
+ [9]=>
+ string(0) ""
+}
+
+-- Iteration 7 --
+array(10) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(0) ""
+ [4]=>
+ string(0) ""
+ [5]=>
+ string(0) ""
+ [6]=>
+ string(1) "_"
+ [7]=>
+ string(0) ""
+ [8]=>
+ string(0) ""
+ [9]=>
+ string(0) ""
+}
+
+-- Iteration 8 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 9 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 10 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 11 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 12 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 13 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 14 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 15 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 16 --
+
+Warning: mb_split() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_split() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+
+Warning: mb_split() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 19 --
+
+Warning: mb_split() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 20 --
+
+Warning: mb_split() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 21 --
+
+Warning: mb_split() expects parameter 3 to be long, object given in %s on line %d
+bool(false)
+
+-- Iteration 22 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 23 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 24 --
+
+Warning: mb_split() expects parameter 3 to be long, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_stripos.phpt b/ext/mbstring/tests/mb_stripos.phpt
new file mode 100644
index 000000000..c21cdf3a5
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos.phpt
@@ -0,0 +1,178 @@
+--TEST--
+mb_stripos()
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+// TODO: Add more encodings
+
+//$debug=true;
+ini_set('include_path','.');
+include_once('common.inc');
+
+
+// Test string
+$euc_jp = b'0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。';
+
+// EUC-JP - With encoding parameter
+mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n");
+
+echo "== POSITIVE OFFSET ==\n";
+print mb_stripos($euc_jp,b'日本語', 0, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, b'0', 0, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, 3, 0, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, 0, 0, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp,b'日本語', 15, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, b'0', 15, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, 3, 15, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, 0, 15, 'EUC-JP') . "\n";
+
+// Negative offset
+// Note: PHP Warning - offset is negative.
+// Note: For offset(-15). It does not return position of latter string. (ie the same result as -50)
+echo "== NEGATIVE OFFSET ==\n";
+$r = mb_stripos($euc_jp,b'日本語', -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, b'0', -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, 3, -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, 0, -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp,b'日本語', -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, b'0', -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, 3, -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, 0, -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+
+// Out of range - should return false
+print ("== OUT OF RANGE ==\n");
+$r = mb_stripos($euc_jp,b'日本語', 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+$r = mb_stripos($euc_jp, b'0', 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+$r = mb_stripos($euc_jp, 3, 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+$r = mb_stripos($euc_jp, 0, 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+// Note: Returned NULL string
+// echo gettype($r). ' val '. $r ."\n";
+
+
+// Non-existent
+echo "== NON-EXISTENT ==\n";
+$r = mb_stripos($euc_jp, b'韓国語', 0, 'EUC-JP');
+($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
+$r = mb_stripos($euc_jp, b"\n", 0, 'EUC-JP');
+($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
+
+
+// EUC-JP - No encoding parameter
+echo "== NO ENCODING PARAMETER ==\n";
+mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
+
+print mb_stripos($euc_jp,b'日本語', 0) . "\n";
+print mb_stripos($euc_jp, b'0', 0) . "\n";
+print mb_stripos($euc_jp, 3, 0) . "\n";
+print mb_stripos($euc_jp, 0, 0) . "\n";
+
+$r = mb_stripos($euc_jp,b'韓国語', 0);
+($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
+$r = mb_stripos($euc_jp,b"\n", 0);
+($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
+
+// EUC-JP - No offset and encoding parameter
+echo "== NO OFFSET AND ENCODING PARAMETER ==\n";
+mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
+
+print mb_stripos($euc_jp,b'日本語') . "\n";
+print mb_stripos($euc_jp, b'0') . "\n";
+print mb_stripos($euc_jp, 3) . "\n";
+print mb_stripos($euc_jp, 0) . "\n";
+
+$r = mb_stripos($euc_jp,b'韓国語');
+($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
+$r = mb_stripos($euc_jp,b"\n");
+($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
+
+
+// Invalid Parameters
+echo "== INVALID PARAMETER TEST ==\n";
+
+$r = mb_stripos($euc_jp,'','EUC-JP');
+($r === FALSE) ? print("OK_NULL\n") : print("NG_NULL\n");
+$r = mb_stripos($euc_jp, $t_ary, 'EUC-JP');
+($r === FALSE) ? print("OK_ARRAY\n") : print("NG_ARRAY\n");
+$r = mb_stripos($euc_jp, $t_obj, 'EUC-JP');
+($r === FALSE) ? print("OK_OBJECT\n") : print("NG_OBJECT\n");
+$r = mb_stripos($euc_jp, $t_obj, 'BAD_ENCODING');
+($r === FALSE) ? print("OK_BAD_ENCODING\n") : print("NG_BAD_ENCODING\n");
+
+
+?>
+
+--EXPECT--
+== POSITIVE OFFSET ==
+10
+0
+3
+0
+34
+30
+33
+30
+== NEGATIVE OFFSET ==
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+== OUT OF RANGE ==
+OK_OUT_RANGE
+OK_OUT_RANGE
+OK_OUT_RANGE
+OK_OUT_RANGE
+== NON-EXISTENT ==
+OK_STR
+OK_NEWLINE
+== NO ENCODING PARAMETER ==
+10
+0
+3
+0
+OK_STR
+OK_NEWLINE
+== NO OFFSET AND ENCODING PARAMETER ==
+10
+0
+3
+0
+OK_STR
+OK_NEWLINE
+== INVALID PARAMETER TEST ==
+ERR: Warning
+OK_NULL
+ERR: Warning
+OK_ARRAY
+ERR: Warning
+OK_OBJECT
+ERR: Warning
+OK_BAD_ENCODING
+
diff --git a/ext/mbstring/tests/mb_stripos_basic.phpt b/ext/mbstring/tests/mb_stripos_basic.phpt
new file mode 100644
index 000000000..bb33bb107
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_basic.phpt
@@ -0,0 +1,158 @@
+--TEST--
+Test mb_stripos() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test basic functionality of mb_stripos with ASCII and multibyte characters
+ */
+
+echo "*** Testing mb_stripos() : basic functionality***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii strings
+$ascii_haystacks = array(
+ b'abc defabc def',
+ b'ABC DEFABC DEF',
+ b'Abc dEFaBC Def',
+);
+
+$ascii_needles = array(
+ // 4 good ones
+ b'DE',
+ b'de',
+ b'De',
+ b'dE',
+
+ //flag a swap between good and bad
+ '!',
+
+ // 4 bad ones
+ b'df',
+ b'Df',
+ b'dF',
+ b'DF'
+);
+
+//greek strings in UTF-8
+$greek_lower = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$greek_upper = base64_decode('zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6p');
+$greek_mixed = base64_decode('zrHOss6TzpTOlc6WzpfOmM65zrrOu868zr3Ovs6fzqDOoc6jzqTOpc+Gz4fPiM+J');
+$greek_haystacks = array($greek_lower, $greek_upper, $greek_mixed);
+
+$greek_nlower = base64_decode('zrzOvc6+zr8=');
+$greek_nupper = base64_decode('zpzOnc6ezp8=');
+$greek_nmixed1 = base64_decode('zpzOnc6+zr8=');
+$greek_nmixed2 = base64_decode('zrzOvc6+zp8=');
+
+$greek_blower = base64_decode('zpzOns6f');
+$greek_bupper = base64_decode('zrzOvs6/');
+$greek_bmixed1 = base64_decode('zpzOvs6/');
+$greek_bmixed2 = base64_decode('zrzOvs6f');
+$greek_needles = array(
+ // 4 good ones
+ $greek_nlower, $greek_nupper, $greek_nmixed1, $greek_nmixed2,
+
+ '!', // used to flag a swap between good and bad
+
+ // 4 bad ones
+ $greek_blower, $greek_bupper, $greek_bmixed1, $greek_bmixed2,
+);
+
+// try the basic options
+echo "\n -- ASCII Strings, needle should be found --\n";
+foreach ($ascii_needles as $needle) {
+ if ($needle == '!') {
+ echo "\n -- ASCII Strings, needle should not be found --\n";
+ }
+ else {
+ foreach ($ascii_haystacks as $haystack) {
+ var_dump(mb_stripos($haystack, $needle));
+ }
+ }
+}
+
+echo "\n -- Greek Strings, needle should be found --\n";
+foreach ($greek_needles as $needle) {
+ if ($needle == '!') {
+ echo "\n -- ASCII Strings, needle should not be found --\n";
+ }
+ else {
+ foreach ($greek_haystacks as $haystack) {
+ var_dump(mb_stripos($haystack, $needle));
+ }
+ }
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : basic functionality***
+
+ -- ASCII Strings, needle should be found --
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+
+ -- ASCII Strings, needle should not be found --
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+
+ -- Greek Strings, needle should be found --
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+
+ -- ASCII Strings, needle should not be found --
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_stripos_basic2.phpt b/ext/mbstring/tests/mb_stripos_basic2.phpt
new file mode 100644
index 000000000..f9131d987
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_basic2.phpt
@@ -0,0 +1,129 @@
+--TEST--
+Test mb_stripos() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test basic functionality of mb_stripos with ASCII and multibyte characters
+ */
+
+echo "*** Testing mb_stripos() : basic functionality***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii strings
+$ascii_haystacks = array(
+ b'abc defabc def',
+ b'ABC DEFABC DEF',
+ b'Abc dEFaBC Def',
+);
+
+$ascii_needles = array(
+ // 4 good ones
+ b'DE',
+ b'de',
+ b'De',
+ b'dE',
+);
+
+//greek strings in UTF-8
+$greek_lower = base64_decode('zrrOu868zr3Ovs6/z4DPgSDOus67zrzOvc6+zr/PgA==');
+$greek_upper = base64_decode('zprOm86czp3Ons6fzqDOoSDOms6bzpzOnc6ezp/OoA==');
+$greek_mixed = base64_decode('zrrOu868zr3Ovs6fzqDOoSDOus67zpzOnc6+zr/OoA==');
+$greek_haystacks = array($greek_lower, $greek_upper, $greek_mixed);
+
+$greek_nlower = base64_decode('zrzOvc6+zr8=');
+$greek_nupper = base64_decode('zpzOnc6ezp8=');
+$greek_nmixed1 = base64_decode('zpzOnc6+zr8=');
+$greek_nmixed2 = base64_decode('zrzOvc6+zp8=');
+
+$greek_needles = array(
+ // 4 good ones
+ $greek_nlower, $greek_nupper, $greek_nmixed1, $greek_nmixed2,
+);
+
+// try the basic options
+echo "\n -- ASCII Strings --\n";
+foreach ($ascii_needles as $needle) {
+ foreach ($ascii_haystacks as $haystack) {
+ var_dump(mb_stripos($haystack, $needle));
+ var_dump(mb_stripos($haystack, $needle, 6));
+ }
+}
+
+echo "\n -- Greek Strings --\n";
+foreach ($greek_needles as $needle) {
+ foreach ($greek_haystacks as $haystack) {
+ var_dump(mb_stripos($haystack, $needle));
+ var_dump(mb_stripos($haystack, $needle, 4));
+ }
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : basic functionality***
+
+ -- ASCII Strings --
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+
+ -- Greek Strings --
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+Done
+
diff --git a/ext/mbstring/tests/mb_stripos_error1.phpt b/ext/mbstring/tests/mb_stripos_error1.phpt
new file mode 100644
index 000000000..c4ea5d771
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_error1.phpt
@@ -0,0 +1,51 @@
+--TEST--
+Test mb_stripos() function : error conditions - Pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test how mb_stripos behaves when passed an incorrect number of arguments
+ */
+
+echo "*** Testing mb_stripos() : error conditions ***\n";
+
+
+//Test mb_stripos with one more than the expected number of arguments
+echo "\n-- Testing mb_stripos() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$offset = 10;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_stripos($haystack, $needle, $offset, $encoding, $extra_arg) );
+
+// Testing mb_stripos with one less than the expected number of arguments
+echo "\n-- Testing mb_stripos() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_stripos($haystack) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : error conditions ***
+
+-- Testing mb_stripos() function with more than expected no. of arguments --
+
+Warning: mb_stripos() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_stripos() function with less than expected no. of arguments --
+
+Warning: mb_stripos() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_stripos_error2.phpt b/ext/mbstring/tests/mb_stripos_error2.phpt
new file mode 100644
index 000000000..c5e5c8d3b
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_stripos() function : error conditions - Pass unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass an unknown encoding to mb_stripos() to test behaviour
+ */
+
+echo "*** Testing mb_stripos() : error conditions ***\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$offset = 2;
+$encoding = 'unknown-encoding';
+
+var_dump( mb_stripos($haystack, $needle, $offset, $encoding) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : error conditions ***
+
+Warning: mb_stripos(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_stripos_variation1.phpt b/ext/mbstring/tests/mb_stripos_variation1.phpt
new file mode 100644
index 000000000..ab7f75ee5
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_variation1.phpt
@@ -0,0 +1,183 @@
+--TEST--
+Test mb_stripos() function : usage variations - pass different data types to $haystack arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_stripos different data types as $haystack arg to test behaviour
+ */
+
+echo "*** Testing mb_stripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'string_val';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $haystack argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_stripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_stripos($input, $needle, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_stripos() expects parameter 1 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_stripos_variation2.phpt b/ext/mbstring/tests/mb_stripos_variation2.phpt
new file mode 100644
index 000000000..47a891fb7
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_variation2.phpt
@@ -0,0 +1,183 @@
+--TEST--
+Test mb_stripos() function : usage variations - pass different data types as $needle arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_stripos different data types as $needle arg to test behaviour
+ */
+
+echo "*** Testing mb_stripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'string_val';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $needle argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ b"string",
+ b'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_stripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_stripos($haystack, $input, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+int(0)
+
+-- Iteration 19 --
+int(0)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_stripos() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_stripos_variation3.phpt b/ext/mbstring/tests/mb_stripos_variation3.phpt
new file mode 100644
index 000000000..41a365abf
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_variation3.phpt
@@ -0,0 +1,203 @@
+--TEST--
+Test mb_stripos() function : usage variations - pass different data types as $offset arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_stripos different data types as $offset arg to test behaviour
+ */
+
+echo "*** Testing mb_stripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'A';
+$haystack = b'string_val';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $offest argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_stripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_stripos($haystack, $needle, $input, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : usage variations ***
+
+-- Iteration 1 --
+int(8)
+
+-- Iteration 2 --
+int(8)
+
+-- Iteration 3 --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+int(8)
+
+-- Iteration 9 --
+int(8)
+
+-- Iteration 10 --
+int(8)
+
+-- Iteration 11 --
+int(8)
+
+-- Iteration 12 --
+int(8)
+
+-- Iteration 13 --
+int(8)
+
+-- Iteration 14 --
+int(8)
+
+-- Iteration 15 --
+int(8)
+
+-- Iteration 16 --
+
+Warning: mb_stripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_stripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+
+Warning: mb_stripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 19 --
+
+Warning: mb_stripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 20 --
+
+Warning: mb_stripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 21 --
+
+Warning: mb_stripos() expects parameter 3 to be long, object given in %s on line %d
+bool(false)
+
+-- Iteration 22 --
+int(8)
+
+-- Iteration 23 --
+int(8)
+
+-- Iteration 24 --
+
+Warning: mb_stripos() expects parameter 3 to be long, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_stripos_variation4.phpt b/ext/mbstring/tests/mb_stripos_variation4.phpt
new file mode 100644
index 000000000..f330bbdae
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_variation4.phpt
@@ -0,0 +1,223 @@
+--TEST--
+Test mb_stripos() function : usage variations - pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_stripos different data types as $encoding arg to test behaviour
+ * Where possible 'UTF-8' has been entered as a string value
+ */
+
+echo "*** Testing mb_stripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'string_val';
+$needle = b'VaL';
+$offset = 0;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $input argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_stripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_stripos($haystack, $needle, $offset, $input));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_stripos() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_stripos(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_stripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_stripos(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_stripos(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_stripos(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_stripos(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_stripos(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_stripos(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_stripos(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_stripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_stripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(7)
+
+-- Iteration 19 --
+int(7)
+
+-- Iteration 20 --
+int(7)
+
+-- Iteration 21 --
+int(7)
+
+-- Iteration 22 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_stripos() expects parameter 4 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt b/ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt
new file mode 100644
index 000000000..134a4c3ec
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt
@@ -0,0 +1,119 @@
+--TEST--
+Test mb_stripos() function : usage variations - Pass different integers as $offset argument
+--XFAIL--
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test how mb_stripos() behaves when passed different integers as $offset argument
+ * The character length of $string_ascii and $string_mb is the same,
+ * and the needle appears at the same positions in both strings
+ */
+
+mb_internal_encoding('UTF-8');
+
+echo "*** Testing mb_stripos() : usage variations ***\n";
+
+$string_ascii = b'+Is an English string'; //21 chars
+$needle_ascii = b'G';
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); //21 chars
+$needle_mb = base64_decode('44CC');
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * mb_stripos should not be able to accept negative values as $offset.
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -10; $i <= 60; $i += 10) {
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ var_dump(mb_stripos($string_ascii, $needle_ascii, $i));
+ echo "--Multibyte String --\n";
+ var_dump(mb_stripos($string_mb, $needle_mb, $i, 'UTF-8'));
+}
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_stripos() : usage variations ***
+
+**-- Offset is: -10 --**
+-- ASCII String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 0 --**
+-- ASCII String --
+int(9)
+--Multibyte String --
+int(9)
+
+**-- Offset is: 10 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 20 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 30 --**
+-- ASCII String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 40 --**
+-- ASCII String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 50 --**
+-- ASCII String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 60 --**
+-- ASCII String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_stristr_basic.phpt b/ext/mbstring/tests/mb_stristr_basic.phpt
new file mode 100644
index 000000000..9340d3511
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_basic.phpt
@@ -0,0 +1,70 @@
+--TEST--
+Test mb_stristr() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'abcdef';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in lower case UTF-8
+$string_mb = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_upper, false, 'ISO-8859-1')));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_lower)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_mixed, true)));
+
+
+echo "\n-- ASCII string: needle doesn't exist --\n";
+var_dump(mb_stristr($string_ascii, '123'));
+
+echo "\n-- Multibyte string: needle exists --\n";
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_upper)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_lower, false, 'utf-8')));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_mixed, true)));
+
+
+echo "\n-- Multibyte string: needle doesn't exist --\n";
+$needle2 = base64_decode("zrzOvs6/");
+var_dump(mb_stristr($string_mb, $needle2));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_stristr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(10) "6263646566"
+string(10) "6263646566"
+string(2) "61"
+
+-- ASCII string: needle doesn't exist --
+bool(false)
+
+-- Multibyte string: needle exists --
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+string(44) "ceb1ceb2ceb3ceb4ceb5ceb6ceb7ceb8ceb9cebacebb"
+
+-- Multibyte string: needle doesn't exist --
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_error1.phpt b/ext/mbstring/tests/mb_stristr_error1.phpt
new file mode 100644
index 000000000..3c766c4fa
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_error1.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_stristr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : error conditions ***\n";
+
+
+//Test mb_stristr with one more than the expected number of arguments
+echo "\n-- Testing mb_stristr() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$part = true;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_stristr($haystack, $needle, $part, $encoding, $extra_arg) );
+
+// Testing mb_stristr with one less than the expected number of arguments
+echo "\n-- Testing mb_stristr() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_stristr($haystack) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : error conditions ***
+
+-- Testing mb_stristr() function with more than expected no. of arguments --
+
+Warning: mb_stristr() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_stristr() function with less than expected no. of arguments --
+
+Warning: mb_stristr() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_error2.phpt b/ext/mbstring/tests/mb_stristr_error2.phpt
new file mode 100644
index 000000000..73f13dc85
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_stristr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : error conditions ***\n";
+
+
+echo "\n-- Testing mb_stristr() with unknown encoding --\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$encoding = 'unknown-encoding';
+$part = true;
+var_dump( mb_stristr($haystack, $needle, $part, $encoding) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : error conditions ***
+
+-- Testing mb_stristr() with unknown encoding --
+
+Warning: mb_stristr(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_variation1.phpt b/ext/mbstring/tests/mb_stristr_variation1.phpt
new file mode 100644
index 000000000..ecea23eca
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_variation1.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_stristr() function : usage variation - various haystacks, needle won't be found
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$needle = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for haystack
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_stristr($value, $needle, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_stristr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_stristr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_stristr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_stristr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_stristr() expects parameter 1 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_stristr() expects parameter 1 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_variation2.phpt b/ext/mbstring/tests/mb_stristr_variation2.phpt
new file mode 100644
index 000000000..714c0e570
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_variation2.phpt
@@ -0,0 +1,215 @@
+--TEST--
+Test mb_stristr() function : usage variation - different types of needle.
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for needle
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_stristr($haystack, $value, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_stristr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_stristr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_stristr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_stristr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_stristr() expects parameter 2 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_stristr() expects parameter 2 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_variation3.phpt b/ext/mbstring/tests/mb_stristr_variation3.phpt
new file mode 100644
index 000000000..30a7e4989
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_variation3.phpt
@@ -0,0 +1,232 @@
+--TEST--
+Test mb_stristr() function : usage variation - different values for part
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // string data
+ 'string DQ' => "string",
+ 'string SQ' => 'string',
+ 'mixed case string' => "sTrInG",
+ 'heredoc' => $heredoc,
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for part
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ $res = mb_stristr($haystack, $needle, $value, $encoding);
+ if ($res === false) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : usage variation ***
+
+--int 0--
+string(8) "5f76616c"
+
+--int 1--
+string(12) "737472696e67"
+
+--int 12345--
+string(12) "737472696e67"
+
+--int -12345--
+string(12) "737472696e67"
+
+--float 10.5--
+string(12) "737472696e67"
+
+--float -10.5--
+string(12) "737472696e67"
+
+--float 12.3456789000e10--
+string(12) "737472696e67"
+
+--float -12.3456789000e10--
+string(12) "737472696e67"
+
+--float .5--
+string(12) "737472696e67"
+
+--empty array--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+string(8) "5f76616c"
+
+--lowercase null--
+string(8) "5f76616c"
+
+--lowercase true--
+string(12) "737472696e67"
+
+--lowercase false--
+string(8) "5f76616c"
+
+--uppercase TRUE--
+string(12) "737472696e67"
+
+--uppercase FALSE--
+string(8) "5f76616c"
+
+--empty string DQ--
+string(8) "5f76616c"
+
+--empty string SQ--
+string(8) "5f76616c"
+
+--string DQ--
+string(12) "737472696e67"
+
+--string SQ--
+string(12) "737472696e67"
+
+--mixed case string--
+string(12) "737472696e67"
+
+--heredoc--
+string(12) "737472696e67"
+
+--instance of classWithToString--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--undefined var--
+string(8) "5f76616c"
+
+--unset var--
+string(8) "5f76616c"
+
+--resource--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_variation4.phpt b/ext/mbstring/tests/mb_stristr_variation4.phpt
new file mode 100644
index 000000000..d547543ae
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_variation4.phpt
@@ -0,0 +1,227 @@
+--TEST--
+Test mb_stristr() function : usage variation - different encoding types
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$part = true;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "invalid";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+utf-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for encoding
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_stristr($haystack, $needle, $part, $value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : usage variation ***
+
+--int 0--
+Error: 2 - mb_stristr(): Unknown encoding "0", %s(%d)
+bool(false)
+
+--int 1--
+Error: 2 - mb_stristr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--int 12345--
+Error: 2 - mb_stristr(): Unknown encoding "12345", %s(%d)
+bool(false)
+
+--int -12345--
+Error: 2 - mb_stristr(): Unknown encoding "-2345", %s(%d)
+bool(false)
+
+--float 10.5--
+Error: 2 - mb_stristr(): Unknown encoding "10.5", %s(%d)
+bool(false)
+
+--float -10.5--
+Error: 2 - mb_stristr(): Unknown encoding "-10.5", %s(%d)
+bool(false)
+
+--float 12.3456789000e10--
+Error: 2 - mb_stristr(): Unknown encoding "123456789000", %s(%d)
+bool(false)
+
+--float -12.3456789000e10--
+Error: 2 - mb_stristr(): Unknown encoding "-123456789000", %s(%d)
+bool(false)
+
+--float .5--
+Error: 2 - mb_stristr(): Unknown encoding "0.5", %s(%d)
+bool(false)
+
+--empty array--
+Error: 2 - mb_stristr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_stristr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_stristr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_stristr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase true--
+Error: 2 - mb_stristr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--uppercase TRUE--
+Error: 2 - mb_stristr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--instance of classWithToString--
+Error: 2 - mb_stristr(): Unknown encoding "invalid", %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_stristr() expects parameter 4 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_stristr() expects parameter 4 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_variation5.phpt b/ext/mbstring/tests/mb_stristr_variation5.phpt
new file mode 100644
index 000000000..5d5482010
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_variation5.phpt
@@ -0,0 +1,69 @@
+--TEST--
+Test mb_stristr() function : usage variation - multiple needles
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii mixed case, multiple needles
+$string_ascii = b'abcDef zBcDyx';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in mixed case UTF-8 with multiple needles
+$string_mb = base64_decode('zrrOu868zr3Ovs6fzqDOoSDOus67zpzOnc6+zr/OoA==');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_upper, false)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_upper, true)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_lower, false)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_lower, true)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_mixed, false)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_mixed, true)));
+
+
+echo "\n-- Multibyte string: needle exists --\n";
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_upper, false)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_upper, true)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_lower, false)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_lower, true)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_mixed, false)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_mixed, true)));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_stristr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(24) "6263446566207a4263447978"
+string(2) "61"
+string(24) "6263446566207a4263447978"
+string(2) "61"
+string(24) "6263446566207a4263447978"
+string(2) "61"
+
+-- Multibyte string: needle exists --
+string(54) "cebccebdcebece9fcea0cea120cebacebbce9cce9dcebecebfcea0"
+string(8) "cebacebb"
+string(54) "cebccebdcebece9fcea0cea120cebacebbce9cce9dcebecebfcea0"
+string(8) "cebacebb"
+string(54) "cebccebdcebece9fcea0cea120cebacebbce9cce9dcebecebfcea0"
+string(8) "cebacebb"
+===DONE===
diff --git a/ext/mbstring/tests/mb_strlen_basic.phpt b/ext/mbstring/tests/mb_strlen_basic.phpt
index 6214f3069..a5dbe512b 100644
--- a/ext/mbstring/tests/mb_strlen_basic.phpt
+++ b/ext/mbstring/tests/mb_strlen_basic.phpt
@@ -18,7 +18,7 @@ function_exists('mb_strlen') or die("skip mb_strlen() is not available in this b
echo "*** Testing mb_strlen() : basic functionality***\n";
-$string_ascii = 'abc def';
+$string_ascii = b'abc def';
//Japanese string in UTF-8
$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
diff --git a/ext/mbstring/tests/mb_strlen_variation1.phpt b/ext/mbstring/tests/mb_strlen_variation1.phpt
index a64fad17e..3c9cfe3c8 100644
--- a/ext/mbstring/tests/mb_strlen_variation1.phpt
+++ b/ext/mbstring/tests/mb_strlen_variation1.phpt
@@ -29,12 +29,12 @@ unset ($unset_var);
class classA
{
public function __toString() {
- return "Class A object";
+ return b"Class A object";
}
}
// heredoc string
-$heredoc = <<<EOT
+$heredoc = b<<<EOT
hello world
EOT;
@@ -72,8 +72,8 @@ $inputs = array(
'',
// string data
-/*18*/ "string",
- 'string',
+/*18*/ b"string",
+ b'string',
$heredoc,
// object data
diff --git a/ext/mbstring/tests/mb_strpos.phpt b/ext/mbstring/tests/mb_strpos.phpt
index ca49599fa..1d613e9c7 100644
--- a/ext/mbstring/tests/mb_strpos.phpt
+++ b/ext/mbstring/tests/mb_strpos.phpt
@@ -12,18 +12,18 @@ include_once('common.inc');
// Test string
-$euc_jp = '0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。';
+$euc_jp = b'0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。';
// EUC-JP - With encoding parameter
mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n");
echo "== POSITIVE OFFSET ==\n";
-print mb_strpos($euc_jp,'日本語', 0, 'EUC-JP') . "\n";
-print mb_strpos($euc_jp, '0', 0, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, b'日本語', 0, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, b'0', 0, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, 3, 0, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, 0, 0, 'EUC-JP') . "\n";
-print mb_strpos($euc_jp,'日本語', 15, 'EUC-JP') . "\n";
-print mb_strpos($euc_jp, '0', 15, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, b'日本語', 15, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, b'0', 15, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, 3, 15, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, 0, 15, 'EUC-JP') . "\n";
@@ -31,17 +31,17 @@ print mb_strpos($euc_jp, 0, 15, 'EUC-JP') . "\n";
// Note: PHP Warning - offset is negative.
// Note: For offset(-15). It does not return position of latter string. (ie the same result as -50)
echo "== NEGATIVE OFFSET ==\n";
-$r = mb_strpos($euc_jp,'日本語', -15, 'EUC-JP');
+$r = mb_strpos($euc_jp, b'日本語', -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
-$r = mb_strpos($euc_jp, '0', -15, 'EUC-JP');
+$r = mb_strpos($euc_jp, b'0', -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
$r = mb_strpos($euc_jp, 3, -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
$r = mb_strpos($euc_jp, 0, -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
-$r = mb_strpos($euc_jp,'日本語', -50, 'EUC-JP');
+$r = mb_strpos($euc_jp, b'日本語', -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
-$r = mb_strpos($euc_jp, '0', -50, 'EUC-JP');
+$r = mb_strpos($euc_jp, b'0', -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
$r = mb_strpos($euc_jp, 3, -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
@@ -50,9 +50,9 @@ $r = mb_strpos($euc_jp, 0, -50, 'EUC-JP');
// Out of range - should return false
print ("== OUT OF RANGE ==\n");
-$r = mb_strpos($euc_jp,'日本語', 40, 'EUC-JP');
+$r = mb_strpos($euc_jp, b'日本語', 40, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
-$r = mb_strpos($euc_jp, '0', 40, 'EUC-JP');
+$r = mb_strpos($euc_jp, b'0', 40, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_strpos($euc_jp, 3, 40, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
@@ -64,9 +64,9 @@ $r = mb_strpos($euc_jp, 0, 40, 'EUC-JP');
// Non-existent
echo "== NON-EXISTENT ==\n";
-$r = mb_strpos($euc_jp, '韓国語', 0, 'EUC-JP');
+$r = mb_strpos($euc_jp, b'韓国語', 0, 'EUC-JP');
($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
-$r = mb_strpos($euc_jp, "\n", 0, 'EUC-JP');
+$r = mb_strpos($euc_jp, b"\n", 0, 'EUC-JP');
($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
@@ -74,28 +74,28 @@ $r = mb_strpos($euc_jp, "\n", 0, 'EUC-JP');
echo "== NO ENCODING PARAMETER ==\n";
mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
-print mb_strpos($euc_jp,'日本語', 0) . "\n";
-print mb_strpos($euc_jp, '0', 0) . "\n";
+print mb_strpos($euc_jp, b'日本語', 0) . "\n";
+print mb_strpos($euc_jp, b'0', 0) . "\n";
print mb_strpos($euc_jp, 3, 0) . "\n";
print mb_strpos($euc_jp, 0, 0) . "\n";
-$r = mb_strpos($euc_jp,'韓国語', 0);
+$r = mb_strpos($euc_jp, b'韓国語', 0);
($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
-$r = mb_strpos($euc_jp,"\n", 0);
+$r = mb_strpos($euc_jp, b"\n", 0);
($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
// EUC-JP - No offset and encoding parameter
echo "== NO OFFSET AND ENCODING PARAMETER ==\n";
mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
-print mb_strpos($euc_jp,'日本語') . "\n";
-print mb_strpos($euc_jp, '0') . "\n";
+print mb_strpos($euc_jp, b'日本語') . "\n";
+print mb_strpos($euc_jp, b'0') . "\n";
print mb_strpos($euc_jp, 3) . "\n";
print mb_strpos($euc_jp, 0) . "\n";
-$r = mb_strpos($euc_jp,'韓国語');
+$r = mb_strpos($euc_jp, b'韓国語');
($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
-$r = mb_strpos($euc_jp,"\n");
+$r = mb_strpos($euc_jp, b"\n");
($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
diff --git a/ext/mbstring/tests/mb_strpos_basic.phpt b/ext/mbstring/tests/mb_strpos_basic.phpt
index 4284ab805..36641b127 100644
--- a/ext/mbstring/tests/mb_strpos_basic.phpt
+++ b/ext/mbstring/tests/mb_strpos_basic.phpt
@@ -20,12 +20,12 @@ echo "*** Testing mb_strpos() : basic functionality***\n";
mb_internal_encoding('UTF-8');
-$string_ascii = 'abc def';
+$string_ascii = b'abc def';
//Japanese string in UTF-8
$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
echo "\n-- ASCII string 1 --\n";
-var_dump(mb_strpos($string_ascii, 'd', 2, 'ISO-8859-1'));
+var_dump(mb_strpos($string_ascii, b'd', 2, 'ISO-8859-1'));
echo "\n-- ASCII string 2 --\n";
var_dump(mb_strpos($string_ascii, '123'));
@@ -40,7 +40,7 @@ var_dump(mb_strpos($string_mb, $needle2));
echo "Done";
?>
---EXPECTF--
+--EXPECT--
*** Testing mb_strpos() : basic functionality***
-- ASCII string 1 --
diff --git a/ext/mbstring/tests/mb_strpos_variation2.phpt b/ext/mbstring/tests/mb_strpos_variation2.phpt
index ed62ea8aa..d6feb4923 100644
--- a/ext/mbstring/tests/mb_strpos_variation2.phpt
+++ b/ext/mbstring/tests/mb_strpos_variation2.phpt
@@ -19,7 +19,7 @@ function_exists('mb_strpos') or die("skip mb_strpos() is not available in this b
echo "*** Testing mb_strpos() : usage variations ***\n";
// Initialise function arguments not being substituted
-$haystack = 'string_val';
+$haystack = b'string_val';
$offset = 0;
$encoding = 'utf-8';
@@ -31,12 +31,12 @@ unset ($unset_var);
class classA
{
public function __toString() {
- return "Class A object";
+ return b"Class A object";
}
}
// heredoc string
-$heredoc = <<<EOT
+$heredoc = b<<<EOT
hello world
EOT;
@@ -74,8 +74,8 @@ $inputs = array(
'',
// string data
-/*18*/ "string",
- 'string',
+/*18*/ b"string",
+ b'string',
$heredoc,
// object data
@@ -135,12 +135,12 @@ bool(false)
-- Iteration 10 --
-Warning: mb_strpos(): Empty delimiter. in %s on line %d
+Warning: mb_strpos(): Empty delimiter in %s on line %d
bool(false)
-- Iteration 11 --
-Warning: mb_strpos(): Empty delimiter. in %s on line %d
+Warning: mb_strpos(): Empty delimiter in %s on line %d
bool(false)
-- Iteration 12 --
@@ -148,7 +148,7 @@ bool(false)
-- Iteration 13 --
-Warning: mb_strpos(): Empty delimiter. in %s on line %d
+Warning: mb_strpos(): Empty delimiter in %s on line %d
bool(false)
-- Iteration 14 --
@@ -156,17 +156,17 @@ bool(false)
-- Iteration 15 --
-Warning: mb_strpos(): Empty delimiter. in %s on line %d
+Warning: mb_strpos(): Empty delimiter in %s on line %d
bool(false)
-- Iteration 16 --
-Warning: mb_strpos(): Empty delimiter. in %s on line %d
+Warning: mb_strpos(): Empty delimiter in %s on line %d
bool(false)
-- Iteration 17 --
-Warning: mb_strpos(): Empty delimiter. in %s on line %d
+Warning: mb_strpos(): Empty delimiter in %s on line %d
bool(false)
-- Iteration 18 --
@@ -183,16 +183,16 @@ bool(false)
-- Iteration 22 --
-Warning: mb_strpos(): Empty delimiter. in %s on line %d
+Warning: mb_strpos(): Empty delimiter in %s on line %d
bool(false)
-- Iteration 23 --
-Warning: mb_strpos(): Empty delimiter. in %s on line %d
+Warning: mb_strpos(): Empty delimiter in %s on line %d
bool(false)
-- Iteration 24 --
Warning: mb_strpos() expects parameter 2 to be string, resource given in %s on line %d
bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/mbstring/tests/mb_strpos_variation3.phpt b/ext/mbstring/tests/mb_strpos_variation3.phpt
index 8f8540ee8..65572b5f0 100644
--- a/ext/mbstring/tests/mb_strpos_variation3.phpt
+++ b/ext/mbstring/tests/mb_strpos_variation3.phpt
@@ -19,8 +19,8 @@ function_exists('mb_strpos') or die("skip mb_strpos() is not available in this b
echo "*** Testing mb_strpos() : usage variations ***\n";
// Initialise function arguments not being substituted
-$needle = 'a';
-$haystack = 'string_val';
+$needle = b'a';
+$haystack = b'string_val';
$encoding = 'utf-8';
//get an unset variable
@@ -114,12 +114,12 @@ int(8)
-- Iteration 3 --
-Warning: mb_strpos(): Offset not contained in string. in %s on line %d
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 4 --
-Warning: mb_strpos(): Offset not contained in string. in %s on line %d
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 5 --
@@ -127,12 +127,12 @@ bool(false)
-- Iteration 6 --
-Warning: mb_strpos(): Offset not contained in string. in %s on line %d
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 7 --
-Warning: mb_strpos(): Offset not contained in string. in %s on line %d
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 8 --
@@ -199,4 +199,4 @@ int(8)
Warning: mb_strpos() expects parameter 3 to be long, resource given in %s on line %d
bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/mbstring/tests/mb_strpos_variation4.phpt b/ext/mbstring/tests/mb_strpos_variation4.phpt
index ac818c661..0fca8bb1f 100644
--- a/ext/mbstring/tests/mb_strpos_variation4.phpt
+++ b/ext/mbstring/tests/mb_strpos_variation4.phpt
@@ -20,8 +20,8 @@ function_exists('mb_strpos') or die("skip mb_strpos() is not available in this b
echo "*** Testing mb_strpos() : usage variations ***\n";
// Initialise function arguments not being substituted
-$haystack = 'string_val';
-$needle = 'val';
+$haystack = b'string_val';
+$needle = b'val';
$offset = 0;
//get an unset variable
diff --git a/ext/mbstring/tests/mb_strpos_variation5.phpt b/ext/mbstring/tests/mb_strpos_variation5.phpt
new file mode 100644
index 000000000..7a9604abe
--- /dev/null
+++ b/ext/mbstring/tests/mb_strpos_variation5.phpt
@@ -0,0 +1,117 @@
+--TEST--
+Test mb_strpos() function : usage variations - Pass different integers as $offset argument
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test how mb_strpos() behaves when passed different integers as $offset argument
+ * The character length of $string_ascii and $string_mb is the same,
+ * and the needle appears at the same positions in both strings
+ */
+
+mb_internal_encoding('UTF-8');
+
+echo "*** Testing mb_strpos() : usage variations ***\n";
+
+$string_ascii = b'+Is an English string'; //21 chars
+$needle_ascii = b'g';
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); //21 chars
+$needle_mb = base64_decode('44CC');
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * mb_strpos should not be able to accept negative values as $offset.
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -10; $i <= 60; $i += 10) {
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ var_dump(mb_strpos($string_ascii, $needle_ascii, $i));
+ echo "--Multibyte String --\n";
+ var_dump(mb_strpos($string_mb, $needle_mb, $i, 'UTF-8'));
+}
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strpos() : usage variations ***
+
+**-- Offset is: -10 --**
+-- ASCII String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 0 --**
+-- ASCII String --
+int(9)
+--Multibyte String --
+int(9)
+
+**-- Offset is: 10 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 20 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 30 --**
+-- ASCII String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 40 --**
+-- ASCII String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 50 --**
+-- ASCII String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 60 --**
+-- ASCII String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strrchr_basic.phpt b/ext/mbstring/tests/mb_strrchr_basic.phpt
new file mode 100644
index 000000000..595d808d4
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_basic.phpt
@@ -0,0 +1,64 @@
+--TEST--
+Test mb_strrchr() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'abc def';
+//Japanese string in UTF-8
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_strrchr($string_ascii, b'd', false, 'ISO-8859-1')));
+var_dump(bin2hex(mb_strrchr($string_ascii, b'd')));
+var_dump(bin2hex(mb_strrchr($string_ascii, b'd', true)));
+
+
+echo "\n-- ASCII string: needle doesn't exist --\n";
+var_dump(mb_strrchr($string_ascii, b'123'));
+
+echo "\n-- Multibyte string: needle exists --\n";
+$needle1 = base64_decode('5pel5pys6Kqe');
+var_dump(bin2hex(mb_strrchr($string_mb, $needle1)));
+var_dump(bin2hex(mb_strrchr($string_mb, $needle1, false, 'utf-8')));
+var_dump(bin2hex(mb_strrchr($string_mb, $needle1, true)));
+
+
+echo "\n-- Multibyte string: needle doesn't exist --\n";
+$needle2 = base64_decode('44GT44KT44Gr44Gh44Gv44CB5LiW55WM');
+var_dump(mb_strrchr($string_mb, $needle2));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strrchr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(6) "646566"
+string(6) "646566"
+string(8) "61626320"
+
+-- ASCII string: needle doesn't exist --
+bool(false)
+
+-- Multibyte string: needle exists --
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(0) ""
+
+-- Multibyte string: needle doesn't exist --
+bool(false)
+===DONE=== \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strrchr_error1.phpt b/ext/mbstring/tests/mb_strrchr_error1.phpt
new file mode 100644
index 000000000..5ebb3d06f
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_error1.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_strrchr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : error conditions ***\n";
+
+
+//Test mb_strrchr with one more than the expected number of arguments
+echo "\n-- Testing mb_strrchr() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$part = true;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strrchr($haystack, $needle, $part, $encoding, $extra_arg) );
+
+// Testing mb_strrchr with one less than the expected number of arguments
+echo "\n-- Testing mb_strrchr() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_strrchr($haystack) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : error conditions ***
+
+-- Testing mb_strrchr() function with more than expected no. of arguments --
+
+Warning: mb_strrchr() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_strrchr() function with less than expected no. of arguments --
+
+Warning: mb_strrchr() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_error2.phpt b/ext/mbstring/tests/mb_strrchr_error2.phpt
new file mode 100644
index 000000000..cfbcd66a0
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_strrchr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : error conditions ***\n";
+
+
+echo "\n-- Testing mb_strrchr() with unknown encoding --\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$encoding = 'unknown-encoding';
+$part = true;
+var_dump( mb_strrchr($haystack, $needle, $part, $encoding) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : error conditions ***
+
+-- Testing mb_strrchr() with unknown encoding --
+
+Warning: mb_strrchr(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation1.phpt b/ext/mbstring/tests/mb_strrchr_variation1.phpt
new file mode 100644
index 000000000..18eb52ea2
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation1.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_strrchr() function : usage variation - various haystacks, needle won't be found
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$needle = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for haystack
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrchr($value, $needle, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation2.phpt b/ext/mbstring/tests/mb_strrchr_variation2.phpt
new file mode 100644
index 000000000..f9b710783
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation2.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_strrchr() function : usage variation - different types of needle.
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for needle
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrchr($haystack, $value, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation3.phpt b/ext/mbstring/tests/mb_strrchr_variation3.phpt
new file mode 100644
index 000000000..4a16f55b4
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation3.phpt
@@ -0,0 +1,232 @@
+--TEST--
+Test mb_strrchr() function : usage variation - different values for part
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // string data
+ 'string DQ' => "string",
+ 'string SQ' => 'string',
+ 'mixed case string' => "sTrInG",
+ 'heredoc' => $heredoc,
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for part
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ $res = mb_strrchr($haystack, $needle, $value, $encoding);
+ if ($res === false) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : usage variation ***
+
+--int 0--
+string(8) "5f76616c"
+
+--int 1--
+string(12) "737472696e67"
+
+--int 12345--
+string(12) "737472696e67"
+
+--int -12345--
+string(12) "737472696e67"
+
+--float 10.5--
+string(12) "737472696e67"
+
+--float -10.5--
+string(12) "737472696e67"
+
+--float 12.3456789000e10--
+string(12) "737472696e67"
+
+--float -12.3456789000e10--
+string(12) "737472696e67"
+
+--float .5--
+string(12) "737472696e67"
+
+--empty array--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+string(8) "5f76616c"
+
+--lowercase null--
+string(8) "5f76616c"
+
+--lowercase true--
+string(12) "737472696e67"
+
+--lowercase false--
+string(8) "5f76616c"
+
+--uppercase TRUE--
+string(12) "737472696e67"
+
+--uppercase FALSE--
+string(8) "5f76616c"
+
+--empty string DQ--
+string(8) "5f76616c"
+
+--empty string SQ--
+string(8) "5f76616c"
+
+--string DQ--
+string(12) "737472696e67"
+
+--string SQ--
+string(12) "737472696e67"
+
+--mixed case string--
+string(12) "737472696e67"
+
+--heredoc--
+string(12) "737472696e67"
+
+--instance of classWithToString--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--undefined var--
+string(8) "5f76616c"
+
+--unset var--
+string(8) "5f76616c"
+
+--resource--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation4.phpt b/ext/mbstring/tests/mb_strrchr_variation4.phpt
new file mode 100644
index 000000000..b9e014706
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation4.phpt
@@ -0,0 +1,227 @@
+--TEST--
+Test mb_strrchr() function : usage variation - different encoding types
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$part = true;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "invalid";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+invalid
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for encoding
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrchr($haystack, $needle, $part, $value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : usage variation ***
+
+--int 0--
+Error: 2 - mb_strrchr(): Unknown encoding "0", %s(%d)
+bool(false)
+
+--int 1--
+Error: 2 - mb_strrchr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--int 12345--
+Error: 2 - mb_strrchr(): Unknown encoding "12345", %s(%d)
+bool(false)
+
+--int -12345--
+Error: 2 - mb_strrchr(): Unknown encoding "-2345", %s(%d)
+bool(false)
+
+--float 10.5--
+Error: 2 - mb_strrchr(): Unknown encoding "10.5", %s(%d)
+bool(false)
+
+--float -10.5--
+Error: 2 - mb_strrchr(): Unknown encoding "-10.5", %s(%d)
+bool(false)
+
+--float 12.3456789000e10--
+Error: 2 - mb_strrchr(): Unknown encoding "123456789000", %s(%d)
+bool(false)
+
+--float -12.3456789000e10--
+Error: 2 - mb_strrchr(): Unknown encoding "-123456789000", %s(%d)
+bool(false)
+
+--float .5--
+Error: 2 - mb_strrchr(): Unknown encoding "0.5", %s(%d)
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase true--
+Error: 2 - mb_strrchr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--uppercase TRUE--
+Error: 2 - mb_strrchr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--instance of classWithToString--
+Error: 2 - mb_strrchr(): Unknown encoding "invalid", %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation5.phpt b/ext/mbstring/tests/mb_strrchr_variation5.phpt
new file mode 100644
index 000000000..84a73a2f5
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation5.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Test mb_strrchr() function : variation - multiple needles
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : variation ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//with repeated needles
+$string_ascii = b'abcdef zbcdyx';
+$needle_ascii = b"bcd";
+
+//Japanese string in UTF-8 with repeated needles
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OIMzTvvJXvvJbml6XmnKzoqp7jg4bjgq3jgrnjg4g=');
+$needle_mb = base64_decode('6Kqe44OG44Kt');
+
+echo "-- Ascii data --\n";
+var_dump(bin2hex(mb_strrchr($string_ascii, $needle_ascii, false)));
+var_dump(bin2hex(mb_strrchr($string_ascii, $needle_ascii, true)));
+
+echo "-- mb data in utf-8 --\n";
+$res = mb_strrchr($string_mb, $needle_mb, false);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+$res = mb_strrchr($string_mb, $needle_mb, true);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strrchr() : variation ***
+-- Ascii data --
+string(10) "6263647978"
+string(16) "616263646566207a"
+-- mb data in utf-8 --
+string(30) "e8aa9ee38386e382ade382b9e38388"
+string(70) "e697a5e69cace8aa9ee38386e382ade382b9e383883334efbc95efbc96e697a5e69cac"
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation6.phpt b/ext/mbstring/tests/mb_strrchr_variation6.phpt
new file mode 100644
index 000000000..86009496e
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation6.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Test mb_strrchr() function : variation - case sensitivity
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : variation ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii
+$string_ascii = b'abcdef';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in lower case UTF-8
+$string_mb = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "-- Ascii data --\n";
+// needle should be found
+var_dump(bin2hex(mb_strrchr($string_ascii, $needle_ascii_lower)));
+// no needle should be found
+var_dump(mb_strrchr($string_ascii, $needle_ascii_upper));
+var_dump(mb_strrchr($string_ascii, $needle_ascii_mixed));
+
+echo "-- mb data in utf-8 --\n";
+// needle should be found
+$res = mb_strrchr($string_mb, $needle_mb_lower, false);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+// no needle should be found
+var_dump(mb_strrchr($string_mb, $needle_mb_upper));
+var_dump(mb_strrchr($string_mb, $needle_mb_mixed));
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strrchr() : variation ***
+-- Ascii data --
+string(10) "6263646566"
+bool(false)
+bool(false)
+-- mb data in utf-8 --
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+bool(false)
+bool(false)
+===DONE=== \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strrichr_basic.phpt b/ext/mbstring/tests/mb_strrichr_basic.phpt
new file mode 100644
index 000000000..5a38e6506
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_basic.phpt
@@ -0,0 +1,70 @@
+--TEST--
+Test mb_strrichr() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'abcdef';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in lower case UTF-8
+$string_mb = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_upper, false, 'ISO-8859-1')));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_lower)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_mixed, true)));
+
+
+echo "\n-- ASCII string: needle doesn't exist --\n";
+var_dump(mb_strrichr($string_ascii, b'123'));
+
+echo "\n-- Multibyte string: needle exists --\n";
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_upper)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_lower, false, 'utf-8')));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_mixed, true)));
+
+
+echo "\n-- Multibyte string: needle doesn't exist --\n";
+$needle2 = base64_decode('zrzOvs6/');
+var_dump(mb_strrichr($string_mb, $needle2));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strrichr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(10) "6263646566"
+string(10) "6263646566"
+string(2) "61"
+
+-- ASCII string: needle doesn't exist --
+bool(false)
+
+-- Multibyte string: needle exists --
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+string(44) "ceb1ceb2ceb3ceb4ceb5ceb6ceb7ceb8ceb9cebacebb"
+
+-- Multibyte string: needle doesn't exist --
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_error1.phpt b/ext/mbstring/tests/mb_strrichr_error1.phpt
new file mode 100644
index 000000000..2c2ed6114
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_error1.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_strrichr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : error conditions ***\n";
+
+
+//Test mb_strrichr with one more than the expected number of arguments
+echo "\n-- Testing mb_strrichr() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$part = true;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strrichr($haystack, $needle, $part, $encoding, $extra_arg) );
+
+// Testing mb_strrichr with one less than the expected number of arguments
+echo "\n-- Testing mb_strrichr() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_strrichr($haystack) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : error conditions ***
+
+-- Testing mb_strrichr() function with more than expected no. of arguments --
+
+Warning: mb_strrichr() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_strrichr() function with less than expected no. of arguments --
+
+Warning: mb_strrichr() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_error2.phpt b/ext/mbstring/tests/mb_strrichr_error2.phpt
new file mode 100644
index 000000000..e8f98ef44
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_strrichr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : error conditions ***\n";
+
+
+echo "\n-- Testing mb_strrichr() with unknown encoding --\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$encoding = 'unknown-encoding';
+$part = true;
+var_dump( mb_strrichr($haystack, $needle, $part, $encoding) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : error conditions ***
+
+-- Testing mb_strrichr() with unknown encoding --
+
+Warning: mb_strrichr(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_variation1.phpt b/ext/mbstring/tests/mb_strrichr_variation1.phpt
new file mode 100644
index 000000000..d826ccf40
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_variation1.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_strrichr() function : usage variation - various haystacks, needle won't be found
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$needle = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for haystack
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrichr($value, $needle, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_variation2.phpt b/ext/mbstring/tests/mb_strrichr_variation2.phpt
new file mode 100644
index 000000000..1a4a73fe4
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_variation2.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_strrichr() function : usage variation - different types of needle.
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for needle
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrichr($haystack, $value, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_variation3.phpt b/ext/mbstring/tests/mb_strrichr_variation3.phpt
new file mode 100644
index 000000000..68e8083bd
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_variation3.phpt
@@ -0,0 +1,232 @@
+--TEST--
+Test mb_strrichr() function : usage variation - different values for part
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // string data
+ 'string DQ' => "string",
+ 'string SQ' => 'string',
+ 'mixed case string' => "sTrInG",
+ 'heredoc' => $heredoc,
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for part
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ $res = mb_strrichr($haystack, $needle, $value, $encoding);
+ if ($res === false) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : usage variation ***
+
+--int 0--
+string(8) "5f76616c"
+
+--int 1--
+string(12) "737472696e67"
+
+--int 12345--
+string(12) "737472696e67"
+
+--int -12345--
+string(12) "737472696e67"
+
+--float 10.5--
+string(12) "737472696e67"
+
+--float -10.5--
+string(12) "737472696e67"
+
+--float 12.3456789000e10--
+string(12) "737472696e67"
+
+--float -12.3456789000e10--
+string(12) "737472696e67"
+
+--float .5--
+string(12) "737472696e67"
+
+--empty array--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+string(8) "5f76616c"
+
+--lowercase null--
+string(8) "5f76616c"
+
+--lowercase true--
+string(12) "737472696e67"
+
+--lowercase false--
+string(8) "5f76616c"
+
+--uppercase TRUE--
+string(12) "737472696e67"
+
+--uppercase FALSE--
+string(8) "5f76616c"
+
+--empty string DQ--
+string(8) "5f76616c"
+
+--empty string SQ--
+string(8) "5f76616c"
+
+--string DQ--
+string(12) "737472696e67"
+
+--string SQ--
+string(12) "737472696e67"
+
+--mixed case string--
+string(12) "737472696e67"
+
+--heredoc--
+string(12) "737472696e67"
+
+--instance of classWithToString--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--undefined var--
+string(8) "5f76616c"
+
+--unset var--
+string(8) "5f76616c"
+
+--resource--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_variation4.phpt b/ext/mbstring/tests/mb_strrichr_variation4.phpt
new file mode 100644
index 000000000..d2e5754c1
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_variation4.phpt
@@ -0,0 +1,227 @@
+--TEST--
+Test mb_strrichr() function : usage variation - different encoding types
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$part = true;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "invalid";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+invalid
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for encoding
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrichr($haystack, $needle, $part, $value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : usage variation ***
+
+--int 0--
+Error: 2 - mb_strrichr(): Unknown encoding "0", %s(%d)
+bool(false)
+
+--int 1--
+Error: 2 - mb_strrichr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--int 12345--
+Error: 2 - mb_strrichr(): Unknown encoding "12345", %s(%d)
+bool(false)
+
+--int -12345--
+Error: 2 - mb_strrichr(): Unknown encoding "-2345", %s(%d)
+bool(false)
+
+--float 10.5--
+Error: 2 - mb_strrichr(): Unknown encoding "10.5", %s(%d)
+bool(false)
+
+--float -10.5--
+Error: 2 - mb_strrichr(): Unknown encoding "-10.5", %s(%d)
+bool(false)
+
+--float 12.3456789000e10--
+Error: 2 - mb_strrichr(): Unknown encoding "123456789000", %s(%d)
+bool(false)
+
+--float -12.3456789000e10--
+Error: 2 - mb_strrichr(): Unknown encoding "-123456789000", %s(%d)
+bool(false)
+
+--float .5--
+Error: 2 - mb_strrichr(): Unknown encoding "0.5", %s(%d)
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase true--
+Error: 2 - mb_strrichr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--uppercase TRUE--
+Error: 2 - mb_strrichr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--instance of classWithToString--
+Error: 2 - mb_strrichr(): Unknown encoding "invalid", %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_variation5.phpt b/ext/mbstring/tests/mb_strrichr_variation5.phpt
new file mode 100644
index 000000000..417f53fde
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_variation5.phpt
@@ -0,0 +1,69 @@
+--TEST--
+Test mb_strrichr() function : usage variation - multiple needles
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii mixed case, multiple needles
+$string_ascii = b'abcDef zBcDyx';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in mixed case UTF-8 with multiple needles
+$string_mb = base64_decode('zrrOu868zr3Ovs6fzqDOoSDOus67zpzOnc6+zr/OoA==');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_upper, false)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_upper, true)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_lower, false)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_lower, true)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_mixed, false)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_mixed, true)));
+
+
+echo "\n-- Multibyte string: needle exists --\n";
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_upper, false)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_upper, true)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_lower, false)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_lower, true)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_mixed, false)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_mixed, true)));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strrichr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(10) "4263447978"
+string(16) "616263446566207a"
+string(10) "4263447978"
+string(16) "616263446566207a"
+string(10) "4263447978"
+string(16) "616263446566207a"
+
+-- Multibyte string: needle exists --
+string(20) "ce9cce9dcebecebfcea0"
+string(42) "cebacebbcebccebdcebece9fcea0cea120cebacebb"
+string(20) "ce9cce9dcebecebfcea0"
+string(42) "cebacebbcebccebdcebece9fcea0cea120cebacebb"
+string(20) "ce9cce9dcebecebfcea0"
+string(42) "cebacebbcebccebdcebece9fcea0cea120cebacebb"
+===DONE=== \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strripos_basic.phpt b/ext/mbstring/tests/mb_strripos_basic.phpt
new file mode 100644
index 000000000..32787a6eb
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_basic.phpt
@@ -0,0 +1,158 @@
+--TEST--
+Test mb_strripos() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test basic functionality of mb_strripos with ASCII and multibyte characters
+ */
+
+echo "*** Testing mb_strripos() : basic functionality***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii strings
+$ascii_haystacks = array(
+ b'abc defabc def',
+ b'ABC DEFABC DEF',
+ b'Abc dEFaBC Def',
+);
+
+$ascii_needles = array(
+ // 4 good ones
+ b'DE',
+ b'de',
+ b'De',
+ b'dE',
+
+ //flag a swap between good and bad
+ '!',
+
+ // 4 bad ones
+ b'df',
+ b'Df',
+ b'dF',
+ b'DF'
+);
+
+//greek strings in UTF-8
+$greek_lower = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$greek_upper = base64_decode('zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6p');
+$greek_mixed = base64_decode('zrHOss6TzpTOlc6WzpfOmM65zrrOu868zr3Ovs6fzqDOoc6jzqTOpc+Gz4fPiM+J');
+$greek_haystacks = array($greek_lower, $greek_upper, $greek_mixed);
+
+$greek_nlower = base64_decode('zrzOvc6+zr8=');
+$greek_nupper = base64_decode('zpzOnc6ezp8=');
+$greek_nmixed1 = base64_decode('zpzOnc6+zr8=');
+$greek_nmixed2 = base64_decode('zrzOvc6+zp8=');
+
+$greek_blower = base64_decode('zpzOns6f');
+$greek_bupper = base64_decode('zrzOvs6/');
+$greek_bmixed1 = base64_decode('zpzOvs6/');
+$greek_bmixed2 = base64_decode('zrzOvs6f');
+$greek_needles = array(
+ // 4 good ones
+ $greek_nlower, $greek_nupper, $greek_nmixed1, $greek_nmixed2,
+
+ '!', // used to flag a swap between good and bad
+
+ // 4 bad ones
+ $greek_blower, $greek_bupper, $greek_bmixed1, $greek_bmixed2,
+);
+
+// try the basic options
+echo "\n -- ASCII Strings, needle should be found --\n";
+foreach ($ascii_needles as $needle) {
+ if ($needle == '!') {
+ echo "\n -- ASCII Strings, needle should not be found --\n";
+ }
+ else {
+ foreach ($ascii_haystacks as $haystack) {
+ var_dump(mb_strripos($haystack, $needle));
+ }
+ }
+}
+
+echo "\n -- Greek Strings, needle should be found --\n";
+foreach ($greek_needles as $needle) {
+ if ($needle == '!') {
+ echo "\n -- ASCII Strings, needle should not be found --\n";
+ }
+ else {
+ foreach ($greek_haystacks as $haystack) {
+ var_dump(mb_strripos($haystack, $needle));
+ }
+ }
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : basic functionality***
+
+ -- ASCII Strings, needle should be found --
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+
+ -- ASCII Strings, needle should not be found --
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+
+ -- Greek Strings, needle should be found --
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+
+ -- ASCII Strings, needle should not be found --
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strripos_basic2.phpt b/ext/mbstring/tests/mb_strripos_basic2.phpt
new file mode 100644
index 000000000..9d7befc93
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_basic2.phpt
@@ -0,0 +1,128 @@
+--TEST--
+Test mb_strripos() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test basic functionality of mb_strripos with ASCII and multibyte characters
+ */
+
+echo "*** Testing mb_strripos() : basic functionality***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii strings
+$ascii_haystacks = array(
+ b'abc defabc def',
+ b'ABC DEFABC DEF',
+ b'Abc dEFaBC Def',
+);
+
+$ascii_needles = array(
+ // 4 good ones
+ b'DE',
+ b'de',
+ b'De',
+ b'dE',
+);
+
+//greek strings in UTF-8
+$greek_lower = base64_decode('zrrOu868zr3Ovs6/z4DPgSDOus67zrzOvc6+zr/PgA==');
+$greek_upper = base64_decode('zprOm86czp3Ons6fzqDOoSDOms6bzpzOnc6ezp/OoA==');
+$greek_mixed = base64_decode('zrrOu868zr3Ovs6fzqDOoSDOus67zpzOnc6+zr/OoA==');
+$greek_haystacks = array($greek_lower, $greek_upper, $greek_mixed);
+
+$greek_nlower = base64_decode('zrzOvc6+zr8=');
+$greek_nupper = base64_decode('zpzOnc6ezp8=');
+$greek_nmixed1 = base64_decode('zpzOnc6+zr8=');
+$greek_nmixed2 = base64_decode('zrzOvc6+zp8=');
+
+$greek_needles = array(
+ // 4 good ones
+ $greek_nlower, $greek_nupper, $greek_nmixed1, $greek_nmixed2,
+);
+
+// try the basic options
+echo "\n -- ASCII Strings --\n";
+foreach ($ascii_needles as $needle) {
+ foreach ($ascii_haystacks as $haystack) {
+ var_dump(mb_strripos($haystack, $needle));
+ var_dump(mb_strripos($haystack, $needle, 14));
+ }
+}
+
+echo "\n -- Greek Strings --\n";
+foreach ($greek_needles as $needle) {
+ foreach ($greek_haystacks as $haystack) {
+ var_dump(mb_strripos($haystack, $needle));
+ var_dump(mb_strripos($haystack, $needle, 12));
+ }
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : basic functionality***
+
+ -- ASCII Strings --
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+
+ -- Greek Strings --
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strripos_error1.phpt b/ext/mbstring/tests/mb_strripos_error1.phpt
new file mode 100644
index 000000000..9d114d55a
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_error1.phpt
@@ -0,0 +1,51 @@
+--TEST--
+Test mb_strripos() function : error conditions - Pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test how mb_strripos behaves when passed an incorrect number of arguments
+ */
+
+echo "*** Testing mb_strripos() : error conditions ***\n";
+
+
+//Test mb_strripos with one more than the expected number of arguments
+echo "\n-- Testing mb_strripos() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$offset = 10;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strripos($haystack, $needle, $offset, $encoding, $extra_arg) );
+
+// Testing mb_strripos with one less than the expected number of arguments
+echo "\n-- Testing mb_strripos() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_strripos($haystack) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : error conditions ***
+
+-- Testing mb_strripos() function with more than expected no. of arguments --
+
+Warning: mb_strripos() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_strripos() function with less than expected no. of arguments --
+
+Warning: mb_strripos() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strripos_error2.phpt b/ext/mbstring/tests/mb_strripos_error2.phpt
new file mode 100644
index 000000000..4790ffbcb
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_strripos() function : error conditions - Pass unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass an unknown encoding to mb_strripos() to test behaviour
+ */
+
+echo "*** Testing mb_strripos() : error conditions ***\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$offset = 2;
+$encoding = 'unknown-encoding';
+
+var_dump( mb_strripos($haystack, $needle, $offset, $encoding) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : error conditions ***
+
+Warning: mb_strripos(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strripos_variation1.phpt b/ext/mbstring/tests/mb_strripos_variation1.phpt
new file mode 100644
index 000000000..704b50177
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_variation1.phpt
@@ -0,0 +1,183 @@
+--TEST--
+Test mb_strripos() function : usage variations - pass different data types to $haystack arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_strripos different data types as $haystack arg to test behaviour
+ */
+
+echo "*** Testing mb_strripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'string_val';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $haystack argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strripos($input, $needle, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strripos() expects parameter 1 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strripos_variation2.phpt b/ext/mbstring/tests/mb_strripos_variation2.phpt
new file mode 100644
index 000000000..61196f007
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_variation2.phpt
@@ -0,0 +1,183 @@
+--TEST--
+Test mb_strripos() function : usage variations - pass different data types as $needle arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_strripos different data types as $needle arg to test behaviour
+ */
+
+echo "*** Testing mb_strripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'string_val';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $needle argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ b"string",
+ b'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strripos($haystack, $input, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+int(0)
+
+-- Iteration 19 --
+int(0)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strripos() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strripos_variation3_Bug45923.phpt b/ext/mbstring/tests/mb_strripos_variation3_Bug45923.phpt
new file mode 100644
index 000000000..eb23d801b
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_variation3_Bug45923.phpt
@@ -0,0 +1,206 @@
+--TEST--
+Test mb_strripos() function : usage variations - pass different data types as $offset arg
+--XFAIL--
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_strripos different data types as $offset arg to test behaviour
+ */
+
+echo "*** Testing mb_strripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'A';
+$haystack = b'string_val';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $offest argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 12.5,
+ -12.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ b"string",
+ b'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strripos($haystack, $needle, $input, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : usage variations ***
+
+-- Iteration 1 --
+int(8)
+
+-- Iteration 2 --
+int(8)
+
+-- Iteration 3 --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+int(8)
+
+-- Iteration 9 --
+int(8)
+
+-- Iteration 10 --
+int(8)
+
+-- Iteration 11 --
+int(8)
+
+-- Iteration 12 --
+int(8)
+
+-- Iteration 13 --
+int(8)
+
+-- Iteration 14 --
+int(8)
+
+-- Iteration 15 --
+int(8)
+
+-- Iteration 16 --
+
+Warning: mb_strripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+
+Warning: mb_strripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 19 --
+
+Warning: mb_strripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 20 --
+
+Warning: mb_strripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 21 --
+
+Warning: mb_strripos() expects parameter 3 to be long, object given in %s on line %d
+bool(false)
+
+-- Iteration 22 --
+int(8)
+
+-- Iteration 23 --
+int(8)
+
+-- Iteration 24 --
+
+Warning: mb_strripos() expects parameter 3 to be long, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strripos_variation4.phpt b/ext/mbstring/tests/mb_strripos_variation4.phpt
new file mode 100644
index 000000000..d617872ef
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_variation4.phpt
@@ -0,0 +1,223 @@
+--TEST--
+Test mb_strripos() function : usage variations - pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_strripos different data types as $encoding arg to test behaviour
+ * Where possible 'UTF-8' has been entered as a string value
+ */
+
+echo "*** Testing mb_strripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'string_val';
+$needle = b'VaL';
+$offset = 0;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $input argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strripos($haystack, $needle, $offset, $input));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strripos() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_strripos(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_strripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_strripos(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strripos(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strripos(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_strripos(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strripos(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_strripos(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_strripos(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_strripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_strripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(7)
+
+-- Iteration 19 --
+int(7)
+
+-- Iteration 20 --
+int(7)
+
+-- Iteration 21 --
+int(7)
+
+-- Iteration 22 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strripos() expects parameter 4 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strripos_variation5_Bug45923.phpt b/ext/mbstring/tests/mb_strripos_variation5_Bug45923.phpt
new file mode 100644
index 000000000..8c40a6fa6
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_variation5_Bug45923.phpt
@@ -0,0 +1,115 @@
+--TEST--
+Test mb_strripos() function : usage variations - Pass different integers as $offset argument
+--XFAIL--
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test how mb_strripos() behaves when passed different integers as $offset argument
+ * The character length of $string_ascii and $string_mb is the same,
+ * and the needle appears at the same positions in both strings
+ */
+
+mb_internal_encoding('UTF-8');
+
+echo "*** Testing mb_strripos() : usage variations ***\n";
+
+$string_ascii = b'+Is an English string'; //21 chars
+$needle_ascii = b'G';
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); //21 chars
+$needle_mb = base64_decode('44CC');
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * mb_strripos should not be able to accept negative values as $offset.
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -10; $i <= 60; $i += 10) {
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ var_dump(mb_strripos($string_ascii, $needle_ascii, $i));
+ echo "--Multibyte String --\n";
+ var_dump(mb_strripos($string_mb, $needle_mb, $i, 'UTF-8'));
+}
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strripos() : usage variations ***
+
+**-- Offset is: -10 --**
+-- ASCII String --
+int(9)
+--Multibyte String --
+int(9)
+
+**-- Offset is: 0 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 10 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 20 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 30 --**
+-- ASCII String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+**-- Offset is: 40 --**
+-- ASCII String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+**-- Offset is: 50 --**
+-- ASCII String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+**-- Offset is: 60 --**
+-- ASCII String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strrpos_basic.phpt b/ext/mbstring/tests/mb_strrpos_basic.phpt
index 9de0388f4..ec6b86c29 100644
--- a/ext/mbstring/tests/mb_strrpos_basic.phpt
+++ b/ext/mbstring/tests/mb_strrpos_basic.phpt
@@ -20,15 +20,15 @@ echo "*** Testing mb_strrpos() : basic ***\n";
mb_internal_encoding('UTF-8');
-$string_ascii = 'This is an English string. 0123456789.';
+$string_ascii = b'This is an English string. 0123456789.';
//Japanese string in UTF-8
$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
echo "\n-- ASCII string 1 --\n";
-var_dump(mb_strrpos($string_ascii, 'is', 4, 'ISO-8859-1'));
+var_dump(mb_strrpos($string_ascii, b'is', 4, 'ISO-8859-1'));
echo "\n-- ASCII string 2 --\n";
-var_dump(mb_strrpos($string_ascii, 'hello, world'));
+var_dump(mb_strrpos($string_ascii, b'hello, world'));
echo "\n-- Multibyte string 1 --\n";
$needle1 = base64_decode('44CC');
diff --git a/ext/mbstring/tests/mb_strrpos_variation1.phpt b/ext/mbstring/tests/mb_strrpos_variation1.phpt
index 922cb73fd..2d2db9003 100644
--- a/ext/mbstring/tests/mb_strrpos_variation1.phpt
+++ b/ext/mbstring/tests/mb_strrpos_variation1.phpt
@@ -19,7 +19,7 @@ function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this
echo "*** Testing mb_strrpos() : usage variations ***\n";
// Initialise function arguments not being substituted
-$needle = 'world';
+$needle = b'world';
$offset = 0;
$encoding = 'utf-8';
@@ -31,12 +31,12 @@ unset ($unset_var);
class classA
{
public function __toString() {
- return "hello, world";
+ return b"hello, world";
}
}
// heredoc string
-$heredoc = <<<EOT
+$heredoc = b<<<EOT
hello, world
EOT;
@@ -74,8 +74,8 @@ $inputs = array(
'',
// string data
-/*18*/ "hello, world",
- 'hello, world',
+/*18*/ b"hello, world",
+ b'hello, world',
$heredoc,
// object data
diff --git a/ext/mbstring/tests/mb_strrpos_variation3.phpt b/ext/mbstring/tests/mb_strrpos_variation3.phpt
index 714ea1693..95840f9e7 100644
--- a/ext/mbstring/tests/mb_strrpos_variation3.phpt
+++ b/ext/mbstring/tests/mb_strrpos_variation3.phpt
@@ -19,8 +19,8 @@ function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this
echo "*** Testing mb_strrpos() : usage variations ***\n";
// Initialise function arguments not being substituted
-$needle = 'a';
-$haystack = 'string_val';
+$needle = b'a';
+$haystack = b'string_val';
$encoding = 'utf-8';
//get an unset variable
@@ -31,12 +31,12 @@ unset ($unset_var);
class classA
{
public function __toString() {
- return "7";
+ return b"7";
}
}
// heredoc string
-$heredoc = <<<EOT
+$heredoc = b<<<EOT
hello world
EOT;
@@ -97,12 +97,12 @@ int(8)
-- Iteration 3 --
-Notice: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
bool(false)
-- Iteration 4 --
-Notice: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
bool(false)
-- Iteration 5 --
@@ -113,7 +113,7 @@ bool(false)
-- Iteration 7 --
-Notice: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
bool(false)
-- Iteration 8 --
@@ -150,4 +150,4 @@ int(8)
-- Iteration 18 --
int(8)
-Done \ No newline at end of file
+Done
diff --git a/ext/mbstring/tests/mb_strrpos_variation4.phpt b/ext/mbstring/tests/mb_strrpos_variation4.phpt
index e3d3d43c0..198ce8fc7 100644
--- a/ext/mbstring/tests/mb_strrpos_variation4.phpt
+++ b/ext/mbstring/tests/mb_strrpos_variation4.phpt
@@ -20,8 +20,8 @@ function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this
echo "*** Testing mb_strrpos() : usage variations ***\n";
// Initialise function arguments not being substituted
-$haystack = 'hello, world';
-$needle = 'world';
+$haystack = b'hello, world';
+$needle = b'world';
$offset = 0;
//get an unset variable
diff --git a/ext/mbstring/tests/mb_strstr_basic.phpt b/ext/mbstring/tests/mb_strstr_basic.phpt
new file mode 100644
index 000000000..efa11056a
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_basic.phpt
@@ -0,0 +1,64 @@
+--TEST--
+Test mb_strstr() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'abc def';
+//Japanese string in UTF-8
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_strstr($string_ascii, b'd', false, 'ISO-8859-1')));
+var_dump(bin2hex(mb_strstr($string_ascii, b'd')));
+var_dump(bin2hex(mb_strstr($string_ascii, b'd', true)));
+
+
+echo "\n-- ASCII string: needle doesn't exist --\n";
+var_dump(mb_strstr($string_ascii, b'123'));
+
+echo "\n-- Multibyte string: needle exists --\n";
+$needle1 = base64_decode('5pel5pys6Kqe');
+var_dump(bin2hex(mb_strstr($string_mb, $needle1)));
+var_dump(bin2hex(mb_strstr($string_mb, $needle1, false, 'utf-8')));
+var_dump(bin2hex(mb_strstr($string_mb, $needle1, true)));
+
+
+echo "\n-- Multibyte string: needle doesn't exist --\n";
+$needle2 = base64_decode('44GT44KT44Gr44Gh44Gv44CB5LiW55WM');
+var_dump(mb_strstr($string_mb, $needle2));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strstr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(6) "646566"
+string(6) "646566"
+string(8) "61626320"
+
+-- ASCII string: needle doesn't exist --
+bool(false)
+
+-- Multibyte string: needle exists --
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(0) ""
+
+-- Multibyte string: needle doesn't exist --
+bool(false)
+===DONE=== \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strstr_error1.phpt b/ext/mbstring/tests/mb_strstr_error1.phpt
new file mode 100644
index 000000000..f38d5c9cc
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_error1.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_strstr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : error conditions ***\n";
+
+
+//Test mb_strstr with one more than the expected number of arguments
+echo "\n-- Testing mb_strstr() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$part = true;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strstr($haystack, $needle, $part, $encoding, $extra_arg) );
+
+// Testing mb_strstr with one less than the expected number of arguments
+echo "\n-- Testing mb_strstr() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_strstr($haystack) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : error conditions ***
+
+-- Testing mb_strstr() function with more than expected no. of arguments --
+
+Warning: mb_strstr() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_strstr() function with less than expected no. of arguments --
+
+Warning: mb_strstr() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_error2.phpt b/ext/mbstring/tests/mb_strstr_error2.phpt
new file mode 100644
index 000000000..163c80026
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_strstr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : error conditions ***\n";
+
+
+echo "\n-- Testing mb_strstr() with unknown encoding --\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$encoding = 'unknown-encoding';
+$part = true;
+var_dump( mb_strstr($haystack, $needle, $part, $encoding) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : error conditions ***
+
+-- Testing mb_strstr() with unknown encoding --
+
+Warning: mb_strstr(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation1.phpt b/ext/mbstring/tests/mb_strstr_variation1.phpt
new file mode 100644
index 000000000..48e7c537e
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation1.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_strstr() function : usage variation - various haystacks, needle won't be found
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$needle = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for haystack
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strstr($value, $needle, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strstr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strstr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strstr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strstr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strstr() expects parameter 1 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_strstr() expects parameter 1 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation2.phpt b/ext/mbstring/tests/mb_strstr_variation2.phpt
new file mode 100644
index 000000000..f70bb67ad
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation2.phpt
@@ -0,0 +1,215 @@
+--TEST--
+Test mb_strstr() function : usage variation - different types of needle.
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for needle
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strstr($haystack, $value, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strstr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strstr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strstr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strstr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strstr() expects parameter 2 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_strstr() expects parameter 2 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation3.phpt b/ext/mbstring/tests/mb_strstr_variation3.phpt
new file mode 100644
index 000000000..55c8f31d9
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation3.phpt
@@ -0,0 +1,232 @@
+--TEST--
+Test mb_strstr() function : usage variation - different values for part
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // string data
+ 'string DQ' => "string",
+ 'string SQ' => 'string',
+ 'mixed case string' => "sTrInG",
+ 'heredoc' => $heredoc,
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for part
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ $res = mb_strstr($haystack, $needle, $value, $encoding);
+ if ($res === false) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : usage variation ***
+
+--int 0--
+string(8) "5f76616c"
+
+--int 1--
+string(12) "737472696e67"
+
+--int 12345--
+string(12) "737472696e67"
+
+--int -12345--
+string(12) "737472696e67"
+
+--float 10.5--
+string(12) "737472696e67"
+
+--float -10.5--
+string(12) "737472696e67"
+
+--float 12.3456789000e10--
+string(12) "737472696e67"
+
+--float -12.3456789000e10--
+string(12) "737472696e67"
+
+--float .5--
+string(12) "737472696e67"
+
+--empty array--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+string(8) "5f76616c"
+
+--lowercase null--
+string(8) "5f76616c"
+
+--lowercase true--
+string(12) "737472696e67"
+
+--lowercase false--
+string(8) "5f76616c"
+
+--uppercase TRUE--
+string(12) "737472696e67"
+
+--uppercase FALSE--
+string(8) "5f76616c"
+
+--empty string DQ--
+string(8) "5f76616c"
+
+--empty string SQ--
+string(8) "5f76616c"
+
+--string DQ--
+string(12) "737472696e67"
+
+--string SQ--
+string(12) "737472696e67"
+
+--mixed case string--
+string(12) "737472696e67"
+
+--heredoc--
+string(12) "737472696e67"
+
+--instance of classWithToString--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--undefined var--
+string(8) "5f76616c"
+
+--unset var--
+string(8) "5f76616c"
+
+--resource--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation4.phpt b/ext/mbstring/tests/mb_strstr_variation4.phpt
new file mode 100644
index 000000000..3a208d312
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation4.phpt
@@ -0,0 +1,227 @@
+--TEST--
+Test mb_strstr() function : usage variation - different encoding types
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$part = true;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "invalid";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+invalid
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for encoding
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strstr($haystack, $needle, $part, $value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : usage variation ***
+
+--int 0--
+Error: 2 - mb_strstr(): Unknown encoding "0", %s(%d)
+bool(false)
+
+--int 1--
+Error: 2 - mb_strstr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--int 12345--
+Error: 2 - mb_strstr(): Unknown encoding "12345", %s(%d)
+bool(false)
+
+--int -12345--
+Error: 2 - mb_strstr(): Unknown encoding "-2345", %s(%d)
+bool(false)
+
+--float 10.5--
+Error: 2 - mb_strstr(): Unknown encoding "10.5", %s(%d)
+bool(false)
+
+--float -10.5--
+Error: 2 - mb_strstr(): Unknown encoding "-10.5", %s(%d)
+bool(false)
+
+--float 12.3456789000e10--
+Error: 2 - mb_strstr(): Unknown encoding "123456789000", %s(%d)
+bool(false)
+
+--float -12.3456789000e10--
+Error: 2 - mb_strstr(): Unknown encoding "-123456789000", %s(%d)
+bool(false)
+
+--float .5--
+Error: 2 - mb_strstr(): Unknown encoding "0.5", %s(%d)
+bool(false)
+
+--empty array--
+Error: 2 - mb_strstr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strstr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strstr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strstr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase true--
+Error: 2 - mb_strstr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--uppercase TRUE--
+Error: 2 - mb_strstr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--instance of classWithToString--
+Error: 2 - mb_strstr(): Unknown encoding "invalid", %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strstr() expects parameter 4 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_strstr() expects parameter 4 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation5.phpt b/ext/mbstring/tests/mb_strstr_variation5.phpt
new file mode 100644
index 000000000..3bfbd6164
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation5.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Test mb_strstr() function : variation - multiple needles
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : variation ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//with repeated needles
+$string_ascii = b'abcdef zbcdyx';
+$needle_ascii = b"bcd";
+
+//Japanese string in UTF-8 with repeated needles
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OIMzTvvJXvvJbml6XmnKzoqp7jg4bjgq3jgrnjg4g=');
+$needle_mb = base64_decode('6Kqe44OG44Kt');
+
+echo "-- Ascii data --\n";
+var_dump(bin2hex(mb_strstr($string_ascii, $needle_ascii, false)));
+var_dump(bin2hex(mb_strstr($string_ascii, $needle_ascii, true)));
+
+echo "-- mb data in utf-8 --\n";
+$res = mb_strstr($string_mb, $needle_mb, false);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+$res = mb_strstr($string_mb, $needle_mb, true);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strstr() : variation ***
+-- Ascii data --
+string(24) "6263646566207a6263647978"
+string(2) "61"
+-- mb data in utf-8 --
+string(88) "e8aa9ee38386e382ade382b9e383883334efbc95efbc96e697a5e69cace8aa9ee38386e382ade382b9e38388"
+string(12) "e697a5e69cac"
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation6.phpt b/ext/mbstring/tests/mb_strstr_variation6.phpt
new file mode 100644
index 000000000..1242e02d1
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation6.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Test mb_strstr() function : variation - case sensitivity
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : variation ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii
+$string_ascii = b'abcdef';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in lower case UTF-8
+$string_mb = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "-- Ascii data --\n";
+// needle should be found
+var_dump(bin2hex(mb_strstr($string_ascii, $needle_ascii_lower)));
+// no needle should be found
+var_dump(mb_strstr($string_ascii, $needle_ascii_upper));
+var_dump(mb_strstr($string_ascii, $needle_ascii_mixed));
+
+echo "-- mb data in utf-8 --\n";
+// needle should be found
+$res = mb_strstr($string_mb, $needle_mb_lower, false);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+// no needle should be found
+var_dump(mb_strstr($string_mb, $needle_mb_upper));
+var_dump(mb_strstr($string_mb, $needle_mb_mixed));
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strstr() : variation ***
+-- Ascii data --
+string(10) "6263646566"
+bool(false)
+bool(false)
+-- mb data in utf-8 --
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+bool(false)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strtolower_variation1.phpt b/ext/mbstring/tests/mb_strtolower_variation1.phpt
index ac468ca0d..3b151b96c 100644
--- a/ext/mbstring/tests/mb_strtolower_variation1.phpt
+++ b/ext/mbstring/tests/mb_strtolower_variation1.phpt
@@ -18,8 +18,6 @@ function_exists('mb_strtolower') or die("skip mb_strtolower() is not available i
echo "*** Testing mb_strtolower() : usage variations ***\n";
-// Initialise function arguments not being substituted
-$encoding = 'UTF-8';
//get an unset variable
$unset_var = 10;
@@ -93,7 +91,7 @@ $inputs = array(
$iterator = 1;
foreach($inputs as $input) {
echo "\n-- Iteration $iterator --\n";
- var_dump( mb_strtolower($input, $encoding) );
+ var_dump( mb_strtolower($input) );
$iterator++;
};
diff --git a/ext/mbstring/tests/mb_strtolower_variation2.phpt b/ext/mbstring/tests/mb_strtolower_variation2.phpt
index c9a674f5c..293c9559a 100644
--- a/ext/mbstring/tests/mb_strtolower_variation2.phpt
+++ b/ext/mbstring/tests/mb_strtolower_variation2.phpt
@@ -20,7 +20,7 @@ function_exists('mb_strtolower') or die("skip mb_strtolower() is not available i
echo "*** Testing mb_strtolower() : usage variations ***\n";
// Initialise function arguments not being substituted
-$sourcestring = 'Hello, World';
+$sourcestring = b'Hello, World';
//get an unset variable
$unset_var = 10;
@@ -94,7 +94,13 @@ $inputs = array(
$iterator = 1;
foreach($inputs as $input) {
echo "\n-- Iteration $iterator --\n";
- var_dump( mb_strtolower($sourcestring, $input) );
+ $res = mb_strtolower($sourcestring, $input);
+ if ($res === false || $res == NULL) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
$iterator++;
};
@@ -191,16 +197,16 @@ Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
bool(false)
-- Iteration 18 --
-string(12) "hello, world"
+string(24) "68656c6c6f2c20776f726c64"
-- Iteration 19 --
-string(12) "hello, world"
+string(24) "68656c6c6f2c20776f726c64"
-- Iteration 20 --
-string(12) "hello, world"
+string(24) "68656c6c6f2c20776f726c64"
-- Iteration 21 --
-string(12) "hello, world"
+string(24) "68656c6c6f2c20776f726c64"
-- Iteration 22 --
diff --git a/ext/mbstring/tests/mb_strtolower_variation4.phpt b/ext/mbstring/tests/mb_strtolower_variation4.phpt
index f08b50879..37357a189 100644
--- a/ext/mbstring/tests/mb_strtolower_variation4.phpt
+++ b/ext/mbstring/tests/mb_strtolower_variation4.phpt
@@ -18,10 +18,10 @@ function_exists('mb_strtolower') or die("skip mb_strtolower() is not available i
echo "*** Testing mb_strtolower() : usage variations ***\n";
-$uppers = array('Basic Latin' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+$uppers = array('Basic Latin' => b'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'Characters With Accents' => base64_decode('w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlg=='),
'Russian' => base64_decode('0JDQkdCS0JPQlNCV0JbQlw=='));
-$lowers = array('Basic Latin' => 'abcdefghijklmnopqrstuvwxyz',
+$lowers = array('Basic Latin' => b'abcdefghijklmnopqrstuvwxyz',
'Characters With Accents' => base64_decode('w6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtg=='),
'Russian' => base64_decode('0LDQsdCy0LPQtNC10LbQtw=='));
diff --git a/ext/mbstring/tests/mb_strtoupper_basic.phpt b/ext/mbstring/tests/mb_strtoupper_basic.phpt
index b282647f8..e77646923 100644
--- a/ext/mbstring/tests/mb_strtoupper_basic.phpt
+++ b/ext/mbstring/tests/mb_strtoupper_basic.phpt
@@ -19,14 +19,14 @@ function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available i
echo "*** Testing mb_strtoupper() : basic functionality ***\n";
mb_internal_encoding('utf-8');
-$ascii_lower = 'abcdefghijklmnopqrstuvwxyz';
-$ascii_upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+$ascii_lower = b'abcdefghijklmnopqrstuvwxyz';
+$ascii_upper = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$greek_lower = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
$greek_upper = base64_decode('zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6p');
echo "\n-- ASCII String --\n";
$ascii = mb_strtoupper($ascii_lower);
-var_dump($ascii);
+var_dump(base64_encode($ascii));
if($ascii == $ascii_upper) {
echo "Correctly converted\n";
@@ -47,11 +47,11 @@ if ($mb == $greek_upper) {
echo "Done";
?>
---EXPECTF--
+--EXPECT--
*** Testing mb_strtoupper() : basic functionality ***
-- ASCII String --
-string(26) "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+string(36) "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo="
Correctly converted
-- Multibyte String --
diff --git a/ext/mbstring/tests/mb_strtoupper_variation1.phpt b/ext/mbstring/tests/mb_strtoupper_variation1.phpt
index b602f696b..efe884563 100644
--- a/ext/mbstring/tests/mb_strtoupper_variation1.phpt
+++ b/ext/mbstring/tests/mb_strtoupper_variation1.phpt
@@ -20,7 +20,6 @@ function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available i
echo "*** Testing mb_strtoupper() : usage variations ***\n";
// Initialise function arguments not being substituted
-$encoding = 'UTF-8';
//get an unset variable
$unset_var = 10;
@@ -94,7 +93,7 @@ $inputs = array(
$iterator = 1;
foreach($inputs as $input) {
echo "\n-- Iteration $iterator --\n";
- var_dump( mb_strtoupper($input, $encoding) );
+ var_dump( mb_strtoupper($input) );
$iterator++;
};
diff --git a/ext/mbstring/tests/mb_strtoupper_variation2.phpt b/ext/mbstring/tests/mb_strtoupper_variation2.phpt
index 3291ce71c..035cd63f4 100644
--- a/ext/mbstring/tests/mb_strtoupper_variation2.phpt
+++ b/ext/mbstring/tests/mb_strtoupper_variation2.phpt
@@ -20,7 +20,7 @@ function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available i
echo "*** Testing mb_strtoupper() : usage variations ***\n";
// Initialise function arguments not being substituted
-$sourcestring = 'Hello, World';
+$sourcestring = b'Hello, World';
//get an unset variable
$unset_var = 10;
@@ -94,7 +94,13 @@ $inputs = array(
$iterator = 1;
foreach($inputs as $input) {
echo "\n-- Iteration $iterator --\n";
- var_dump( mb_strtoupper($sourcestring, $input) );
+ $res = mb_strtoupper($sourcestring, $input);
+ if ($res === false || $res == NULL) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
$iterator++;
};
@@ -192,16 +198,16 @@ Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
bool(false)
-- Iteration 18 --
-string(12) "HELLO, WORLD"
+string(24) "48454c4c4f2c20574f524c44"
-- Iteration 19 --
-string(12) "HELLO, WORLD"
+string(24) "48454c4c4f2c20574f524c44"
-- Iteration 20 --
-string(12) "HELLO, WORLD"
+string(24) "48454c4c4f2c20574f524c44"
-- Iteration 21 --
-string(12) "HELLO, WORLD"
+string(24) "48454c4c4f2c20574f524c44"
-- Iteration 22 --
diff --git a/ext/mbstring/tests/mb_strtoupper_variation4.phpt b/ext/mbstring/tests/mb_strtoupper_variation4.phpt
index 8f5abe726..7d91c8a2d 100644
--- a/ext/mbstring/tests/mb_strtoupper_variation4.phpt
+++ b/ext/mbstring/tests/mb_strtoupper_variation4.phpt
@@ -19,10 +19,10 @@ function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available i
echo "*** Testing mb_strtoupper() : usage variations ***\n";
-$uppers = array('Basic Latin' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+$uppers = array('Basic Latin' => b'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'Characters With Accents' => base64_decode('w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlg=='),
'Russian' => base64_decode('0JDQkdCS0JPQlNCV0JbQlw=='));
-$lowers = array('Basic Latin' => 'abcdefghijklmnopqrstuvwxyz',
+$lowers = array('Basic Latin' => b'abcdefghijklmnopqrstuvwxyz',
'Characters With Accents' => base64_decode('w6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtg=='),
'Russian' => base64_decode('0LDQsdCy0LPQtNC10LbQtw=='));
diff --git a/ext/mbstring/tests/mb_substitute_character.phpt b/ext/mbstring/tests/mb_substitute_character.phpt
index 9f2131080..9f35f1d26 100644
--- a/ext/mbstring/tests/mb_substitute_character.phpt
+++ b/ext/mbstring/tests/mb_substitute_character.phpt
@@ -10,40 +10,36 @@ include_once('common.inc');
// Note: It does not return TRUE/FALSE for setting char
-// Use Unicode val
-$r = mb_substitute_character(0x3013);
-//$r = mb_substitute_character('U+3013');
-($r === TRUE) ? print "OK_UTF\n" : print("NG_UTF: ".gettype($r)." $r\n");
-print mb_substitute_character() . "\n";
+var_dump(mb_substitute_character(0x3044));
+var_dump(mb_substitute_character());
+var_dump(bin2hex(mb_convert_encoding("\xe2\x99\xa0\xe3\x81\x82", "CP932", "UTF-8")));
+var_dump(mb_substitute_character('long'));
+var_dump(mb_substitute_character());
+var_dump(bin2hex(mb_convert_encoding("\xe2\x99\xa0\xe3\x81\x82", "CP932", "UTF-8")));
-// Use "long"
-$r = mb_substitute_character('long');
-($r === TRUE) ? print "OK_LONG\n" : print("NG_LONG: ".gettype($r)." $r\n");
-print mb_substitute_character() . "\n";
+var_dump(mb_substitute_character('none'));
+var_dump(mb_substitute_character());
+var_dump(bin2hex(mb_convert_encoding("\xe2\x99\xa0\xe3\x81\x82", "CP932", "UTF-8")));
+var_dump(mb_substitute_character('entity'));
+var_dump(mb_substitute_character());
+var_dump(bin2hex(mb_convert_encoding("\xe2\x99\xa0\xe3\x81\x82", "CP932", "UTF-8")));
-// Use "none"
-$r = mb_substitute_character('none');
-($r === TRUE) ? print "OK_NONE\n" : print("NG_NONE: ".gettype($r)." $r\n");
-print mb_substitute_character() . "\n";
-
-
-// Set invalid string. Should fail.
-print "== INVALID PARAMETER ==\n";
-$r = mb_substitute_character('BAD_NAME');
-($r === FALSE) ? print "OK_BAD_NAME\n" : print("NG_BAD_NAME: ".gettype($r)." $r\n");
-
+var_dump(mb_substitute_character('BAD_NAME'));
?>
-
--EXPECT--
-OK_UTF
-12307
-OK_LONG
-long
-OK_NONE
-none
-== INVALID PARAMETER ==
+bool(true)
+int(12356)
+string(8) "82a282a0"
+bool(true)
+string(4) "long"
+string(16) "552b3236363082a0"
+bool(true)
+string(4) "none"
+string(4) "82a0"
+bool(true)
+string(6) "entity"
+string(20) "262378323636303b82a0"
ERR: Warning
-OK_BAD_NAME
-
+bool(false)
diff --git a/ext/mbstring/tests/mb_substitute_character_basic.phpt b/ext/mbstring/tests/mb_substitute_character_basic.phpt
new file mode 100644
index 000000000..30cda8a92
--- /dev/null
+++ b/ext/mbstring/tests/mb_substitute_character_basic.phpt
@@ -0,0 +1,43 @@
+--TEST--
+Test mb_substitute_character() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substitute_character') or die("skip mb_substitute_character() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : mixed mb_substitute_character([mixed substchar])
+ * Description: Sets the current substitute_character or returns the current substitute_character
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_substitute_character() : basic functionality ***\n";
+
+
+// Initialise all required variables
+var_dump( mb_substitute_character() );
+var_dump( mb_substitute_character(66) );
+var_dump( mb_substitute_character() );
+var_dump( mb_substitute_character(1234) );
+var_dump( mb_substitute_character() );
+var_dump( mb_substitute_character("none") );
+var_dump( mb_substitute_character() );
+var_dump( mb_substitute_character("b") );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_substitute_character() : basic functionality ***
+int(63)
+bool(true)
+int(66)
+bool(true)
+int(1234)
+bool(true)
+string(4) "none"
+
+Warning: mb_substitute_character(): Unknown character. in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_substitute_character_error.phpt b/ext/mbstring/tests/mb_substitute_character_error.phpt
new file mode 100644
index 000000000..7576accd8
--- /dev/null
+++ b/ext/mbstring/tests/mb_substitute_character_error.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Test mb_substitute_character() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substitute_character') or die("skip mb_substitute_character() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : mixed mb_substitute_character([mixed substchar])
+ * Description: Sets the current substitute_character or returns the current substitute_character
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_substitute_character() : error conditions ***\n";
+
+
+//Test mb_substitute_character with one more than the expected number of arguments
+echo "\n-- Testing mb_substitute_character() function with more than expected no. of arguments --\n";
+$substchar = 1;
+$extra_arg = 10;
+var_dump( mb_substitute_character($substchar, $extra_arg) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_substitute_character() : error conditions ***
+
+-- Testing mb_substitute_character() function with more than expected no. of arguments --
+
+Warning: Wrong parameter count for mb_substitute_character() in %s on line %d
+NULL
+===DONE===
diff --git a/ext/mbstring/tests/mb_substitute_character_variation1.phpt b/ext/mbstring/tests/mb_substitute_character_variation1.phpt
new file mode 100644
index 000000000..435f95adf
--- /dev/null
+++ b/ext/mbstring/tests/mb_substitute_character_variation1.phpt
@@ -0,0 +1,238 @@
+--TEST--
+Test mb_substitute_character() function : usage variation
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substitute_character') or die("skip mb_substitute_character() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : mixed mb_substitute_character([mixed substchar])
+ * Description: Sets the current substitute_character or returns the current substitute_character
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_substitute_character() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // string data
+ 'string DQ' => "string",
+ 'string SQ' => 'string',
+ 'mixed case string' => "sTrInG",
+ 'heredoc' => $heredoc,
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for substchar
+
+mb_internal_encoding('utf-8');
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_substitute_character($value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_substitute_character() : usage variation ***
+
+--int 0--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--int 1--
+bool(true)
+
+--int 12345--
+bool(true)
+
+--int -12345--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--float 10.5--
+bool(true)
+
+--float -10.5--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--float 12.3456789000e10--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--float -12.3456789000e10--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--float .5--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--empty array--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--int indexed array--
+bool(true)
+
+--associative array--
+bool(true)
+
+--nested arrays--
+bool(true)
+
+--uppercase NULL--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--lowercase true--
+bool(true)
+
+--lowercase false--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--uppercase TRUE--
+bool(true)
+
+--uppercase FALSE--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--string DQ--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--string SQ--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--mixed case string--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--heredoc--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--instance of classWithToString--
+Error: 8 - Object of class classWithToString could not be converted to int, %s(%d)
+bool(true)
+
+--instance of classWithoutToString--
+Error: 8 - Object of class classWithoutToString could not be converted to int, %s(%d)
+bool(true)
+
+--undefined var--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--resource--
+bool(true)
+===DONE===
diff --git a/ext/mbstring/tests/mb_substitute_character_variation2.phpt b/ext/mbstring/tests/mb_substitute_character_variation2.phpt
new file mode 100644
index 000000000..202561afc
--- /dev/null
+++ b/ext/mbstring/tests/mb_substitute_character_variation2.phpt
@@ -0,0 +1,39 @@
+--TEST--
+Test mb_substitute_character() function : variation unmappable out char for convert encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substitute_character') or die("skip mb_substitute_character() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : mixed mb_substitute_character([mixed substchar])
+ * Description: Sets the current substitute_character or returns the current substitute_character
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_substitute_character() : variation ***\n";
+//japenese utf-8
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI');
+
+//output the default which is ? in ISO-8859-1, x3f
+var_dump(bin2hex(mb_convert_encoding($string_mb, "ISO-8859-1", "UTF-8")));
+
+mb_substitute_character(66); //'B' in ISO-8859-1, x42
+var_dump(bin2hex(mb_convert_encoding($string_mb, "ISO-8859-1", "UTF-8")));
+mb_substitute_character("none"); //no substitution
+var_dump(bin2hex(mb_convert_encoding($string_mb, "ISO-8859-1", "UTF-8")));
+mb_substitute_character(280); //not valid in ISO-8859-1
+var_dump(bin2hex(mb_convert_encoding($string_mb, "ISO-8859-1", "UTF-8")));
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_substitute_character() : variation ***
+string(14) "3f3f3f3f3f3f3f"
+string(14) "42424242424242"
+string(0) ""
+string(0) ""
+===DONE===
diff --git a/ext/mbstring/tests/mb_substr.phpt b/ext/mbstring/tests/mb_substr.phpt
index 579e7ffb5..d9269c377 100644
--- a/ext/mbstring/tests/mb_substr.phpt
+++ b/ext/mbstring/tests/mb_substr.phpt
@@ -12,24 +12,24 @@ ini_set('include_path','.');
include_once('common.inc');
// EUC-JP
-$euc_jp = '0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。';
+$euc_jp = b'0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。';
-print "1: ". mb_substr($euc_jp, 10, 10,'EUC-JP') . "\n";
-print "2: ". mb_substr($euc_jp, 0, 100,'EUC-JP') . "\n";
+print "1: ". bin2hex(mb_substr($euc_jp, 10, 10,'EUC-JP')) . "\n";
+print "2: ". bin2hex(mb_substr($euc_jp, 0, 100,'EUC-JP')) . "\n";
$str = mb_substr($euc_jp, 100, 10,'EUC-JP');
// Note: returns last character
-($str === "") ? print "3 OK\n" : print "NG: $str\n";
+($str === "") ? print "3 OK\n" : print "NG: ".bin2hex($str)."\n";
$str = mb_substr($euc_jp, -100, 10,'EUC-JP');
-($str !== "") ? print "4 OK: $str\n" : print "NG: $str\n";
+($str !== "") ? print "4 OK: ".bin2hex($str)."\n" : print "NG: ".bin2hex($str)."\n";
?>
--EXPECT--
-1: 日本語です。EUC-
-2: 0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。
+1: c6fccbdcb8eca4c7a4b9a1a34555432d
+2: 30313233a4b3a4cecab8bbfacef3a4cfc6fccbdcb8eca4c7a4b9a1a34555432d4a50a4f2bbc8a4c3a4c6a4a4a4dea4b9a1a3c6fccbdcb8eca4cfccccc5ddbdada4a4a1a3
3 OK
-4 OK: 0123この文字列は
+4 OK: 30313233a4b3a4cecab8bbfacef3a4cf
diff --git a/ext/mbstring/tests/mb_substr_basic.phpt b/ext/mbstring/tests/mb_substr_basic.phpt
index a43cf15bb..d6d6b75d2 100644
--- a/ext/mbstring/tests/mb_substr_basic.phpt
+++ b/ext/mbstring/tests/mb_substr_basic.phpt
@@ -5,6 +5,8 @@ Test mb_substr() function : basic functionality
extension_loaded('mbstring') or die('skip');
function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
?>
+--INI--
+mbstring.internal_encoding=ISO-8859-1
--FILE--
<?php
/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
@@ -52,4 +54,4 @@ string(12) "peacrOiqng=="
-- Multibyte string 2 --
string(28) "6Kqe44OG44Kt44K544OI44Gn44GZ"
-Done \ No newline at end of file
+Done
diff --git a/ext/mbstring/tests/mb_substr_count_variation1.phpt b/ext/mbstring/tests/mb_substr_count_variation1.phpt
index 8121b4871..cc55135ab 100644
--- a/ext/mbstring/tests/mb_substr_count_variation1.phpt
+++ b/ext/mbstring/tests/mb_substr_count_variation1.phpt
@@ -21,7 +21,6 @@ echo "*** Testing mb_substr_count() : usage variations ***\n";
// Initialise function arguments not being substituted
$needle = 'world';
-$encoding = 'utf-8';
//get an unset variable
$unset_var = 10;
@@ -95,7 +94,7 @@ $inputs = array(
$iterator = 1;
foreach($inputs as $input) {
echo "\n-- Iteration $iterator --\n";
- var_dump( mb_substr_count($input, $needle, $encoding) );
+ var_dump( mb_substr_count($input, $needle) );
$iterator++;
};
diff --git a/ext/mbstring/tests/mb_substr_count_variation2.phpt b/ext/mbstring/tests/mb_substr_count_variation2.phpt
index dac48b55a..87b5eed18 100644
--- a/ext/mbstring/tests/mb_substr_count_variation2.phpt
+++ b/ext/mbstring/tests/mb_substr_count_variation2.phpt
@@ -20,7 +20,6 @@ echo "*** Testing mb_substr_count() : usage variations ***\n";
// Initialise function arguments not being substituted (if any)
$haystack = 'hello, world';
-$encoding = 'utf-8';
//get an unset variable
$unset_var = 10;
@@ -94,7 +93,7 @@ $inputs = array(
$iterator = 1;
foreach($inputs as $input) {
echo "\n-- Iteration $iterator --\n";
- var_dump( mb_substr_count($haystack, $input, $encoding) );
+ var_dump( mb_substr_count($haystack, $input) );
$iterator++;
};
@@ -134,12 +133,12 @@ int(0)
-- Iteration 10 --
-Warning: mb_substr_count(): Empty substring. in %s on line %d
+Warning: mb_substr_count(): Empty substring in %s on line %d
bool(false)
-- Iteration 11 --
-Warning: mb_substr_count(): Empty substring. in %s on line %d
+Warning: mb_substr_count(): Empty substring in %s on line %d
bool(false)
-- Iteration 12 --
@@ -147,7 +146,7 @@ int(0)
-- Iteration 13 --
-Warning: mb_substr_count(): Empty substring. in %s on line %d
+Warning: mb_substr_count(): Empty substring in %s on line %d
bool(false)
-- Iteration 14 --
@@ -155,17 +154,17 @@ int(0)
-- Iteration 15 --
-Warning: mb_substr_count(): Empty substring. in %s on line %d
+Warning: mb_substr_count(): Empty substring in %s on line %d
bool(false)
-- Iteration 16 --
-Warning: mb_substr_count(): Empty substring. in %s on line %d
+Warning: mb_substr_count(): Empty substring in %s on line %d
bool(false)
-- Iteration 17 --
-Warning: mb_substr_count(): Empty substring. in %s on line %d
+Warning: mb_substr_count(): Empty substring in %s on line %d
bool(false)
-- Iteration 18 --
@@ -182,16 +181,16 @@ int(1)
-- Iteration 22 --
-Warning: mb_substr_count(): Empty substring. in %s on line %d
+Warning: mb_substr_count(): Empty substring in %s on line %d
bool(false)
-- Iteration 23 --
-Warning: mb_substr_count(): Empty substring. in %s on line %d
+Warning: mb_substr_count(): Empty substring in %s on line %d
bool(false)
-- Iteration 24 --
Warning: mb_substr_count() expects parameter 2 to be string, resource given in %s on line %d
NULL
-Done \ No newline at end of file
+Done
diff --git a/ext/mbstring/tests/mb_substr_count_variation3.phpt b/ext/mbstring/tests/mb_substr_count_variation3.phpt
index d2e7a6056..65c8769b0 100644
--- a/ext/mbstring/tests/mb_substr_count_variation3.phpt
+++ b/ext/mbstring/tests/mb_substr_count_variation3.phpt
@@ -20,8 +20,8 @@ function_exists('mb_substr_count') or die("skip mb_substr_count() is not availab
echo "*** Testing mb_substr_count() : usage variations ***\n";
// Initialise function arguments not being substituted (if any)
-$haystack = 'hello, world';
-$needle = 'world';
+$haystack = b'hello, world';
+$needle = b'world';
//get an unset variable
$unset_var = 10;
diff --git a/ext/mbstring/tests/mb_substr_count_variation4.phpt b/ext/mbstring/tests/mb_substr_count_variation4.phpt
new file mode 100644
index 000000000..624c95a95
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_count_variation4.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Test mb_substr_count() function : variation - pass a $needle that overlaps in $haystack
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr_count') or die("skip mb_substr_count() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_substr_count(string $haystack, string $needle [, string $encoding])
+ * Description: Count the number of substring occurrences
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_substr_count() a $needle that overlaps in $haystack and see whether
+ * it counts only the first occurrence or all other occurrences regardless whether they
+ * were part of previous match
+ */
+
+echo "*** Testing mb_substr_count() : usage variations ***\n";
+
+
+echo "\n-- ASCII String --\n";
+$string_ascii = b'abcabcabc';
+var_dump(mb_substr_count($string_ascii, b'abcabc')); //needle overlaps in haystack
+
+echo "\n-- Multibyte String --\n";
+$string_mb = base64_decode('5pel5pys6Kqe5pel5pys6Kqe5pel5pys6Kqe');
+$needle_mb = base64_decode('5pel5pys6Kqe5pel5pys6Kqe');
+var_dump(mb_substr_count($string_mb, $needle_mb, 'utf-8'));
+
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr_count() : usage variations ***
+
+-- ASCII String --
+int(1)
+
+-- Multibyte String --
+int(1)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_substr_variation1.phpt b/ext/mbstring/tests/mb_substr_variation1.phpt
index fd9d0db47..eae73da1d 100644
--- a/ext/mbstring/tests/mb_substr_variation1.phpt
+++ b/ext/mbstring/tests/mb_substr_variation1.phpt
@@ -21,7 +21,6 @@ echo "*** Testing mb_substr() : usage variations ***\n";
// Initialise function arguments not being substituted
$start = 0;
$length = 5;
-$encoding = 'utf-8';
//get an unset variable
$unset_var = 10;
@@ -95,7 +94,7 @@ $inputs = array(
$iterator = 1;
foreach($inputs as $input) {
echo "\n-- Iteration $iterator --\n";
- var_dump( mb_substr($input, $start, $length, $encoding));
+ var_dump( mb_substr($input, $start, $length));
$iterator++;
};
diff --git a/ext/mbstring/tests/mb_substr_variation2.phpt b/ext/mbstring/tests/mb_substr_variation2.phpt
index cb8a37af5..bdfd9102b 100644
--- a/ext/mbstring/tests/mb_substr_variation2.phpt
+++ b/ext/mbstring/tests/mb_substr_variation2.phpt
@@ -20,7 +20,7 @@ function_exists('mb_substr') or die("skip mb_substr() is not available in this b
echo "*** Testing mb_substr() : usage variations ***\n";
// Initialise function arguments not being substituted
-$str = 'string_val';
+$str = b'string_val';
$start = 1;
$length = 5;
@@ -96,7 +96,13 @@ $inputs = array(
$iterator = 1;
foreach($inputs as $input) {
echo "\n-- Iteration $iterator --\n";
- var_dump( mb_substr($str, $start, $length, $input));
+ $res = mb_substr($str, $start, $length, $input);
+ if ($res === false) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
$iterator++;
};
@@ -192,16 +198,16 @@ Warning: mb_substr(): Unknown encoding "" in %s on line %d
bool(false)
-- Iteration 18 --
-string(5) "tring"
+string(10) "7472696e67"
-- Iteration 19 --
-string(5) "tring"
+string(10) "7472696e67"
-- Iteration 20 --
-string(5) "tring"
+string(10) "7472696e67"
-- Iteration 21 --
-string(5) "tring"
+string(10) "7472696e67"
-- Iteration 22 --
diff --git a/ext/mbstring/tests/mb_substr_variation4.phpt b/ext/mbstring/tests/mb_substr_variation4.phpt
index d2c4de3ce..c4a723a0a 100644
--- a/ext/mbstring/tests/mb_substr_variation4.phpt
+++ b/ext/mbstring/tests/mb_substr_variation4.phpt
@@ -20,7 +20,7 @@ echo "*** Testing mb_substr() : usage variations ***\n";
mb_internal_encoding('UTF-8');
-$string_ascii = '+Is an English string'; //21 chars
+$string_ascii = b'+Is an English string'; //21 chars
$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); //21 chars
@@ -35,7 +35,8 @@ for ($i = -60; $i <= 60; $i += 10) {
}
echo "\n**-- Offset is: $i --**\n";
echo "-- ASCII String --\n";
- var_dump($a = mb_substr($string_ascii, $i, 4));
+ $a = mb_substr($string_ascii, $i, 4);
+ var_dump(base64_encode($a));
echo "--Multibyte String --\n";
$b = mb_substr($string_mb, $i, 4, 'UTF-8');
if (strlen($a) == mb_strlen($b, 'UTF-8')) { // should return same length
@@ -48,60 +49,60 @@ for ($i = -60; $i <= 60; $i += 10) {
echo "Done";
?>
---EXPECTF--
+--EXPECT--
*** Testing mb_substr() : usage variations ***
**-- Offset is: -60 --**
-- ASCII String --
-string(4) "+Is "
+string(8) "K0lzIA=="
--Multibyte String --
string(16) "5pel5pys6Kqe44OG"
**-- Offset is: -50 --**
-- ASCII String --
-string(4) "+Is "
+string(8) "K0lzIA=="
--Multibyte String --
string(16) "5pel5pys6Kqe44OG"
**-- Offset is: -40 --**
-- ASCII String --
-string(4) "+Is "
+string(8) "K0lzIA=="
--Multibyte String --
string(16) "5pel5pys6Kqe44OG"
**-- Offset is: -30 --**
-- ASCII String --
-string(4) "+Is "
+string(8) "K0lzIA=="
--Multibyte String --
string(16) "5pel5pys6Kqe44OG"
**-- Offset is: -20 --**
-- ASCII String --
-string(4) "Is a"
+string(8) "SXMgYQ=="
--Multibyte String --
string(16) "5pys6Kqe44OG44Kt"
**-- Offset is: -10 --**
-- ASCII String --
-string(4) "ish "
+string(8) "aXNoIA=="
--Multibyte String --
string(8) "MTIzNA=="
**-- Offset is: 0 --**
-- ASCII String --
-string(4) "+Is "
+string(8) "K0lzIA=="
--Multibyte String --
string(16) "5pel5pys6Kqe44OG"
**-- Offset is: 10 --**
-- ASCII String --
-string(4) "lish"
+string(8) "bGlzaA=="
--Multibyte String --
string(8) "MDEyMw=="
**-- Offset is: 20 --**
-- ASCII String --
-string(1) "g"
+string(4) "Zw=="
--Multibyte String --
string(4) "44CC"
diff --git a/ext/mbstring/tests/mb_substr_variation5.phpt b/ext/mbstring/tests/mb_substr_variation5.phpt
index 02ea6d3aa..11caa9cab 100644
--- a/ext/mbstring/tests/mb_substr_variation5.phpt
+++ b/ext/mbstring/tests/mb_substr_variation5.phpt
@@ -6,7 +6,6 @@ extension_loaded('mbstring') or die('skip');
function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
?>
--FILE--
-
<?php
/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
* Description: Returns part of a string
@@ -21,7 +20,7 @@ echo "*** Testing mb_substr() : usage variations ***\n";
mb_internal_encoding('UTF-8');
-$string_ascii = '+Is an English string'; //21 chars
+$string_ascii = b'+Is an English string'; //21 chars
//Japanese string, 21 characters
$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
@@ -37,7 +36,8 @@ for ($i = -60; $i <= 60; $i += 10) {
}
echo "\n**-- Offset is: $i --**\n";
echo "-- ASCII String --\n";
- var_dump($a = mb_substr($string_ascii, 1, $i));
+ $a = mb_substr($string_ascii, 1, $i);
+ var_dump(base64_encode($a));
echo "--Multibyte String --\n";
$b = mb_substr($string_mb, 1, $i, 'UTF-8');
if (strlen($a) == mb_strlen($b, 'UTF-8')) { // should return same length
@@ -50,8 +50,7 @@ for ($i = -60; $i <= 60; $i += 10) {
echo "Done";
?>
-
---EXPECTF--
+--EXPECT--
*** Testing mb_substr() : usage variations ***
**-- Offset is: -60 --**
@@ -86,7 +85,7 @@ string(0) ""
**-- Offset is: -10 --**
-- ASCII String --
-string(10) "Is an Engl"
+string(16) "SXMgYW4gRW5nbA=="
--Multibyte String --
string(40) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMA=="
@@ -98,37 +97,37 @@ string(0) ""
**-- Offset is: 10 --**
-- ASCII String --
-string(10) "Is an Engl"
+string(16) "SXMgYW4gRW5nbA=="
--Multibyte String --
string(40) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMA=="
**-- Offset is: 20 --**
-- ASCII String --
-string(20) "Is an English string"
+string(28) "SXMgYW4gRW5nbGlzaCBzdHJpbmc="
--Multibyte String --
string(68) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
**-- Offset is: 30 --**
-- ASCII String --
-string(20) "Is an English string"
+string(28) "SXMgYW4gRW5nbGlzaCBzdHJpbmc="
--Multibyte String --
string(68) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
**-- Offset is: 40 --**
-- ASCII String --
-string(20) "Is an English string"
+string(28) "SXMgYW4gRW5nbGlzaCBzdHJpbmc="
--Multibyte String --
string(68) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
**-- Offset is: 50 --**
-- ASCII String --
-string(20) "Is an English string"
+string(28) "SXMgYW4gRW5nbGlzaCBzdHJpbmc="
--Multibyte String --
string(68) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
**-- Offset is: 60 --**
-- ASCII String --
-string(20) "Is an English string"
+string(28) "SXMgYW4gRW5nbGlzaCBzdHJpbmc="
--Multibyte String --
string(68) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_substr_variation6.phpt b/ext/mbstring/tests/mb_substr_variation6.phpt
new file mode 100644
index 000000000..20ee1ec15
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_variation6.phpt
@@ -0,0 +1,137 @@
+--TEST--
+Test mb_substr() function : usage variations - pass different integers to $start arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test how mb_substr() behaves when passed a range of integers as $start argument
+ */
+
+echo "*** Testing mb_substr() : usage variations ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'+Is an English string'; //21 chars
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); //21 chars
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -60; $i <= 60; $i += 10) {
+ if (@$a || @$b) {
+ $a = null;
+ $b = null;
+ }
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ $a = mb_substr($string_ascii, $i, 4);
+ if ($a !== false) {
+ var_dump(bin2hex($a));
+ }
+ else {
+ var_dump($a);
+ }
+ echo "--Multibyte String --\n";
+ $b = mb_substr($string_mb, $i, 4, 'UTF-8');
+ if (strlen($a) == mb_strlen($b, 'UTF-8')) { // should return same length
+ var_dump(bin2hex($b));
+ } else {
+ echo "Difference in length of ASCII string and multibyte string\n";
+ }
+
+}
+
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_substr() : usage variations ***
+
+**-- Offset is: -60 --**
+-- ASCII String --
+string(8) "2b497320"
+--Multibyte String --
+string(24) "e697a5e69cace8aa9ee38386"
+
+**-- Offset is: -50 --**
+-- ASCII String --
+string(8) "2b497320"
+--Multibyte String --
+string(24) "e697a5e69cace8aa9ee38386"
+
+**-- Offset is: -40 --**
+-- ASCII String --
+string(8) "2b497320"
+--Multibyte String --
+string(24) "e697a5e69cace8aa9ee38386"
+
+**-- Offset is: -30 --**
+-- ASCII String --
+string(8) "2b497320"
+--Multibyte String --
+string(24) "e697a5e69cace8aa9ee38386"
+
+**-- Offset is: -20 --**
+-- ASCII String --
+string(8) "49732061"
+--Multibyte String --
+string(24) "e69cace8aa9ee38386e382ad"
+
+**-- Offset is: -10 --**
+-- ASCII String --
+string(8) "69736820"
+--Multibyte String --
+string(8) "31323334"
+
+**-- Offset is: 0 --**
+-- ASCII String --
+string(8) "2b497320"
+--Multibyte String --
+string(24) "e697a5e69cace8aa9ee38386"
+
+**-- Offset is: 10 --**
+-- ASCII String --
+string(8) "6c697368"
+--Multibyte String --
+string(8) "30313233"
+
+**-- Offset is: 20 --**
+-- ASCII String --
+string(2) "67"
+--Multibyte String --
+string(6) "e38082"
+
+**-- Offset is: 30 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 40 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 50 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 60 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_substr_variation7.phpt b/ext/mbstring/tests/mb_substr_variation7.phpt
new file mode 100644
index 000000000..4d68097df
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_variation7.phpt
@@ -0,0 +1,138 @@
+--TEST--
+Test mb_substr() function : usage variations - pass different integers to $length arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test how mb_substr() behaves when passed a range of integers as $length argument
+ */
+
+echo "*** Testing mb_substr() : usage variations ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'+Is an English string'; //21 chars
+
+//Japanese string, 21 characters
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -60; $i <= 60; $i += 10) {
+ if (@$a || @$b) {
+ $a = null;
+ $b = null;
+ }
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ $a = mb_substr($string_ascii, 1, $i);
+ if ($a !== false) {
+ var_dump(bin2hex($a));
+ }
+ else {
+ var_dump($a);
+ }
+ echo "--Multibyte String --\n";
+ $b = mb_substr($string_mb, 1, $i, 'UTF-8');
+ if (strlen($a) == mb_strlen($b, 'UTF-8')) { // should return same length
+ var_dump(bin2hex($b));
+ } else {
+ echo "Difference in length of ASCII string and multibyte string\n";
+ }
+
+}
+
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_substr() : usage variations ***
+
+**-- Offset is: -60 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -50 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -40 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -30 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -20 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -10 --**
+-- ASCII String --
+string(20) "497320616e20456e676c"
+--Multibyte String --
+string(56) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e3808230"
+
+**-- Offset is: 0 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 10 --**
+-- ASCII String --
+string(20) "497320616e20456e676c"
+--Multibyte String --
+string(56) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e3808230"
+
+**-- Offset is: 20 --**
+-- ASCII String --
+string(40) "497320616e20456e676c69736820737472696e67"
+--Multibyte String --
+string(100) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+
+**-- Offset is: 30 --**
+-- ASCII String --
+string(40) "497320616e20456e676c69736820737472696e67"
+--Multibyte String --
+string(100) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+
+**-- Offset is: 40 --**
+-- ASCII String --
+string(40) "497320616e20456e676c69736820737472696e67"
+--Multibyte String --
+string(100) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+
+**-- Offset is: 50 --**
+-- ASCII String --
+string(40) "497320616e20456e676c69736820737472696e67"
+--Multibyte String --
+string(100) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+
+**-- Offset is: 60 --**
+-- ASCII String --
+string(40) "497320616e20456e676c69736820737472696e67"
+--Multibyte String --
+string(100) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+Done \ No newline at end of file