On Friday 21 November 2003 01:16 pm, you wrote: > > I've attached a patch which adds a function that basically wraps the > > ctype.h > > > functions. It pretty much just lets you check to see if a string contains > > only a certain set of characters. I think it would be very nice for input > > validation, particularly for those who fear regular expressions. Here's > > the > > > prototype: > > A couple things: > > #1 Have you looked at the ctype extension? > http://us4.php.net/manual/en/ref.ctype.php
Yeah, but I like being able to use them all at once. > > #2 If a unified function is to be added (not against it per se) it should > probably be named ctype() (as the "top-level" of the ctype extension and be > placed in ext/ctype rather than in ext/standard/strings.[ch] Agreed. Here's a new patch that does that, and renames the calls the constants CTYPE_* > > -Sara -- Evan Nemerson [EMAIL PROTECTED]
Index: ext/ctype/ctype.c =================================================================== RCS file: /repository/php-src/ext/ctype/ctype.c,v retrieving revision 1.28 diff -u -r1.28 ctype.c --- ext/ctype/ctype.c 3 Oct 2003 15:50:01 -0000 1.28 +++ ext/ctype/ctype.c 21 Nov 2003 22:10:36 -0000 @@ -55,17 +55,49 @@ PHP_FE(ctype_space, NULL) PHP_FE(ctype_upper, NULL) PHP_FE(ctype_xdigit, NULL) + PHP_FE(ctype, NULL) {NULL, NULL, NULL} /* Must be the last line in ctype_functions[] */ }; /* }}} */ +#define CTYPE_ALNUM 0x01 +#define CTYPE_ALPHA 0x02 +#define CTYPE_CNTRL 0x04 +#define CTYPE_DIGIT 0x08 +#define CTYPE_GRAPH 0x10 +#define CTYPE_LOWER 0x20 +#define CTYPE_PRINT 0x40 +#define CTYPE_PUNCT 0x80 +#define CTYPE_SPACE 0x100 +#define CTYPE_UPPER 0x200 +#define CTYPE_XDIGIT 0x400 + +/* {{{ PHP_MINIT_FUNCTION + */ +PHP_MINIT_FUNCTION(ctype) +{ + REGISTER_LONG_CONSTANT("CTYPE_ALNUM", CTYPE_ALNUM, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTYPE_ALPHA", CTYPE_ALPHA, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTYPE_CNTRL", CTYPE_CNTRL, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTYPE_DIGIT", CTYPE_DIGIT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTYPE_GRAPH", CTYPE_GRAPH, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTYPE_LOWER", CTYPE_LOWER, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTYPE_PRINT", CTYPE_PRINT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTYPE_PUNCT", CTYPE_PUNCT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTYPE_SPACE", CTYPE_SPACE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTYPE_UPPER", CTYPE_UPPER, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CTYPE_XDIGIT", CTYPE_XDIGIT, CONST_CS | CONST_PERSISTENT); + return SUCCESS; +} +/* }}} */ + /* {{{ ctype_module_entry */ zend_module_entry ctype_module_entry = { STANDARD_MODULE_HEADER, "ctype", ctype_functions, - NULL, + PHP_MINIT(ctype), NULL, NULL, NULL, @@ -204,6 +236,50 @@ } /* }}} */ +/* {{{ proto bool ctype(string str, int type) + Find out if a string is composed entirely of the specified type(s) of characters. */ +PHP_FUNCTION(ctype) +{ + char *str; + int str_l, types, count, res; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &str, &str_l, &types) == FAILURE) { + RETURN_FALSE; + } + + for ( count=0 ; count<str_l ; count++ ) { + res = 1; + if ( (types & CTYPE_ALNUM) && (isalnum(str[count])) ) + res = 0; + else if ( (types & CTYPE_ALPHA) && (isalpha(str[count])) ) + res = 0; + else if ( (types & CTYPE_CNTRL) && (iscntrl(str[count])) ) + res = 0; + else if ( (types & CTYPE_DIGIT) && (isdigit(str[count])) ) + res = 0; + else if ( (types & CTYPE_GRAPH) && (isgraph(str[count])) ) + res = 0; + else if ( (types & CTYPE_LOWER) && (islower(str[count])) ) + res = 0; + else if ( (types & CTYPE_PRINT) && (isprint(str[count])) ) + res = 0; + else if ( (types & CTYPE_PUNCT) && (ispunct(str[count])) ) + res = 0; + else if ( (types & CTYPE_SPACE) && (isspace(str[count])) ) + res = 0; + else if ( (types & CTYPE_UPPER) && (isupper(str[count])) ) + res = 0; + else if ( (types & CTYPE_XDIGIT) && (isxdigit(str[count])) ) + res = 0; + + if ( res == 1 ) { + RETURN_FALSE; + } + } + RETURN_TRUE; +} +/* }}} */ + #endif /* HAVE_CTYPE */ /* Index: ext/ctype/php_ctype.h =================================================================== RCS file: /repository/php-src/ext/ctype/php_ctype.h,v retrieving revision 1.10 diff -u -r1.10 php_ctype.h --- ext/ctype/php_ctype.h 10 Jun 2003 20:03:26 -0000 1.10 +++ ext/ctype/php_ctype.h 21 Nov 2003 22:10:36 -0000 @@ -50,6 +50,7 @@ PHP_FUNCTION(ctype_space); PHP_FUNCTION(ctype_upper); PHP_FUNCTION(ctype_xdigit); +PHP_FUNCTION(ctype); /* Declare any global variables you may need between the BEGIN
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php