diff options
Diffstat (limited to 'ext/mbstring')
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 |
