Re: cvs: php-src / NEWS /ext/standard string.c /ext/standard/tests/strings stristr.phpt strstr.phpt
| From: | Andi Gutmans | Date: | Wed, 10 Aug 2005 01:26:11 +0000 |
| Subject: | Re: cvs: php-src / NEWS /ext/standard string.c /ext/standard/tests/strings stristr.phpt strstr.phpt | ||
| References: | 1 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-33257@lists.php.net to get a copy of this message | ||
Please use strlcpy() and not strncpy().
http://www.courtesan.com/todd/papers/strlcpy.html for more info
PHP bundles this functionality...
Andi
At 08:49 PM 8/9/2005 +0000, Johannes Schlüter wrote:
johannes Tue Aug 9 16:49:19 2005 EDTAdded files:/php-src/ext/standard/tests/strings stristr.phptModified files:/php-src NEWS /php-src/ext/standard string.c /php-src/ext/standard/tests/strings strstr.phptLog: - Added option to strstr() and stristr() to get a particular haystack component http://cvs.php.net/diff.php/php-src/NEWS?r1=1.2030&r2=1.2031&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.2030 php-src/NEWS:1.2031 --- php-src/NEWS:1.2030 Tue Aug 9 11:07:18 2005+++ php-src/NEWS Tue Aug 9 16:49:12 2005@@ -6,6 +6,8 @@ . Added CURLINFO_HEADER_OUT to facilitate request retrieval. - Added an optional parameter to parse_url() to allow retrieval of distinct URL components. (Ilia) +- Added an optional parameter to strstr() and stristr() for retrieval of either + the part of haystack before or after first occurence of needle. (Johannes) ?? ??? 2005, PHP 5.1 - Upgraded PCRE library to version 6.2. (Andrei) http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.445&r2=1..446&ty=u Index: php-src/ext/standard/string.c diff -u php-src/ext/standard/string.c:1.445 php-src/ext/standard/string.c:1.446 --- php-src/ext/standard/string.c:1.445 Wed Aug 3 10:08:13 2005+++ php-src/ext/standard/string.c Tue Aug 9 16:49:18 2005@@ -18,7 +18,7 @@+----------------------------------------------------------------------+*/ -/* $Id: string.c,v 1.445 2005/08/03 14:08:13 sniper Exp $ */ +/* $Id: string.c,v 1.446 2005/08/09 20:49:18 johannes Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -1433,52 +1433,60 @@ } /* }}} */ -/* {{{ proto string stristr(string haystack, string needle) +/* {{{ proto string stristr(string haystack, string needle[, bool part])Finds first occurrence of a string within another, case insensitive */PHP_FUNCTION(stristr) {- zval **haystack, **needle; + char *haystack; + long haystack_len; + zval *needle; + zend_bool part = 0; char *found = NULL; int found_offset; char *haystack_orig; char needle_char[2];- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &haystack, &needle) == FAILURE) { - WRONG_PARAM_COUNT; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|b", &haystack, &haystack_len, &needle, &part) == FAILURE) { + return; }- SEPARATE_ZVAL(haystack); - SEPARATE_ZVAL(needle);-- convert_to_string_ex(haystack); + SEPARATE_ZVAL(&needle);- haystack_orig = estrndup(Z_STRVAL_PP(haystack), Z_STRLEN_PP(haystack)); + haystack_orig = estrndup(haystack, haystack_len);- if (Z_TYPE_PP(needle) == IS_STRING) { - if (!Z_STRLEN_PP(needle)) { + if (Z_TYPE_P(needle) == IS_STRING) { + if (!Z_STRLEN_P(needle)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter."); efree(haystack_orig); RETURN_FALSE; }- found = php_stristr(Z_STRVAL_PP(haystack), - Z_STRVAL_PP(needle), - Z_STRLEN_PP(haystack), - Z_STRLEN_PP(needle)); + found = php_stristr(haystack, + Z_STRVAL_P(needle), + haystack_len, + Z_STRLEN_P(needle)); } else { - convert_to_long_ex(needle); - needle_char[0] = (char) Z_LVAL_PP(needle); + convert_to_long_ex(&needle); + needle_char[0] = (char) Z_LVAL_P(needle); needle_char[1] = 0;- found = php_stristr(Z_STRVAL_PP(haystack), + found = php_stristr(haystack, needle_char, - Z_STRLEN_PP(haystack), + haystack_len, 1); }if (found) { - found_offset = found - Z_STRVAL_PP(haystack); - RETVAL_STRINGL(haystack_orig + found_offset, Z_STRLEN_PP(haystack) - found_offset, 1); + found_offset = found - haystack; + if (part) { + char *ret; + ret = emalloc(found_offset + 1); + strncpy(ret, haystack_orig, found_offset); + ret[found_offset] = '\0'; + RETVAL_STRINGL(ret , found_offset, 0); + } else { + RETVAL_STRINGL(haystack_orig + found_offset, haystack_len - found_offset, 1); + } } else { RETVAL_FALSE; }@@ -1487,45 +1495,54 @@ } /* }}} */ -/* {{{ proto string strstr(string haystack, string needle) +/* {{{ proto string strstr(string haystack, string needle[, bool part])Finds first occurrence of a string within another */PHP_FUNCTION(strstr) {- zval **haystack, **needle; + char *haystack; + long haystack_len; + zval *needle; + zend_bool part = 0; char *found = NULL; char needle_char[2]; long found_offset;-- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &haystack, &needle) == FAILURE) { - WRONG_PARAM_COUNT; - }- convert_to_string_ex(haystack); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|b", &haystack, &haystack_len, &needle, &part) == FAILURE) { + return; + }- if (Z_TYPE_PP(needle) == IS_STRING) { - if (!Z_STRLEN_PP(needle)) { + if (Z_TYPE_P(needle) == IS_STRING) { + if (!Z_STRLEN_P(needle)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter."); RETURN_FALSE; }- found = php_memnstr(Z_STRVAL_PP(haystack), - Z_STRVAL_PP(needle), - Z_STRLEN_PP(needle), - Z_STRVAL_PP(haystack) + Z_STRLEN_PP(haystack)); + found = php_memnstr(haystack, + Z_STRVAL_P(needle), + Z_STRLEN_P(needle), + haystack + haystack_len); } else { - convert_to_long_ex(needle); - needle_char[0] = (char) Z_LVAL_PP(needle); + convert_to_long_ex(&needle); + needle_char[0] = (char) Z_LVAL_P(needle); needle_char[1] = 0;- found = php_memnstr(Z_STRVAL_PP(haystack), + found = php_memnstr(haystack, needle_char, 1, - Z_STRVAL_PP(haystack) + Z_STRLEN_PP(haystack)); + haystack + haystack_len); }if (found) { - found_offset = found - Z_STRVAL_PP(haystack); - RETURN_STRINGL(found, Z_STRLEN_PP(haystack) - found_offset, 1); + found_offset = found - haystack; + if (part) { + char *ret; + ret = emalloc(found_offset + 1); + strncpy(ret, haystack, found_offset); + ret[found_offset] = '\0'; + RETURN_STRINGL(ret , found_offset, 0); + } else { + RETURN_STRINGL(found, haystack_len - found_offset, 1); + } } else { RETURN_FALSE; }http://cvs.php.net/diff.php/php-src/ext/standard/tests/strings/strstr.phpt?r1=1.2&r2=1.3&ty=u Index: php-src/ext/standard/tests/strings/strstr.phpt diff -u php-src/ext/standard/tests/strings/strstr.phpt:1.2 php-src/ext/standard/tests/strings/strstr.phpt:1.3 --- php-src/ext/standard/tests/strings/strstr.phpt:1.2 Wed May 19 04:45:23 2004+++ php-src/ext/standard/tests/strings/strstr.phpt Tue Aug 9 16:49:19 2005@@ -14,6 +14,8 @@var_dump(@strstr("a", "")); var_dump(@strstr("", "a")); var_dump(md5(@strstr("\\\\a\\", "\\a"))); + var_dump(strstr("test string", " ", false)); + var_dump(strstr("test string", " ", true));?> --EXPECT-- string(11) "test string" @@ -28,3 +30,5 @@ bool(false) bool(false) string(32) "6ec19f52f0766c463f3bb240f4396913" +string(7) " string" +string(4) "test" http://cvs.php.net/co.php/php-src/ext/standard/tests/strings/stristr.phpt?r=1.1&p=1 Index: php-src/ext/standard/tests/strings/stristr.phpt +++ php-src/ext/standard/tests/strings/stristr.phpt --TEST-- stristr() function --FILE-- <?phpvar_dump(stristr("tEsT sTrInG", "tEsT")); var_dump(stristr("tEsT sTrInG", "stRiNg")); var_dump(stristr("tEsT sTrInG", "stRiN")); var_dump(stristr("tEsT sTrInG", "t S")); var_dump(stristr("tEsT sTrInG", "g")); var_dump(md5(stristr("te".chr(0)."st", chr(0)))); var_dump(@stristr("", "")); var_dump(@stristr("a", "")); var_dump(@stristr("", "a")); var_dump(md5(@stristr("\\\\a\\", "\\a"))); var_dump(stristr("tEsT sTrInG", " ", false)); var_dump(stristr("tEsT sTrInG", " ", true));?> --EXPECT-- string(11) "tEsT sTrInG" string(6) "sTrInG" string(6) "sTrInG" string(8) "T sTrInG" string(1) "G" string(32) "7272696018bdeb2c9a3f8d01fc2a9273" bool(false) bool(false) bool(false) string(32) "6ec19f52f0766c463f3bb240f4396913" string(7) " sTrInG" string(4) "tEsT" -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php