Re: [PATCH] [PHP-DEV] Extra parameters for strtoupper(), strtolower()

From: Date: Tue, 14 Aug 2001 15:51:51 +0000
Subject: Re: [PATCH] [PHP-DEV] Extra parameters for strtoupper(), strtolower()
References: 1 2  Groups: php.dev 
Request: Send a blank email to php-dev+get-63169@lists.php.net to get a copy of this message
'Kay. This ought to do it. Patch included at the bottom of the post. (I have no idea why, but qmail daemon for the newsgroup keeps bouncing back my posts if I include attachments -- something about the message being < 2 bytes long.) Anyways, I don't have a CVS account, so whoever wants to apply this little patch should go ahead. It's nothing serious -- basically, take what was done in substr() and jam it into strtoupper/lower(). J Stig Sæther Bakken wrote: > [J Smith <dark_panda@hushmail.com>] >> string strtoupper(string string [, int start [, int length]]) >> string strtolower(string string [, int start [, int length]]) >> >> The additional parameters would work in much the same fashion as >> substr(). I've implemented it in the latest cvs just for the hell >> of it. >> >> Am I the only one who thinks this is even remotely useful? It isn't >> a big thing, but it's a lot easier to have this available than to >> chop up a string with substr() and then capitalize what you want. >> >> A pretty useless feature, I guess. Obviously, I'm pretty bored right >> now. > > If it's useful to you, it will be useful to others. Go for it. > > - Stig > Index: string.c =================================================================== RCS file: /repository/php4/ext/standard/string.c,v retrieving revision 1.224 diff -u -r1.224 string.c --- string.c 11 Aug 2001 17:03:37 -0000 1.224 +++ stringnew.c 14 Aug 2001 15:22:11 -0000 @@ -995,20 +995,74 @@ } /* }}} */ -/* {{{ proto string strtoupper(string str) - Make a string uppercase */ +/* {{{ proto string strtoupper(string str [, int from [, int length]]) + Make a string (or part of a string) uppercase */ PHP_FUNCTION(strtoupper) { - zval **arg; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg)) { + zval **str, **from, **len; + int argc = ZEND_NUM_ARGS(), f, l, i; + + if ((argc == 1 && zend_get_parameters_ex(1, &str) == FAILURE) || + (argc == 2 && zend_get_parameters_ex(2, &str, &from) == FAILURE) || + (argc == 3 && zend_get_parameters_ex(3, &str, &from, &len) == FAILURE)) { WRONG_PARAM_COUNT; } - convert_to_string_ex(arg); + convert_to_string_ex(str); + + /* if there's only one argument, this function will work exactly like it did before. */ + + if (argc == 1) { + *return_value = **str; + zval_copy_ctor(return_value); + php_strtoupper(return_value->value.str.val, return_value->value.str.len); + } + + /* otherwise, it acts a lot like PHP's substr() function */ + + else { + convert_to_long_ex(from); + f = (*from)->value.lval; + + if (argc == 2) { + l = (*str)->value.str.len; + } + else if (argc == 3) { + convert_to_long_ex(len); + l = (*len)->value.lval; + } - *return_value = **arg; - zval_copy_ctor(return_value); - php_strtoupper(return_value->value.str.val, return_value->value.str.len); + /* if the "from" position is negative, then count back from the end of the string */ + + if (f < 0) { + f = (*str)->value.str.len + f; + if (f < 0) { + f = 0; + } + } + + /* if the "length" position is negative, set it to the length needed to stop + * X many characters from the end of the string */ + + if (l < 0) { + l = ((*str)->value.str.len - f) + l; + if (l < 0) { + l = 0; + } + } + + if (f >= (int)(*str)->value.str.len) { + RETURN_FALSE; + } + + if ((f + 1) > (int)(*str)->value.str.len) { + l = (int)(*str)->value.str.len - f; + } + + for (i = f; i < (f + l); i++) { + (*str)->value.str.val[i] = toupper((*str)->value.str.val[i]); + } + RETVAL_STRINGL((*str)->value.str.val, (*str)->value.str.len, 1); + } } /* }}} */ @@ -1029,21 +1083,74 @@ } /* }}} */ -/* {{{ proto string strtolower(string str) - Make a string lowercase */ +/* {{{ proto string strtolower(string str [, int from [, int length]]) + Make a string (or part of a string) lowercase */ PHP_FUNCTION(strtolower) { - zval **str; - char *ret; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str)) { + zval **str, **from, **len; + int argc = ZEND_NUM_ARGS(), f, l, i; + + if ((argc == 1 && zend_get_parameters_ex(1, &str) == FAILURE) || + (argc == 2 && zend_get_parameters_ex(2, &str, &from) == FAILURE) || + (argc == 3 && zend_get_parameters_ex(3, &str, &from, &len) == FAILURE)) { WRONG_PARAM_COUNT; } convert_to_string_ex(str); + + /* if there's only one argument, this function will work exactly like it did before */ + + if (argc == 1) { + *return_value = **str; + zval_copy_ctor(return_value); + php_strtolower(return_value->value.str.val, return_value->value.str.len); + } + + /* otherwise, it acts a lot like PHP's substr() function */ + + else { + convert_to_long_ex(from); + f = (*from)->value.lval; + + if (argc == 2) { + l = (*str)->value.str.len; + } + else if (argc == 3) { + convert_to_long_ex(len); + l = (*len)->value.lval; + } - *return_value = **str; - zval_copy_ctor(return_value); - ret = php_strtolower(return_value->value.str.val, return_value->value.str.len); + /* if the "from" position is negative, then count back from the end of the string */ + + if (f < 0) { + f = (*str)->value.str.len + f; + if (f < 0) { + f = 0; + } + } + + /* if the "length" position is negative, set it to the length needed to stop + * X many characters from the end of the string. */ + + if (l < 0) { + l = ((*str)->value.str.len - f) + l; + if (l < 0) { + l = 0; + } + } + + if (f >= (int)(*str)->value.str.len) { + RETURN_FALSE; + } + + if ((f + 1) > (int)(*str)->value.str.len) { + l = (int)(*str)->value.str.len - f; + } + + for (i = f; i < (f + l); i++) { + (*str)->value.str.val[i] = tolower((*str)->value.str.val[i]); + } + RETVAL_STRINGL((*str)->value.str.val, (*str)->value.str.len, 1); + } } /* }}} */

« previous php.dev (#63169) next »