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

2001-08-14 Thread J Smith

'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 <[EMAIL PROTECTED]>]
>> 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.c11 Aug 2001 17:03:37 -  1.224
+++ stringnew.c 14 Aug 2001 15:22:11 -
@@ -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) ||
+ 

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

2001-08-14 Thread Stig Sæther Bakken

[J Smith <[EMAIL PROTECTED]>]
> 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

-- 
  Stig Sæther Bakken <[EMAIL PROTECTED]>
  Fast Search & Transfer ASA, Trondheim, Norway

-- 
PHP Development Mailing List 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]




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

2001-08-13 Thread J Smith


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.

J

-- 
PHP Development Mailing List 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]