Hi All, I came across a situation where I had to make the first character of an arrays keys uppercase, and found the array_change_key_case function, but noticed it only supported CASE_UPPER and CASE_LOWER. Attached is a patch to also add support for CASE_LCFIRST and CASE_UCFIRST.
The patch is against PHP_5_3. I wasn't sure which branch I should write it for--let me know if it should be against another branch. This is my first patch submission so any comments are appreciated. Regards, --Matthew
Index: ext/standard/array.c =================================================================== --- ext/standard/array.c (revision 288546) +++ ext/standard/array.c (working copy) @@ -63,6 +63,8 @@ #define CASE_LOWER 0 #define CASE_UPPER 1 +#define CASE_LCFIRST 2 +#define CASE_UCFIRST 3 #define COUNT_NORMAL 0 #define COUNT_RECURSIVE 1 @@ -121,6 +123,8 @@ REGISTER_LONG_CONSTANT("CASE_LOWER", CASE_LOWER, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CASE_UPPER", CASE_UPPER, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CASE_LCFIRST", CASE_LCFIRST, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CASE_UCFIRST", CASE_UCFIRST, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("COUNT_NORMAL", COUNT_NORMAL, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("COUNT_RECURSIVE", COUNT_RECURSIVE, CONST_CS | CONST_PERSISTENT); @@ -2711,10 +2715,20 @@ break; case HASH_KEY_IS_STRING: new_key = estrndup(string_key, str_key_len - 1); - if (change_to_upper) { - php_strtoupper(new_key, str_key_len - 1); - } else { - php_strtolower(new_key, str_key_len - 1); + switch (change_to_upper) { + case CASE_UPPER: + php_strtoupper(new_key, str_key_len - 1); + break; + case CASE_LCFIRST: + php_lcfirst(new_key); + break; + case CASE_UCFIRST: + php_ucfirst(new_key); + break; + case CASE_LOWER: + default: + php_strtolower(new_key, str_key_len - 1); + break; } zend_hash_update(Z_ARRVAL_P(return_value), new_key, str_key_len, entry, sizeof(entry), NULL); efree(new_key); Index: ext/standard/string.c =================================================================== --- ext/standard/string.c (revision 288546) +++ ext/standard/string.c (working copy) @@ -2513,11 +2513,12 @@ /* {{{ php_ucfirst Uppercase the first character of the word in a native string */ -static void php_ucfirst(char *str) +PHPAPI char *php_ucfirst(char *s) { - register char *r; - r = str; - *r = toupper((unsigned char) *r); + unsigned char *c; + c = (unsigned char *)s; + *c = toupper(*c); + return s; } /* }}} */ @@ -2536,22 +2537,24 @@ RETURN_EMPTY_STRING(); } - ZVAL_STRINGL(return_value, str, str_len, 1); - php_ucfirst(Z_STRVAL_P(return_value)); + str = estrndup(str, str_len); + php_ucfirst(str); + RETURN_STRINGL(str, str_len, 0); } /* }}} */ /* {{{ Lowercase the first character of the word in a native string */ -static void php_lcfirst(char *str) +PHPAPI char *php_lcfirst(char *s) { - register char *r; - r = str; - *r = tolower((unsigned char) *r); + unsigned char *c; + c = (unsigned char *)s; + *c = tolower(*c); + return s; } /* }}} */ -/* {{{ proto string ucfirst(string str) +/* {{{ proto string lcfirst(string str) Make a string's first character lowercase */ PHP_FUNCTION(lcfirst) { @@ -2566,8 +2569,9 @@ RETURN_EMPTY_STRING(); } - ZVAL_STRINGL(return_value, str, str_len, 1); - php_lcfirst(Z_STRVAL_P(return_value)); + str = estrndup(str, str_len); + php_lcfirst(str); + RETURN_STRINGL(str, str_len, 0); } /* }}} */
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php