From: Thies C. Arntzen Date: Tue, 14 Dec 1999 03:52:12 +0000 (+0000) Subject: @- implemented count_chars(). (Thies) X-Git-Tag: PRE_RETURN_REF_MERGE~19 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6553540153f04945b645f0c6df37714d24682a44;p=php @- implemented count_chars(). (Thies) --- 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); + } +} +/* }}} */