moriyoshi               Wed Oct 23 19:25:27 2002 EDT

  Modified files:              
    /php4/ext/mbstring  mbstring.c mbstring.h 
    /php4/main  rfc1867.c 
  Log:
  Make php_mb_is_mb_leadbyte() obsolete. It only works with double-byte chars.
  # Sorry Marcus, it seems we were working simultaneously :)
  
  
Index: php4/ext/mbstring/mbstring.c
diff -u php4/ext/mbstring/mbstring.c:1.119 php4/ext/mbstring/mbstring.c:1.120
--- php4/ext/mbstring/mbstring.c:1.119  Wed Oct 23 19:07:14 2002
+++ php4/ext/mbstring/mbstring.c        Wed Oct 23 19:25:26 2002
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: mbstring.c,v 1.119 2002/10/23 23:07:14 helly Exp $ */
+/* $Id: mbstring.c,v 1.120 2002/10/23 23:25:26 moriyoshi Exp $ */
 
 /*
  * PHP4 Multibyte String module "mbstring" (currently only for Japanese)
@@ -412,7 +412,7 @@
 }
 /* }}} */
 
-/* {{{ php_mb_parse_encoding_array
+/* {{{ static int php_mb_parse_encoding_array()
  *  Return 0 if input contains any illegal encoding, otherwise 1.
  *  Even if any illegal encoding is detected the result may contain a list 
  *  of parsed encodings.
@@ -489,7 +489,7 @@
 /* }}} */
 
 #if HAVE_MBREGEX
-/* {{{ php_mbregex_free_cache */
+/* {{{ static void php_mbregex_free_cache() */
 static void
 php_mbregex_free_cache(mb_regex_t *pre) 
 {
@@ -1510,38 +1510,6 @@
 #define IS_SJIS1(c) ((((c)>=0x81 && (c)<=0x9f) || ((c)>=0xe0 && (c)<=0xf5)) ? 1 : 0)
 #define IS_SJIS2(c) ((((c)>=0x40 && (c)<=0x7e) || ((c)>=0x80 && (c)<=0xfc)) ? 1 : 0)
 
-/* {{{ PHPAPI char *php_mb_strrchr() */
-PHPAPI char *php_mb_strrchr(const char *s, char c TSRMLS_DC)
-{
-       unsigned char *p = (unsigned char *)s, *last = NULL;
-       while(*p++) {
-               if (*p == c) {
-                       last = p;
-               }
-               if (*p == '\0'){
-                       break;
-               }
-               if (MBSTRG(current_language) == mbfl_no_language_japanese 
-                       && IS_SJIS1(*p) && IS_SJIS2(*(p+1))) {
-                       p++;
-               }
-       }
-       return last;
-}
-/* }}} */
-
-/* {{{ PHPAPI int php_mb_is_mb_leadbyte() */
-PHPAPI int php_mb_is_mb_leadbyte(const char *s TSRMLS_DC)
-{
-       unsigned char *p = (unsigned char *)s;
-       if (MBSTRG(current_language) == mbfl_no_language_japanese 
-               && IS_SJIS1(*p) && IS_SJIS2(*(p+1))) {
-               return 1;
-       }
-       return 0;
-}
-/* }}} */
-
 /* {{{ SAPI_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data)
  * http input processing */
 SAPI_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data)
@@ -3474,6 +3442,79 @@
 PHPAPI int php_mb_encoding_translation(TSRMLS_D) 
 {
        return MBSTRG(encoding_translation);
+}
+/* }}} */
+
+/* {{{ PHPAPI size_t php_mb_mbchar_bytes_ex() */
+PHPAPI size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *enc)
+{
+       if (enc != NULL) {
+               if(enc->flag & MBFL_ENCTYPE_MBCS) {
+                       if(enc->mblen_table != NULL) {
+                               if (*s != '\0') return enc->mblen_table[*(unsigned 
+char *)s];
+                       }
+               } else if (enc->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) {
+                       return 2;
+               } else if (enc->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) {
+                       return 4;
+               }
+       }
+       return 1;
+}
+/* }}} */
+
+/* {{{ PHPAPI size_t php_mb_mbchar_bytes() */
+PHPAPI size_t php_mb_mbchar_bytes(const char *s TSRMLS_DC)
+{
+       return php_mb_mbchar_bytes_ex(s,
+               mbfl_no2encoding(MBSTRG(internal_encoding)));
+}
+/* }}} */
+
+/* {{{ PHPAPI char *php_mb_safe_strrchr_ex() */
+PHPAPI char *php_mb_safe_strrchr_ex(const char *s, unsigned int c, size_t nbytes, 
+const mbfl_encoding *enc)
+{
+       register const char *p = s;
+       char *last;
+
+       if (nbytes == (size_t)-1) {
+               while (*p != '\0') {
+                       if (*p == c) {
+                               last = (char *)p;
+                       }
+                       p += php_mb_mbchar_bytes_ex(p, enc);
+               }
+       } else {
+               register size_t bcnt = nbytes;
+               register size_t nbytes_char;
+               while (bcnt > 0) {
+                       if (*p == c) {
+                               last = (char *)p;
+                       }
+                       nbytes_char = php_mb_mbchar_bytes_ex(p, enc);
+                       if (bcnt < nbytes_char) {
+                               return NULL;
+                       }
+                       p += nbytes_char;
+                       bcnt -= nbytes_char;
+               }
+       }
+       return last;
+}
+/* }}} */
+
+/* {{{ PHPAPI char *php_mb_safe_strrchr() */
+PHPAPI char *php_mb_safe_strrchr(const char *s, unsigned int c, size_t nbytes 
+TSRMLS_DC)
+{
+       return php_mb_safe_strrchr_ex(s, c, nbytes,
+               mbfl_no2encoding(MBSTRG(internal_encoding)));
+}
+/* }}} */
+
+/* {{{ PHPAPI char *php_mb_strrchr() */
+PHPAPI char *php_mb_strrchr(const char *s, char c TSRMLS_DC)
+{
+       return php_mb_safe_strrchr(s, c, -1 TSRMLS_CC);
 }
 /* }}} */
 
