Excuse me, this must be the last one :-)

Moriyoshi


"Moriyoshi Koizumi" <[EMAIL PROTECTED]> wrote:

> moriyoshi             Sun Nov 10 21:39:32 2002 EDT
> 
>   Modified files:              
>     /php4/ext/mbstring        php_unicode.c 
>   Log:
>   Fixed mb_convert_case() / mb_strtolower() / mb_strtoupper() to work in  
>   64bit systems
>   
>   
> Index: php4/ext/mbstring/php_unicode.c
> diff -u php4/ext/mbstring/php_unicode.c:1.3 php4/ext/mbstring/php_unicode.c:1.4
> --- php4/ext/mbstring/php_unicode.c:1.3       Wed Oct 23 16:32:51 2002
> +++ php4/ext/mbstring/php_unicode.c   Sun Nov 10 21:39:32 2002
> @@ -224,55 +224,69 @@
>  
>  }
>  
> -#ifdef WORDS_BIGENDIAN
> -# define NATIVE_UNICODE_ENCODING "UCS-4BE"
> -#else
> -# define NATIVE_UNICODE_ENCODING "UCS-4LE"
> -#endif
> +
> +#define BE_ARY_TO_UINT32(ptr) (\
> +     ((unsigned char*)(ptr))[0]<<24 |\
> +     ((unsigned char*)(ptr))[1]<<16 |\
> +     ((unsigned char*)(ptr))[2]<< 8 |\
> +     ((unsigned char*)(ptr))[3] )
> +
> +#define UINT32_TO_BE_ARY(ptr,val) { \
> +     unsigned int v = val; \
> +     ((unsigned char*)(ptr))[0] = (v>>24) & 0xff,\
> +     ((unsigned char*)(ptr))[1] = (v>>16) & 0xff,\
> +     ((unsigned char*)(ptr))[2] = (v>> 8) & 0xff,\
> +     ((unsigned char*)(ptr))[3] = (v    ) & 0xff;\
> +}
>  
>  PHPAPI char *php_unicode_convert_case(int case_mode, char *srcstr, size_t srclen, 
>size_t *ret_len,
>               char *src_encoding TSRMLS_DC)
>  {
>       char *unicode, *newstr;
>       size_t unicode_len;
> -     unsigned long *unicode_ptr;
> +     unsigned char *unicode_ptr;
>       size_t i;
>  
> -     unicode = php_mb_convert_encoding(srcstr, srclen, NATIVE_UNICODE_ENCODING, 
>src_encoding, &unicode_len TSRMLS_CC);
> +     unicode = php_mb_convert_encoding(srcstr, srclen, "UCS-4BE", src_encoding, 
>&unicode_len TSRMLS_CC);
>       if (unicode == NULL)
>               return NULL;
>       
> -     unicode_ptr = (unsigned long*)unicode;
> +     unicode_ptr = unicode;
>  
>       switch(case_mode) {
>               case PHP_UNICODE_CASE_UPPER:
> -                     for (i = 0; i < unicode_len / sizeof(unsigned long); i++) {
> -                             unicode_ptr[i] = php_unicode_toupper(unicode_ptr[i]);
> +                     for (i = 0; i < unicode_len; i+=4) {
> +                             UINT32_TO_BE_ARY(&unicode_ptr[i],
> +                                     
>php_unicode_toupper(BE_ARY_TO_UINT32(&unicode_ptr[i])));
>                       }
>                       break;
>  
>               case PHP_UNICODE_CASE_LOWER:
> -                     for (i = 0; i < unicode_len / sizeof(unsigned long); i++) {
> -                             unicode_ptr[i] = php_unicode_tolower(unicode_ptr[i]);
> +                     for (i = 0; i < unicode_len; i+=4) {
> +                             UINT32_TO_BE_ARY(&unicode_ptr[i],
> +                                     
>php_unicode_tolower(BE_ARY_TO_UINT32(&unicode_ptr[i])));
>                       }
>                       break;
>  
>               case PHP_UNICODE_CASE_TITLE: {
>                       int mode = 0; 
>  
> -                     for (i = 0; i < unicode_len / sizeof(unsigned long); i++) {
> -                             int res = php_unicode_is_prop(unicode_ptr[i],
> +                     for (i = 0; i < unicode_len; i+=4) {
> +                             int res = php_unicode_is_prop(
> +                                     BE_ARY_TO_UINT32(&unicode_ptr[i]),
>                                       
>UC_MN|UC_ME|UC_CF|UC_LM|UC_SK|UC_LU|UC_LL|UC_LT, 0);
>                               if (mode) {
>                                       if (res) {
> -                                             unicode_ptr[i] = 
>php_unicode_tolower(unicode_ptr[i]);
> +                                             UINT32_TO_BE_ARY(&unicode_ptr[i],
> +                                                     
>php_unicode_tolower(BE_ARY_TO_UINT32(&unicode_ptr[i])));
>                                       } else {
>                                               mode = 0;
>                                       }       
>                               } else {
>                                       if (res) {
>                                               mode = 1;
> -                                             unicode_ptr[i] = 
>php_unicode_totitle(unicode_ptr[i]);
> +                                             UINT32_TO_BE_ARY(&unicode_ptr[i],
> +                                                     
>php_unicode_totitle(BE_ARY_TO_UINT32(&unicode_ptr[i])));
>                                       }
>                               }
>                       }
> @@ -280,7 +294,7 @@
>  
>       }
>       
> -     newstr = php_mb_convert_encoding(unicode, unicode_len, src_encoding, 
>NATIVE_UNICODE_ENCODING, ret_len TSRMLS_CC);
> +     newstr = php_mb_convert_encoding(unicode, unicode_len, src_encoding, 
>"UCS-4BE", ret_len TSRMLS_CC);
>       efree(unicode);
>  
>       return newstr;
> 
> 
> 
> -- 
> PHP CVS Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
> 


-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to