summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThies C. Arntzen <thies@php.net>1999-12-14 03:52:12 +0000
committerThies C. Arntzen <thies@php.net>1999-12-14 03:52:12 +0000
commit6553540153f04945b645f0c6df37714d24682a44 (patch)
tree653938cc5ed826ecc3457f6332ba6782592f382a
parent82679342354c70a0f2d3c070b402539554f92e8e (diff)
downloadphp-git-6553540153f04945b645f0c6df37714d24682a44.tar.gz
@- implemented count_chars(). (Thies)
-rw-r--r--ext/standard/basic_functions.c1
-rw-r--r--ext/standard/php_string.h1
-rw-r--r--ext/standard/string.c82
3 files changed, 78 insertions, 6 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index f456784529..0f96155a3f 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -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)
diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h
index 3010676590..af5babb7d2 100644
--- a/ext/standard/php_string.h
+++ b/ext/standard/php_string.h
@@ -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);
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 4e5218dd76..19e678fb69 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -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);
+ }
+}
+/* }}} */