[patch] Allow array_change_key_case to support ucfirst and lcfirst
| From: | Matthew Fonda | Date: | Tue, 22 Sep 2009 17:15:54 +0000 |
| Subject: | [patch] Allow array_change_key_case to support ucfirst and lcfirst | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-45626@lists.php.net to get a copy of this message | ||
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); } /* }}} */
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); } /* }}} */