]> granicus.if.org Git - php/commitdiff
- Added lcfirst() function. The sister function of ucfirst()
authorDavid Coallier <davidc@php.net>
Sat, 19 Jan 2008 19:23:25 +0000 (19:23 +0000)
committerDavid Coallier <davidc@php.net>
Sat, 19 Jan 2008 19:23:25 +0000 (19:23 +0000)
- Test #1 for lcfirst()

ext/standard/basic_functions.c
ext/standard/php_string.h
ext/standard/string.c
ext/standard/tests/strings/lcfirst.phpt [new file with mode: 0644]

index 6d6f038ea442437602636dbb56fa2819e08c33f7..7cf04874be290c4a1ed029ef522d70937bbf9534 100644 (file)
@@ -2634,6 +2634,11 @@ ZEND_BEGIN_ARG_INFO(arginfo_ucfirst, 0)
        ZEND_ARG_INFO(0, str)
 ZEND_END_ARG_INFO()
 
+static
+ZEND_BEGIN_ARG_INFO(arginfo_lcfirst, 0)
+       ZEND_ARG_INFO(0, str)
+ZEND_END_ARG_INFO()
+
 static
 ZEND_BEGIN_ARG_INFO(arginfo_ucwords, 0)
        ZEND_ARG_INFO(0, str)
@@ -3189,6 +3194,7 @@ const zend_function_entry basic_functions[] = { /* {{{ */
        PHP_FE(substr_replace,                                                                                                  arginfo_substr_replace)
        PHP_FE(quotemeta,                                                                                                               arginfo_quotemeta)
        PHP_FE(ucfirst,                                                                                                                 arginfo_ucfirst)
+       PHP_FE(lcfirst,                                                                                                                 arginfo_lcfirst)
        PHP_FE(ucwords,                                                                                                                 arginfo_ucwords)
        PHP_FE(strtr,                                                                                                                   arginfo_strtr)
        PHP_FE(addslashes,                                                                                                              arginfo_addslashes)
index ca00aa3ed1222644e7e2ecd278ce540c9295e821..a5fab47470f39f5fa16c0b540df8934c6b83addf 100644 (file)
@@ -54,6 +54,7 @@ PHP_FUNCTION(strrchr);
 PHP_FUNCTION(substr);
 PHP_FUNCTION(quotemeta);
 PHP_FUNCTION(ucfirst);
+PHP_FUNCTION(lcfirst);
 PHP_FUNCTION(ucwords);
 PHP_FUNCTION(strtr);
 PHP_FUNCTION(strrev);
index 4c9277a20bc2a24e77fad20a663db0c9b825a9ca..aae82e4c9f6318a438d3e0879f0acc444a53efe8 100644 (file)
@@ -3856,6 +3856,69 @@ PHP_FUNCTION(chr)
 }
 /* }}} */
 
+/* {{{ php_u_lcfirst()
+   Makes an Unicode string's first character lowercase */
+static void php_u_lcfirst(UChar *ustr, int ustr_len, zval *return_value TSRMLS_DC)
+{
+       UChar tmp[3] = { 0, 0, 0 }; /* UChar32 will be converted to upto 2 UChar units */
+       int tmp_len = 0;
+       int pos = 0;
+       UErrorCode status = U_ZERO_ERROR;
+
+       U16_FWD_1(ustr, pos, ustr_len);
+       tmp_len = u_strToUpper(tmp, sizeof(tmp)/sizeof(UChar), ustr, pos, UG(default_locale), &status);
+
+       Z_USTRVAL_P(return_value) = eumalloc(tmp_len + ustr_len - pos+1);
+       
+       Z_USTRVAL_P(return_value)[0] = tmp[0];
+       if (tmp_len > 1) {
+               Z_USTRVAL_P(return_value)[1] = tmp[1];
+       }
+       u_memcpy(Z_USTRVAL_P(return_value)+tmp_len, ustr + pos, ustr_len - pos+1);
+       Z_USTRLEN_P(return_value) = tmp_len + ustr_len - pos;
+}
+/* }}} */
+
+/* {{{ php_lcfirst 
+   Lowercase the first character of the word in a native string */
+static void php_lcfirst(char *str)
+{
+       register char *r;
+       r = str;
+       *r = tolower((unsigned char) *r);
+}
+/* }}} */
+
+/* {{{ proto string ucfirst(string str) U
+   Makes a string's first character uppercase */
+PHP_FUNCTION(lcfirst)
+{
+       zstr       str;
+       int        str_len;
+       zend_uchar str_type;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &str, &str_len, &str_type) == FAILURE) {
+               return;
+       }
+       
+       if (str_len == 0) {
+               if (str_type == IS_UNICODE) {
+                       RETURN_EMPTY_UNICODE();
+               } else {
+                       RETURN_EMPTY_STRING();
+               }
+       }       
+
+       if (str_type == IS_UNICODE) {
+               Z_TYPE_P(return_value) = IS_UNICODE;
+               php_u_lcfirst(str.u, str_len, return_value TSRMLS_CC);
+       } else {
+               ZVAL_STRINGL(return_value, str.s, str_len, ZSTR_DUPLICATE);
+               php_lcfirst(Z_STRVAL_P(return_value));
+       }       
+}
+/* }}} */
+
 /* {{{ php_u_ucfirst()
    Makes an Unicode string's first character uppercase */
 static void php_u_ucfirst(UChar *ustr, int ustr_len, zval *return_value TSRMLS_DC)
diff --git a/ext/standard/tests/strings/lcfirst.phpt b/ext/standard/tests/strings/lcfirst.phpt
new file mode 100644 (file)
index 0000000..2b5fea3
Binary files /dev/null and b/ext/standard/tests/strings/lcfirst.phpt differ