]> granicus.if.org Git - php/commitdiff
added optional 3rd parameter 'limit' to explode() as in split()
authorHartmut Holzgraefe <hholzgra@php.net>
Fri, 19 May 2000 22:00:38 +0000 (22:00 +0000)
committerHartmut Holzgraefe <hholzgra@php.net>
Fri, 19 May 2000 22:00:38 +0000 (22:00 +0000)
(due to feature request in bug id #3251)

ext/standard/php_string.h
ext/standard/string.c

index 9e31cb3cd928ea7e758dabcc0b6119ad085c8a61..e71cf8f997b3804b855d9d2c1f991059927f6701 100644 (file)
@@ -109,7 +109,7 @@ PHPAPI void php_strip_tags(char *rbuf, int len, int state, char *allow, int allo
 PHPAPI void php_char_to_str(char *str, uint len, char from, char *to, int to_len, pval *result);
 
 PHPAPI void php_implode(pval *delim, pval *arr, pval *return_value);
-PHPAPI void php_explode(pval *delim, pval *str, pval *return_value);
+PHPAPI void php_explode(pval *delim, pval *str, pval *return_value, int limit);
 PHPAPI inline char *php_memnstr(char *haystack, char *needle, int needle_len, char *end);
 PHPAPI size_t php_strspn(char *s1, char *s2, char *s1_end, char *s2_end); 
 PHPAPI size_t php_strcspn(char *s1, char *s2, char *s1_end, char *s2_end); 
index b9c2194c769e932239abc52b903a1d065375c56d..319a3cb9b1ab7ec87ebdffa1ec9ba9db9889eb26 100644 (file)
@@ -213,7 +213,7 @@ PHP_FUNCTION(ltrim)
 }
 /* }}} */
 
-PHPAPI void php_explode(zval *delim, zval *str, zval *return_value) 
+PHPAPI void php_explode(zval *delim, zval *str, zval *return_value, int limit
 {
        char *p1, *p2, *endp;
        int i = 0;
@@ -229,23 +229,38 @@ PHPAPI void php_explode(zval *delim, zval *str, zval *return_value)
                do {
                        add_index_stringl(return_value, i++, p1, p2-p1, 1);
                        p1 = p2 + delim->value.str.len;
+                       if((limit>=0)&&(i>=limit-1))
+                               break;
                } while ((p2 = php_memnstr(p1, delim->value.str.val, delim->value.str.len, endp)) != NULL);
 
-               if (p1 <= endp) {
+               if ((p1 <= endp)|| ((limit>=0)&&(i>=limit-1))){
                        add_index_stringl(return_value, i++, p1, endp-p1, 1);
                }
        }
 }
 
-/* {{{ proto array explode(string separator, string str)
+/* {{{ proto array explode(string separator, string str [, int limit])
    Split a string on string separator and return array of components */
 PHP_FUNCTION(explode)
 {
-       zval **str, **delim;
+       zval **str, **delim, **zlimit = NULL;
+       int limit;
 
-       if (ARG_COUNT(ht) != 2 || zend_get_parameters_ex(2, &delim, &str) == FAILURE) {
-               WRONG_PARAM_COUNT;
-       }
+       switch (ARG_COUNT(ht)) {
+       case 2:
+               if (zend_get_parameters_ex(2, &delim, &str) == FAILURE)
+                       WRONG_PARAM_COUNT;
+               limit=-1;
+               break;
+       case 3:
+               if (zend_get_parameters_ex(3, &delim, &str, &zlimit) == FAILURE)
+                       WRONG_PARAM_COUNT;
+               convert_to_long_ex(zlimit);
+               limit = (*zlimit)->value.lval;
+               break;
+       default:
+               WRONG_PARAM_COUNT;                                         
+       }                                                                  
 
        convert_to_string_ex(str);
        convert_to_string_ex(delim);
@@ -259,7 +274,11 @@ PHP_FUNCTION(explode)
                RETURN_FALSE;
        }
 
-       php_explode(*delim, *str, return_value);
+       if((limit==0)||(limit==1)) {
+               add_index_stringl(return_value, 0, (*str)->value.str.val, (*str)->value.str.len, 1);
+       } else {
+               php_explode(*delim, *str, return_value, limit);
+       }
 }
 /* }}} */