From 7a66695286c22eca91d431fc2a6dc85c3199f465 Mon Sep 17 00:00:00 2001 From: David Coallier Date: Sat, 19 Jan 2008 19:23:25 +0000 Subject: [PATCH] - Added lcfirst() function. The sister function of ucfirst() - Test #1 for lcfirst() --- ext/standard/basic_functions.c | 6 +++ ext/standard/php_string.h | 1 + ext/standard/string.c | 63 ++++++++++++++++++++++++ ext/standard/tests/strings/lcfirst.phpt | Bin 0 -> 6897 bytes 4 files changed, 70 insertions(+) create mode 100644 ext/standard/tests/strings/lcfirst.phpt diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 6d6f038ea4..7cf04874be 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -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) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index ca00aa3ed1..a5fab47470 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -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); diff --git a/ext/standard/string.c b/ext/standard/string.c index 4c9277a20b..aae82e4c9f 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -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 index 0000000000000000000000000000000000000000..2b5fea3e3763c0aa4673308e0d3e789ae5e99cbf GIT binary patch literal 6897 zcmeHLYjfK+7TvGruehdVi}G5IWVB!?tUp}A_uq+8~_*RUZC5(I=j5;b}c(_M}Djlr(@G74c)|#LaW<-e(@Z_ zX)Ik|q35K3gwChW&(F~N@bPp!wI1x!3vnk&kV;}dylpGej>sL0Sh$IdDVKS~uv&=fqjBG$MG?eDD?91lbsiv^vK{_9v98-&lk zlIjX$QU-qC-m@qZ_4gC0l8O+rO!VyR{QM=&UcNeiQgpT}oo#rj`RtpXy|=OP-~nBv zK|l>U^Iop?OwP4tvm!L>g<|M>*;rnb4g*PV({xm`#lWeN^gQwuj3h z!-uwZ0opf7rYV&xrjnF=o669Y4Uuw_G{NZ~G)t114DMwX`F@ztzw?OK=biA|`JO2! zh@vSa5%C$PSrp&#L61f`5fBG6dH!f5V+l9+B1olT`WZ#B6z-Uu3abc3+=7b^y~FJ9 zMLh7*$<)c+X=N?O=Nc3v&`OAs8=K%RAIFyMim)?^Q^%#N@wkv}4b_X+>Bw5?>) z?o>5ctCgWYDRxh#!`$SM*NC<9ua%5_)qPYNweGKbZ%Uo_S{r-L2GbR!K;X3QS8#Bk1%I($NWOm`TF? z$^J4AX#nCG%Mj%Y85HCzn&NQa2>78&r103iF*~-d#?nB*u?l$*68DksK^YEF5^>I^ z1WJQJ5?yLGqKUZm=QNQ>%pQTIMiB^MrjB(TWpEq!`XE*gQ0~FWBOu#GLn%y{pcCH0 z_n@;D;14oCX6sA?OJ1-^ULD#MWt-1Z{kFW4DoSG{hk`a*BOk;F4(KDCZLsTPv7gKn z<~^2h?+C?T=#+|}yP3_Lwfv#}a>3!6aXHS|+~S;oUDus)Hn`5_@EU6s8l%ocFdzqH zWY1&5W{~R-IQyIN`y91q6%L@~AQg3*RSiDIW#Wc+62?+Y3}%vH$yBFbSjSTU>3@`x#2)ULV!hS6_eg?RQ*ce@@3*M`<0Me;oZU z7yERpwf)=9?(WWS+pVqB%@4;;2cLs)X9wNr+}b)lJ>A^g{DAKiEv^6MHVH9Usl{^k z%+9VpgLws6&1RyA?~repSy1Pd7h9JR-aJAxEh}G_a(s~7i2pk$wFnb|KRV%5=-Q0c z)|sLWng{b-8tcrWj$~|xsMEpi70c7CY!MS`&OvqEPCp>G31H>YV-O=d+)#p5kFgPvNs~GnRD`CB7?<=`~(&x#6fG9wogf!#GzZz^fMwz{ze6`(x)IWKH*M=z z5r+t_<2<@hBb$@P)q9Kzl`pn^eq2D2o&~V;I`rMhLzu@j^g|IZI@zV0ZvA^)0#?GA z->9r52py;eduzcPGOQsqHwNNp+H*D8~8d*(TF zpU!(YN13|m5@3oXS!72P6h6O8;4LDFFITA}%Y;j8%Li5agv(4`?b7h;DwtfEQJQik kqtDt3CxZJV+1SFvT#Q*>R literal 0 HcmV?d00001 -- 2.40.0