Index: php4/ext/mbstring/mbstring.h
diff -u php4/ext/mbstring/mbstring.h:1.38 php4/ext/mbstring/mbstring.h:1.39
--- php4/ext/mbstring/mbstring.h:1.38   Wed Oct 23 19:08:20 2002
+++ php4/ext/mbstring/mbstring.h        Wed Oct 23 19:25:26 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: mbstring.h,v 1.38 2002/10/23 23:08:20 helly Exp $ */
+/* $Id: mbstring.h,v 1.39 2002/10/23 23:25:26 moriyoshi Exp $ */
 
 /*
  * PHP4 Multibyte String module "mbstring" (currently only for Japanese)
@@ -58,10 +58,7 @@
 #include "mbfilter.h"
 #include "SAPI.h"
 
-#define PHP_MBSTRING_API 20020405
-
-PHPAPI char * php_mb_convert_encoding(char *input, size_t length, char *_to_encoding, 
char *_from_encodings, size_t *output_len TSRMLS_DC);
-PHPAPI int php_mb_check_encoding_list(const char *encoding_list TSRMLS_DC);
+#define PHP_MBSTRING_API 20021024
 
 #if HAVE_MBREGEX
 #include "php_mbregex.h"
@@ -109,10 +106,25 @@
 PHP_FUNCTION(mb_send_mail);
 PHP_FUNCTION(mb_get_info);
 
-PHPAPI char *php_mb_strrchr(const char *s, char c TSRMLS_DC);
-PHPAPI int php_mb_is_leadbyte(const char *s TSRMLS_DC);
 PHPAPI int php_mb_encoding_translation(TSRMLS_D);
 
+PHPAPI char *php_mb_safe_strrchr_ex(const char *s, unsigned int c,
+                                    size_t nbytes, const mbfl_encoding *enc);
+PHPAPI char *php_mb_safe_strrchr(const char *s, unsigned int c,
+                                 size_t nbytes TSRMLS_DC);
+PHPAPI char *php_mb_strrchr(const char *s, char c TSRMLS_DC);
+
+PHPAPI char * php_mb_convert_encoding(char *input, size_t length,
+                                      char *_to_encoding,
+                                      char *_from_encodings,
+                                      size_t *output_len TSRMLS_DC);
+
+PHPAPI int php_mb_check_encoding_list(const char *encoding_list TSRMLS_DC);
+
+PHPAPI size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *enc);
+PHPAPI size_t php_mb_mbchar_bytes(const char *s TSRMLS_DC);
+
+
 ZEND_BEGIN_MODULE_GLOBALS(mbstring)
        int language;
        int current_language;
@@ -184,8 +196,6 @@
 #endif /* HAVE_MBSTRING */
 
 #define phpext_mbstring_ptr mbstring_module_ptr
-
-PHPAPI int php_mb_is_mb_leadbyte(const char *s TSRMLS_DC);
 
 #endif         /* _MBSTRING_H */
 
Index: php4/main/rfc1867.c
diff -u php4/main/rfc1867.c:1.119 php4/main/rfc1867.c:1.120
--- php4/main/rfc1867.c:1.119   Wed Oct 23 15:51:50 2002
+++ php4/main/rfc1867.c Wed Oct 23 19:25:27 2002
@@ -16,7 +16,7 @@
    |          Jani Taskinen <[EMAIL PROTECTED]>                              |
    +----------------------------------------------------------------------+
  */
-/* $Id: rfc1867.c,v 1.119 2002/10/23 19:51:50 moriyoshi Exp $ */
+/* $Id: rfc1867.c,v 1.120 2002/10/23 23:25:27 moriyoshi Exp $ */
 
 /*
  *  This product includes software developed by the Apache Group
@@ -512,9 +512,11 @@
                } else {
                        *resp++ = start[i];
 #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING)
-                       if (php_mb_encoding_translation(TSRMLS_C) && 
-                               php_mb_is_mb_leadbyte(start+i TSRMLS_CC)) {
-                               *resp++ = start[++i];
+                       if (php_mb_encoding_translation(TSRMLS_C)) {
+                               size_t j = php_mb_mbchar_bytes(start+i TSRMLS_CC);
+                               while (j-- > 0) {
+                                       *resp++ = start[++i];
+                               }
                        }
 #endif
                }



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

Reply via email to