]> granicus.if.org Git - php/commitdiff
Unicode support: fixed internal constants usage and get_defined_constants()
authorDmitry Stogov <dmitry@php.net>
Wed, 22 Feb 2006 10:02:15 +0000 (10:02 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 22 Feb 2006 10:02:15 +0000 (10:02 +0000)
Zend/zend_builtin_functions.c
Zend/zend_constants.c

index 86e1270b0f7a6c3ba586832506274d67121c57e3..23ef30f8ecd5e716a959b5d4b554ed92908853c6 100644 (file)
@@ -1663,8 +1663,8 @@ ZEND_FUNCTION(get_defined_constants)
                        zval_copy_ctor(const_val);
                        INIT_PZVAL(const_val);
 
-                       /* FIXME: Unicode support??? */
-                       add_assoc_zval_ex(modules[module_number], val->name.s, val->name_len, const_val);
+                       add_u_assoc_zval_ex(modules[module_number], UG(unicode)?IS_UNICODE:IS_STRING, val->name, val->name_len, const_val);
+
 bad_module_id:
                        zend_hash_move_forward_ex(EG(zend_constants), &pos);
                }
index 28684bfba015f1e1b0e5d81771fb1667c3d913ed..2bc0e53dd4e8845a202c7a0b9e47565b149d4356 100644 (file)
@@ -38,8 +38,12 @@ void free_zend_constant(zend_constant *c)
 
 void copy_zend_constant(zend_constant *c)
 {
-       /* FIXME: Unicode support??? */
-       c->name.s = zend_strndup(c->name.s, c->name_len - 1);
+       TSRMLS_FETCH();
+       if (UG(unicode)) {
+               c->name.u = zend_ustrndup(c->name.u, c->name_len - 1);
+       } else {
+               c->name.s = zend_strndup(c->name.s, c->name_len - 1);
+       }
        if (!(c->flags & CONST_PERSISTENT)) {
                zval_copy_ctor(&c->value);
        }
@@ -358,7 +362,26 @@ ZEND_API int zend_u_register_constant(zend_uchar type, zend_constant *c TSRMLS_D
 
 ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC)
 {
-       return zend_u_register_constant(IS_STRING, c TSRMLS_CC);
+       if (UG(unicode)) {
+               UChar *ustr;
+
+               if (c->name.s) {
+                       ustr = malloc(UBYTES(c->name_len));
+                       u_charsToUChars(c->name.s, ustr, c->name_len);
+                       free(c->name.s);
+                       c->name.u = ustr;
+               }
+               if (Z_TYPE(c->value) == IS_STRING || Z_TYPE(c->value) == IS_CONSTANT) {
+                       ustr = pemalloc(UBYTES(Z_STRLEN(c->value)+1), c->flags & CONST_PERSISTENT);
+                       u_charsToUChars(Z_STRVAL(c->value), ustr, Z_STRLEN(c->value)+1);
+                       pefree(Z_STRVAL(c->value), c->flags & CONST_PERSISTENT);
+                       Z_USTRVAL(c->value) = ustr;
+                       if (Z_TYPE(c->value) == IS_STRING) Z_TYPE(c->value) = IS_UNICODE;
+               }
+               return zend_u_register_constant(IS_UNICODE, c TSRMLS_CC);
+       } else {
+               return zend_u_register_constant(IS_STRING, c TSRMLS_CC);
+       }
 }
 /*
  * Local variables: