moriyoshi               Sat Nov  9 12:05:47 2002 EDT

  Modified files:              
    /php4/ext/mbstring  mbfilter.c mbfilter.h mbstring.c mbstring.h 
  Log:
  Added mb_substr_count() as per the request #15097
  
  
Index: php4/ext/mbstring/mbfilter.c
diff -u php4/ext/mbstring/mbfilter.c:1.47 php4/ext/mbstring/mbfilter.c:1.48
--- php4/ext/mbstring/mbfilter.c:1.47   Sat Nov  2 08:38:32 2002
+++ php4/ext/mbstring/mbfilter.c        Sat Nov  9 12:05:47 2002
@@ -1,6 +1,7 @@
-/* charset=UTF-8
- * vim: encoding=utf-8:
- * */
+/*
+ * charset=UTF-8
+ * vim600: encoding=utf-8
+ */
 
 /*
  * "streamable kanji code filter and converter"
@@ -79,7 +80,7 @@
  *
  */
 
-/* $Id: mbfilter.c,v 1.47 2002/11/02 13:38:32 moriyoshi Exp $ */
+/* $Id: mbfilter.c,v 1.48 2002/11/09 17:05:47 moriyoshi Exp $ */
 
 
 #ifdef HAVE_CONFIG_H
@@ -7831,6 +7832,90 @@
        return result;
 }
 
+/*
+ *  substr_count
+ */
+
+int
+mbfl_substr_count(
+    mbfl_string *haystack,
+    mbfl_string *needle
+    TSRMLS_DC)
+{
+       int n, result = 0;
+       unsigned char *p;
+       mbfl_convert_filter *filter;
+       struct collector_strpos_data pc;
+
+       if (haystack == NULL || needle == NULL) {
+               return -8;
+       }
+       /* needle is converted into wchar */
+       mbfl_wchar_device_init(&pc.needle TSRMLS_CC);
+       filter = mbfl_convert_filter_new(
+         needle->no_encoding,
+         mbfl_no_encoding_wchar,
+         mbfl_wchar_device_output, 0, &pc.needle TSRMLS_CC);
+       if (filter == NULL) {
+               return -4;
+       }
+       p = needle->val;
+       n = needle->len;
+       if (p != NULL) {
+               while (n > 0) {
+                       if ((*filter->filter_function)(*p++, filter TSRMLS_CC) < 0) {
+                               break;
+                       }
+                       n--;
+               }
+       }
+       mbfl_convert_filter_flush(filter TSRMLS_CC);
+       mbfl_convert_filter_delete(filter TSRMLS_CC);
+       pc.needle_len = pc.needle.pos;
+       if (pc.needle.buffer == NULL) {
+               return -4;
+       }
+       if (pc.needle_len <= 0) {
+               mbfl_wchar_device_clear(&pc.needle TSRMLS_CC);
+               return -2;
+       }
+       /* initialize filter and collector data */
+       filter = mbfl_convert_filter_new(
+         haystack->no_encoding,
+         mbfl_no_encoding_wchar,
+         collector_strpos, 0, &pc TSRMLS_CC);
+       if (filter == NULL) {
+               mbfl_wchar_device_clear(&pc.needle TSRMLS_CC);
+               return -4;
+       }
+       pc.start = 0;
+       pc.output = 0;
+       pc.needle_pos = 0;
+       pc.found_pos = 0;
+       pc.matched_pos = -1;
+
+       /* feed data */
+       p = haystack->val;
+       n = haystack->len;
+       if (p != NULL) {
+               while (n > 0) {
+                       if ((*filter->filter_function)(*p++, filter TSRMLS_CC) < 0) {
+                               pc.matched_pos = -4;
+                               break;
+                       }
+                       if (pc.matched_pos >= 0) {
+                               ++result;
+                               pc.matched_pos = -1;
+                       }
+                       n--;
+               }
+       }
+       mbfl_convert_filter_flush(filter TSRMLS_CC);
+       mbfl_convert_filter_delete(filter TSRMLS_CC);
+       mbfl_wchar_device_clear(&pc.needle TSRMLS_CC);
+
+       return result;
+}
 
 /*
  *  substr
Index: php4/ext/mbstring/mbfilter.h
diff -u php4/ext/mbstring/mbfilter.h:1.15 php4/ext/mbstring/mbfilter.h:1.16
--- php4/ext/mbstring/mbfilter.h:1.15   Wed Aug 14 02:38:07 2002
+++ php4/ext/mbstring/mbfilter.h        Sat Nov  9 12:05:47 2002
@@ -86,7 +86,7 @@
  *
  */
 
-/* $Id: mbfilter.h,v 1.15 2002/08/14 06:38:07 dets Exp $ */
+/* $Id: mbfilter.h,v 1.16 2002/11/09 17:05:47 moriyoshi Exp $ */
 
 
 #ifndef MBFL_MBFILTER_H
@@ -486,6 +486,13 @@
  */
 int
 mbfl_strpos(mbfl_string *haystack, mbfl_string *needle, int offset, int reverse 
TSRMLS_DC);
+
+
+/*
+ * substr_count
+ */
+int
+mbfl_substr_count(mbfl_string *haystack, mbfl_string *needle TSRMLS_DC);
 
 /*
  * substr
Index: php4/ext/mbstring/mbstring.c
diff -u php4/ext/mbstring/mbstring.c:1.129 php4/ext/mbstring/mbstring.c:1.130
--- php4/ext/mbstring/mbstring.c:1.129  Sat Nov  9 11:15:40 2002
+++ php4/ext/mbstring/mbstring.c        Sat Nov  9 12:05:47 2002
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: mbstring.c,v 1.129 2002/11/09 16:15:40 moriyoshi Exp $ */
+/* $Id: mbstring.c,v 1.130 2002/11/09 17:05:47 moriyoshi Exp $ */
 
 /*
  * PHP4 Multibyte String module "mbstring" (currently only for Japanese)
@@ -173,6 +173,7 @@
        {MB_OVERLOAD_STRING, "substr", "mb_substr", "mb_orig_substr"},
        {MB_OVERLOAD_STRING, "strtolower", "mb_strtolower", "mb_orig_strtolower"},
        {MB_OVERLOAD_STRING, "strtoupper", "mb_strtoupper", "mb_orig_strtoupper"},
+       {MB_OVERLOAD_STRING, "substr_count", "mb_substr_count", 
+"mb_orig_substr_count"},
 #if HAVE_MBREGEX
        {MB_OVERLOAD_REGEX, "ereg", "mb_ereg", "mb_orig_ereg"},
        {MB_OVERLOAD_REGEX, "eregi", "mb_eregi", "mb_orig_eregi"},
@@ -216,6 +217,7 @@
        PHP_FE(mb_strlen,                                       NULL)
        PHP_FE(mb_strpos,                                       NULL)
        PHP_FE(mb_strrpos,                              NULL)
+       PHP_FE(mb_substr_count,                 NULL)
        PHP_FE(mb_substr,                                       NULL)
        PHP_FE(mb_strcut,                                       NULL)
        PHP_FE(mb_strwidth,                             NULL)
@@ -2113,6 +2115,61 @@
        needle.val = (unsigned char *)Z_STRVAL_PP(arg2);
        needle.len = Z_STRLEN_PP(arg2);
        n = mbfl_strpos(&haystack, &needle, 0, 1 TSRMLS_CC);
+       if (n >= 0) {
+               RETVAL_LONG(n);
+       } else {
+               RETVAL_FALSE;
+       }
+}
+/* }}} */
+
+/* {{{ proto int mb_substr_count(string haystack, string needle [, string encoding])
+   Count the number of substring occurrences */
+PHP_FUNCTION(mb_substr_count)
+{
+       pval **arg1, **arg2, **arg3; 
+       int n;
+       mbfl_string haystack, needle;
+
+       mbfl_string_init(&haystack);
+       mbfl_string_init(&needle);
+       haystack.no_language = MBSTRG(current_language);
+       haystack.no_encoding = MBSTRG(current_internal_encoding);
+       needle.no_language = MBSTRG(current_language);
+       needle.no_encoding = MBSTRG(current_internal_encoding);
+       switch (ZEND_NUM_ARGS()) {
+       case 2:
+               if (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) {
+                       WRONG_PARAM_COUNT;
+               }
+               break;
+       case 3:
+               if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
+                       WRONG_PARAM_COUNT;
+               }
+               convert_to_string_ex(arg3);
+               haystack.no_encoding = needle.no_encoding = 
+mbfl_name2no_encoding(Z_STRVAL_PP(arg3));
+               if (haystack.no_encoding == mbfl_no_encoding_invalid) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding 
+\"%s\"", Z_STRVAL_PP(arg3));
+                       RETURN_FALSE;
+               }
+               break;
+       default:
+               WRONG_PARAM_COUNT;
+       }
+
+       convert_to_string_ex(arg1);
+       convert_to_string_ex(arg2);
+
+       if (Z_STRLEN_PP(arg2) <= 0) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING,"Empty needle");
+               RETURN_FALSE;
+       }
+       haystack.val = (unsigned char *)Z_STRVAL_PP(arg1);
+       haystack.len = Z_STRLEN_PP(arg1);
+       needle.val = (unsigned char *)Z_STRVAL_PP(arg2);
+       needle.len = Z_STRLEN_PP(arg2);
+       n = mbfl_substr_count(&haystack, &needle TSRMLS_CC);
        if (n >= 0) {
                RETVAL_LONG(n);
        } else {
Index: php4/ext/mbstring/mbstring.h
diff -u php4/ext/mbstring/mbstring.h:1.39 php4/ext/mbstring/mbstring.h:1.40
--- php4/ext/mbstring/mbstring.h:1.39   Wed Oct 23 19:25:26 2002
+++ php4/ext/mbstring/mbstring.h        Sat Nov  9 12:05:47 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: mbstring.h,v 1.39 2002/10/23 23:25:26 moriyoshi Exp $ */
+/* $Id: mbstring.h,v 1.40 2002/11/09 17:05:47 moriyoshi Exp $ */
 
 /*
  * PHP4 Multibyte String module "mbstring" (currently only for Japanese)
@@ -91,6 +91,7 @@
 PHP_FUNCTION(mb_strlen);
 PHP_FUNCTION(mb_strpos);
 PHP_FUNCTION(mb_strrpos);
+PHP_FUNCTION(mb_substr_count);
 PHP_FUNCTION(mb_substr);
 PHP_FUNCTION(mb_strcut);
 PHP_FUNCTION(mb_strwidth);



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to