]> granicus.if.org Git - php/commitdiff
@- implemented count_chars(). (Thies)
authorThies C. Arntzen <thies@php.net>
Tue, 14 Dec 1999 03:52:12 +0000 (03:52 +0000)
committerThies C. Arntzen <thies@php.net>
Tue, 14 Dec 1999 03:52:12 +0000 (03:52 +0000)
ext/standard/basic_functions.c
ext/standard/php_string.h
ext/standard/string.c

index f45678452983d986d57057b2ad72f76805866729..0f96155a3fb7dcfbe5280c5c54722d71491d22cb 100644 (file)
@@ -152,6 +152,7 @@ function_entry basic_functions[] = {
        PHP_FE(chop,                                                                    NULL)
        PHP_FE(str_replace,                                                             NULL)
        PHP_FE(str_repeat,                                                              NULL)
+       PHP_FE(count_chars,                                                             NULL)
        PHP_FE(chunk_split,                                                             NULL)
        PHP_FE(trim,                                                                    NULL)
        PHP_FE(ltrim,                                                                   NULL)
index 3010676590c180cd7abd93680bad6ac218994b0d..af5babb7d2c98319c96e5379c7562e76dea42be0 100644 (file)
@@ -46,6 +46,7 @@ PHP_FUNCTION(trim);
 PHP_FUNCTION(ltrim);
 PHP_FUNCTION(soundex);
 
+PHP_FUNCTION(count_chars);
 PHP_FUNCTION(explode);
 PHP_FUNCTION(implode);
 PHP_FUNCTION(strtok);
index 4e5218dd76e8d619d5b642afd2d14c81bce33de3..19e678fb692677f317cbf04a883a3e5ffd316637 100644 (file)
@@ -2352,9 +2352,79 @@ PHP_FUNCTION(str_repeat)
 }
 /* }}} */
 
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- */
+/* {{{ proto mixed count_chars(string input[, int mode])
+   Returns info about what characters are used in input */
+PHP_FUNCTION(count_chars)
+{
+       zval **input, **mode;
+       int chars[256];
+       int ac=ARG_COUNT(ht);
+       int mymode=0;
+       unsigned char *buf;
+       int len, inx;
+       char retstr[256];
+       int retlen=0;
+
+       if (ac < 1 || ac > 2 || getParametersEx(ac, &input, &mode) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+       
+       convert_to_string_ex(input);
+
+       if (ac == 2) {
+               convert_to_long_ex(mode);
+               mymode = (*mode)->value.lval;
+               
+               if (mymode < 0 || mymode > 4) {
+                       php_error(E_WARNING, "unknown mode");
+                       RETURN_FALSE;
+               }
+       }
+       
+       len = (*input)->value.str.len;
+       buf = (unsigned char *) (*input)->value.str.val;
+       memset((void*) chars,0,sizeof(chars));
+
+       while (len > 0) {
+               chars[*buf]++;
+               buf++;
+               len--;
+       }
+
+       if (mymode < 3) {
+               array_init(return_value);
+       }
+
+       for (inx=0; inx < 255; inx++) {
+               switch (mymode) {
+               case 0:
+                       add_index_long(return_value,inx,chars[inx]);
+                       break;
+               case 1:
+                       if (chars[inx] != 0) {
+                               add_index_long(return_value,inx,chars[inx]);
+                       }
+                       break;
+               case 2:
+                       if (chars[inx] == 0) {
+                               add_index_long(return_value,inx,chars[inx]);
+                       }
+                       break;
+               case 3:
+                       if (chars[inx] != 0) {
+                               retstr[retlen++] = inx;
+                       }
+                       break;
+               case 4:
+                       if (chars[inx] == 0) {
+                               retstr[retlen++] = inx;
+                       }
+                       break;
+               }
+       }
+       
+       if (mymode >= 3 && mymode <= 4) {
+               RETURN_STRINGL(retstr,retlen,1);
+       }
+}
+/* }}} */