Err, aren't we in a feature freeze? --Wez.
On 8/9/05, Johannes Schlüter <[EMAIL PROTECTED]> wrote: > johannes Tue Aug 9 16:49:19 2005 EDT > > Added files: > /php-src/ext/standard/tests/strings stristr.phpt > > Modified files: > /php-src NEWS > /php-src/ext/standard string.c > /php-src/ext/standard/tests/strings strstr.phpt > Log: > - 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-- > <?php > var_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 > > -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php