From ab3b8b193b70d399d045c8935996c667f7f2b3cb Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 26 Jul 2016 11:59:47 -0500 Subject: [PATCH 001/107] Added str_begins and str_ends --- ext/standard/basic_functions.c | 12 ++++++++++++ ext/standard/php_string.h | 2 ++ ext/standard/string.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index ef03db14db36d..7c0e1f46034d8 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2227,6 +2227,16 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2) ZEND_ARG_INFO(0, part) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins, 0, 0, 2) + ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, search_value) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends, 0, 0, 2) + ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, search_value) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_strpos, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) @@ -2744,6 +2754,8 @@ const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(strtoupper, arginfo_strtoupper) PHP_FE(strtolower, arginfo_strtolower) PHP_FE(strpos, arginfo_strpos) + PHP_FE(str_begins, arginfo_str_begins) + PHP_FE(str_ends, arginfo_str_ends) PHP_FE(stripos, arginfo_stripos) PHP_FE(strrpos, arginfo_strrpos) PHP_FE(strripos, arginfo_strripos) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 51cf8c99626e3..c4f00e5bf7b34 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -45,6 +45,8 @@ PHP_FUNCTION(basename); PHP_FUNCTION(dirname); PHP_FUNCTION(pathinfo); PHP_FUNCTION(strstr); +PHP_FUNCTION(str_begins); +PHP_FUNCTION(str_ends); PHP_FUNCTION(strpos); PHP_FUNCTION(stripos); PHP_FUNCTION(strrpos); diff --git a/ext/standard/string.c b/ext/standard/string.c index c3f5eebb1bb5d..f5cdf99fed208 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2445,6 +2445,34 @@ PHP_FUNCTION(substr) } /* }}} */ +/* {{{ proto boolean str_begins(string str, string search_value) + Checks if str begins with search_value */ +PHP_FUNCTION(str_begins) { + zend_string *str, *search_value; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &str, &search_value) == FAILURE) + RETURN_NULL(); + + for (int i = 0; i < search_value->len; i++) + if (str->val[i] != search_value->val[i]) + RETURN_BOOL(0); + RETURN_BOOL(1); +} + +/* {{{ proto boolean str_ends(string str, string search_value) + Checks if str ends with search_value */ +PHP_FUNCTION(str_ends) { + zend_string *str, *search_value; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &str, &search_value) == FAILURE) + RETURN_NULL(); + + for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) + if (str->val[i] != search_value->val[j]) + RETURN_BOOL(0); + RETURN_BOOL(1); +} + /* {{{ proto mixed substr_replace(mixed str, mixed repl, mixed start [, mixed length]) Replaces part of a string with another string */ PHP_FUNCTION(substr_replace) From f89d8edc5f32d8a4b702699209e72d864e2ca440 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 27 Jul 2016 15:24:05 -0500 Subject: [PATCH 002/107] Added support for case insensitive searches --- ext/standard/basic_functions.c | 2 ++ ext/standard/string.c | 36 ++++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 7c0e1f46034d8..e7411a3065885 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2230,11 +2230,13 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins, 0, 0, 2) ZEND_ARG_INFO(0, str) ZEND_ARG_INFO(0, search_value) + ZEND_ARG_INFO(0, caseSensitive) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends, 0, 0, 2) ZEND_ARG_INFO(0, str) ZEND_ARG_INFO(0, search_value) + ZEND_ARG_INFO(0, caseSensitive) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_strpos, 0, 0, 2) diff --git a/ext/standard/string.c b/ext/standard/string.c index f5cdf99fed208..e72b83b8ed51f 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2445,31 +2445,47 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begins(string str, string search_value) +/* {{{ proto boolean str_begins(string str, string search_value [, case_sensitive = TRUE]) Checks if str begins with search_value */ PHP_FUNCTION(str_begins) { zend_string *str, *search_value; + int argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &str, &search_value) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &argc) == FAILURE) RETURN_NULL(); - for (int i = 0; i < search_value->len; i++) - if (str->val[i] != search_value->val[i]) - RETURN_BOOL(0); + // Case sensitive checks + if (argc == 2) { + for (int i = 0; i < search_value->len; i++) + if (str->val[i] != search_value->val[i]) + RETURN_BOOL(0); + } else if (argc == 3) { // Case insensitive checks + for (int i = 0; i < search_value->len; i++) + if (tolower(str->val[i]) != tolower(search_value->val[i])) + RETURN_BOOL(0); + } RETURN_BOOL(1); } -/* {{{ proto boolean str_ends(string str, string search_value) +/* {{{ proto boolean str_ends(string str, string search_value [, case_sensitive = TRUE) Checks if str ends with search_value */ PHP_FUNCTION(str_ends) { zend_string *str, *search_value; + int argc = ZEND_NUM_ARGS(); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &str, &search_value) == FAILURE) RETURN_NULL(); - - for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) - if (str->val[i] != search_value->val[j]) - RETURN_BOOL(0); + + // Case sensitive checks + if (argc == 2) { + for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) + if (str->val[i] != search_value->val[j]) + RETURN_BOOL(0); + } else if (argc == 3) { // Case insensitive checks + for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) + if (tolower(str->val[i]) != tolower(search_value->val[j])) + RETURN_BOOL(0); + } RETURN_BOOL(1); } From 19d3d8623600ebe3c6b16d6e2bb264ac7560a40d Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 27 Jul 2016 17:32:08 -0500 Subject: [PATCH 003/107] changed capitalization of TRUE --- ext/standard/string.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index e72b83b8ed51f..7dedd936e87c6 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2445,7 +2445,7 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begins(string str, string search_value [, case_sensitive = TRUE]) +/* {{{ proto boolean str_begins(string str, string search_value [, case_sensitive = true]) Checks if str begins with search_value */ PHP_FUNCTION(str_begins) { zend_string *str, *search_value; @@ -2467,7 +2467,7 @@ PHP_FUNCTION(str_begins) { RETURN_BOOL(1); } -/* {{{ proto boolean str_ends(string str, string search_value [, case_sensitive = TRUE) +/* {{{ proto boolean str_ends(string str, string search_value [, case_sensitive = true) Checks if str ends with search_value */ PHP_FUNCTION(str_ends) { zend_string *str, *search_value; From bbced238458e267dd52994a005f52f242c70c576 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 29 Jul 2016 16:36:46 -0500 Subject: [PATCH 004/107] Passes test case now --- ext/standard/string.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 7dedd936e87c6..4f11e7156a319 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2450,19 +2450,17 @@ PHP_FUNCTION(substr) PHP_FUNCTION(str_begins) { zend_string *str, *search_value; int argc = ZEND_NUM_ARGS(); + int case_sensitive; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &argc) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) RETURN_NULL(); - - // Case sensitive checks - if (argc == 2) { - for (int i = 0; i < search_value->len; i++) - if (str->val[i] != search_value->val[i]) - RETURN_BOOL(0); - } else if (argc == 3) { // Case insensitive checks - for (int i = 0; i < search_value->len; i++) - if (tolower(str->val[i]) != tolower(search_value->val[i])) - RETURN_BOOL(0); + + for (int i = 0; i < search_value->len; i++) { + if (case_sensitive && str->val[i] != search_value->val[i]) { + RETURN_BOOL(0); + } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[i])) { + RETURN_BOOL(0); + } } RETURN_BOOL(1); } From 764cb915ce5d663d00114c5ef2fb68532bac7735 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 29 Jul 2016 16:53:29 -0500 Subject: [PATCH 005/107] Added testing for str_ends --- ext/standard/tests/strings/str_ends.phpt | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 ext/standard/tests/strings/str_ends.phpt diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_ends.phpt new file mode 100644 index 0000000000000..e93c5b542314e --- /dev/null +++ b/ext/standard/tests/strings/str_ends.phpt @@ -0,0 +1,25 @@ +--TEST-- +str_begins() function - unit tests for str_begins() +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(false) +bool(true) +bool(true) +bool(false) From 50524df7f3273223b9d4a0c6204c84ee50470c14 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Sun, 31 Jul 2016 16:24:58 -0500 Subject: [PATCH 006/107] Passes tests cases --- ext/standard/string.c | 20 +++++++++----------- ext/standard/tests/strings/str_ends.phpt | 14 +++++++------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 4f11e7156a319..69057b4891162 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2458,7 +2458,7 @@ PHP_FUNCTION(str_begins) { for (int i = 0; i < search_value->len; i++) { if (case_sensitive && str->val[i] != search_value->val[i]) { RETURN_BOOL(0); - } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[i])) { + } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[i])) { RETURN_BOOL(0); } } @@ -2470,19 +2470,17 @@ PHP_FUNCTION(str_begins) { PHP_FUNCTION(str_ends) { zend_string *str, *search_value; int argc = ZEND_NUM_ARGS(); + int case_sensitive; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &str, &search_value) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) RETURN_NULL(); - // Case sensitive checks - if (argc == 2) { - for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) - if (str->val[i] != search_value->val[j]) - RETURN_BOOL(0); - } else if (argc == 3) { // Case insensitive checks - for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) - if (tolower(str->val[i]) != tolower(search_value->val[j])) - RETURN_BOOL(0); + for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) { + if (case_sensitive && str->val[i] != search_value->val[j]) { + RETURN_BOOL(0); + } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[j])) { + RETURN_BOOL(0); + } } RETURN_BOOL(1); } diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_ends.phpt index e93c5b542314e..a46c080c1f641 100644 --- a/ext/standard/tests/strings/str_ends.phpt +++ b/ext/standard/tests/strings/str_ends.phpt @@ -1,5 +1,5 @@ --TEST-- -str_begins() function - unit tests for str_begins() +str_ends() function - unit tests for str_ends() --FILE-- --EXPECT-- bool(true) From c00d31f0e9ce0b9900c4de74ab6eeeaf7e51a7ef Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 1 Aug 2016 21:14:21 -0500 Subject: [PATCH 007/107] Fixed build error --- ext/standard/string.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 69057b4891162..6dbef0383c453 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2450,12 +2450,12 @@ PHP_FUNCTION(substr) PHP_FUNCTION(str_begins) { zend_string *str, *search_value; int argc = ZEND_NUM_ARGS(); - int case_sensitive; + int case_sensitive, i; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) RETURN_NULL(); - for (int i = 0; i < search_value->len; i++) { + for (i = 0; i < search_value->len; i++) { if (case_sensitive && str->val[i] != search_value->val[i]) { RETURN_BOOL(0); } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[i])) { @@ -2470,12 +2470,12 @@ PHP_FUNCTION(str_begins) { PHP_FUNCTION(str_ends) { zend_string *str, *search_value; int argc = ZEND_NUM_ARGS(); - int case_sensitive; + int case_sensitive, i, j; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) RETURN_NULL(); - for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) { + for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) { if (case_sensitive && str->val[i] != search_value->val[j]) { RETURN_BOOL(0); } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[j])) { From 0283a08545413c19109f8fcd10e10af9d0d8e2c4 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 12 Aug 2016 17:21:24 -0500 Subject: [PATCH 008/107] Split functions based on case sensitivity --- ext/standard/basic_functions.c | 16 +++-- ext/standard/php_string.h | 6 +- ext/standard/string.c | 60 ++++++++++++------- ext/standard/tests/strings/str_begin.phpt | 16 +++++ .../strings/{str_ends.phpt => str_end.phpt} | 0 5 files changed, 72 insertions(+), 26 deletions(-) create mode 100644 ext/standard/tests/strings/str_begin.phpt rename ext/standard/tests/strings/{str_ends.phpt => str_end.phpt} (100%) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index e7411a3065885..d0f61aaa96f61 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2227,16 +2227,24 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2) ZEND_ARG_INFO(0, part) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begin, 0, 0, 2) + ZEND_ARG_INFO(0, search_value) ZEND_ARG_INFO(0, str) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ibegin, 0, 0, 2) ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, caseSensitive) + ZEND_ARG_INFO(0, str) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_end, 0, 0, 2) + ZEND_ARG_INFO(0, search_value) ZEND_ARG_INFO(0, str) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_iend, 0, 0, 2) ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, caseSensitive) + ZEND_ARG_INFO(0, str) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_strpos, 0, 0, 2) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index c4f00e5bf7b34..7ce3138e2afa8 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -45,8 +45,10 @@ PHP_FUNCTION(basename); PHP_FUNCTION(dirname); PHP_FUNCTION(pathinfo); PHP_FUNCTION(strstr); -PHP_FUNCTION(str_begins); -PHP_FUNCTION(str_ends); +PHP_FUNCTION(str_begin); +PHP_FUNCTION(str_ibegin); +PHP_FUNCTION(str_end); +PHP_FUNCTION(str_iend); PHP_FUNCTION(strpos); PHP_FUNCTION(stripos); PHP_FUNCTION(strrpos); diff --git a/ext/standard/string.c b/ext/standard/string.c index 6dbef0383c453..a4abf7a9051c5 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2445,43 +2445,63 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begins(string str, string search_value [, case_sensitive = true]) +/* {{{ proto boolean str_begin(string search_value, string str) Checks if str begins with search_value */ -PHP_FUNCTION(str_begins) { +PHP_FUNCTION(str_begin) { zend_string *str, *search_value; - int argc = ZEND_NUM_ARGS(); - int case_sensitive, i; + int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) RETURN_NULL(); - for (i = 0; i < search_value->len; i++) { - if (case_sensitive && str->val[i] != search_value->val[i]) { + for (i = 0; i < search_value->len; i++) + if (str->val[i] != search_value->val[i]) RETURN_BOOL(0); - } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[i])) { + RETURN_BOOL(1); +} + +/* {{{ proto boolean str_ibegin(string search_value, string str) + Performs case insensitive check to determine if str begins with search_value */ +PHP_FUNCTION(str_ibegin) { + zend_string *str, *search_value; + int i; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + RETURN_NULL(); + + for (i = 0; i < search_value->len; i++) + if (tolower(str->val[i]) != tolower(search_value->val[i])) RETURN_BOOL(0); - } - } RETURN_BOOL(1); } -/* {{{ proto boolean str_ends(string str, string search_value [, case_sensitive = true) +/* {{{ proto boolean str_end(string search_value, string str) Checks if str ends with search_value */ -PHP_FUNCTION(str_ends) { +PHP_FUNCTION(str_end) { zend_string *str, *search_value; - int argc = ZEND_NUM_ARGS(); - int case_sensitive, i, j; + int i, j; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) RETURN_NULL(); - for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) { - if (case_sensitive && str->val[i] != search_value->val[j]) { + for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) + if (str->val[i] != search_value->val[j]) RETURN_BOOL(0); - } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[j])) { + RETURN_BOOL(1); +} + +/* {{{ proto boolean str_iend(string search_value, string str) + Performs case insensitive check to determine if str ends with search_value */ +PHP_FUNCTION(str_iend) { + zend_string *str, *search_value; + int i, j; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + RETURN_NULL(); + + for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) + if (tolower(str->val[i]) != tolower(search_value->val[j])) RETURN_BOOL(0); - } - } RETURN_BOOL(1); } diff --git a/ext/standard/tests/strings/str_begin.phpt b/ext/standard/tests/strings/str_begin.phpt new file mode 100644 index 0000000000000..860e81ee8d33b --- /dev/null +++ b/ext/standard/tests/strings/str_begin.phpt @@ -0,0 +1,16 @@ +--TEST-- +str_begin() function - unit tests for str_begin() +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_end.phpt similarity index 100% rename from ext/standard/tests/strings/str_ends.phpt rename to ext/standard/tests/strings/str_end.phpt From 73be3373ea905a34f834915fae710842c8e85cbd Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 12 Aug 2016 17:23:26 -0500 Subject: [PATCH 009/107] Renamed str_begins to str_begins --- ext/standard/basic_functions.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index d0f61aaa96f61..98e94a381a1f4 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2764,8 +2764,10 @@ const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(strtoupper, arginfo_strtoupper) PHP_FE(strtolower, arginfo_strtolower) PHP_FE(strpos, arginfo_strpos) - PHP_FE(str_begins, arginfo_str_begins) - PHP_FE(str_ends, arginfo_str_ends) + PHP_FE(str_begin, arginfo_str_begin) + PHP_FE(str_ibegin, arginfo_str_ibegin) + PHP_FE(str_end, arginfo_str_end) + PHP_FE(str_iend, arginfo_str_iend) PHP_FE(stripos, arginfo_stripos) PHP_FE(strrpos, arginfo_strrpos) PHP_FE(strripos, arginfo_strripos) From 4173d3a30d8542ce732818c3333b5422506f8cd5 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 12 Aug 2016 17:33:29 -0500 Subject: [PATCH 010/107] Updated test code --- ext/standard/tests/strings/str_begin.phpt | 8 ++++---- ext/standard/tests/strings/str_end.phpt | 21 ++++++--------------- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/ext/standard/tests/strings/str_begin.phpt b/ext/standard/tests/strings/str_begin.phpt index 860e81ee8d33b..aa579175c3df4 100644 --- a/ext/standard/tests/strings/str_begin.phpt +++ b/ext/standard/tests/strings/str_begin.phpt @@ -5,10 +5,10 @@ str_begin() function - unit tests for str_begin() /* Prototype: boolean str_begin (string $search_value string $str); Description: Determine if $str begins with $search_value */ -$testStr1 = "beginningMiddleEnd"; -var_dump(str_begins($testStr1, "beginning")); -var_dump(str_begins($testStr1, "Beginning")); -var_dump(str_begins($testStr1, "eginning")); +$testStr = "beginningMiddleEnd"; +var_dump(str_begin("beginning", $testStr)); +var_dump(str_begin("Beginning", $testStr)); +var_dump(str_begin("eginning", $testStr)); ?> --EXPECT-- bool(true) diff --git a/ext/standard/tests/strings/str_end.phpt b/ext/standard/tests/strings/str_end.phpt index a46c080c1f641..99f91e4df29aa 100644 --- a/ext/standard/tests/strings/str_end.phpt +++ b/ext/standard/tests/strings/str_end.phpt @@ -1,25 +1,16 @@ --TEST-- -str_ends() function - unit tests for str_ends() +str_end() function - unit tests for str_end() --FILE-- --EXPECT-- bool(true) bool(false) bool(false) -bool(true) -bool(true) -bool(false) From 65f9b81629d80df33f0477e70620c7f6c99bafa3 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 12 Aug 2016 17:38:49 -0500 Subject: [PATCH 011/107] Added case insensitive test cases --- ext/standard/tests/strings/str_ibegin.phpt | 16 ++++++++++++++++ ext/standard/tests/strings/str_iend.phpt | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 ext/standard/tests/strings/str_ibegin.phpt create mode 100644 ext/standard/tests/strings/str_iend.phpt diff --git a/ext/standard/tests/strings/str_ibegin.phpt b/ext/standard/tests/strings/str_ibegin.phpt new file mode 100644 index 0000000000000..5b7ac247d2025 --- /dev/null +++ b/ext/standard/tests/strings/str_ibegin.phpt @@ -0,0 +1,16 @@ +--TEST-- +str_ibegin() function - unit tests for str_ibegin() +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(false) diff --git a/ext/standard/tests/strings/str_iend.phpt b/ext/standard/tests/strings/str_iend.phpt new file mode 100644 index 0000000000000..a8b2be75db47b --- /dev/null +++ b/ext/standard/tests/strings/str_iend.phpt @@ -0,0 +1,16 @@ +--TEST-- +str_iend() function - unit tests for str_iend() +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(false) From 12ef0ed828d5e1b0d42967fe6c773a26fa24a4b1 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 15 May 2019 18:32:01 -0500 Subject: [PATCH 012/107] Improved argument consistency and added additional test cases --- ext/standard/basic_functions.c | 16 ++++---- ext/standard/string.c | 48 +++++++++++----------- ext/standard/tests/strings/str_begin.phpt | 12 +++--- ext/standard/tests/strings/str_end.phpt | 10 ++--- ext/standard/tests/strings/str_ibegin.phpt | 12 +++--- ext/standard/tests/strings/str_iend.phpt | 10 ++--- 6 files changed, 56 insertions(+), 52 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 98e94a381a1f4..c9b92766c59bc 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2228,23 +2228,23 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begin, 0, 0, 2) - ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ibegin, 0, 0, 2) - ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_end, 0, 0, 2) - ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_iend, 0, 0, 2) - ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_strpos, 0, 0, 2) diff --git a/ext/standard/string.c b/ext/standard/string.c index a4abf7a9051c5..48fe680e1cd68 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2445,62 +2445,62 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begin(string search_value, string str) - Checks if str begins with search_value */ +/* {{{ proto boolean str_begin(string haystack, string needle) + Checks if haystack begins with needle */ PHP_FUNCTION(str_begin) { - zend_string *str, *search_value; + zend_string *haystack, *needle; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) RETURN_NULL(); - for (i = 0; i < search_value->len; i++) - if (str->val[i] != search_value->val[i]) + for (i = 0; i < needle->len; i++) + if (haystack->val[i] != needle->val[i]) RETURN_BOOL(0); RETURN_BOOL(1); } -/* {{{ proto boolean str_ibegin(string search_value, string str) - Performs case insensitive check to determine if str begins with search_value */ +/* {{{ proto boolean str_ibegin(string haystack, string needle) + Performs case insensitive check to determine if haystack begins with needle */ PHP_FUNCTION(str_ibegin) { - zend_string *str, *search_value; + zend_string *haystack, *needle; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) RETURN_NULL(); - for (i = 0; i < search_value->len; i++) - if (tolower(str->val[i]) != tolower(search_value->val[i])) + for (i = 0; i < needle->len; i++) + if (tolower(haystack->val[i]) != tolower(needle->val[i])) RETURN_BOOL(0); RETURN_BOOL(1); } -/* {{{ proto boolean str_end(string search_value, string str) - Checks if str ends with search_value */ +/* {{{ proto boolean str_end(string haystack, string needle) + Checks if haystack ends with needle */ PHP_FUNCTION(str_end) { - zend_string *str, *search_value; + zend_string *haystack, *needle; int i, j; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) RETURN_NULL(); - for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) - if (str->val[i] != search_value->val[j]) + for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) + if (haystack->val[i] != needle->val[j]) RETURN_BOOL(0); RETURN_BOOL(1); } -/* {{{ proto boolean str_iend(string search_value, string str) - Performs case insensitive check to determine if str ends with search_value */ +/* {{{ proto boolean str_iend(string haystack, string needle) + Performs case insensitive check to determine if haystack ends with needle */ PHP_FUNCTION(str_iend) { - zend_string *str, *search_value; + zend_string *haystack, *needle; int i, j; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) RETURN_NULL(); - for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) - if (tolower(str->val[i]) != tolower(search_value->val[j])) + for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) + if (tolower(haystack->val[i]) != tolower(needle->val[j])) RETURN_BOOL(0); RETURN_BOOL(1); } diff --git a/ext/standard/tests/strings/str_begin.phpt b/ext/standard/tests/strings/str_begin.phpt index aa579175c3df4..68946622a8826 100644 --- a/ext/standard/tests/strings/str_begin.phpt +++ b/ext/standard/tests/strings/str_begin.phpt @@ -2,15 +2,17 @@ str_begin() function - unit tests for str_begin() --FILE-- --EXPECT-- bool(true) bool(false) bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_end.phpt b/ext/standard/tests/strings/str_end.phpt index 99f91e4df29aa..67ae1501eb08f 100644 --- a/ext/standard/tests/strings/str_end.phpt +++ b/ext/standard/tests/strings/str_end.phpt @@ -2,13 +2,13 @@ str_end() function - unit tests for str_end() --FILE-- --EXPECT-- bool(true) diff --git a/ext/standard/tests/strings/str_ibegin.phpt b/ext/standard/tests/strings/str_ibegin.phpt index 5b7ac247d2025..3a3d7e7aa1de2 100644 --- a/ext/standard/tests/strings/str_ibegin.phpt +++ b/ext/standard/tests/strings/str_ibegin.phpt @@ -2,15 +2,17 @@ str_ibegin() function - unit tests for str_ibegin() --FILE-- --EXPECT-- bool(true) bool(true) bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_iend.phpt b/ext/standard/tests/strings/str_iend.phpt index a8b2be75db47b..eb01e450b1cd2 100644 --- a/ext/standard/tests/strings/str_iend.phpt +++ b/ext/standard/tests/strings/str_iend.phpt @@ -2,13 +2,13 @@ str_iend() function - unit tests for str_iend() --FILE-- --EXPECT-- bool(true) From 4d1f7b861e2008a5e7bfc6816be93be85809de8b Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 15 May 2019 22:26:38 -0500 Subject: [PATCH 013/107] Updated function parameter definitions --- ext/standard/string.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 7c848c420ac7b..4afc028125351 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2307,8 +2307,10 @@ PHP_FUNCTION(str_begin) { zend_string *haystack, *needle; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) - RETURN_NULL(); + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_STR(haystack) + Z_PARAM_STR(needle) + ZEND_PARSE_PARAMETERS_END(); for (i = 0; i < needle->len; i++) if (haystack->val[i] != needle->val[i]) @@ -2322,8 +2324,10 @@ PHP_FUNCTION(str_ibegin) { zend_string *haystack, *needle; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) - RETURN_NULL(); + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_STR(haystack) + Z_PARAM_STR(needle) + ZEND_PARSE_PARAMETERS_END(); for (i = 0; i < needle->len; i++) if (tolower(haystack->val[i]) != tolower(needle->val[i])) @@ -2337,8 +2341,10 @@ PHP_FUNCTION(str_end) { zend_string *haystack, *needle; int i, j; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) - RETURN_NULL(); + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_STR(haystack) + Z_PARAM_STR(needle) + ZEND_PARSE_PARAMETERS_END(); for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (haystack->val[i] != needle->val[j]) @@ -2352,8 +2358,10 @@ PHP_FUNCTION(str_iend) { zend_string *haystack, *needle; int i, j; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) - RETURN_NULL(); + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_STR(haystack) + Z_PARAM_STR(needle) + ZEND_PARSE_PARAMETERS_END(); for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (tolower(haystack->val[i]) != tolower(needle->val[j])) From b37545fd9851e93f3a01fdc55f7ba5671656c2a1 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 16 May 2019 06:30:50 -0500 Subject: [PATCH 014/107] Corrected verb conjugation in str_begins and str_ends --- ext/standard/basic_functions.c | 16 ++++++++-------- ext/standard/php_string.h | 8 ++++---- ext/standard/string.c | 16 ++++++++-------- ext/standard/tests/strings/str_begin.phpt | 18 ------------------ ext/standard/tests/strings/str_begins.phpt | 18 ++++++++++++++++++ ext/standard/tests/strings/str_end.phpt | 16 ---------------- ext/standard/tests/strings/str_ends.phpt | 16 ++++++++++++++++ ext/standard/tests/strings/str_ibegin.phpt | 18 ------------------ ext/standard/tests/strings/str_ibegins.phpt | 18 ++++++++++++++++++ ext/standard/tests/strings/str_iend.phpt | 16 ---------------- ext/standard/tests/strings/str_iends.phpt | 16 ++++++++++++++++ 11 files changed, 88 insertions(+), 88 deletions(-) delete mode 100644 ext/standard/tests/strings/str_begin.phpt create mode 100644 ext/standard/tests/strings/str_begins.phpt delete mode 100644 ext/standard/tests/strings/str_end.phpt create mode 100644 ext/standard/tests/strings/str_ends.phpt delete mode 100644 ext/standard/tests/strings/str_ibegin.phpt create mode 100644 ext/standard/tests/strings/str_ibegins.phpt delete mode 100644 ext/standard/tests/strings/str_iend.phpt create mode 100644 ext/standard/tests/strings/str_iends.phpt diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index b5f5d2df8bad2..333df8cf16cea 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2238,22 +2238,22 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2) ZEND_ARG_INFO(0, part) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begin, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ibegin, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ibegins, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_end, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_iend, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_iends, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() @@ -2797,10 +2797,10 @@ static const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(strtoupper, arginfo_strtoupper) PHP_FE(strtolower, arginfo_strtolower) PHP_FE(strpos, arginfo_strpos) - PHP_FE(str_begin, arginfo_str_begin) - PHP_FE(str_ibegin, arginfo_str_ibegin) - PHP_FE(str_end, arginfo_str_end) - PHP_FE(str_iend, arginfo_str_iend) + PHP_FE(str_begins, arginfo_str_begins) + PHP_FE(str_ibegins, arginfo_str_ibegins) + PHP_FE(str_ends, arginfo_str_ends) + PHP_FE(str_iends, arginfo_str_iends) PHP_FE(stripos, arginfo_stripos) PHP_FE(strrpos, arginfo_strrpos) PHP_FE(strripos, arginfo_strripos) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 22e5154c771b3..9783be2bdc189 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -41,10 +41,10 @@ PHP_FUNCTION(basename); PHP_FUNCTION(dirname); PHP_FUNCTION(pathinfo); PHP_FUNCTION(strstr); -PHP_FUNCTION(str_begin); -PHP_FUNCTION(str_ibegin); -PHP_FUNCTION(str_end); -PHP_FUNCTION(str_iend); +PHP_FUNCTION(str_begins); +PHP_FUNCTION(str_ibegins); +PHP_FUNCTION(str_ends); +PHP_FUNCTION(str_iends); PHP_FUNCTION(strpos); PHP_FUNCTION(stripos); PHP_FUNCTION(strrpos); diff --git a/ext/standard/string.c b/ext/standard/string.c index 4afc028125351..5b1616de1a76d 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2301,9 +2301,9 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begin(string haystack, string needle) +/* {{{ proto boolean str_begins(string haystack, string needle) Checks if haystack begins with needle */ -PHP_FUNCTION(str_begin) { +PHP_FUNCTION(str_begins) { zend_string *haystack, *needle; int i; @@ -2318,9 +2318,9 @@ PHP_FUNCTION(str_begin) { RETURN_BOOL(1); } -/* {{{ proto boolean str_ibegin(string haystack, string needle) +/* {{{ proto boolean str_ibegins(string haystack, string needle) Performs case insensitive check to determine if haystack begins with needle */ -PHP_FUNCTION(str_ibegin) { +PHP_FUNCTION(str_ibegins) { zend_string *haystack, *needle; int i; @@ -2335,9 +2335,9 @@ PHP_FUNCTION(str_ibegin) { RETURN_BOOL(1); } -/* {{{ proto boolean str_end(string haystack, string needle) +/* {{{ proto boolean str_ends(string haystack, string needle) Checks if haystack ends with needle */ -PHP_FUNCTION(str_end) { +PHP_FUNCTION(str_ends) { zend_string *haystack, *needle; int i, j; @@ -2352,9 +2352,9 @@ PHP_FUNCTION(str_end) { RETURN_BOOL(1); } -/* {{{ proto boolean str_iend(string haystack, string needle) +/* {{{ proto boolean str_iends(string haystack, string needle) Performs case insensitive check to determine if haystack ends with needle */ -PHP_FUNCTION(str_iend) { +PHP_FUNCTION(str_iends) { zend_string *haystack, *needle; int i, j; diff --git a/ext/standard/tests/strings/str_begin.phpt b/ext/standard/tests/strings/str_begin.phpt deleted file mode 100644 index 68946622a8826..0000000000000 --- a/ext/standard/tests/strings/str_begin.phpt +++ /dev/null @@ -1,18 +0,0 @@ ---TEST-- -str_begin() function - unit tests for str_begin() ---FILE-- - ---EXPECT-- -bool(true) -bool(false) -bool(false) -bool(false) diff --git a/ext/standard/tests/strings/str_begins.phpt b/ext/standard/tests/strings/str_begins.phpt new file mode 100644 index 0000000000000..ac235fc85fab5 --- /dev/null +++ b/ext/standard/tests/strings/str_begins.phpt @@ -0,0 +1,18 @@ +--TEST-- +str_begins() function - unit tests for str_begins() +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_end.phpt b/ext/standard/tests/strings/str_end.phpt deleted file mode 100644 index 67ae1501eb08f..0000000000000 --- a/ext/standard/tests/strings/str_end.phpt +++ /dev/null @@ -1,16 +0,0 @@ ---TEST-- -str_end() function - unit tests for str_end() ---FILE-- - ---EXPECT-- -bool(true) -bool(false) -bool(false) diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_ends.phpt new file mode 100644 index 0000000000000..a57992082fa47 --- /dev/null +++ b/ext/standard/tests/strings/str_ends.phpt @@ -0,0 +1,16 @@ +--TEST-- +str_ends() function - unit tests for str_ends() +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_ibegin.phpt b/ext/standard/tests/strings/str_ibegin.phpt deleted file mode 100644 index 3a3d7e7aa1de2..0000000000000 --- a/ext/standard/tests/strings/str_ibegin.phpt +++ /dev/null @@ -1,18 +0,0 @@ ---TEST-- -str_ibegin() function - unit tests for str_ibegin() ---FILE-- - ---EXPECT-- -bool(true) -bool(true) -bool(false) -bool(false) diff --git a/ext/standard/tests/strings/str_ibegins.phpt b/ext/standard/tests/strings/str_ibegins.phpt new file mode 100644 index 0000000000000..9f218cd3e7e27 --- /dev/null +++ b/ext/standard/tests/strings/str_ibegins.phpt @@ -0,0 +1,18 @@ +--TEST-- +str_ibegins() function - unit tests for str_ibegins() +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_iend.phpt b/ext/standard/tests/strings/str_iend.phpt deleted file mode 100644 index eb01e450b1cd2..0000000000000 --- a/ext/standard/tests/strings/str_iend.phpt +++ /dev/null @@ -1,16 +0,0 @@ ---TEST-- -str_iend() function - unit tests for str_iend() ---FILE-- - ---EXPECT-- -bool(true) -bool(true) -bool(false) diff --git a/ext/standard/tests/strings/str_iends.phpt b/ext/standard/tests/strings/str_iends.phpt new file mode 100644 index 0000000000000..a1295cd210230 --- /dev/null +++ b/ext/standard/tests/strings/str_iends.phpt @@ -0,0 +1,16 @@ +--TEST-- +str_iends() function - unit tests for str_iends() +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(false) From 8263aeaadf82513e66d084f06867dc015c71a5a6 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 05:31:51 -0500 Subject: [PATCH 015/107] Added mb_str_begins --- ext/mbstring/mbstring.c | 48 +++++++++++++++++++++++++++++++++++++++++ ext/mbstring/mbstring.h | 1 + 2 files changed, 49 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index eb0ae0e553f0e..b93d99e5cbce4 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2573,6 +2573,54 @@ PHP_FUNCTION(mb_strripos) } /* }}} */ +/* {{{ proto boolean mb_str_begins(string haystack, string needle [, string encoding]) + Checks if haystack begins with needle */ +PHP_FUNCTION(mb_str_begins) +{ + mbfl_string haystack, needle; + zend_string *enc_name = NULL; + size_t n; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", char( **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { + return; + } + + haystack.no_language = needle.no_language = MBSTRG(language); + haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name); + if (!haystack.encoding) { + RETURN_FALSE; + } + + if (needle.len == 0) { + RETURN_BOOL(1); + } + + n = mbfl_strpos(&haystack, &needle, 0, 0); + if (!mbfl_is_error(n)) { + if (n == 0) { + RETURN_BOOL(1); + } else { + RETURN_BOOL(0); + } + } else { + switch (-n) { + case 1: + break; + case 4: + php_error_docref(NULL, E_WARNING, "Unknown encoding or conversion error"); + break; + case 8: + php_error_docref(NULL, E_NOTICE, "Argument is empty"); + break; + default: + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); + break; + } + RETURN_BOOL(0); + } +} +/* }}} */ + /* {{{ proto string mb_strstr(string haystack, string needle[, bool part[, string encoding]]) Finds first occurrence of a string within another */ PHP_FUNCTION(mb_strstr) diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 58ae9cebbc476..1410e728c2681 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -84,6 +84,7 @@ PHP_FUNCTION(mb_strpos); PHP_FUNCTION(mb_strrpos); PHP_FUNCTION(mb_stripos); PHP_FUNCTION(mb_strripos); +PHP_FUNCTION(mb_str_begins); PHP_FUNCTION(mb_strstr); PHP_FUNCTION(mb_strrchr); PHP_FUNCTION(mb_stristr); From b534efa7dea732fce72a677630ffa80dd9a51b2e Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 05:50:08 -0500 Subject: [PATCH 016/107] Fixed typo --- ext/mbstring/mbstring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index b93d99e5cbce4..1c2480d5b3d4c 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2581,7 +2581,7 @@ PHP_FUNCTION(mb_str_begins) zend_string *enc_name = NULL; size_t n; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", char( **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { return; } From c7ebb7c831816cbc714136cbf2bbf9823c9507b5 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 06:29:00 -0500 Subject: [PATCH 017/107] Added mb_str_ibegins --- ext/mbstring/mbstring.c | 35 +++++++++++++++++++++++++++++++++++ ext/mbstring/mbstring.h | 1 + 2 files changed, 36 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 1c2480d5b3d4c..078a51cf70fff 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2621,6 +2621,41 @@ PHP_FUNCTION(mb_str_begins) } /* }}} */ +/* {{{ proto boolean mb_str_ibegins(string haystack, string needle. [, string encoding]) + Checks if haystack begins with needle, case insensitive */ +PHP_FUNCTION(mb_str_ibegins) +{ + mbfl_string haystack, needle; + zend_string *enc_name = NULL; + size_t n; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { + return; + } + + haystack.no_language = needle.no_language = MBSTRG(language); + haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name); + if (!haystack.encoding) { + RETURN_FALSE; + } + + if (needle.len == 0) { + RETURN_BOOL(1); + } + + n = php_mb_stripos(0, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, haystack.encoding); + if (!mbfl_is_error(n)) { + if (n == 0) { + RETURN_BOOL(1); + } else { + RETURN_BOOL(0); + } + } else { + RETVAL_FALSE; + } +} +/* }}} */ + /* {{{ proto string mb_strstr(string haystack, string needle[, bool part[, string encoding]]) Finds first occurrence of a string within another */ PHP_FUNCTION(mb_strstr) diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 1410e728c2681..22588c178ebad 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -85,6 +85,7 @@ PHP_FUNCTION(mb_strrpos); PHP_FUNCTION(mb_stripos); PHP_FUNCTION(mb_strripos); PHP_FUNCTION(mb_str_begins); +PHP_FUNCTION(mb_str_ibegins); PHP_FUNCTION(mb_strstr); PHP_FUNCTION(mb_strrchr); PHP_FUNCTION(mb_stristr); From e861268e9f6ad334c4d73bc3d35dd326437d103c Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 06:38:03 -0500 Subject: [PATCH 018/107] Fixed call to PHP mb_stripos API --- ext/mbstring/mbstring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 078a51cf70fff..2083929c602ac 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2643,7 +2643,7 @@ PHP_FUNCTION(mb_str_ibegins) RETURN_BOOL(1); } - n = php_mb_stripos(0, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, haystack.encoding); + n = php_mb_stripos(0, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, enc_name); if (!mbfl_is_error(n)) { if (n == 0) { RETURN_BOOL(1); From ccba7f32d451fddd76ce85cc9165c4d257d0f1c7 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 17:53:37 -0500 Subject: [PATCH 019/107] Added mb_str_ends --- ext/mbstring/mbstring.c | 48 +++++++++++++++++++++++++++++++++++++++++ ext/mbstring/mbstring.h | 1 + 2 files changed, 49 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 2083929c602ac..91c75837510f0 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2656,6 +2656,54 @@ PHP_FUNCTION(mb_str_ibegins) } /* }}} */ +/* {{{ proto boolean mb_str_ends(string haystack, string needle [, string encoding]) + Checks if haystack ends with needle */ +PHP_FUNCTION(mb_str_ends) +{ + mbfl_string haystack, needle; + zend_string *enc_name = NULL; + size_t n; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { + return; + } + + haystack.no_language = needle.no_language = MBSTRG(language); + haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name); + if (!haystack.encoding) { + RETURN_FALSE; + } + + if (needle.len == 0) { + RETURN_BOOL(1); + } + + n = mbfl_strpos(&haystack, &needle, 0, 1); + if (!mbfl_is_error(n)) { + if (n == (haystack.length - needle.length)) { + RETURN_BOOL(1); + } else { + RETURN_BOOL(0); + } + } else { + switch (-n) { + case 1: + break; + case 4: + php_error_docref(NULL, E_WARNING, "Unknown encoding or conversion error"); + break; + case 8: + php_error_docref(NULL, E_NOTICE, "Argument is empty"); + break; + default: + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); + break; + } + RETURN_BOOL(0); + } +} +/* }}} */ + /* {{{ proto string mb_strstr(string haystack, string needle[, bool part[, string encoding]]) Finds first occurrence of a string within another */ PHP_FUNCTION(mb_strstr) diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 22588c178ebad..95dbe20392594 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -86,6 +86,7 @@ PHP_FUNCTION(mb_stripos); PHP_FUNCTION(mb_strripos); PHP_FUNCTION(mb_str_begins); PHP_FUNCTION(mb_str_ibegins); +PHP_FUNCTION(mb_str_ends); PHP_FUNCTION(mb_strstr); PHP_FUNCTION(mb_strrchr); PHP_FUNCTION(mb_stristr); From a3dc5eb0d1026da133fbcb4fbc2b084129c03e79 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 18:00:20 -0500 Subject: [PATCH 020/107] Fixed call to member of mbfl_string struct --- ext/mbstring/mbstring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 91c75837510f0..ecc563a2513ec 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2680,7 +2680,7 @@ PHP_FUNCTION(mb_str_ends) n = mbfl_strpos(&haystack, &needle, 0, 1); if (!mbfl_is_error(n)) { - if (n == (haystack.length - needle.length)) { + if (n == (haystack.len - needle.len)) { RETURN_BOOL(1); } else { RETURN_BOOL(0); From 26c572100a18c87fe1108b7e18ae28adf21b7c2d Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 21:14:18 -0500 Subject: [PATCH 021/107] Added mb_str_iends --- ext/mbstring/mbstring.c | 36 ++++++++++++++++++++++++++++++++++++ ext/mbstring/mbstring.h | 1 + 2 files changed, 37 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index ecc563a2513ec..d9eab6a0bbcd3 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2704,6 +2704,42 @@ PHP_FUNCTION(mb_str_ends) } /* }}} */ +/* {{{ proto boolean mb_str_iends(string haystack, string needle. [, string encoding]) + Checks if haystack ends with needle, case insensitive */ +PHP_FUNCTION(mb_str_iends) +{ + mbfl_string haystack, needle; + zend_string *enc_name = NULL; + size_t n; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { + return; + } + + haystack.no_language = needle.no_language = MBSTRG(language); + haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name); + if (!haystack.encoding) { + RETURN_FALSE; + } + + if (needle.len == 0) { + RETURN_BOOL(1); + } + + n = php_mb_stripos(1, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, enc_name); + if (!mbfl_is_error(n)) { + if (n == (haystack.len - needle.len)) { + RETURN_BOOL(1); + } else { + RETURN_BOOL(0); + } + } else { + RETVAL_FALSE; + } +} +/* }}} */ + + /* {{{ proto string mb_strstr(string haystack, string needle[, bool part[, string encoding]]) Finds first occurrence of a string within another */ PHP_FUNCTION(mb_strstr) diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 95dbe20392594..2ede3b4d48d1e 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -87,6 +87,7 @@ PHP_FUNCTION(mb_strripos); PHP_FUNCTION(mb_str_begins); PHP_FUNCTION(mb_str_ibegins); PHP_FUNCTION(mb_str_ends); +PHP_FUNCTION(mb_str_iends); PHP_FUNCTION(mb_strstr); PHP_FUNCTION(mb_strrchr); PHP_FUNCTION(mb_stristr); From 02bbeefe8c696d32eda695ec7a1245f4c1d157ae Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 22:30:01 -0500 Subject: [PATCH 022/107] Added test for mb_str_begins --- ext/mbstring/tests/mb_str_begins.phpt | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 ext/mbstring/tests/mb_str_begins.phpt diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt new file mode 100644 index 0000000000000..3dd62e41bf76f --- /dev/null +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -0,0 +1,55 @@ +--TEST-- +mb_str_begins() +--SKIPIF-- + +--FILE-- + +==DONE== +--EXPECTF-- +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) From bfa34f439674fff0bea96a24f9b18391a7c8b3ec Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 23:03:21 -0500 Subject: [PATCH 023/107] Added string to list of functions for mbstring --- ext/mbstring/mbstring.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index d9eab6a0bbcd3..c7fcac294b73c 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -530,6 +530,10 @@ static const zend_function_entry mbstring_functions[] = { PHP_FE(mb_strrpos, arginfo_mb_strrpos) PHP_FE(mb_stripos, arginfo_mb_stripos) PHP_FE(mb_strripos, arginfo_mb_strripos) + PHP_FE(mb_str_begins, arginfo_mb_str_begins) + PHP_FE(mb_str_ibegins, arginfo_mb_str_ibegins) + PHP_FE(mb_str_ends, arginfo_mb_str_ends) + PHP_FE(mb_str_iends, arginfo_mb_str_iends) PHP_FE(mb_strstr, arginfo_mb_strstr) PHP_FE(mb_strrchr, arginfo_mb_strrchr) PHP_FE(mb_stristr, arginfo_mb_stristr) From 59e0081d7bff5c99584bd6b69fa1024ef097bccb Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 23:13:32 -0500 Subject: [PATCH 024/107] Added Zend Arg info --- ext/mbstring/mbstring.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index c7fcac294b73c..791f0762262ed 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -260,6 +260,30 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strripos, 0, 0, 2) ZEND_ARG_INFO(0, encoding) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_begins, 0, 0, 2) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) + ZEND_ARG_INFO(0, encoding) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_ibegins, 0, 0, 2) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) + ZEND_ARG_INFO(0, encoding) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_ends, 0, 0, 2) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) + ZEND_ARG_INFO(0, encoding) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_iends, 0, 0, 2) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) + ZEND_ARG_INFO(0, encoding) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strstr, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) From 71f7afa68d7584e13147708d892ff1af44a9468a Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 23:32:46 -0500 Subject: [PATCH 025/107] Fixed typo in test case --- ext/mbstring/tests/mb_str_begins.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index 3dd62e41bf76f..848690299e02f 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -37,7 +37,7 @@ $needle1 = base64_decode('5pel5pys6Kqe'); var_dump(mb_str_begins($string_mb, $needle1)); $needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM"); -var_dump(mb_str_begin($string_mb, $needle2)); +var_dump(mb_str_begins($string_mb, $needle2)); ?> From 4534840a23068252654b4bd673c5cd8b48ec3b33 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 4 Jun 2019 07:02:01 -0500 Subject: [PATCH 026/107] Change needle in tesT --- ext/mbstring/tests/mb_str_begins.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index 848690299e02f..73ab4bfa31033 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -13,7 +13,7 @@ $euc_jp = '0123この文字列は日本語です。EUC-JPを使っています // EUC-JP - With encoding parameter mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_begins($euc_jp, '0123', 'EUC-JP')); +var_dump(mb_str_begins($euc_jp, '0123こ', EUC-JP')); var_dump(mb_str_begins($euc_jp, '韓国語', 'EUC-JP')); // EUC-JP - No encoding parameter From 21caed8e86b2ebb5e6088fffc843ed22bbcf5eb4 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 4 Jun 2019 09:53:09 -0500 Subject: [PATCH 027/107] Fixed syntax error --- ext/mbstring/tests/mb_str_begins.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index 73ab4bfa31033..d9508eda45542 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -13,7 +13,7 @@ $euc_jp = '0123この文字列は日本語です。EUC-JPを使っています // EUC-JP - With encoding parameter mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_begins($euc_jp, '0123こ', EUC-JP')); +var_dump(mb_str_begins($euc_jp, '0123こ', 'EUC-JP')); var_dump(mb_str_begins($euc_jp, '韓国語', 'EUC-JP')); // EUC-JP - No encoding parameter From 4a5e9b293b5d124dd8c38c580785cc637df9c8bc Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 4 Jun 2019 11:22:01 -0500 Subject: [PATCH 028/107] Removed incorrect text in mb_str_begins test --- ext/mbstring/tests/mb_str_begins.phpt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index d9508eda45542..0b11693be6c78 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -41,8 +41,7 @@ var_dump(mb_str_begins($string_mb, $needle2)); ?> -==DONE== ---EXPECTF-- +--EXPECT-- bool(true) bool(false) bool(true) From aa0aa2ae90bd21c80b99cc1b2480a9bd416873b9 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 4 Jun 2019 13:12:57 -0500 Subject: [PATCH 029/107] Added more tests for mb_str_i?(begins|ends) --- ext/mbstring/tests/mb_str_begins.phpt | 3 +- ext/mbstring/tests/mb_str_ends.phpt | 55 ++++++++++++++++++++++++++ ext/mbstring/tests/mb_str_ibegins.phpt | 53 +++++++++++++++++++++++++ ext/mbstring/tests/mb_str_iends.phpt | 53 +++++++++++++++++++++++++ 4 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 ext/mbstring/tests/mb_str_ends.phpt create mode 100644 ext/mbstring/tests/mb_str_ibegins.phpt create mode 100644 ext/mbstring/tests/mb_str_iends.phpt diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index 0b11693be6c78..f09266c0f99e5 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -4,7 +4,6 @@ mb_str_begins() --FILE-- +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) diff --git a/ext/mbstring/tests/mb_str_ibegins.phpt b/ext/mbstring/tests/mb_str_ibegins.phpt new file mode 100644 index 0000000000000..ae5baca893b28 --- /dev/null +++ b/ext/mbstring/tests/mb_str_ibegins.phpt @@ -0,0 +1,53 @@ +--TEST-- +mb_str_ibegins() +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) diff --git a/ext/mbstring/tests/mb_str_iends.phpt b/ext/mbstring/tests/mb_str_iends.phpt new file mode 100644 index 0000000000000..d5b38fec44bc0 --- /dev/null +++ b/ext/mbstring/tests/mb_str_iends.phpt @@ -0,0 +1,53 @@ +--TEST-- +mb_str_iends() +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) From f33f884624f4255ddb34d57730d776d527d45ecf Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 4 Jun 2019 22:56:40 -0500 Subject: [PATCH 030/107] Changed approach for str_ends --- ext/mbstring/mbstring.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 791f0762262ed..a3438c16982f4 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2706,13 +2706,9 @@ PHP_FUNCTION(mb_str_ends) RETURN_BOOL(1); } - n = mbfl_strpos(&haystack, &needle, 0, 1); + n = mbfl_strpos(&haystack, &needle, haystack.len-needle.len, 0); if (!mbfl_is_error(n)) { - if (n == (haystack.len - needle.len)) { - RETURN_BOOL(1); - } else { - RETURN_BOOL(0); - } + RETURN_BOOL(1); } else { switch (-n) { case 1: From 9005a5ceef024d0225392d62a4bb1b2bce4b5906 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 11:26:25 -0500 Subject: [PATCH 031/107] Output the error code when an unknown error occurs in mb_strpos --- ext/mbstring/mbstring.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index a3438c16982f4..4d0e642f8fdf9 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -11,7 +11,7 @@ | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ + +-------------------------------------------------------------- --------+ | Author: Tsukada Takuya | | Rui Hirokawa | | Hironori Sato | @@ -2641,7 +2641,7 @@ PHP_FUNCTION(mb_str_begins) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n"); break; } RETURN_BOOL(0); @@ -2720,7 +2720,7 @@ PHP_FUNCTION(mb_str_ends) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n); break; } RETURN_BOOL(0); From 433e8c4270bf7ed0a2d21566b51ca4104bd83b83 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 11:27:22 -0500 Subject: [PATCH 032/107] Fixed finger typo --- ext/mbstring/mbstring.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 4d0e642f8fdf9..b639cc267098b 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -11,7 +11,7 @@ | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | - +-------------------------------------------------------------- --------+ + +----------------------------------------------------------------------+ | Author: Tsukada Takuya | | Rui Hirokawa | | Hironori Sato | @@ -2641,7 +2641,7 @@ PHP_FUNCTION(mb_str_begins) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n"); + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n); break; } RETURN_BOOL(0); From fa557a06f9a7f39a82e05b651fa362d653951dbc Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 11:34:41 -0500 Subject: [PATCH 033/107] Corrected string output, remembered this is C and not PHP --- ext/mbstring/mbstring.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index b639cc267098b..9e4708194e2ee 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2641,7 +2641,9 @@ PHP_FUNCTION(mb_str_begins) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n); + char buffer[42]; + sprintf(buffer, "Unknown error in mb_strpos. Error code: %s", n); + php_error_docref(NULL, E_WARNING, buffer); break; } RETURN_BOOL(0); @@ -2720,7 +2722,9 @@ PHP_FUNCTION(mb_str_ends) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n); + char buffer[42]; + sprintf(buffer, "Unknown error in mb_strpos. Error code: %s", n); + php_error_docref(NULL, E_WARNING, buffer); break; } RETURN_BOOL(0); From 363e4b68fd21284ae9c711c355f00914f6058f9b Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 11:45:18 -0500 Subject: [PATCH 034/107] Fixed format string --- ext/mbstring/mbstring.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 9e4708194e2ee..58fbb0f292cb9 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2642,7 +2642,7 @@ PHP_FUNCTION(mb_str_begins) break; default: char buffer[42]; - sprintf(buffer, "Unknown error in mb_strpos. Error code: %s", n); + sprintf(buffer, "Unknown error in mb_strpos. Error code: %d", n); php_error_docref(NULL, E_WARNING, buffer); break; } @@ -2723,7 +2723,7 @@ PHP_FUNCTION(mb_str_ends) break; default: char buffer[42]; - sprintf(buffer, "Unknown error in mb_strpos. Error code: %s", n); + sprintf(buffer, "Unknown error in mb_strpos. Error code: %d", n); php_error_docref(NULL, E_WARNING, buffer); break; } From 3cc6435053c0ab930bf6c712ff00c0028ff586db Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 12:40:57 -0500 Subject: [PATCH 035/107] Update mbstring.c --- ext/mbstring/mbstring.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 58fbb0f292cb9..647ad0bcd32ff 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2642,7 +2642,7 @@ PHP_FUNCTION(mb_str_begins) break; default: char buffer[42]; - sprintf(buffer, "Unknown error in mb_strpos. Error code: %d", n); + sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); php_error_docref(NULL, E_WARNING, buffer); break; } @@ -2723,7 +2723,7 @@ PHP_FUNCTION(mb_str_ends) break; default: char buffer[42]; - sprintf(buffer, "Unknown error in mb_strpos. Error code: %d", n); + sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); php_error_docref(NULL, E_WARNING, buffer); break; } From 60c8be800ef880dd69cc11b5d5787f8a018cbf08 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 13:35:58 -0500 Subject: [PATCH 036/107] Update mbstring.c --- ext/mbstring/mbstring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 647ad0bcd32ff..9fb14ecf53233 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2631,6 +2631,7 @@ PHP_FUNCTION(mb_str_begins) RETURN_BOOL(0); } } else { + char buffer[42]; switch (-n) { case 1: break; @@ -2641,7 +2642,6 @@ PHP_FUNCTION(mb_str_begins) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - char buffer[42]; sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); php_error_docref(NULL, E_WARNING, buffer); break; From 9d27d12799249a86c545479492dcca4cf2d71430 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 13:46:04 -0500 Subject: [PATCH 037/107] Update mbstring.c --- ext/mbstring/mbstring.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 9fb14ecf53233..0f6904ede47b5 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2712,6 +2712,7 @@ PHP_FUNCTION(mb_str_ends) if (!mbfl_is_error(n)) { RETURN_BOOL(1); } else { + char buffer[42]; switch (-n) { case 1: break; @@ -2722,7 +2723,7 @@ PHP_FUNCTION(mb_str_ends) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - char buffer[42]; + sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); php_error_docref(NULL, E_WARNING, buffer); break; From cb82c1b2c368d897e2d675dd66f8eec97e7f89c6 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 15:11:29 -0500 Subject: [PATCH 038/107] Update mbstring.c --- ext/mbstring/mbstring.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 0f6904ede47b5..a3438c16982f4 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2631,7 +2631,6 @@ PHP_FUNCTION(mb_str_begins) RETURN_BOOL(0); } } else { - char buffer[42]; switch (-n) { case 1: break; @@ -2642,8 +2641,7 @@ PHP_FUNCTION(mb_str_begins) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); - php_error_docref(NULL, E_WARNING, buffer); + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); break; } RETURN_BOOL(0); @@ -2712,7 +2710,6 @@ PHP_FUNCTION(mb_str_ends) if (!mbfl_is_error(n)) { RETURN_BOOL(1); } else { - char buffer[42]; switch (-n) { case 1: break; @@ -2723,9 +2720,7 @@ PHP_FUNCTION(mb_str_ends) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - - sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); - php_error_docref(NULL, E_WARNING, buffer); + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); break; } RETURN_BOOL(0); From edc593d66755006f0e4a77b908ba4ca051f5c5c9 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 10 Jun 2019 13:35:33 -0500 Subject: [PATCH 039/107] Update mbstring.c --- ext/mbstring/mbstring.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index a3438c16982f4..667cd347f8d86 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2719,6 +2719,9 @@ PHP_FUNCTION(mb_str_ends) case 8: php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; + case 16: + php_error_docref(NULL, E_WARNING, "Unknown needle, haystack error"); + break; default: php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); break; From e614fa21d3eeedbd95e777b3c018d6eb9f525043 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 10 Jun 2019 14:20:40 -0500 Subject: [PATCH 040/107] Update mbstring.c --- ext/mbstring/mbstring.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 667cd347f8d86..9eea150a6e310 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2705,6 +2705,10 @@ PHP_FUNCTION(mb_str_ends) if (needle.len == 0) { RETURN_BOOL(1); } + + if (needle.len > haystack.len) { + RETURN_BOOL(0); + } n = mbfl_strpos(&haystack, &needle, haystack.len-needle.len, 0); if (!mbfl_is_error(n)) { From 0d44f2b7b9f7309a245a94d5f41e799de9ce6a1a Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 17 Jun 2019 18:14:16 -0500 Subject: [PATCH 041/107] Update mbstring.c --- ext/mbstring/mbstring.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 9eea150a6e310..c56dc521970d8 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2710,9 +2710,18 @@ PHP_FUNCTION(mb_str_ends) RETURN_BOOL(0); } - n = mbfl_strpos(&haystack, &needle, haystack.len-needle.len, 0); - if (!mbfl_is_error(n)) { + mbfl_string haystack_tail; + haystack_tail.encoding = haystack.encoding; + haystack_tail.no_language = haystack.no_language; + unsigned char* haystack_tail_val = haystack.val + sizeof(char) * (haystack.len - needle.len); + haystack_tail.val = haystack_tail_val; + haystack_tail.len = needle.len; + + n = mbfl_strpos(&haystack_tail, &needle, 0, 0); + if (!mbfl_is_error(n) && n == 0) { RETURN_BOOL(1); + } else if (!mbfl_is_error(n)) { + RETURN_BOOL(0); } else { switch (-n) { case 1: From 117d677b3e659a07bc13bc3f7c33aba173e1e555 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 17 Jun 2019 18:14:45 -0500 Subject: [PATCH 042/107] Update mb_str_ends.phpt --- ext/mbstring/tests/mb_str_ends.phpt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/tests/mb_str_ends.phpt b/ext/mbstring/tests/mb_str_ends.phpt index e3be9660b06ff..3d5b5eb916078 100644 --- a/ext/mbstring/tests/mb_str_ends.phpt +++ b/ext/mbstring/tests/mb_str_ends.phpt @@ -24,7 +24,7 @@ var_dump(mb_str_ends($euc_jp, '韓国語')); mb_internal_encoding('UTF-8'); $string_ascii = 'abc def'; -//Japanese string in UTF-8 +// Japanese string in UTF-8 $string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); var_dump(mb_str_ends($string_ascii, 'f', 'ISO-8859-1')); @@ -33,7 +33,7 @@ var_dump(mb_str_ends($string_ascii, 'e', 'ISO-8859-1')); var_dump(mb_str_ends($string_ascii, 'def')); var_dump(mb_str_ends($string_ascii, 'de')); -$needle1 = base64_decode('JnjgII='); +$needle1 = base64_decode('77yZ44CC'); var_dump(mb_str_ends($string_mb, $needle1)); $needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM"); From 9a4c339203be77b37e8f75821b547c71c0a49563 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 17 Jun 2019 21:59:11 -0500 Subject: [PATCH 043/107] Corrected mb_str_iends test --- ext/mbstring/tests/mb_str_iends.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/tests/mb_str_iends.phpt b/ext/mbstring/tests/mb_str_iends.phpt index d5b38fec44bc0..a09e1b22a12a8 100644 --- a/ext/mbstring/tests/mb_str_iends.phpt +++ b/ext/mbstring/tests/mb_str_iends.phpt @@ -32,7 +32,7 @@ var_dump(mb_str_iends($string_ascii, 'e', 'ISO-8859-1')); var_dump(mb_str_iends($string_ascii, 'DeF')); var_dump(mb_str_iends($string_ascii, 'de')); -$needle1 = base64_decode('JnjgII='); +$needle1 = base64_decode('77yZ44CC'); var_dump(mb_str_iends($string_mb, $needle1)); $needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM"); From 0dbe537b09cfcfbedbf0df55c70072488ba61ce5 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 17 Jun 2019 21:59:39 -0500 Subject: [PATCH 044/107] Updated mb_str_iends --- ext/mbstring/mbstring.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index c56dc521970d8..75ff01e539a81 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2766,9 +2766,16 @@ PHP_FUNCTION(mb_str_iends) RETURN_BOOL(1); } - n = php_mb_stripos(1, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, enc_name); + mbfl_string haystack_tail; + haystack_tail.encoding = haystack.encoding; + haystack_tail.no_language = haystack.no_language; + unsigned char* haystack_tail_val = haystack.val + sizeof(char) * (haystack.len - needle.len); + haystack_tail.val = haystack_tail_val; + haystack_tail.len = needle.len; + + n = php_mb_stripos(0, (char *)haystack_tail.val, haystack_tail.len, (char *)needle.val, needle.len, 0, enc_name); if (!mbfl_is_error(n)) { - if (n == (haystack.len - needle.len)) { + if (n == 0) { RETURN_BOOL(1); } else { RETURN_BOOL(0); From 6938799c707fe5bc0bc95a0bc613044d73bc2509 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 20 Jun 2019 07:28:00 -0500 Subject: [PATCH 045/107] Added explicit checks for when needle is longer than haystack --- ext/standard/string.c | 16 ++++++++++++++++ ext/standard/tests/strings/str_ends.phpt | 2 ++ ext/standard/tests/strings/str_iends.phpt | 2 ++ 3 files changed, 20 insertions(+) diff --git a/ext/standard/string.c b/ext/standard/string.c index 3154600bd4074..acfe4c543d882 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2312,6 +2312,10 @@ PHP_FUNCTION(str_begins) { Z_PARAM_STR(needle) ZEND_PARSE_PARAMETERS_END(); + if (needle->len > haystack->len) { + RETURN_BOOL(0); + } + for (i = 0; i < needle->len; i++) if (haystack->val[i] != needle->val[i]) RETURN_BOOL(0); @@ -2329,6 +2333,10 @@ PHP_FUNCTION(str_ibegins) { Z_PARAM_STR(needle) ZEND_PARSE_PARAMETERS_END(); + if (needle->len > haystack->len) { + RETURN_BOOL(0); + } + for (i = 0; i < needle->len; i++) if (tolower(haystack->val[i]) != tolower(needle->val[i])) RETURN_BOOL(0); @@ -2345,6 +2353,10 @@ PHP_FUNCTION(str_ends) { Z_PARAM_STR(haystack) Z_PARAM_STR(needle) ZEND_PARSE_PARAMETERS_END(); + + if (needle->len > haystack->len) { + RETURN_BOOL(0); + } for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (haystack->val[i] != needle->val[j]) @@ -2363,6 +2375,10 @@ PHP_FUNCTION(str_iends) { Z_PARAM_STR(needle) ZEND_PARSE_PARAMETERS_END(); + if (needle->len > haystack->len) { + RETURN_BOOL(0); + } + for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (tolower(haystack->val[i]) != tolower(needle->val[j])) RETURN_BOOL(0); diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_ends.phpt index a57992082fa47..82988d1299609 100644 --- a/ext/standard/tests/strings/str_ends.phpt +++ b/ext/standard/tests/strings/str_ends.phpt @@ -9,8 +9,10 @@ $testStr = "beginningMiddleEnd"; var_dump(str_ends($testStr, "End")); var_dump(str_ends($testStr, "end")); var_dump(str_ends($testStr, "en")); +var_dump(str_ends($testStr, $testStr."a")); ?> --EXPECT-- bool(true) bool(false) bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_iends.phpt b/ext/standard/tests/strings/str_iends.phpt index a1295cd210230..d82aeff979c80 100644 --- a/ext/standard/tests/strings/str_iends.phpt +++ b/ext/standard/tests/strings/str_iends.phpt @@ -9,8 +9,10 @@ $testStr = "beginningMiddleEnd"; var_dump(str_iends($testStr, "End")); var_dump(str_iends($testStr, "end")); var_dump(str_iends($testStr, "en")); +var_dump(str_iends($testStr, $testStr."a")); ?> --EXPECT-- bool(true) bool(true) bool(false) +bool(false) From 90684da64e6100c798ade81ae51fd5923a2a1481 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 20 Jun 2019 09:07:27 -0500 Subject: [PATCH 046/107] Fixed indentation --- ext/standard/string.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index acfe4c543d882..3ec8384dff9c6 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2316,10 +2316,10 @@ PHP_FUNCTION(str_begins) { RETURN_BOOL(0); } - for (i = 0; i < needle->len; i++) - if (haystack->val[i] != needle->val[i]) - RETURN_BOOL(0); - RETURN_BOOL(1); + for (i = 0; i < needle->len; i++) + if (haystack->val[i] != needle->val[i]) + RETURN_BOOL(0); + RETURN_BOOL(1); } /* {{{ proto boolean str_ibegins(string haystack, string needle) @@ -2337,10 +2337,10 @@ PHP_FUNCTION(str_ibegins) { RETURN_BOOL(0); } - for (i = 0; i < needle->len; i++) - if (tolower(haystack->val[i]) != tolower(needle->val[i])) - RETURN_BOOL(0); - RETURN_BOOL(1); + for (i = 0; i < needle->len; i++) + if (tolower(haystack->val[i]) != tolower(needle->val[i])) + RETURN_BOOL(0); + RETURN_BOOL(1); } /* {{{ proto boolean str_ends(string haystack, string needle) @@ -2358,10 +2358,10 @@ PHP_FUNCTION(str_ends) { RETURN_BOOL(0); } - for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) - if (haystack->val[i] != needle->val[j]) - RETURN_BOOL(0); - RETURN_BOOL(1); + for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) + if (haystack->val[i] != needle->val[j]) + RETURN_BOOL(0); + RETURN_BOOL(1); } /* {{{ proto boolean str_iends(string haystack, string needle) @@ -2379,9 +2379,9 @@ PHP_FUNCTION(str_iends) { RETURN_BOOL(0); } - for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) - if (tolower(haystack->val[i]) != tolower(needle->val[j])) - RETURN_BOOL(0); + for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) + if (tolower(haystack->val[i]) != tolower(needle->val[j])) + RETURN_BOOL(0); RETURN_BOOL(1); } From 21d186201ef7ee4ef25b321775e3dff0070b32f7 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 20 Jun 2019 09:09:27 -0500 Subject: [PATCH 047/107] Fixed indentation --- ext/standard/string.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 3ec8384dff9c6..1222a7a4a925a 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2304,8 +2304,8 @@ PHP_FUNCTION(substr) /* {{{ proto boolean str_begins(string haystack, string needle) Checks if haystack begins with needle */ PHP_FUNCTION(str_begins) { - zend_string *haystack, *needle; - int i; + zend_string *haystack, *needle; + int i; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) @@ -2319,14 +2319,14 @@ PHP_FUNCTION(str_begins) { for (i = 0; i < needle->len; i++) if (haystack->val[i] != needle->val[i]) RETURN_BOOL(0); - RETURN_BOOL(1); + RETURN_BOOL(1); } /* {{{ proto boolean str_ibegins(string haystack, string needle) Performs case insensitive check to determine if haystack begins with needle */ PHP_FUNCTION(str_ibegins) { - zend_string *haystack, *needle; - int i; + zend_string *haystack, *needle; + int i; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) @@ -2346,8 +2346,8 @@ PHP_FUNCTION(str_ibegins) { /* {{{ proto boolean str_ends(string haystack, string needle) Checks if haystack ends with needle */ PHP_FUNCTION(str_ends) { - zend_string *haystack, *needle; - int i, j; + zend_string *haystack, *needle; + int i, j; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) @@ -2367,8 +2367,8 @@ PHP_FUNCTION(str_ends) { /* {{{ proto boolean str_iends(string haystack, string needle) Performs case insensitive check to determine if haystack ends with needle */ PHP_FUNCTION(str_iends) { - zend_string *haystack, *needle; - int i, j; + zend_string *haystack, *needle; + int i, j; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) From 7fc90b68847bf640b9e410bc3c6ee4e4adc89f48 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 20 Jun 2019 09:12:12 -0500 Subject: [PATCH 048/107] Fixed indentation --- ext/standard/string.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 1222a7a4a925a..053e4470ca113 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2382,7 +2382,7 @@ PHP_FUNCTION(str_iends) { for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (tolower(haystack->val[i]) != tolower(needle->val[j])) RETURN_BOOL(0); - RETURN_BOOL(1); + RETURN_BOOL(1); } /* {{{ proto string|array|false substr_replace(mixed str, mixed repl, mixed start [, mixed length]) From ddf1dce8858ea4651044fd59b0d5fb8741edc0f5 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 26 Jul 2016 11:59:47 -0500 Subject: [PATCH 049/107] Added str_begins and str_ends --- ext/standard/basic_functions.c | 12 ++++++++++++ ext/standard/php_string.h | 2 ++ ext/standard/string.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index f17133f7e17d7..31bf8cd3bba2c 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2236,6 +2236,16 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2) ZEND_ARG_INFO(0, part) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins, 0, 0, 2) + ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, search_value) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends, 0, 0, 2) + ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, search_value) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_strpos, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) @@ -2775,6 +2785,8 @@ static const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(strtoupper, arginfo_strtoupper) PHP_FE(strtolower, arginfo_strtolower) PHP_FE(strpos, arginfo_strpos) + PHP_FE(str_begins, arginfo_str_begins) + PHP_FE(str_ends, arginfo_str_ends) PHP_FE(stripos, arginfo_stripos) PHP_FE(strrpos, arginfo_strrpos) PHP_FE(strripos, arginfo_strripos) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 53209f4485199..2da193e7e4ed9 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -41,6 +41,8 @@ PHP_FUNCTION(basename); PHP_FUNCTION(dirname); PHP_FUNCTION(pathinfo); PHP_FUNCTION(strstr); +PHP_FUNCTION(str_begins); +PHP_FUNCTION(str_ends); PHP_FUNCTION(strpos); PHP_FUNCTION(stripos); PHP_FUNCTION(strrpos); diff --git a/ext/standard/string.c b/ext/standard/string.c index bf2891c690900..f0fbb4d7e9e2c 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2301,6 +2301,34 @@ PHP_FUNCTION(substr) } /* }}} */ +/* {{{ proto boolean str_begins(string str, string search_value) + Checks if str begins with search_value */ +PHP_FUNCTION(str_begins) { + zend_string *str, *search_value; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &str, &search_value) == FAILURE) + RETURN_NULL(); + + for (int i = 0; i < search_value->len; i++) + if (str->val[i] != search_value->val[i]) + RETURN_BOOL(0); + RETURN_BOOL(1); +} + +/* {{{ proto boolean str_ends(string str, string search_value) + Checks if str ends with search_value */ +PHP_FUNCTION(str_ends) { + zend_string *str, *search_value; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &str, &search_value) == FAILURE) + RETURN_NULL(); + + for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) + if (str->val[i] != search_value->val[j]) + RETURN_BOOL(0); + RETURN_BOOL(1); +} + /* {{{ proto string|array|false substr_replace(mixed str, mixed repl, mixed start [, mixed length]) Replaces part of a string with another string */ PHP_FUNCTION(substr_replace) From a3342932f36887e610aafab991353af50a3b073f Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 27 Jul 2016 15:24:05 -0500 Subject: [PATCH 050/107] Added support for case insensitive searches --- ext/standard/basic_functions.c | 2 ++ ext/standard/string.c | 36 ++++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 31bf8cd3bba2c..dbed3e9d721a0 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2239,11 +2239,13 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins, 0, 0, 2) ZEND_ARG_INFO(0, str) ZEND_ARG_INFO(0, search_value) + ZEND_ARG_INFO(0, caseSensitive) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends, 0, 0, 2) ZEND_ARG_INFO(0, str) ZEND_ARG_INFO(0, search_value) + ZEND_ARG_INFO(0, caseSensitive) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_strpos, 0, 0, 2) diff --git a/ext/standard/string.c b/ext/standard/string.c index f0fbb4d7e9e2c..6fb89223b8691 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2301,31 +2301,47 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begins(string str, string search_value) +/* {{{ proto boolean str_begins(string str, string search_value [, case_sensitive = TRUE]) Checks if str begins with search_value */ PHP_FUNCTION(str_begins) { zend_string *str, *search_value; + int argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &str, &search_value) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &argc) == FAILURE) RETURN_NULL(); - for (int i = 0; i < search_value->len; i++) - if (str->val[i] != search_value->val[i]) - RETURN_BOOL(0); + // Case sensitive checks + if (argc == 2) { + for (int i = 0; i < search_value->len; i++) + if (str->val[i] != search_value->val[i]) + RETURN_BOOL(0); + } else if (argc == 3) { // Case insensitive checks + for (int i = 0; i < search_value->len; i++) + if (tolower(str->val[i]) != tolower(search_value->val[i])) + RETURN_BOOL(0); + } RETURN_BOOL(1); } -/* {{{ proto boolean str_ends(string str, string search_value) +/* {{{ proto boolean str_ends(string str, string search_value [, case_sensitive = TRUE) Checks if str ends with search_value */ PHP_FUNCTION(str_ends) { zend_string *str, *search_value; + int argc = ZEND_NUM_ARGS(); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &str, &search_value) == FAILURE) RETURN_NULL(); - - for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) - if (str->val[i] != search_value->val[j]) - RETURN_BOOL(0); + + // Case sensitive checks + if (argc == 2) { + for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) + if (str->val[i] != search_value->val[j]) + RETURN_BOOL(0); + } else if (argc == 3) { // Case insensitive checks + for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) + if (tolower(str->val[i]) != tolower(search_value->val[j])) + RETURN_BOOL(0); + } RETURN_BOOL(1); } From f7ff725a52c35d8c8b46d46e6afeb711815cbd78 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 27 Jul 2016 17:32:08 -0500 Subject: [PATCH 051/107] changed capitalization of TRUE --- ext/standard/string.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 6fb89223b8691..4f5ca3bf6dc70 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2301,7 +2301,7 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begins(string str, string search_value [, case_sensitive = TRUE]) +/* {{{ proto boolean str_begins(string str, string search_value [, case_sensitive = true]) Checks if str begins with search_value */ PHP_FUNCTION(str_begins) { zend_string *str, *search_value; @@ -2323,7 +2323,7 @@ PHP_FUNCTION(str_begins) { RETURN_BOOL(1); } -/* {{{ proto boolean str_ends(string str, string search_value [, case_sensitive = TRUE) +/* {{{ proto boolean str_ends(string str, string search_value [, case_sensitive = true) Checks if str ends with search_value */ PHP_FUNCTION(str_ends) { zend_string *str, *search_value; From 5514cd0008e2fa420a3c12f030a75d5b1df9bb7c Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 29 Jul 2016 16:36:46 -0500 Subject: [PATCH 052/107] Passes test case now --- ext/standard/string.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 4f5ca3bf6dc70..9ab11180fcec9 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2306,19 +2306,17 @@ PHP_FUNCTION(substr) PHP_FUNCTION(str_begins) { zend_string *str, *search_value; int argc = ZEND_NUM_ARGS(); + int case_sensitive; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &argc) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) RETURN_NULL(); - - // Case sensitive checks - if (argc == 2) { - for (int i = 0; i < search_value->len; i++) - if (str->val[i] != search_value->val[i]) - RETURN_BOOL(0); - } else if (argc == 3) { // Case insensitive checks - for (int i = 0; i < search_value->len; i++) - if (tolower(str->val[i]) != tolower(search_value->val[i])) - RETURN_BOOL(0); + + for (int i = 0; i < search_value->len; i++) { + if (case_sensitive && str->val[i] != search_value->val[i]) { + RETURN_BOOL(0); + } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[i])) { + RETURN_BOOL(0); + } } RETURN_BOOL(1); } From cbe46ec2c0bcede4887382801084b33a774dba64 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 29 Jul 2016 16:53:29 -0500 Subject: [PATCH 053/107] Added testing for str_ends --- ext/standard/tests/strings/str_ends.phpt | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 ext/standard/tests/strings/str_ends.phpt diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_ends.phpt new file mode 100644 index 0000000000000..e93c5b542314e --- /dev/null +++ b/ext/standard/tests/strings/str_ends.phpt @@ -0,0 +1,25 @@ +--TEST-- +str_begins() function - unit tests for str_begins() +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(false) +bool(true) +bool(true) +bool(false) From b6ec725c21ab458009904203b6f08eeb7c8052b3 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Sun, 31 Jul 2016 16:24:58 -0500 Subject: [PATCH 054/107] Passes tests cases --- ext/standard/string.c | 20 +++++++++----------- ext/standard/tests/strings/str_ends.phpt | 14 +++++++------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 9ab11180fcec9..2a8a9c312c0f7 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2314,7 +2314,7 @@ PHP_FUNCTION(str_begins) { for (int i = 0; i < search_value->len; i++) { if (case_sensitive && str->val[i] != search_value->val[i]) { RETURN_BOOL(0); - } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[i])) { + } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[i])) { RETURN_BOOL(0); } } @@ -2326,19 +2326,17 @@ PHP_FUNCTION(str_begins) { PHP_FUNCTION(str_ends) { zend_string *str, *search_value; int argc = ZEND_NUM_ARGS(); + int case_sensitive; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &str, &search_value) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) RETURN_NULL(); - // Case sensitive checks - if (argc == 2) { - for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) - if (str->val[i] != search_value->val[j]) - RETURN_BOOL(0); - } else if (argc == 3) { // Case insensitive checks - for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) - if (tolower(str->val[i]) != tolower(search_value->val[j])) - RETURN_BOOL(0); + for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) { + if (case_sensitive && str->val[i] != search_value->val[j]) { + RETURN_BOOL(0); + } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[j])) { + RETURN_BOOL(0); + } } RETURN_BOOL(1); } diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_ends.phpt index e93c5b542314e..a46c080c1f641 100644 --- a/ext/standard/tests/strings/str_ends.phpt +++ b/ext/standard/tests/strings/str_ends.phpt @@ -1,5 +1,5 @@ --TEST-- -str_begins() function - unit tests for str_begins() +str_ends() function - unit tests for str_ends() --FILE-- --EXPECT-- bool(true) From 98ec7d6b47626240ec6a3e892b370770f09d74d2 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 1 Aug 2016 21:14:21 -0500 Subject: [PATCH 055/107] Fixed build error --- ext/standard/string.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 2a8a9c312c0f7..7181cd37b5f82 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2306,12 +2306,12 @@ PHP_FUNCTION(substr) PHP_FUNCTION(str_begins) { zend_string *str, *search_value; int argc = ZEND_NUM_ARGS(); - int case_sensitive; + int case_sensitive, i; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) RETURN_NULL(); - for (int i = 0; i < search_value->len; i++) { + for (i = 0; i < search_value->len; i++) { if (case_sensitive && str->val[i] != search_value->val[i]) { RETURN_BOOL(0); } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[i])) { @@ -2326,12 +2326,12 @@ PHP_FUNCTION(str_begins) { PHP_FUNCTION(str_ends) { zend_string *str, *search_value; int argc = ZEND_NUM_ARGS(); - int case_sensitive; + int case_sensitive, i, j; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) RETURN_NULL(); - for (int i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) { + for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) { if (case_sensitive && str->val[i] != search_value->val[j]) { RETURN_BOOL(0); } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[j])) { From e0c645713be8bc333291363a003d68dd24d7e07b Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 12 Aug 2016 17:21:24 -0500 Subject: [PATCH 056/107] Split functions based on case sensitivity --- ext/standard/basic_functions.c | 16 +++-- ext/standard/php_string.h | 6 +- ext/standard/string.c | 60 ++++++++++++------- ext/standard/tests/strings/str_begin.phpt | 16 +++++ .../strings/{str_ends.phpt => str_end.phpt} | 0 5 files changed, 72 insertions(+), 26 deletions(-) create mode 100644 ext/standard/tests/strings/str_begin.phpt rename ext/standard/tests/strings/{str_ends.phpt => str_end.phpt} (100%) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index dbed3e9d721a0..bc67f818e0075 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2236,16 +2236,24 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2) ZEND_ARG_INFO(0, part) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begin, 0, 0, 2) + ZEND_ARG_INFO(0, search_value) ZEND_ARG_INFO(0, str) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ibegin, 0, 0, 2) ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, caseSensitive) + ZEND_ARG_INFO(0, str) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_end, 0, 0, 2) + ZEND_ARG_INFO(0, search_value) ZEND_ARG_INFO(0, str) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_iend, 0, 0, 2) ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, caseSensitive) + ZEND_ARG_INFO(0, str) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_strpos, 0, 0, 2) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 2da193e7e4ed9..22e5154c771b3 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -41,8 +41,10 @@ PHP_FUNCTION(basename); PHP_FUNCTION(dirname); PHP_FUNCTION(pathinfo); PHP_FUNCTION(strstr); -PHP_FUNCTION(str_begins); -PHP_FUNCTION(str_ends); +PHP_FUNCTION(str_begin); +PHP_FUNCTION(str_ibegin); +PHP_FUNCTION(str_end); +PHP_FUNCTION(str_iend); PHP_FUNCTION(strpos); PHP_FUNCTION(stripos); PHP_FUNCTION(strrpos); diff --git a/ext/standard/string.c b/ext/standard/string.c index 7181cd37b5f82..7b69ee33cfe84 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2301,43 +2301,63 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begins(string str, string search_value [, case_sensitive = true]) +/* {{{ proto boolean str_begin(string search_value, string str) Checks if str begins with search_value */ -PHP_FUNCTION(str_begins) { +PHP_FUNCTION(str_begin) { zend_string *str, *search_value; - int argc = ZEND_NUM_ARGS(); - int case_sensitive, i; + int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) RETURN_NULL(); - for (i = 0; i < search_value->len; i++) { - if (case_sensitive && str->val[i] != search_value->val[i]) { + for (i = 0; i < search_value->len; i++) + if (str->val[i] != search_value->val[i]) RETURN_BOOL(0); - } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[i])) { + RETURN_BOOL(1); +} + +/* {{{ proto boolean str_ibegin(string search_value, string str) + Performs case insensitive check to determine if str begins with search_value */ +PHP_FUNCTION(str_ibegin) { + zend_string *str, *search_value; + int i; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + RETURN_NULL(); + + for (i = 0; i < search_value->len; i++) + if (tolower(str->val[i]) != tolower(search_value->val[i])) RETURN_BOOL(0); - } - } RETURN_BOOL(1); } -/* {{{ proto boolean str_ends(string str, string search_value [, case_sensitive = true) +/* {{{ proto boolean str_end(string search_value, string str) Checks if str ends with search_value */ -PHP_FUNCTION(str_ends) { +PHP_FUNCTION(str_end) { zend_string *str, *search_value; - int argc = ZEND_NUM_ARGS(); - int case_sensitive, i, j; + int i, j; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS|l", &str, &search_value, &case_sensitive) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) RETURN_NULL(); - for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) { - if (case_sensitive && str->val[i] != search_value->val[j]) { + for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) + if (str->val[i] != search_value->val[j]) RETURN_BOOL(0); - } else if (!case_sensitive && tolower(str->val[i]) != tolower(search_value->val[j])) { + RETURN_BOOL(1); +} + +/* {{{ proto boolean str_iend(string search_value, string str) + Performs case insensitive check to determine if str ends with search_value */ +PHP_FUNCTION(str_iend) { + zend_string *str, *search_value; + int i, j; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + RETURN_NULL(); + + for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) + if (tolower(str->val[i]) != tolower(search_value->val[j])) RETURN_BOOL(0); - } - } RETURN_BOOL(1); } diff --git a/ext/standard/tests/strings/str_begin.phpt b/ext/standard/tests/strings/str_begin.phpt new file mode 100644 index 0000000000000..860e81ee8d33b --- /dev/null +++ b/ext/standard/tests/strings/str_begin.phpt @@ -0,0 +1,16 @@ +--TEST-- +str_begin() function - unit tests for str_begin() +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_end.phpt similarity index 100% rename from ext/standard/tests/strings/str_ends.phpt rename to ext/standard/tests/strings/str_end.phpt From 0d3e608d3613940d0775df7ee3a1d44d3cd4e419 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 12 Aug 2016 17:23:26 -0500 Subject: [PATCH 057/107] Renamed str_begins to str_begins --- ext/standard/basic_functions.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index bc67f818e0075..b887069ed6243 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2795,8 +2795,10 @@ static const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(strtoupper, arginfo_strtoupper) PHP_FE(strtolower, arginfo_strtolower) PHP_FE(strpos, arginfo_strpos) - PHP_FE(str_begins, arginfo_str_begins) - PHP_FE(str_ends, arginfo_str_ends) + PHP_FE(str_begin, arginfo_str_begin) + PHP_FE(str_ibegin, arginfo_str_ibegin) + PHP_FE(str_end, arginfo_str_end) + PHP_FE(str_iend, arginfo_str_iend) PHP_FE(stripos, arginfo_stripos) PHP_FE(strrpos, arginfo_strrpos) PHP_FE(strripos, arginfo_strripos) From c2f769af15f49bd23e1e80fd160532bde50db933 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 12 Aug 2016 17:33:29 -0500 Subject: [PATCH 058/107] Updated test code --- ext/standard/tests/strings/str_begin.phpt | 8 ++++---- ext/standard/tests/strings/str_end.phpt | 21 ++++++--------------- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/ext/standard/tests/strings/str_begin.phpt b/ext/standard/tests/strings/str_begin.phpt index 860e81ee8d33b..aa579175c3df4 100644 --- a/ext/standard/tests/strings/str_begin.phpt +++ b/ext/standard/tests/strings/str_begin.phpt @@ -5,10 +5,10 @@ str_begin() function - unit tests for str_begin() /* Prototype: boolean str_begin (string $search_value string $str); Description: Determine if $str begins with $search_value */ -$testStr1 = "beginningMiddleEnd"; -var_dump(str_begins($testStr1, "beginning")); -var_dump(str_begins($testStr1, "Beginning")); -var_dump(str_begins($testStr1, "eginning")); +$testStr = "beginningMiddleEnd"; +var_dump(str_begin("beginning", $testStr)); +var_dump(str_begin("Beginning", $testStr)); +var_dump(str_begin("eginning", $testStr)); ?> --EXPECT-- bool(true) diff --git a/ext/standard/tests/strings/str_end.phpt b/ext/standard/tests/strings/str_end.phpt index a46c080c1f641..99f91e4df29aa 100644 --- a/ext/standard/tests/strings/str_end.phpt +++ b/ext/standard/tests/strings/str_end.phpt @@ -1,25 +1,16 @@ --TEST-- -str_ends() function - unit tests for str_ends() +str_end() function - unit tests for str_end() --FILE-- --EXPECT-- bool(true) bool(false) bool(false) -bool(true) -bool(true) -bool(false) From dd8d8dffd688e1cfe1f5a151fdeb2b6d8aa905f8 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 12 Aug 2016 17:38:49 -0500 Subject: [PATCH 059/107] Added case insensitive test cases --- ext/standard/tests/strings/str_ibegin.phpt | 16 ++++++++++++++++ ext/standard/tests/strings/str_iend.phpt | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 ext/standard/tests/strings/str_ibegin.phpt create mode 100644 ext/standard/tests/strings/str_iend.phpt diff --git a/ext/standard/tests/strings/str_ibegin.phpt b/ext/standard/tests/strings/str_ibegin.phpt new file mode 100644 index 0000000000000..5b7ac247d2025 --- /dev/null +++ b/ext/standard/tests/strings/str_ibegin.phpt @@ -0,0 +1,16 @@ +--TEST-- +str_ibegin() function - unit tests for str_ibegin() +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(false) diff --git a/ext/standard/tests/strings/str_iend.phpt b/ext/standard/tests/strings/str_iend.phpt new file mode 100644 index 0000000000000..a8b2be75db47b --- /dev/null +++ b/ext/standard/tests/strings/str_iend.phpt @@ -0,0 +1,16 @@ +--TEST-- +str_iend() function - unit tests for str_iend() +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(false) From 66f55fa11fdbbd74632fbae0f2be8c62ffc3242c Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 15 May 2019 18:32:01 -0500 Subject: [PATCH 060/107] Improved argument consistency and added additional test cases --- ext/standard/basic_functions.c | 16 ++++---- ext/standard/string.c | 48 +++++++++++----------- ext/standard/tests/strings/str_begin.phpt | 12 +++--- ext/standard/tests/strings/str_end.phpt | 10 ++--- ext/standard/tests/strings/str_ibegin.phpt | 12 +++--- ext/standard/tests/strings/str_iend.phpt | 10 ++--- 6 files changed, 56 insertions(+), 52 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index b887069ed6243..f283f65b03b28 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2237,23 +2237,23 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begin, 0, 0, 2) - ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ibegin, 0, 0, 2) - ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_end, 0, 0, 2) - ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_str_iend, 0, 0, 2) - ZEND_ARG_INFO(0, search_value) - ZEND_ARG_INFO(0, str) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_strpos, 0, 0, 2) diff --git a/ext/standard/string.c b/ext/standard/string.c index 7b69ee33cfe84..684d9af8acc5e 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2301,62 +2301,62 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begin(string search_value, string str) - Checks if str begins with search_value */ +/* {{{ proto boolean str_begin(string haystack, string needle) + Checks if haystack begins with needle */ PHP_FUNCTION(str_begin) { - zend_string *str, *search_value; + zend_string *haystack, *needle; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) RETURN_NULL(); - for (i = 0; i < search_value->len; i++) - if (str->val[i] != search_value->val[i]) + for (i = 0; i < needle->len; i++) + if (haystack->val[i] != needle->val[i]) RETURN_BOOL(0); RETURN_BOOL(1); } -/* {{{ proto boolean str_ibegin(string search_value, string str) - Performs case insensitive check to determine if str begins with search_value */ +/* {{{ proto boolean str_ibegin(string haystack, string needle) + Performs case insensitive check to determine if haystack begins with needle */ PHP_FUNCTION(str_ibegin) { - zend_string *str, *search_value; + zend_string *haystack, *needle; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) RETURN_NULL(); - for (i = 0; i < search_value->len; i++) - if (tolower(str->val[i]) != tolower(search_value->val[i])) + for (i = 0; i < needle->len; i++) + if (tolower(haystack->val[i]) != tolower(needle->val[i])) RETURN_BOOL(0); RETURN_BOOL(1); } -/* {{{ proto boolean str_end(string search_value, string str) - Checks if str ends with search_value */ +/* {{{ proto boolean str_end(string haystack, string needle) + Checks if haystack ends with needle */ PHP_FUNCTION(str_end) { - zend_string *str, *search_value; + zend_string *haystack, *needle; int i, j; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) RETURN_NULL(); - for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) - if (str->val[i] != search_value->val[j]) + for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) + if (haystack->val[i] != needle->val[j]) RETURN_BOOL(0); RETURN_BOOL(1); } -/* {{{ proto boolean str_iend(string search_value, string str) - Performs case insensitive check to determine if str ends with search_value */ +/* {{{ proto boolean str_iend(string haystack, string needle) + Performs case insensitive check to determine if haystack ends with needle */ PHP_FUNCTION(str_iend) { - zend_string *str, *search_value; + zend_string *haystack, *needle; int i, j; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &search_value, &str) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) RETURN_NULL(); - for (i = str->len - 1, j = search_value->len - 1; j >= 0; i--, j--) - if (tolower(str->val[i]) != tolower(search_value->val[j])) + for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) + if (tolower(haystack->val[i]) != tolower(needle->val[j])) RETURN_BOOL(0); RETURN_BOOL(1); } diff --git a/ext/standard/tests/strings/str_begin.phpt b/ext/standard/tests/strings/str_begin.phpt index aa579175c3df4..68946622a8826 100644 --- a/ext/standard/tests/strings/str_begin.phpt +++ b/ext/standard/tests/strings/str_begin.phpt @@ -2,15 +2,17 @@ str_begin() function - unit tests for str_begin() --FILE-- --EXPECT-- bool(true) bool(false) bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_end.phpt b/ext/standard/tests/strings/str_end.phpt index 99f91e4df29aa..67ae1501eb08f 100644 --- a/ext/standard/tests/strings/str_end.phpt +++ b/ext/standard/tests/strings/str_end.phpt @@ -2,13 +2,13 @@ str_end() function - unit tests for str_end() --FILE-- --EXPECT-- bool(true) diff --git a/ext/standard/tests/strings/str_ibegin.phpt b/ext/standard/tests/strings/str_ibegin.phpt index 5b7ac247d2025..3a3d7e7aa1de2 100644 --- a/ext/standard/tests/strings/str_ibegin.phpt +++ b/ext/standard/tests/strings/str_ibegin.phpt @@ -2,15 +2,17 @@ str_ibegin() function - unit tests for str_ibegin() --FILE-- --EXPECT-- bool(true) bool(true) bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_iend.phpt b/ext/standard/tests/strings/str_iend.phpt index a8b2be75db47b..eb01e450b1cd2 100644 --- a/ext/standard/tests/strings/str_iend.phpt +++ b/ext/standard/tests/strings/str_iend.phpt @@ -2,13 +2,13 @@ str_iend() function - unit tests for str_iend() --FILE-- --EXPECT-- bool(true) From 0cec5e1e1b39180db0a81e62c679c5ca6284d27e Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 15 May 2019 22:26:38 -0500 Subject: [PATCH 061/107] Updated function parameter definitions --- ext/standard/string.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 684d9af8acc5e..c81dbbf643b02 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2307,8 +2307,10 @@ PHP_FUNCTION(str_begin) { zend_string *haystack, *needle; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) - RETURN_NULL(); + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_STR(haystack) + Z_PARAM_STR(needle) + ZEND_PARSE_PARAMETERS_END(); for (i = 0; i < needle->len; i++) if (haystack->val[i] != needle->val[i]) @@ -2322,8 +2324,10 @@ PHP_FUNCTION(str_ibegin) { zend_string *haystack, *needle; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) - RETURN_NULL(); + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_STR(haystack) + Z_PARAM_STR(needle) + ZEND_PARSE_PARAMETERS_END(); for (i = 0; i < needle->len; i++) if (tolower(haystack->val[i]) != tolower(needle->val[i])) @@ -2337,8 +2341,10 @@ PHP_FUNCTION(str_end) { zend_string *haystack, *needle; int i, j; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) - RETURN_NULL(); + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_STR(haystack) + Z_PARAM_STR(needle) + ZEND_PARSE_PARAMETERS_END(); for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (haystack->val[i] != needle->val[j]) @@ -2352,8 +2358,10 @@ PHP_FUNCTION(str_iend) { zend_string *haystack, *needle; int i, j; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &haystack, &needle) == FAILURE) - RETURN_NULL(); + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_STR(haystack) + Z_PARAM_STR(needle) + ZEND_PARSE_PARAMETERS_END(); for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (tolower(haystack->val[i]) != tolower(needle->val[j])) From 9ef79edfec76b04729330ed6d4b5b8ce15693f08 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 16 May 2019 06:30:50 -0500 Subject: [PATCH 062/107] Corrected verb conjugation in str_begins and str_ends --- ext/standard/basic_functions.c | 16 ++++++++-------- ext/standard/php_string.h | 8 ++++---- ext/standard/string.c | 16 ++++++++-------- ext/standard/tests/strings/str_begin.phpt | 18 ------------------ ext/standard/tests/strings/str_begins.phpt | 18 ++++++++++++++++++ ext/standard/tests/strings/str_end.phpt | 16 ---------------- ext/standard/tests/strings/str_ends.phpt | 16 ++++++++++++++++ ext/standard/tests/strings/str_ibegin.phpt | 18 ------------------ ext/standard/tests/strings/str_ibegins.phpt | 18 ++++++++++++++++++ ext/standard/tests/strings/str_iend.phpt | 16 ---------------- ext/standard/tests/strings/str_iends.phpt | 16 ++++++++++++++++ 11 files changed, 88 insertions(+), 88 deletions(-) delete mode 100644 ext/standard/tests/strings/str_begin.phpt create mode 100644 ext/standard/tests/strings/str_begins.phpt delete mode 100644 ext/standard/tests/strings/str_end.phpt create mode 100644 ext/standard/tests/strings/str_ends.phpt delete mode 100644 ext/standard/tests/strings/str_ibegin.phpt create mode 100644 ext/standard/tests/strings/str_ibegins.phpt delete mode 100644 ext/standard/tests/strings/str_iend.phpt create mode 100644 ext/standard/tests/strings/str_iends.phpt diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index f283f65b03b28..c4c866cc9e16b 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2236,22 +2236,22 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2) ZEND_ARG_INFO(0, part) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begin, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ibegin, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ibegins, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_end, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_iend, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_iends, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() @@ -2795,10 +2795,10 @@ static const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(strtoupper, arginfo_strtoupper) PHP_FE(strtolower, arginfo_strtolower) PHP_FE(strpos, arginfo_strpos) - PHP_FE(str_begin, arginfo_str_begin) - PHP_FE(str_ibegin, arginfo_str_ibegin) - PHP_FE(str_end, arginfo_str_end) - PHP_FE(str_iend, arginfo_str_iend) + PHP_FE(str_begins, arginfo_str_begins) + PHP_FE(str_ibegins, arginfo_str_ibegins) + PHP_FE(str_ends, arginfo_str_ends) + PHP_FE(str_iends, arginfo_str_iends) PHP_FE(stripos, arginfo_stripos) PHP_FE(strrpos, arginfo_strrpos) PHP_FE(strripos, arginfo_strripos) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 22e5154c771b3..9783be2bdc189 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -41,10 +41,10 @@ PHP_FUNCTION(basename); PHP_FUNCTION(dirname); PHP_FUNCTION(pathinfo); PHP_FUNCTION(strstr); -PHP_FUNCTION(str_begin); -PHP_FUNCTION(str_ibegin); -PHP_FUNCTION(str_end); -PHP_FUNCTION(str_iend); +PHP_FUNCTION(str_begins); +PHP_FUNCTION(str_ibegins); +PHP_FUNCTION(str_ends); +PHP_FUNCTION(str_iends); PHP_FUNCTION(strpos); PHP_FUNCTION(stripos); PHP_FUNCTION(strrpos); diff --git a/ext/standard/string.c b/ext/standard/string.c index c81dbbf643b02..682a7bacafb19 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2301,9 +2301,9 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begin(string haystack, string needle) +/* {{{ proto boolean str_begins(string haystack, string needle) Checks if haystack begins with needle */ -PHP_FUNCTION(str_begin) { +PHP_FUNCTION(str_begins) { zend_string *haystack, *needle; int i; @@ -2318,9 +2318,9 @@ PHP_FUNCTION(str_begin) { RETURN_BOOL(1); } -/* {{{ proto boolean str_ibegin(string haystack, string needle) +/* {{{ proto boolean str_ibegins(string haystack, string needle) Performs case insensitive check to determine if haystack begins with needle */ -PHP_FUNCTION(str_ibegin) { +PHP_FUNCTION(str_ibegins) { zend_string *haystack, *needle; int i; @@ -2335,9 +2335,9 @@ PHP_FUNCTION(str_ibegin) { RETURN_BOOL(1); } -/* {{{ proto boolean str_end(string haystack, string needle) +/* {{{ proto boolean str_ends(string haystack, string needle) Checks if haystack ends with needle */ -PHP_FUNCTION(str_end) { +PHP_FUNCTION(str_ends) { zend_string *haystack, *needle; int i, j; @@ -2352,9 +2352,9 @@ PHP_FUNCTION(str_end) { RETURN_BOOL(1); } -/* {{{ proto boolean str_iend(string haystack, string needle) +/* {{{ proto boolean str_iends(string haystack, string needle) Performs case insensitive check to determine if haystack ends with needle */ -PHP_FUNCTION(str_iend) { +PHP_FUNCTION(str_iends) { zend_string *haystack, *needle; int i, j; diff --git a/ext/standard/tests/strings/str_begin.phpt b/ext/standard/tests/strings/str_begin.phpt deleted file mode 100644 index 68946622a8826..0000000000000 --- a/ext/standard/tests/strings/str_begin.phpt +++ /dev/null @@ -1,18 +0,0 @@ ---TEST-- -str_begin() function - unit tests for str_begin() ---FILE-- - ---EXPECT-- -bool(true) -bool(false) -bool(false) -bool(false) diff --git a/ext/standard/tests/strings/str_begins.phpt b/ext/standard/tests/strings/str_begins.phpt new file mode 100644 index 0000000000000..ac235fc85fab5 --- /dev/null +++ b/ext/standard/tests/strings/str_begins.phpt @@ -0,0 +1,18 @@ +--TEST-- +str_begins() function - unit tests for str_begins() +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_end.phpt b/ext/standard/tests/strings/str_end.phpt deleted file mode 100644 index 67ae1501eb08f..0000000000000 --- a/ext/standard/tests/strings/str_end.phpt +++ /dev/null @@ -1,16 +0,0 @@ ---TEST-- -str_end() function - unit tests for str_end() ---FILE-- - ---EXPECT-- -bool(true) -bool(false) -bool(false) diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_ends.phpt new file mode 100644 index 0000000000000..a57992082fa47 --- /dev/null +++ b/ext/standard/tests/strings/str_ends.phpt @@ -0,0 +1,16 @@ +--TEST-- +str_ends() function - unit tests for str_ends() +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_ibegin.phpt b/ext/standard/tests/strings/str_ibegin.phpt deleted file mode 100644 index 3a3d7e7aa1de2..0000000000000 --- a/ext/standard/tests/strings/str_ibegin.phpt +++ /dev/null @@ -1,18 +0,0 @@ ---TEST-- -str_ibegin() function - unit tests for str_ibegin() ---FILE-- - ---EXPECT-- -bool(true) -bool(true) -bool(false) -bool(false) diff --git a/ext/standard/tests/strings/str_ibegins.phpt b/ext/standard/tests/strings/str_ibegins.phpt new file mode 100644 index 0000000000000..9f218cd3e7e27 --- /dev/null +++ b/ext/standard/tests/strings/str_ibegins.phpt @@ -0,0 +1,18 @@ +--TEST-- +str_ibegins() function - unit tests for str_ibegins() +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_iend.phpt b/ext/standard/tests/strings/str_iend.phpt deleted file mode 100644 index eb01e450b1cd2..0000000000000 --- a/ext/standard/tests/strings/str_iend.phpt +++ /dev/null @@ -1,16 +0,0 @@ ---TEST-- -str_iend() function - unit tests for str_iend() ---FILE-- - ---EXPECT-- -bool(true) -bool(true) -bool(false) diff --git a/ext/standard/tests/strings/str_iends.phpt b/ext/standard/tests/strings/str_iends.phpt new file mode 100644 index 0000000000000..a1295cd210230 --- /dev/null +++ b/ext/standard/tests/strings/str_iends.phpt @@ -0,0 +1,16 @@ +--TEST-- +str_iends() function - unit tests for str_iends() +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(false) From ee628b499c4749fcbb225de2f083606bb088470e Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 05:31:51 -0500 Subject: [PATCH 063/107] Added mb_str_begins --- ext/mbstring/mbstring.c | 48 +++++++++++++++++++++++++++++++++++++++++ ext/mbstring/mbstring.h | 1 + 2 files changed, 49 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 4ca947374e69a..5d7ba770536a6 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2581,6 +2581,54 @@ PHP_FUNCTION(mb_strripos) } /* }}} */ +/* {{{ proto boolean mb_str_begins(string haystack, string needle [, string encoding]) + Checks if haystack begins with needle */ +PHP_FUNCTION(mb_str_begins) +{ + mbfl_string haystack, needle; + zend_string *enc_name = NULL; + size_t n; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", char( **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { + return; + } + + haystack.no_language = needle.no_language = MBSTRG(language); + haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name); + if (!haystack.encoding) { + RETURN_FALSE; + } + + if (needle.len == 0) { + RETURN_BOOL(1); + } + + n = mbfl_strpos(&haystack, &needle, 0, 0); + if (!mbfl_is_error(n)) { + if (n == 0) { + RETURN_BOOL(1); + } else { + RETURN_BOOL(0); + } + } else { + switch (-n) { + case 1: + break; + case 4: + php_error_docref(NULL, E_WARNING, "Unknown encoding or conversion error"); + break; + case 8: + php_error_docref(NULL, E_NOTICE, "Argument is empty"); + break; + default: + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); + break; + } + RETURN_BOOL(0); + } +} +/* }}} */ + /* {{{ proto string mb_strstr(string haystack, string needle[, bool part[, string encoding]]) Finds first occurrence of a string within another */ PHP_FUNCTION(mb_strstr) diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 58ae9cebbc476..1410e728c2681 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -84,6 +84,7 @@ PHP_FUNCTION(mb_strpos); PHP_FUNCTION(mb_strrpos); PHP_FUNCTION(mb_stripos); PHP_FUNCTION(mb_strripos); +PHP_FUNCTION(mb_str_begins); PHP_FUNCTION(mb_strstr); PHP_FUNCTION(mb_strrchr); PHP_FUNCTION(mb_stristr); From 7416d625b91515b2704bad2e1883cd811b4988c3 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 05:50:08 -0500 Subject: [PATCH 064/107] Fixed typo --- ext/mbstring/mbstring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 5d7ba770536a6..66158d21b650e 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2589,7 +2589,7 @@ PHP_FUNCTION(mb_str_begins) zend_string *enc_name = NULL; size_t n; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", char( **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { return; } From a0571220a747c8ffad0c0470239154b5786c819d Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 06:29:00 -0500 Subject: [PATCH 065/107] Added mb_str_ibegins --- ext/mbstring/mbstring.c | 35 +++++++++++++++++++++++++++++++++++ ext/mbstring/mbstring.h | 1 + 2 files changed, 36 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 66158d21b650e..da1d85b340490 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2629,6 +2629,41 @@ PHP_FUNCTION(mb_str_begins) } /* }}} */ +/* {{{ proto boolean mb_str_ibegins(string haystack, string needle. [, string encoding]) + Checks if haystack begins with needle, case insensitive */ +PHP_FUNCTION(mb_str_ibegins) +{ + mbfl_string haystack, needle; + zend_string *enc_name = NULL; + size_t n; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { + return; + } + + haystack.no_language = needle.no_language = MBSTRG(language); + haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name); + if (!haystack.encoding) { + RETURN_FALSE; + } + + if (needle.len == 0) { + RETURN_BOOL(1); + } + + n = php_mb_stripos(0, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, haystack.encoding); + if (!mbfl_is_error(n)) { + if (n == 0) { + RETURN_BOOL(1); + } else { + RETURN_BOOL(0); + } + } else { + RETVAL_FALSE; + } +} +/* }}} */ + /* {{{ proto string mb_strstr(string haystack, string needle[, bool part[, string encoding]]) Finds first occurrence of a string within another */ PHP_FUNCTION(mb_strstr) diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 1410e728c2681..22588c178ebad 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -85,6 +85,7 @@ PHP_FUNCTION(mb_strrpos); PHP_FUNCTION(mb_stripos); PHP_FUNCTION(mb_strripos); PHP_FUNCTION(mb_str_begins); +PHP_FUNCTION(mb_str_ibegins); PHP_FUNCTION(mb_strstr); PHP_FUNCTION(mb_strrchr); PHP_FUNCTION(mb_stristr); From 7c42c2a22033cc01ad34c8241580941888462305 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 06:38:03 -0500 Subject: [PATCH 066/107] Fixed call to PHP mb_stripos API --- ext/mbstring/mbstring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index da1d85b340490..6c35d74a01443 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2651,7 +2651,7 @@ PHP_FUNCTION(mb_str_ibegins) RETURN_BOOL(1); } - n = php_mb_stripos(0, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, haystack.encoding); + n = php_mb_stripos(0, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, enc_name); if (!mbfl_is_error(n)) { if (n == 0) { RETURN_BOOL(1); From 923433b766b073f4570a88673d7f6c09f8b3e6ca Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 17:53:37 -0500 Subject: [PATCH 067/107] Added mb_str_ends --- ext/mbstring/mbstring.c | 48 +++++++++++++++++++++++++++++++++++++++++ ext/mbstring/mbstring.h | 1 + 2 files changed, 49 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 6c35d74a01443..fd325e62e2405 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2664,6 +2664,54 @@ PHP_FUNCTION(mb_str_ibegins) } /* }}} */ +/* {{{ proto boolean mb_str_ends(string haystack, string needle [, string encoding]) + Checks if haystack ends with needle */ +PHP_FUNCTION(mb_str_ends) +{ + mbfl_string haystack, needle; + zend_string *enc_name = NULL; + size_t n; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { + return; + } + + haystack.no_language = needle.no_language = MBSTRG(language); + haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name); + if (!haystack.encoding) { + RETURN_FALSE; + } + + if (needle.len == 0) { + RETURN_BOOL(1); + } + + n = mbfl_strpos(&haystack, &needle, 0, 1); + if (!mbfl_is_error(n)) { + if (n == (haystack.length - needle.length)) { + RETURN_BOOL(1); + } else { + RETURN_BOOL(0); + } + } else { + switch (-n) { + case 1: + break; + case 4: + php_error_docref(NULL, E_WARNING, "Unknown encoding or conversion error"); + break; + case 8: + php_error_docref(NULL, E_NOTICE, "Argument is empty"); + break; + default: + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); + break; + } + RETURN_BOOL(0); + } +} +/* }}} */ + /* {{{ proto string mb_strstr(string haystack, string needle[, bool part[, string encoding]]) Finds first occurrence of a string within another */ PHP_FUNCTION(mb_strstr) diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 22588c178ebad..95dbe20392594 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -86,6 +86,7 @@ PHP_FUNCTION(mb_stripos); PHP_FUNCTION(mb_strripos); PHP_FUNCTION(mb_str_begins); PHP_FUNCTION(mb_str_ibegins); +PHP_FUNCTION(mb_str_ends); PHP_FUNCTION(mb_strstr); PHP_FUNCTION(mb_strrchr); PHP_FUNCTION(mb_stristr); From 6c48448581ad425e292986562ab7e975bc66f487 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 18:00:20 -0500 Subject: [PATCH 068/107] Fixed call to member of mbfl_string struct --- ext/mbstring/mbstring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index fd325e62e2405..c4e4669fb8190 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2688,7 +2688,7 @@ PHP_FUNCTION(mb_str_ends) n = mbfl_strpos(&haystack, &needle, 0, 1); if (!mbfl_is_error(n)) { - if (n == (haystack.length - needle.length)) { + if (n == (haystack.len - needle.len)) { RETURN_BOOL(1); } else { RETURN_BOOL(0); From 7af64f28467b23069a9638296a9e93d00683d921 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 21:14:18 -0500 Subject: [PATCH 069/107] Added mb_str_iends --- ext/mbstring/mbstring.c | 36 ++++++++++++++++++++++++++++++++++++ ext/mbstring/mbstring.h | 1 + 2 files changed, 37 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index c4e4669fb8190..d1c6bdbb7b7ca 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2712,6 +2712,42 @@ PHP_FUNCTION(mb_str_ends) } /* }}} */ +/* {{{ proto boolean mb_str_iends(string haystack, string needle. [, string encoding]) + Checks if haystack ends with needle, case insensitive */ +PHP_FUNCTION(mb_str_iends) +{ + mbfl_string haystack, needle; + zend_string *enc_name = NULL; + size_t n; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|S", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name) == FAILURE) { + return; + } + + haystack.no_language = needle.no_language = MBSTRG(language); + haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name); + if (!haystack.encoding) { + RETURN_FALSE; + } + + if (needle.len == 0) { + RETURN_BOOL(1); + } + + n = php_mb_stripos(1, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, enc_name); + if (!mbfl_is_error(n)) { + if (n == (haystack.len - needle.len)) { + RETURN_BOOL(1); + } else { + RETURN_BOOL(0); + } + } else { + RETVAL_FALSE; + } +} +/* }}} */ + + /* {{{ proto string mb_strstr(string haystack, string needle[, bool part[, string encoding]]) Finds first occurrence of a string within another */ PHP_FUNCTION(mb_strstr) diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 95dbe20392594..2ede3b4d48d1e 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -87,6 +87,7 @@ PHP_FUNCTION(mb_strripos); PHP_FUNCTION(mb_str_begins); PHP_FUNCTION(mb_str_ibegins); PHP_FUNCTION(mb_str_ends); +PHP_FUNCTION(mb_str_iends); PHP_FUNCTION(mb_strstr); PHP_FUNCTION(mb_strrchr); PHP_FUNCTION(mb_stristr); From eb14215b230aab6a799c8e5763251df450726727 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 22:30:01 -0500 Subject: [PATCH 070/107] Added test for mb_str_begins --- ext/mbstring/tests/mb_str_begins.phpt | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 ext/mbstring/tests/mb_str_begins.phpt diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt new file mode 100644 index 0000000000000..3dd62e41bf76f --- /dev/null +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -0,0 +1,55 @@ +--TEST-- +mb_str_begins() +--SKIPIF-- + +--FILE-- + +==DONE== +--EXPECTF-- +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) From a80ccf1177de55b1ca1339d850cd320cc9a4fc2c Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 23:03:21 -0500 Subject: [PATCH 071/107] Added string to list of functions for mbstring --- ext/mbstring/mbstring.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index d1c6bdbb7b7ca..807a44cbf893f 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -530,6 +530,10 @@ static const zend_function_entry mbstring_functions[] = { PHP_FE(mb_strrpos, arginfo_mb_strrpos) PHP_FE(mb_stripos, arginfo_mb_stripos) PHP_FE(mb_strripos, arginfo_mb_strripos) + PHP_FE(mb_str_begins, arginfo_mb_str_begins) + PHP_FE(mb_str_ibegins, arginfo_mb_str_ibegins) + PHP_FE(mb_str_ends, arginfo_mb_str_ends) + PHP_FE(mb_str_iends, arginfo_mb_str_iends) PHP_FE(mb_strstr, arginfo_mb_strstr) PHP_FE(mb_strrchr, arginfo_mb_strrchr) PHP_FE(mb_stristr, arginfo_mb_stristr) From 39076dd6ea8ed4531145b7ede61c012ed763f3f3 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 23:13:32 -0500 Subject: [PATCH 072/107] Added Zend Arg info --- ext/mbstring/mbstring.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 807a44cbf893f..814b4eabd5437 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -260,6 +260,30 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strripos, 0, 0, 2) ZEND_ARG_INFO(0, encoding) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_begins, 0, 0, 2) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) + ZEND_ARG_INFO(0, encoding) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_ibegins, 0, 0, 2) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) + ZEND_ARG_INFO(0, encoding) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_ends, 0, 0, 2) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) + ZEND_ARG_INFO(0, encoding) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_iends, 0, 0, 2) + ZEND_ARG_INFO(0, haystack) + ZEND_ARG_INFO(0, needle) + ZEND_ARG_INFO(0, encoding) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strstr, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) From 7110d90b398414307512b6abbc4dc08d787a7e90 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 3 Jun 2019 23:32:46 -0500 Subject: [PATCH 073/107] Fixed typo in test case --- ext/mbstring/tests/mb_str_begins.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index 3dd62e41bf76f..848690299e02f 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -37,7 +37,7 @@ $needle1 = base64_decode('5pel5pys6Kqe'); var_dump(mb_str_begins($string_mb, $needle1)); $needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM"); -var_dump(mb_str_begin($string_mb, $needle2)); +var_dump(mb_str_begins($string_mb, $needle2)); ?> From 308f0b6548c1a3946c4e1e2bdd2d7aee7ed984e4 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 4 Jun 2019 07:02:01 -0500 Subject: [PATCH 074/107] Change needle in tesT --- ext/mbstring/tests/mb_str_begins.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index 848690299e02f..73ab4bfa31033 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -13,7 +13,7 @@ $euc_jp = '0123この文字列は日本語です。EUC-JPを使っています // EUC-JP - With encoding parameter mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_begins($euc_jp, '0123', 'EUC-JP')); +var_dump(mb_str_begins($euc_jp, '0123こ', EUC-JP')); var_dump(mb_str_begins($euc_jp, '韓国語', 'EUC-JP')); // EUC-JP - No encoding parameter From d85e113bf13ca60a214786c93773cb8297767eb7 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 4 Jun 2019 09:53:09 -0500 Subject: [PATCH 075/107] Fixed syntax error --- ext/mbstring/tests/mb_str_begins.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index 73ab4bfa31033..d9508eda45542 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -13,7 +13,7 @@ $euc_jp = '0123この文字列は日本語です。EUC-JPを使っています // EUC-JP - With encoding parameter mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_begins($euc_jp, '0123こ', EUC-JP')); +var_dump(mb_str_begins($euc_jp, '0123こ', 'EUC-JP')); var_dump(mb_str_begins($euc_jp, '韓国語', 'EUC-JP')); // EUC-JP - No encoding parameter From cdb74bc95eafad9c67cbce8b2a30b69c754d47f5 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 4 Jun 2019 11:22:01 -0500 Subject: [PATCH 076/107] Removed incorrect text in mb_str_begins test --- ext/mbstring/tests/mb_str_begins.phpt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index d9508eda45542..0b11693be6c78 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -41,8 +41,7 @@ var_dump(mb_str_begins($string_mb, $needle2)); ?> -==DONE== ---EXPECTF-- +--EXPECT-- bool(true) bool(false) bool(true) From 4ed887e97104a28402ee12f2bbb87b72c3e1a983 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 4 Jun 2019 13:12:57 -0500 Subject: [PATCH 077/107] Added more tests for mb_str_i?(begins|ends) --- ext/mbstring/tests/mb_str_begins.phpt | 3 +- ext/mbstring/tests/mb_str_ends.phpt | 55 ++++++++++++++++++++++++++ ext/mbstring/tests/mb_str_ibegins.phpt | 53 +++++++++++++++++++++++++ ext/mbstring/tests/mb_str_iends.phpt | 53 +++++++++++++++++++++++++ 4 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 ext/mbstring/tests/mb_str_ends.phpt create mode 100644 ext/mbstring/tests/mb_str_ibegins.phpt create mode 100644 ext/mbstring/tests/mb_str_iends.phpt diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index 0b11693be6c78..f09266c0f99e5 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -4,7 +4,6 @@ mb_str_begins() --FILE-- +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) diff --git a/ext/mbstring/tests/mb_str_ibegins.phpt b/ext/mbstring/tests/mb_str_ibegins.phpt new file mode 100644 index 0000000000000..ae5baca893b28 --- /dev/null +++ b/ext/mbstring/tests/mb_str_ibegins.phpt @@ -0,0 +1,53 @@ +--TEST-- +mb_str_ibegins() +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) diff --git a/ext/mbstring/tests/mb_str_iends.phpt b/ext/mbstring/tests/mb_str_iends.phpt new file mode 100644 index 0000000000000..d5b38fec44bc0 --- /dev/null +++ b/ext/mbstring/tests/mb_str_iends.phpt @@ -0,0 +1,53 @@ +--TEST-- +mb_str_iends() +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) From bd3485c6bf8de121cfefd13a9cc811d5c6ebb244 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Tue, 4 Jun 2019 22:56:40 -0500 Subject: [PATCH 078/107] Changed approach for str_ends --- ext/mbstring/mbstring.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 814b4eabd5437..dfed0be48e933 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2714,13 +2714,9 @@ PHP_FUNCTION(mb_str_ends) RETURN_BOOL(1); } - n = mbfl_strpos(&haystack, &needle, 0, 1); + n = mbfl_strpos(&haystack, &needle, haystack.len-needle.len, 0); if (!mbfl_is_error(n)) { - if (n == (haystack.len - needle.len)) { - RETURN_BOOL(1); - } else { - RETURN_BOOL(0); - } + RETURN_BOOL(1); } else { switch (-n) { case 1: From 1cc0c31055ba068b68ebefba71d38699ed7a4db6 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 11:26:25 -0500 Subject: [PATCH 079/107] Output the error code when an unknown error occurs in mb_strpos --- ext/mbstring/mbstring.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index dfed0be48e933..a83bf36a56d98 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -11,7 +11,7 @@ | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ + +-------------------------------------------------------------- --------+ | Author: Tsukada Takuya | | Rui Hirokawa | | Hironori Sato | @@ -2649,7 +2649,7 @@ PHP_FUNCTION(mb_str_begins) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n"); break; } RETURN_BOOL(0); @@ -2728,7 +2728,7 @@ PHP_FUNCTION(mb_str_ends) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n); break; } RETURN_BOOL(0); From 1322540a66b9cf8a5ba7fb5b73eb4adb1e774f14 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 11:27:22 -0500 Subject: [PATCH 080/107] Fixed finger typo --- ext/mbstring/mbstring.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index a83bf36a56d98..c147fa32c7020 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -11,7 +11,7 @@ | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | - +-------------------------------------------------------------- --------+ + +----------------------------------------------------------------------+ | Author: Tsukada Takuya | | Rui Hirokawa | | Hironori Sato | @@ -2649,7 +2649,7 @@ PHP_FUNCTION(mb_str_begins) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n"); + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n); break; } RETURN_BOOL(0); From 6cdcb23c3af89135842be42fef5b77cbfe6a9504 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 11:34:41 -0500 Subject: [PATCH 081/107] Corrected string output, remembered this is C and not PHP --- ext/mbstring/mbstring.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index c147fa32c7020..b1fb2fcbf79d2 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2649,7 +2649,9 @@ PHP_FUNCTION(mb_str_begins) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n); + char buffer[42]; + sprintf(buffer, "Unknown error in mb_strpos. Error code: %s", n); + php_error_docref(NULL, E_WARNING, buffer); break; } RETURN_BOOL(0); @@ -2728,7 +2730,9 @@ PHP_FUNCTION(mb_str_ends) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos. Error code: ".$n); + char buffer[42]; + sprintf(buffer, "Unknown error in mb_strpos. Error code: %s", n); + php_error_docref(NULL, E_WARNING, buffer); break; } RETURN_BOOL(0); From 315a2010fcd48b1ff667e2af984995f6436d2112 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 11:45:18 -0500 Subject: [PATCH 082/107] Fixed format string --- ext/mbstring/mbstring.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index b1fb2fcbf79d2..68bb8735dafe5 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2650,7 +2650,7 @@ PHP_FUNCTION(mb_str_begins) break; default: char buffer[42]; - sprintf(buffer, "Unknown error in mb_strpos. Error code: %s", n); + sprintf(buffer, "Unknown error in mb_strpos. Error code: %d", n); php_error_docref(NULL, E_WARNING, buffer); break; } @@ -2731,7 +2731,7 @@ PHP_FUNCTION(mb_str_ends) break; default: char buffer[42]; - sprintf(buffer, "Unknown error in mb_strpos. Error code: %s", n); + sprintf(buffer, "Unknown error in mb_strpos. Error code: %d", n); php_error_docref(NULL, E_WARNING, buffer); break; } From 4bb52bcab67e35f2c059c92373d3c526d038b564 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 12:40:57 -0500 Subject: [PATCH 083/107] Update mbstring.c --- ext/mbstring/mbstring.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 68bb8735dafe5..67b6d1311e9bc 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2650,7 +2650,7 @@ PHP_FUNCTION(mb_str_begins) break; default: char buffer[42]; - sprintf(buffer, "Unknown error in mb_strpos. Error code: %d", n); + sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); php_error_docref(NULL, E_WARNING, buffer); break; } @@ -2731,7 +2731,7 @@ PHP_FUNCTION(mb_str_ends) break; default: char buffer[42]; - sprintf(buffer, "Unknown error in mb_strpos. Error code: %d", n); + sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); php_error_docref(NULL, E_WARNING, buffer); break; } From 101f29bc205010368f6918536eeb71d43badc254 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 13:35:58 -0500 Subject: [PATCH 084/107] Update mbstring.c --- ext/mbstring/mbstring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 67b6d1311e9bc..0a981b728d025 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2639,6 +2639,7 @@ PHP_FUNCTION(mb_str_begins) RETURN_BOOL(0); } } else { + char buffer[42]; switch (-n) { case 1: break; @@ -2649,7 +2650,6 @@ PHP_FUNCTION(mb_str_begins) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - char buffer[42]; sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); php_error_docref(NULL, E_WARNING, buffer); break; From 7ecc8552b4e8dc685a62be2f2e8f4fcf81c27ffe Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 13:46:04 -0500 Subject: [PATCH 085/107] Update mbstring.c --- ext/mbstring/mbstring.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 0a981b728d025..af563a5a504e7 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2720,6 +2720,7 @@ PHP_FUNCTION(mb_str_ends) if (!mbfl_is_error(n)) { RETURN_BOOL(1); } else { + char buffer[42]; switch (-n) { case 1: break; @@ -2730,7 +2731,7 @@ PHP_FUNCTION(mb_str_ends) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - char buffer[42]; + sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); php_error_docref(NULL, E_WARNING, buffer); break; From a44574a69597cc04f28d43d555c23dc28cf7a160 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Fri, 7 Jun 2019 15:11:29 -0500 Subject: [PATCH 086/107] Update mbstring.c --- ext/mbstring/mbstring.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index af563a5a504e7..dfed0be48e933 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2639,7 +2639,6 @@ PHP_FUNCTION(mb_str_begins) RETURN_BOOL(0); } } else { - char buffer[42]; switch (-n) { case 1: break; @@ -2650,8 +2649,7 @@ PHP_FUNCTION(mb_str_begins) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); - php_error_docref(NULL, E_WARNING, buffer); + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); break; } RETURN_BOOL(0); @@ -2720,7 +2718,6 @@ PHP_FUNCTION(mb_str_ends) if (!mbfl_is_error(n)) { RETURN_BOOL(1); } else { - char buffer[42]; switch (-n) { case 1: break; @@ -2731,9 +2728,7 @@ PHP_FUNCTION(mb_str_ends) php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; default: - - sprintf(buffer, "Unknown error in mb_strpos. Error code: %zu", n); - php_error_docref(NULL, E_WARNING, buffer); + php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); break; } RETURN_BOOL(0); From 6ce0ac1817c3a9d643e01d1f375038384100966e Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 10 Jun 2019 13:35:33 -0500 Subject: [PATCH 087/107] Update mbstring.c --- ext/mbstring/mbstring.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index dfed0be48e933..ad961137c0f8b 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2727,6 +2727,9 @@ PHP_FUNCTION(mb_str_ends) case 8: php_error_docref(NULL, E_NOTICE, "Argument is empty"); break; + case 16: + php_error_docref(NULL, E_WARNING, "Unknown needle, haystack error"); + break; default: php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos"); break; From df0e11c3d0ac72ead7f1901a4c49d3ffb1728848 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 10 Jun 2019 14:20:40 -0500 Subject: [PATCH 088/107] Update mbstring.c --- ext/mbstring/mbstring.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index ad961137c0f8b..7042f1e7ff0a8 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2713,6 +2713,10 @@ PHP_FUNCTION(mb_str_ends) if (needle.len == 0) { RETURN_BOOL(1); } + + if (needle.len > haystack.len) { + RETURN_BOOL(0); + } n = mbfl_strpos(&haystack, &needle, haystack.len-needle.len, 0); if (!mbfl_is_error(n)) { From 1a9def4dc8b6c86d412d21322b54fa89aa4e038f Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 17 Jun 2019 18:14:16 -0500 Subject: [PATCH 089/107] Update mbstring.c --- ext/mbstring/mbstring.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 7042f1e7ff0a8..91950478b157d 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2718,9 +2718,18 @@ PHP_FUNCTION(mb_str_ends) RETURN_BOOL(0); } - n = mbfl_strpos(&haystack, &needle, haystack.len-needle.len, 0); - if (!mbfl_is_error(n)) { + mbfl_string haystack_tail; + haystack_tail.encoding = haystack.encoding; + haystack_tail.no_language = haystack.no_language; + unsigned char* haystack_tail_val = haystack.val + sizeof(char) * (haystack.len - needle.len); + haystack_tail.val = haystack_tail_val; + haystack_tail.len = needle.len; + + n = mbfl_strpos(&haystack_tail, &needle, 0, 0); + if (!mbfl_is_error(n) && n == 0) { RETURN_BOOL(1); + } else if (!mbfl_is_error(n)) { + RETURN_BOOL(0); } else { switch (-n) { case 1: From cb34fe0371d7d9d1717915bffde462b6f7ed0f87 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 17 Jun 2019 18:14:45 -0500 Subject: [PATCH 090/107] Update mb_str_ends.phpt --- ext/mbstring/tests/mb_str_ends.phpt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/tests/mb_str_ends.phpt b/ext/mbstring/tests/mb_str_ends.phpt index e3be9660b06ff..3d5b5eb916078 100644 --- a/ext/mbstring/tests/mb_str_ends.phpt +++ b/ext/mbstring/tests/mb_str_ends.phpt @@ -24,7 +24,7 @@ var_dump(mb_str_ends($euc_jp, '韓国語')); mb_internal_encoding('UTF-8'); $string_ascii = 'abc def'; -//Japanese string in UTF-8 +// Japanese string in UTF-8 $string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); var_dump(mb_str_ends($string_ascii, 'f', 'ISO-8859-1')); @@ -33,7 +33,7 @@ var_dump(mb_str_ends($string_ascii, 'e', 'ISO-8859-1')); var_dump(mb_str_ends($string_ascii, 'def')); var_dump(mb_str_ends($string_ascii, 'de')); -$needle1 = base64_decode('JnjgII='); +$needle1 = base64_decode('77yZ44CC'); var_dump(mb_str_ends($string_mb, $needle1)); $needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM"); From 857ca2a26d4d737deb92304cc78f6b4e42c40d26 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 17 Jun 2019 21:59:11 -0500 Subject: [PATCH 091/107] Corrected mb_str_iends test --- ext/mbstring/tests/mb_str_iends.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/tests/mb_str_iends.phpt b/ext/mbstring/tests/mb_str_iends.phpt index d5b38fec44bc0..a09e1b22a12a8 100644 --- a/ext/mbstring/tests/mb_str_iends.phpt +++ b/ext/mbstring/tests/mb_str_iends.phpt @@ -32,7 +32,7 @@ var_dump(mb_str_iends($string_ascii, 'e', 'ISO-8859-1')); var_dump(mb_str_iends($string_ascii, 'DeF')); var_dump(mb_str_iends($string_ascii, 'de')); -$needle1 = base64_decode('JnjgII='); +$needle1 = base64_decode('77yZ44CC'); var_dump(mb_str_iends($string_mb, $needle1)); $needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM"); From 7a9151609617fa4d4ba34405cbccc7840604f311 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Mon, 17 Jun 2019 21:59:39 -0500 Subject: [PATCH 092/107] Updated mb_str_iends --- ext/mbstring/mbstring.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 91950478b157d..640f0af265792 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2774,9 +2774,16 @@ PHP_FUNCTION(mb_str_iends) RETURN_BOOL(1); } - n = php_mb_stripos(1, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, enc_name); + mbfl_string haystack_tail; + haystack_tail.encoding = haystack.encoding; + haystack_tail.no_language = haystack.no_language; + unsigned char* haystack_tail_val = haystack.val + sizeof(char) * (haystack.len - needle.len); + haystack_tail.val = haystack_tail_val; + haystack_tail.len = needle.len; + + n = php_mb_stripos(0, (char *)haystack_tail.val, haystack_tail.len, (char *)needle.val, needle.len, 0, enc_name); if (!mbfl_is_error(n)) { - if (n == (haystack.len - needle.len)) { + if (n == 0) { RETURN_BOOL(1); } else { RETURN_BOOL(0); From ccbba775dd68ba155cb1d5a794d20f003be67881 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 20 Jun 2019 07:28:00 -0500 Subject: [PATCH 093/107] Added explicit checks for when needle is longer than haystack --- ext/standard/string.c | 16 ++++++++++++++++ ext/standard/tests/strings/str_ends.phpt | 2 ++ ext/standard/tests/strings/str_iends.phpt | 2 ++ 3 files changed, 20 insertions(+) diff --git a/ext/standard/string.c b/ext/standard/string.c index 682a7bacafb19..b6e9ae96a3538 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2312,6 +2312,10 @@ PHP_FUNCTION(str_begins) { Z_PARAM_STR(needle) ZEND_PARSE_PARAMETERS_END(); + if (needle->len > haystack->len) { + RETURN_BOOL(0); + } + for (i = 0; i < needle->len; i++) if (haystack->val[i] != needle->val[i]) RETURN_BOOL(0); @@ -2329,6 +2333,10 @@ PHP_FUNCTION(str_ibegins) { Z_PARAM_STR(needle) ZEND_PARSE_PARAMETERS_END(); + if (needle->len > haystack->len) { + RETURN_BOOL(0); + } + for (i = 0; i < needle->len; i++) if (tolower(haystack->val[i]) != tolower(needle->val[i])) RETURN_BOOL(0); @@ -2345,6 +2353,10 @@ PHP_FUNCTION(str_ends) { Z_PARAM_STR(haystack) Z_PARAM_STR(needle) ZEND_PARSE_PARAMETERS_END(); + + if (needle->len > haystack->len) { + RETURN_BOOL(0); + } for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (haystack->val[i] != needle->val[j]) @@ -2363,6 +2375,10 @@ PHP_FUNCTION(str_iends) { Z_PARAM_STR(needle) ZEND_PARSE_PARAMETERS_END(); + if (needle->len > haystack->len) { + RETURN_BOOL(0); + } + for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (tolower(haystack->val[i]) != tolower(needle->val[j])) RETURN_BOOL(0); diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_ends.phpt index a57992082fa47..82988d1299609 100644 --- a/ext/standard/tests/strings/str_ends.phpt +++ b/ext/standard/tests/strings/str_ends.phpt @@ -9,8 +9,10 @@ $testStr = "beginningMiddleEnd"; var_dump(str_ends($testStr, "End")); var_dump(str_ends($testStr, "end")); var_dump(str_ends($testStr, "en")); +var_dump(str_ends($testStr, $testStr."a")); ?> --EXPECT-- bool(true) bool(false) bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_iends.phpt b/ext/standard/tests/strings/str_iends.phpt index a1295cd210230..d82aeff979c80 100644 --- a/ext/standard/tests/strings/str_iends.phpt +++ b/ext/standard/tests/strings/str_iends.phpt @@ -9,8 +9,10 @@ $testStr = "beginningMiddleEnd"; var_dump(str_iends($testStr, "End")); var_dump(str_iends($testStr, "end")); var_dump(str_iends($testStr, "en")); +var_dump(str_iends($testStr, $testStr."a")); ?> --EXPECT-- bool(true) bool(true) bool(false) +bool(false) From af61e1427f1966e28a87ad2148928c1ba8a91d90 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 20 Jun 2019 09:07:27 -0500 Subject: [PATCH 094/107] Fixed indentation --- ext/standard/string.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index b6e9ae96a3538..d598f79ff69e6 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2316,10 +2316,10 @@ PHP_FUNCTION(str_begins) { RETURN_BOOL(0); } - for (i = 0; i < needle->len; i++) - if (haystack->val[i] != needle->val[i]) - RETURN_BOOL(0); - RETURN_BOOL(1); + for (i = 0; i < needle->len; i++) + if (haystack->val[i] != needle->val[i]) + RETURN_BOOL(0); + RETURN_BOOL(1); } /* {{{ proto boolean str_ibegins(string haystack, string needle) @@ -2337,10 +2337,10 @@ PHP_FUNCTION(str_ibegins) { RETURN_BOOL(0); } - for (i = 0; i < needle->len; i++) - if (tolower(haystack->val[i]) != tolower(needle->val[i])) - RETURN_BOOL(0); - RETURN_BOOL(1); + for (i = 0; i < needle->len; i++) + if (tolower(haystack->val[i]) != tolower(needle->val[i])) + RETURN_BOOL(0); + RETURN_BOOL(1); } /* {{{ proto boolean str_ends(string haystack, string needle) @@ -2358,10 +2358,10 @@ PHP_FUNCTION(str_ends) { RETURN_BOOL(0); } - for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) - if (haystack->val[i] != needle->val[j]) - RETURN_BOOL(0); - RETURN_BOOL(1); + for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) + if (haystack->val[i] != needle->val[j]) + RETURN_BOOL(0); + RETURN_BOOL(1); } /* {{{ proto boolean str_iends(string haystack, string needle) @@ -2379,9 +2379,9 @@ PHP_FUNCTION(str_iends) { RETURN_BOOL(0); } - for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) - if (tolower(haystack->val[i]) != tolower(needle->val[j])) - RETURN_BOOL(0); + for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) + if (tolower(haystack->val[i]) != tolower(needle->val[j])) + RETURN_BOOL(0); RETURN_BOOL(1); } From a685de6fe03bb0a4e5bb040b7024796f18a99972 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 20 Jun 2019 09:09:27 -0500 Subject: [PATCH 095/107] Fixed indentation --- ext/standard/string.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index d598f79ff69e6..bc946f47ae36d 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2304,8 +2304,8 @@ PHP_FUNCTION(substr) /* {{{ proto boolean str_begins(string haystack, string needle) Checks if haystack begins with needle */ PHP_FUNCTION(str_begins) { - zend_string *haystack, *needle; - int i; + zend_string *haystack, *needle; + int i; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) @@ -2319,14 +2319,14 @@ PHP_FUNCTION(str_begins) { for (i = 0; i < needle->len; i++) if (haystack->val[i] != needle->val[i]) RETURN_BOOL(0); - RETURN_BOOL(1); + RETURN_BOOL(1); } /* {{{ proto boolean str_ibegins(string haystack, string needle) Performs case insensitive check to determine if haystack begins with needle */ PHP_FUNCTION(str_ibegins) { - zend_string *haystack, *needle; - int i; + zend_string *haystack, *needle; + int i; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) @@ -2346,8 +2346,8 @@ PHP_FUNCTION(str_ibegins) { /* {{{ proto boolean str_ends(string haystack, string needle) Checks if haystack ends with needle */ PHP_FUNCTION(str_ends) { - zend_string *haystack, *needle; - int i, j; + zend_string *haystack, *needle; + int i, j; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) @@ -2367,8 +2367,8 @@ PHP_FUNCTION(str_ends) { /* {{{ proto boolean str_iends(string haystack, string needle) Performs case insensitive check to determine if haystack ends with needle */ PHP_FUNCTION(str_iends) { - zend_string *haystack, *needle; - int i, j; + zend_string *haystack, *needle; + int i, j; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) From 10205e8bf72519f933a0b7792e1e57fd1a2f9a72 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 20 Jun 2019 09:12:12 -0500 Subject: [PATCH 096/107] Fixed indentation --- ext/standard/string.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index bc946f47ae36d..745035fd9fab8 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2382,7 +2382,7 @@ PHP_FUNCTION(str_iends) { for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (tolower(haystack->val[i]) != tolower(needle->val[j])) RETURN_BOOL(0); - RETURN_BOOL(1); + RETURN_BOOL(1); } /* {{{ proto string|array|false substr_replace(mixed str, mixed repl, mixed start [, mixed length]) From c3c6e2d811ba819fbb7e756b8f4f6b18ab34f21b Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 3 Jul 2019 07:09:17 -0500 Subject: [PATCH 097/107] Renamed functions --- ext/standard/basic_functions.c | 16 ++++++++-------- ext/standard/php_string.h | 8 ++++---- ext/standard/string.c | 16 ++++++++-------- ext/standard/tests/strings/str_begins.phpt | 12 ++++++------ ext/standard/tests/strings/str_ends.phpt | 12 ++++++------ ext/standard/tests/strings/str_ibegins.phpt | 12 ++++++------ ext/standard/tests/strings/str_iends.phpt | 12 ++++++------ 7 files changed, 44 insertions(+), 44 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index c4c866cc9e16b..01b7a0a7fb107 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2236,22 +2236,22 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2) ZEND_ARG_INFO(0, part) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins_with, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ibegins, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins_with_ci, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends_with, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_iends, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_ends_with_ci, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() @@ -2795,10 +2795,10 @@ static const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(strtoupper, arginfo_strtoupper) PHP_FE(strtolower, arginfo_strtolower) PHP_FE(strpos, arginfo_strpos) - PHP_FE(str_begins, arginfo_str_begins) - PHP_FE(str_ibegins, arginfo_str_ibegins) - PHP_FE(str_ends, arginfo_str_ends) - PHP_FE(str_iends, arginfo_str_iends) + PHP_FE(str_begins_with, arginfo_str_begins) + PHP_FE(str_begins_with_ci, arginfo_str_begins_with_ci) + PHP_FE(str_ends_with, arginfo_str_ends_with) + PHP_FE(str_ends_with_ci, arginfo_str_ends_with_ci) PHP_FE(stripos, arginfo_stripos) PHP_FE(strrpos, arginfo_strrpos) PHP_FE(strripos, arginfo_strripos) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 9783be2bdc189..478ed4be55228 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -41,10 +41,10 @@ PHP_FUNCTION(basename); PHP_FUNCTION(dirname); PHP_FUNCTION(pathinfo); PHP_FUNCTION(strstr); -PHP_FUNCTION(str_begins); -PHP_FUNCTION(str_ibegins); -PHP_FUNCTION(str_ends); -PHP_FUNCTION(str_iends); +PHP_FUNCTION(str_begins_with); +PHP_FUNCTION(str_begins_with_ci); +PHP_FUNCTION(str_ends_with); +PHP_FUNCTION(str_ends_with_ci); PHP_FUNCTION(strpos); PHP_FUNCTION(stripos); PHP_FUNCTION(strrpos); diff --git a/ext/standard/string.c b/ext/standard/string.c index 745035fd9fab8..b48866fdccaf4 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2301,9 +2301,9 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begins(string haystack, string needle) +/* {{{ proto boolean str_begins_with(string haystack, string needle) Checks if haystack begins with needle */ -PHP_FUNCTION(str_begins) { +PHP_FUNCTION(str_begins_with) { zend_string *haystack, *needle; int i; @@ -2322,9 +2322,9 @@ PHP_FUNCTION(str_begins) { RETURN_BOOL(1); } -/* {{{ proto boolean str_ibegins(string haystack, string needle) +/* {{{ proto boolean str_begins_with_ci(string haystack, string needle) Performs case insensitive check to determine if haystack begins with needle */ -PHP_FUNCTION(str_ibegins) { +PHP_FUNCTION(str_begins_with_ci) { zend_string *haystack, *needle; int i; @@ -2343,9 +2343,9 @@ PHP_FUNCTION(str_ibegins) { RETURN_BOOL(1); } -/* {{{ proto boolean str_ends(string haystack, string needle) +/* {{{ proto boolean str_ends_with(string haystack, string needle) Checks if haystack ends with needle */ -PHP_FUNCTION(str_ends) { +PHP_FUNCTION(str_ends_with) { zend_string *haystack, *needle; int i, j; @@ -2364,9 +2364,9 @@ PHP_FUNCTION(str_ends) { RETURN_BOOL(1); } -/* {{{ proto boolean str_iends(string haystack, string needle) +/* {{{ proto boolean str_ends_with_ci(string haystack, string needle) Performs case insensitive check to determine if haystack ends with needle */ -PHP_FUNCTION(str_iends) { +PHP_FUNCTION(str_ends_with_ci) { zend_string *haystack, *needle; int i, j; diff --git a/ext/standard/tests/strings/str_begins.phpt b/ext/standard/tests/strings/str_begins.phpt index ac235fc85fab5..10ffc959a2cc6 100644 --- a/ext/standard/tests/strings/str_begins.phpt +++ b/ext/standard/tests/strings/str_begins.phpt @@ -1,15 +1,15 @@ --TEST-- -str_begins() function - unit tests for str_begins() +str_begins_with() function - unit tests for str_begins_with() --FILE-- --EXPECT-- bool(true) diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_ends.phpt index 82988d1299609..0064e9f432d83 100644 --- a/ext/standard/tests/strings/str_ends.phpt +++ b/ext/standard/tests/strings/str_ends.phpt @@ -1,15 +1,15 @@ --TEST-- -str_ends() function - unit tests for str_ends() +str_ends_with() function - unit tests for str_ends_with() --FILE-- --EXPECT-- bool(true) diff --git a/ext/standard/tests/strings/str_ibegins.phpt b/ext/standard/tests/strings/str_ibegins.phpt index 9f218cd3e7e27..4737b926409f4 100644 --- a/ext/standard/tests/strings/str_ibegins.phpt +++ b/ext/standard/tests/strings/str_ibegins.phpt @@ -1,15 +1,15 @@ --TEST-- -str_ibegins() function - unit tests for str_ibegins() +str_begins_with_ci() function - unit tests for str_begins_with_ci() --FILE-- --EXPECT-- bool(true) diff --git a/ext/standard/tests/strings/str_iends.phpt b/ext/standard/tests/strings/str_iends.phpt index d82aeff979c80..3d646e190c64e 100644 --- a/ext/standard/tests/strings/str_iends.phpt +++ b/ext/standard/tests/strings/str_iends.phpt @@ -1,15 +1,15 @@ --TEST-- -str_iends() function - unit tests for str_iends() +str_ends_with_ci() function - unit tests for str_ends_with_ci() --FILE-- --EXPECT-- bool(true) From 07f690aa7aa83ca3a9135b171257ada6787b5bd6 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 3 Jul 2019 07:10:26 -0500 Subject: [PATCH 098/107] Renamed test files --- .../tests/strings/{str_begins.phpt => str_begins_with.phpt} | 0 .../tests/strings/{str_ibegins.phpt => str_begins_with_ci.phpt} | 0 ext/standard/tests/strings/{str_ends.phpt => str_ends_with.phpt} | 0 .../tests/strings/{str_iends.phpt => str_ends_with_ci.phpt} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename ext/standard/tests/strings/{str_begins.phpt => str_begins_with.phpt} (100%) rename ext/standard/tests/strings/{str_ibegins.phpt => str_begins_with_ci.phpt} (100%) rename ext/standard/tests/strings/{str_ends.phpt => str_ends_with.phpt} (100%) rename ext/standard/tests/strings/{str_iends.phpt => str_ends_with_ci.phpt} (100%) diff --git a/ext/standard/tests/strings/str_begins.phpt b/ext/standard/tests/strings/str_begins_with.phpt similarity index 100% rename from ext/standard/tests/strings/str_begins.phpt rename to ext/standard/tests/strings/str_begins_with.phpt diff --git a/ext/standard/tests/strings/str_ibegins.phpt b/ext/standard/tests/strings/str_begins_with_ci.phpt similarity index 100% rename from ext/standard/tests/strings/str_ibegins.phpt rename to ext/standard/tests/strings/str_begins_with_ci.phpt diff --git a/ext/standard/tests/strings/str_ends.phpt b/ext/standard/tests/strings/str_ends_with.phpt similarity index 100% rename from ext/standard/tests/strings/str_ends.phpt rename to ext/standard/tests/strings/str_ends_with.phpt diff --git a/ext/standard/tests/strings/str_iends.phpt b/ext/standard/tests/strings/str_ends_with_ci.phpt similarity index 100% rename from ext/standard/tests/strings/str_iends.phpt rename to ext/standard/tests/strings/str_ends_with_ci.phpt From 4445f67af64225f0410004969f973368024fb78c Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 3 Jul 2019 07:39:30 -0500 Subject: [PATCH 099/107] Renamd from begins with to starts with --- ext/standard/basic_functions.c | 8 ++++---- ext/standard/php_string.h | 4 ++-- ext/standard/string.c | 12 ++++++------ .../tests/strings/str_begins_with.phpt | 18 ------------------ .../tests/strings/str_begins_with_ci.phpt | 18 ------------------ .../tests/strings/str_starts_with.phpt | 18 ++++++++++++++++++ .../tests/strings/str_starts_with_ci.phpt | 18 ++++++++++++++++++ 7 files changed, 48 insertions(+), 48 deletions(-) delete mode 100644 ext/standard/tests/strings/str_begins_with.phpt delete mode 100644 ext/standard/tests/strings/str_begins_with_ci.phpt create mode 100644 ext/standard/tests/strings/str_starts_with.phpt create mode 100644 ext/standard/tests/strings/str_starts_with_ci.phpt diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 01b7a0a7fb107..85d5d77154faf 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2236,12 +2236,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_strstr, 0, 0, 2) ZEND_ARG_INFO(0, part) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins_with, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_starts_with, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_str_begins_with_ci, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_str_starts_with_ci, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_END_ARG_INFO() @@ -2795,8 +2795,8 @@ static const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(strtoupper, arginfo_strtoupper) PHP_FE(strtolower, arginfo_strtolower) PHP_FE(strpos, arginfo_strpos) - PHP_FE(str_begins_with, arginfo_str_begins) - PHP_FE(str_begins_with_ci, arginfo_str_begins_with_ci) + PHP_FE(str_starts_with, arginfo_str_starts_with) + PHP_FE(str_starts_with_ci, arginfo_str_starts_with_ci) PHP_FE(str_ends_with, arginfo_str_ends_with) PHP_FE(str_ends_with_ci, arginfo_str_ends_with_ci) PHP_FE(stripos, arginfo_stripos) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 478ed4be55228..c92c06e7d8d2c 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -41,8 +41,8 @@ PHP_FUNCTION(basename); PHP_FUNCTION(dirname); PHP_FUNCTION(pathinfo); PHP_FUNCTION(strstr); -PHP_FUNCTION(str_begins_with); -PHP_FUNCTION(str_begins_with_ci); +PHP_FUNCTION(str_starts_with); +PHP_FUNCTION(str_starts_with_ci); PHP_FUNCTION(str_ends_with); PHP_FUNCTION(str_ends_with_ci); PHP_FUNCTION(strpos); diff --git a/ext/standard/string.c b/ext/standard/string.c index b48866fdccaf4..6f51419c92fc9 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2301,9 +2301,9 @@ PHP_FUNCTION(substr) } /* }}} */ -/* {{{ proto boolean str_begins_with(string haystack, string needle) - Checks if haystack begins with needle */ -PHP_FUNCTION(str_begins_with) { +/* {{{ proto boolean str_starts_with(string haystack, string needle) + Checks if haystack strats with needle */ +PHP_FUNCTION(str_starts_with) { zend_string *haystack, *needle; int i; @@ -2322,9 +2322,9 @@ PHP_FUNCTION(str_begins_with) { RETURN_BOOL(1); } -/* {{{ proto boolean str_begins_with_ci(string haystack, string needle) - Performs case insensitive check to determine if haystack begins with needle */ -PHP_FUNCTION(str_begins_with_ci) { +/* {{{ proto boolean str_starts_with_ci(string haystack, string needle) + Performs case insensitive check to determine if haystack starts with needle */ +PHP_FUNCTION(str_starts_with_ci) { zend_string *haystack, *needle; int i; diff --git a/ext/standard/tests/strings/str_begins_with.phpt b/ext/standard/tests/strings/str_begins_with.phpt deleted file mode 100644 index 10ffc959a2cc6..0000000000000 --- a/ext/standard/tests/strings/str_begins_with.phpt +++ /dev/null @@ -1,18 +0,0 @@ ---TEST-- -str_begins_with() function - unit tests for str_begins_with() ---FILE-- - ---EXPECT-- -bool(true) -bool(false) -bool(false) -bool(false) diff --git a/ext/standard/tests/strings/str_begins_with_ci.phpt b/ext/standard/tests/strings/str_begins_with_ci.phpt deleted file mode 100644 index 4737b926409f4..0000000000000 --- a/ext/standard/tests/strings/str_begins_with_ci.phpt +++ /dev/null @@ -1,18 +0,0 @@ ---TEST-- -str_begins_with_ci() function - unit tests for str_begins_with_ci() ---FILE-- - ---EXPECT-- -bool(true) -bool(true) -bool(false) -bool(false) diff --git a/ext/standard/tests/strings/str_starts_with.phpt b/ext/standard/tests/strings/str_starts_with.phpt new file mode 100644 index 0000000000000..90e97bb3254a1 --- /dev/null +++ b/ext/standard/tests/strings/str_starts_with.phpt @@ -0,0 +1,18 @@ +--TEST-- +str_starts_with() function - unit tests for str_starts_with() +--FILE-- + +--EXPECT-- +bool(true) +bool(false) +bool(false) +bool(false) diff --git a/ext/standard/tests/strings/str_starts_with_ci.phpt b/ext/standard/tests/strings/str_starts_with_ci.phpt new file mode 100644 index 0000000000000..7272a98acb5cc --- /dev/null +++ b/ext/standard/tests/strings/str_starts_with_ci.phpt @@ -0,0 +1,18 @@ +--TEST-- +str_starts_with_ci() function - unit tests for str_starts_with_ci() +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(false) +bool(false) From c34367858aaa84c537da50603d2b194947884fe8 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 3 Jul 2019 15:28:27 -0500 Subject: [PATCH 100/107] Refactored naming format --- ext/mbstring/mbstring.c | 36 +++++++++++++------------- ext/mbstring/mbstring.h | 8 +++--- ext/mbstring/tests/mb_str_begins.phpt | 24 ++++++++--------- ext/mbstring/tests/mb_str_ends.phpt | 24 ++++++++--------- ext/mbstring/tests/mb_str_ibegins.phpt | 22 ++++++++-------- ext/mbstring/tests/mb_str_iends.phpt | 22 ++++++++-------- 6 files changed, 68 insertions(+), 68 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 640f0af265792..fd0920b78ff72 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -260,25 +260,25 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strripos, 0, 0, 2) ZEND_ARG_INFO(0, encoding) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_begins, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_starts_with, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_ARG_INFO(0, encoding) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_ibegins, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_starts_with_ci, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_ARG_INFO(0, encoding) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_ends, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_ends_with, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_ARG_INFO(0, encoding) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_iends, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_str_ends_with_ci, 0, 0, 2) ZEND_ARG_INFO(0, haystack) ZEND_ARG_INFO(0, needle) ZEND_ARG_INFO(0, encoding) @@ -554,10 +554,10 @@ static const zend_function_entry mbstring_functions[] = { PHP_FE(mb_strrpos, arginfo_mb_strrpos) PHP_FE(mb_stripos, arginfo_mb_stripos) PHP_FE(mb_strripos, arginfo_mb_strripos) - PHP_FE(mb_str_begins, arginfo_mb_str_begins) - PHP_FE(mb_str_ibegins, arginfo_mb_str_ibegins) - PHP_FE(mb_str_ends, arginfo_mb_str_ends) - PHP_FE(mb_str_iends, arginfo_mb_str_iends) + PHP_FE(mb_str_starts_with, arginfo_mb_str_starts_with) + PHP_FE(mb_str_starts_with_ci, arginfo_mb_str_starts_with_ci) + PHP_FE(mb_str_ends_with, arginfo_mb_str_ends_with) + PHP_FE(mb_str_ends_with_ci, arginfo_mb_str_ends_with_ci) PHP_FE(mb_strstr, arginfo_mb_strstr) PHP_FE(mb_strrchr, arginfo_mb_strrchr) PHP_FE(mb_stristr, arginfo_mb_stristr) @@ -2609,9 +2609,9 @@ PHP_FUNCTION(mb_strripos) } /* }}} */ -/* {{{ proto boolean mb_str_begins(string haystack, string needle [, string encoding]) - Checks if haystack begins with needle */ -PHP_FUNCTION(mb_str_begins) +/* {{{ proto boolean mb_str_starts_with(string haystack, string needle [, string encoding]) + Checks if haystack starts with needle */ +PHP_FUNCTION(mb_str_starts_with) { mbfl_string haystack, needle; zend_string *enc_name = NULL; @@ -2657,9 +2657,9 @@ PHP_FUNCTION(mb_str_begins) } /* }}} */ -/* {{{ proto boolean mb_str_ibegins(string haystack, string needle. [, string encoding]) - Checks if haystack begins with needle, case insensitive */ -PHP_FUNCTION(mb_str_ibegins) +/* {{{ proto boolean mb_str_starts_with_ci(string haystack, string needle. [, string encoding]) + Checks if haystack starts with needle, case insensitive */ +PHP_FUNCTION(mb_str_starts_with_ci) { mbfl_string haystack, needle; zend_string *enc_name = NULL; @@ -2692,9 +2692,9 @@ PHP_FUNCTION(mb_str_ibegins) } /* }}} */ -/* {{{ proto boolean mb_str_ends(string haystack, string needle [, string encoding]) +/* {{{ proto boolean mb_str_ends_with(string haystack, string needle [, string encoding]) Checks if haystack ends with needle */ -PHP_FUNCTION(mb_str_ends) +PHP_FUNCTION(mb_str_ends_with) { mbfl_string haystack, needle; zend_string *enc_name = NULL; @@ -2752,9 +2752,9 @@ PHP_FUNCTION(mb_str_ends) } /* }}} */ -/* {{{ proto boolean mb_str_iends(string haystack, string needle. [, string encoding]) +/* {{{ proto boolean mb_str_ends_with_ci(string haystack, string needle. [, string encoding]) Checks if haystack ends with needle, case insensitive */ -PHP_FUNCTION(mb_str_iends) +PHP_FUNCTION(mb_str_ends_with_ci) { mbfl_string haystack, needle; zend_string *enc_name = NULL; diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 2ede3b4d48d1e..eb340252b397f 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -84,10 +84,10 @@ PHP_FUNCTION(mb_strpos); PHP_FUNCTION(mb_strrpos); PHP_FUNCTION(mb_stripos); PHP_FUNCTION(mb_strripos); -PHP_FUNCTION(mb_str_begins); -PHP_FUNCTION(mb_str_ibegins); -PHP_FUNCTION(mb_str_ends); -PHP_FUNCTION(mb_str_iends); +PHP_FUNCTION(mb_str_starts_with); +PHP_FUNCTION(mb_str_starts_with_ci); +PHP_FUNCTION(mb_str_ends_with); +PHP_FUNCTION(mb_str_ends_with_ci); PHP_FUNCTION(mb_strstr); PHP_FUNCTION(mb_strrchr); PHP_FUNCTION(mb_stristr); diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_begins.phpt index f09266c0f99e5..c895ef5963041 100644 --- a/ext/mbstring/tests/mb_str_begins.phpt +++ b/ext/mbstring/tests/mb_str_begins.phpt @@ -1,5 +1,5 @@ --TEST-- -mb_str_begins() +mb_str_starts_with() --SKIPIF-- --FILE-- @@ -12,13 +12,13 @@ $euc_jp = '0123この文字列は日本語です。EUC-JPを使っています // EUC-JP - With encoding parameter mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_begins($euc_jp, '0123こ', 'EUC-JP')); -var_dump(mb_str_begins($euc_jp, '韓国語', 'EUC-JP')); +var_dump(mb_str_starts_with($euc_jp, '0123こ', 'EUC-JP')); +var_dump(mb_str_starts_with($euc_jp, '韓国語', 'EUC-JP')); // EUC-JP - No encoding parameter mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_begins($euc_jp, '0123')); -var_dump(mb_str_begins($euc_jp, '韓国語')); +var_dump(mb_str_starts_with($euc_jp, '0123')); +var_dump(mb_str_starts_with($euc_jp, '韓国語')); // Basic functionality mb_internal_encoding('UTF-8'); @@ -27,17 +27,17 @@ $string_ascii = 'abc def'; //Japanese string in UTF-8 $string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); -var_dump(mb_str_begins($string_ascii, 'a', 'ISO-8859-1')); -var_dump(mb_str_begins($string_ascii, 'A', 'ISO-8859-1')); -var_dump(mb_str_begins($string_ascii, 'b', 'ISO-8859-1')); -var_dump(mb_str_begins($string_ascii, 'abc')); -var_dump(mb_str_begins($string_ascii, 'bc')); +var_dump(mb_str_starts_with($string_ascii, 'a', 'ISO-8859-1')); +var_dump(mb_str_starts_with($string_ascii, 'A', 'ISO-8859-1')); +var_dump(mb_str_starts_with($string_ascii, 'b', 'ISO-8859-1')); +var_dump(mb_str_starts_with($string_ascii, 'abc')); +var_dump(mb_str_starts_with($string_ascii, 'bc')); $needle1 = base64_decode('5pel5pys6Kqe'); -var_dump(mb_str_begins($string_mb, $needle1)); +var_dump(mb_str_starts_with($string_mb, $needle1)); $needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM"); -var_dump(mb_str_begins($string_mb, $needle2)); +var_dump(mb_str_starts_with($string_mb, $needle2)); ?> diff --git a/ext/mbstring/tests/mb_str_ends.phpt b/ext/mbstring/tests/mb_str_ends.phpt index 3d5b5eb916078..d2e8fe2ca8f1b 100644 --- a/ext/mbstring/tests/mb_str_ends.phpt +++ b/ext/mbstring/tests/mb_str_ends.phpt @@ -1,5 +1,5 @@ --TEST-- -mb_str_ends() +mb_str_ends_with() --SKIPIF-- --FILE-- @@ -12,13 +12,13 @@ $euc_jp = '0123この文字列は日本語です。EUC-JPを使っています // EUC-JP - With encoding parameter mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_ends($euc_jp, 'い。', 'EUC-JP')); -var_dump(mb_str_ends($euc_jp, '韓国語', 'EUC-JP')); +var_dump(mb_str_ends_with($euc_jp, 'い。', 'EUC-JP')); +var_dump(mb_str_ends_with($euc_jp, '韓国語', 'EUC-JP')); // EUC-JP - No encoding parameter mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_ends($euc_jp, 'い。')); -var_dump(mb_str_ends($euc_jp, '韓国語')); +var_dump(mb_str_ends_with($euc_jp, 'い。')); +var_dump(mb_str_ends_with($euc_jp, '韓国語')); // Basic functionality mb_internal_encoding('UTF-8'); @@ -27,17 +27,17 @@ $string_ascii = 'abc def'; // Japanese string in UTF-8 $string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); -var_dump(mb_str_ends($string_ascii, 'f', 'ISO-8859-1')); -var_dump(mb_str_ends($string_ascii, 'F', 'ISO-8859-1')); -var_dump(mb_str_ends($string_ascii, 'e', 'ISO-8859-1')); -var_dump(mb_str_ends($string_ascii, 'def')); -var_dump(mb_str_ends($string_ascii, 'de')); +var_dump(mb_str_ends_with($string_ascii, 'f', 'ISO-8859-1')); +var_dump(mb_str_ends_with($string_ascii, 'F', 'ISO-8859-1')); +var_dump(mb_str_ends_with($string_ascii, 'e', 'ISO-8859-1')); +var_dump(mb_str_ends_with($string_ascii, 'def')); +var_dump(mb_str_ends_with($string_ascii, 'de')); $needle1 = base64_decode('77yZ44CC'); -var_dump(mb_str_ends($string_mb, $needle1)); +var_dump(mb_str_ends_with($string_mb, $needle1)); $needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM"); -var_dump(mb_str_ends($string_mb, $needle2)); +var_dump(mb_str_ends_with($string_mb, $needle2)); ?> diff --git a/ext/mbstring/tests/mb_str_ibegins.phpt b/ext/mbstring/tests/mb_str_ibegins.phpt index ae5baca893b28..b1081b97e5456 100644 --- a/ext/mbstring/tests/mb_str_ibegins.phpt +++ b/ext/mbstring/tests/mb_str_ibegins.phpt @@ -1,5 +1,5 @@ --TEST-- -mb_str_ibegins() +mb_str_starts_with_ci() --SKIPIF-- --FILE-- @@ -12,13 +12,13 @@ $euc_jp = '0123この文字列は日本語です。EUC-JPを使っています // EUC-JP - With encoding parameter mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_ibegins($euc_jp, '0123こ', 'EUC-JP')); -var_dump(mb_str_ibegins($euc_jp, '韓国語', 'EUC-JP')); +var_dump(mb_str_starts_with_ci($euc_jp, '0123こ', 'EUC-JP')); +var_dump(mb_str_starts_with_ci($euc_jp, '韓国語', 'EUC-JP')); // EUC-JP - No encoding parameter mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_ibegins($euc_jp, '0123')); -var_dump(mb_str_ibegins($euc_jp, '韓国語')); +var_dump(mb_str_starts_with_ci($euc_jp, '0123')); +var_dump(mb_str_starts_with_ci($euc_jp, '韓国語')); // Basic functionality mb_internal_encoding('UTF-8'); @@ -27,16 +27,16 @@ $string_ascii = 'abc def'; //Japanese string in UTF-8 $string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); -var_dump(mb_str_ibegins($string_ascii, 'A', 'ISO-8859-1')); -var_dump(mb_str_ibegins($string_ascii, 'b', 'ISO-8859-1')); -var_dump(mb_str_ibegins($string_ascii, 'AbC')); -var_dump(mb_str_ibegins($string_ascii, 'bc')); +var_dump(mb_str_starts_with_ci($string_ascii, 'A', 'ISO-8859-1')); +var_dump(mb_str_starts_with_ci($string_ascii, 'b', 'ISO-8859-1')); +var_dump(mb_str_starts_with_ci($string_ascii, 'AbC')); +var_dump(mb_str_starts_with_ci($string_ascii, 'bc')); $needle1 = base64_decode('5pel5pys6Kqe'); -var_dump(mb_str_ibegins($string_mb, $needle1)); +var_dump(mb_str_starts_with_ci($string_mb, $needle1)); $needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM"); -var_dump(mb_str_ibegins($string_mb, $needle2)); +var_dump(mb_str_starts_with_ci($string_mb, $needle2)); ?> diff --git a/ext/mbstring/tests/mb_str_iends.phpt b/ext/mbstring/tests/mb_str_iends.phpt index a09e1b22a12a8..fe3e45b4081ed 100644 --- a/ext/mbstring/tests/mb_str_iends.phpt +++ b/ext/mbstring/tests/mb_str_iends.phpt @@ -1,5 +1,5 @@ --TEST-- -mb_str_iends() +mb_str_ends_with_ci() --SKIPIF-- --FILE-- @@ -12,13 +12,13 @@ $euc_jp = '0123この文字列は日本語です。EUC-JPを使っています // EUC-JP - With encoding parameter mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_iends($euc_jp, 'い。', 'EUC-JP')); -var_dump(mb_str_iends($euc_jp, '韓国語', 'EUC-JP')); +var_dump(mb_str_ends_with_ci($euc_jp, 'い。', 'EUC-JP')); +var_dump(mb_str_ends_with_ci($euc_jp, '韓国語', 'EUC-JP')); // EUC-JP - No encoding parameter mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n"); -var_dump(mb_str_iends($euc_jp, 'い。')); -var_dump(mb_str_iends($euc_jp, '韓国語')); +var_dump(mb_str_ends_with_ci($euc_jp, 'い。')); +var_dump(mb_str_ends_with_ci($euc_jp, '韓国語')); // Basic functionality mb_internal_encoding('UTF-8'); @@ -27,16 +27,16 @@ $string_ascii = 'abc def'; //Japanese string in UTF-8 $string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); -var_dump(mb_str_iends($string_ascii, 'F', 'ISO-8859-1')); -var_dump(mb_str_iends($string_ascii, 'e', 'ISO-8859-1')); -var_dump(mb_str_iends($string_ascii, 'DeF')); -var_dump(mb_str_iends($string_ascii, 'de')); +var_dump(mb_str_ends_with_ci($string_ascii, 'F', 'ISO-8859-1')); +var_dump(mb_str_ends_with_ci($string_ascii, 'e', 'ISO-8859-1')); +var_dump(mb_str_ends_with_ci($string_ascii, 'DeF')); +var_dump(mb_str_ends_with_ci($string_ascii, 'de')); $needle1 = base64_decode('77yZ44CC'); -var_dump(mb_str_iends($string_mb, $needle1)); +var_dump(mb_str_ends_with_ci($string_mb, $needle1)); $needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM"); -var_dump(mb_str_iends($string_mb, $needle2)); +var_dump(mb_str_ends_with_ci($string_mb, $needle2)); ?> From c448a6d4b0821db066a9c3cf2ab23bd9991c013c Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Wed, 3 Jul 2019 15:29:24 -0500 Subject: [PATCH 101/107] Renamed test cases --- ext/mbstring/tests/{mb_str_ends.phpt => mb_str_ends_with.phpt} | 0 .../tests/{mb_str_iends.phpt => mb_str_ends_with_ci.phpt} | 0 .../tests/{mb_str_begins.phpt => mb_str_starts_with.phpt} | 0 .../tests/{mb_str_ibegins.phpt => mb_str_starts_with_ci.phpt} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename ext/mbstring/tests/{mb_str_ends.phpt => mb_str_ends_with.phpt} (100%) rename ext/mbstring/tests/{mb_str_iends.phpt => mb_str_ends_with_ci.phpt} (100%) rename ext/mbstring/tests/{mb_str_begins.phpt => mb_str_starts_with.phpt} (100%) rename ext/mbstring/tests/{mb_str_ibegins.phpt => mb_str_starts_with_ci.phpt} (100%) diff --git a/ext/mbstring/tests/mb_str_ends.phpt b/ext/mbstring/tests/mb_str_ends_with.phpt similarity index 100% rename from ext/mbstring/tests/mb_str_ends.phpt rename to ext/mbstring/tests/mb_str_ends_with.phpt diff --git a/ext/mbstring/tests/mb_str_iends.phpt b/ext/mbstring/tests/mb_str_ends_with_ci.phpt similarity index 100% rename from ext/mbstring/tests/mb_str_iends.phpt rename to ext/mbstring/tests/mb_str_ends_with_ci.phpt diff --git a/ext/mbstring/tests/mb_str_begins.phpt b/ext/mbstring/tests/mb_str_starts_with.phpt similarity index 100% rename from ext/mbstring/tests/mb_str_begins.phpt rename to ext/mbstring/tests/mb_str_starts_with.phpt diff --git a/ext/mbstring/tests/mb_str_ibegins.phpt b/ext/mbstring/tests/mb_str_starts_with_ci.phpt similarity index 100% rename from ext/mbstring/tests/mb_str_ibegins.phpt rename to ext/mbstring/tests/mb_str_starts_with_ci.phpt From 08f1c1cbd04ed7e4712b70ca68defc6af1382a88 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 4 Jul 2019 10:52:44 -0500 Subject: [PATCH 102/107] Fixed indentation --- ext/mbstring/mbstring.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index fd0920b78ff72..9f2ff185dcdd1 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -554,10 +554,10 @@ static const zend_function_entry mbstring_functions[] = { PHP_FE(mb_strrpos, arginfo_mb_strrpos) PHP_FE(mb_stripos, arginfo_mb_stripos) PHP_FE(mb_strripos, arginfo_mb_strripos) - PHP_FE(mb_str_starts_with, arginfo_mb_str_starts_with) - PHP_FE(mb_str_starts_with_ci, arginfo_mb_str_starts_with_ci) - PHP_FE(mb_str_ends_with, arginfo_mb_str_ends_with) - PHP_FE(mb_str_ends_with_ci, arginfo_mb_str_ends_with_ci) + PHP_FE(mb_str_starts_with, arginfo_mb_str_starts_with) + PHP_FE(mb_str_starts_with_ci, arginfo_mb_str_starts_with_ci) + PHP_FE(mb_str_ends_with, arginfo_mb_str_ends_with) + PHP_FE(mb_str_ends_with_ci, arginfo_mb_str_ends_with_ci) PHP_FE(mb_strstr, arginfo_mb_strstr) PHP_FE(mb_strrchr, arginfo_mb_strrchr) PHP_FE(mb_stristr, arginfo_mb_stristr) From 9b2bff408b3622a089f8dbf5b873f3b02745668b Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 4 Jul 2019 10:52:55 -0500 Subject: [PATCH 103/107] Fixed return macros --- ext/standard/string.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 6f51419c92fc9..64b953d3a4974 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2313,13 +2313,13 @@ PHP_FUNCTION(str_starts_with) { ZEND_PARSE_PARAMETERS_END(); if (needle->len > haystack->len) { - RETURN_BOOL(0); + RETURN_FALSE; } for (i = 0; i < needle->len; i++) if (haystack->val[i] != needle->val[i]) - RETURN_BOOL(0); - RETURN_BOOL(1); + RETURN_FALSE; + RETURN_TRUE; } /* {{{ proto boolean str_starts_with_ci(string haystack, string needle) @@ -2334,13 +2334,13 @@ PHP_FUNCTION(str_starts_with_ci) { ZEND_PARSE_PARAMETERS_END(); if (needle->len > haystack->len) { - RETURN_BOOL(0); + RETURN_FALSE; } for (i = 0; i < needle->len; i++) if (tolower(haystack->val[i]) != tolower(needle->val[i])) - RETURN_BOOL(0); - RETURN_BOOL(1); + RETURN_FALSE; + RETURN_TRUE; } /* {{{ proto boolean str_ends_with(string haystack, string needle) @@ -2355,13 +2355,13 @@ PHP_FUNCTION(str_ends_with) { ZEND_PARSE_PARAMETERS_END(); if (needle->len > haystack->len) { - RETURN_BOOL(0); + RETURN_FALSE; } for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (haystack->val[i] != needle->val[j]) - RETURN_BOOL(0); - RETURN_BOOL(1); + RETURN_FALSE; + RETURN_TRUE; } /* {{{ proto boolean str_ends_with_ci(string haystack, string needle) @@ -2376,13 +2376,13 @@ PHP_FUNCTION(str_ends_with_ci) { ZEND_PARSE_PARAMETERS_END(); if (needle->len > haystack->len) { - RETURN_BOOL(0); + RETURN_FALSE; } for (i = haystack->len - 1, j = needle->len - 1; j >= 0; i--, j--) if (tolower(haystack->val[i]) != tolower(needle->val[j])) - RETURN_BOOL(0); - RETURN_BOOL(1); + RETURN_FALSE; + RETURN_TRUE; } /* {{{ proto string|array|false substr_replace(mixed str, mixed repl, mixed start [, mixed length]) From ffe96ed85f47bf6510f5c5ba74ba07f3eb50ca99 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 4 Jul 2019 10:55:59 -0500 Subject: [PATCH 104/107] Replaced starts_with loops with memcmp calls --- ext/standard/string.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 64b953d3a4974..a706406c5215b 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2316,10 +2316,7 @@ PHP_FUNCTION(str_starts_with) { RETURN_FALSE; } - for (i = 0; i < needle->len; i++) - if (haystack->val[i] != needle->val[i]) - RETURN_FALSE; - RETURN_TRUE; + RETURN_BOOL(memcmp(ZSTR_VAL(haystack), ZSTR_VAL(needle), ZSTR_LEN(needle)) == 0); } /* {{{ proto boolean str_starts_with_ci(string haystack, string needle) @@ -2337,10 +2334,7 @@ PHP_FUNCTION(str_starts_with_ci) { RETURN_FALSE; } - for (i = 0; i < needle->len; i++) - if (tolower(haystack->val[i]) != tolower(needle->val[i])) - RETURN_FALSE; - RETURN_TRUE; + RETURN_BOOL(memcmp(tolower(ZSTR_VAL(haystack)), tolower(ZSTR_VAL(needle)), ZSTR_LEN(needle)) == 0); } /* {{{ proto boolean str_ends_with(string haystack, string needle) From 756ecbf1ac5213924725321df623fb7071aae30f Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 4 Jul 2019 11:05:40 -0500 Subject: [PATCH 105/107] Removed unused variable --- ext/standard/string.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index a706406c5215b..8dca94762cb4e 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2305,7 +2305,6 @@ PHP_FUNCTION(substr) Checks if haystack strats with needle */ PHP_FUNCTION(str_starts_with) { zend_string *haystack, *needle; - int i; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) @@ -2323,7 +2322,6 @@ PHP_FUNCTION(str_starts_with) { Performs case insensitive check to determine if haystack starts with needle */ PHP_FUNCTION(str_starts_with_ci) { zend_string *haystack, *needle; - int i; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack) From 7b9217f53d6b5d8adb4eaa13b7636fe924ef31a6 Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 4 Jul 2019 11:35:19 -0500 Subject: [PATCH 106/107] Turned str_starts_with_ci from memcmp to loop --- ext/standard/string.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 8dca94762cb4e..98adf3104ab8a 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2332,7 +2332,10 @@ PHP_FUNCTION(str_starts_with_ci) { RETURN_FALSE; } - RETURN_BOOL(memcmp(tolower(ZSTR_VAL(haystack)), tolower(ZSTR_VAL(needle)), ZSTR_LEN(needle)) == 0); + for (i = 0; i < needle->len; i++) + if (tolower(haystack->val[i]) != tolower(needle->val[i])) + RETURN_FALSE; + RETURN_TRUE; } /* {{{ proto boolean str_ends_with(string haystack, string needle) From 70d0f3930c2636be1fee7419d56f3411ada7bedd Mon Sep 17 00:00:00 2001 From: William Hudgins Date: Thu, 4 Jul 2019 11:43:04 -0500 Subject: [PATCH 107/107] Readded looping variable --- ext/standard/string.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/standard/string.c b/ext/standard/string.c index 98adf3104ab8a..db766b0b3115c 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2322,6 +2322,7 @@ PHP_FUNCTION(str_starts_with) { Performs case insensitive check to determine if haystack starts with needle */ PHP_FUNCTION(str_starts_with_ci) { zend_string *haystack, *needle; + int i; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STR(haystack)