pollita         Sun Jan  7 06:29:41 2007 UTC

  Modified files:              
    /php-src/ext/standard       user_filters.c 
    /php-src/ext/standard/tests/filters 001.phpt bug35916.phpt 
  Log:
  Remaining unicode updates for user filters
  
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/user_filters.c?r1=1.41&r2=1.42&diff_format=u
Index: php-src/ext/standard/user_filters.c
diff -u php-src/ext/standard/user_filters.c:1.41 
php-src/ext/standard/user_filters.c:1.42
--- php-src/ext/standard/user_filters.c:1.41    Mon Jan  1 09:29:32 2007
+++ php-src/ext/standard/user_filters.c Sun Jan  7 06:29:40 2007
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: user_filters.c,v 1.41 2007/01/01 09:29:32 sebastian Exp $ */
+/* $Id: user_filters.c,v 1.42 2007/01/07 06:29:40 pollita Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
@@ -31,8 +31,10 @@
 
 struct php_user_filter_data {
        zend_class_entry *ce;
-       /* variable length; this *must* be last in the structure */
-       char classname[1];
+
+       zend_uchar classname_type;
+       zstr classname;
+       int classname_len;
 };
 
 /* to provide context for calling into the next filter from user-space */
@@ -50,10 +52,13 @@
 }
 
 /* define the base filter class */
-
-PHP_FUNCTION(user_filter_nop)
+/* {{{ proto void user_filter_nop(void) U
+Non-function */
+static PHP_FUNCTION(user_filter_nop)
 {
 }
+/* }}} */
+
 static
 ZEND_BEGIN_ARG_INFO(arginfo_php_user_filter_filter, 0)
        ZEND_ARG_INFO(0, in)
@@ -269,10 +274,10 @@
                char *period;
 
                /* Userspace Filters using ambiguous wildcards could cause 
problems.
-           i.e.: myfilter.foo.bar will always call into myfilter.foo.*
-                 never seeing myfilter.* 
-           TODO: Allow failed userfilter creations to continue
-                 scanning through the list */
+                  i.e.: myfilter.foo.bar will always call into myfilter.foo.*
+                  never seeing myfilter.* 
+                  TODO: Allow failed userfilter creations to continue
+                  scanning through the list */
                if ((period = strrchr(filtername, '.'))) {
                        char *wildcard;
 
@@ -300,7 +305,7 @@
 
        /* bind the classname to the actual class */
        if (fdat->ce == NULL) {
-               if (FAILURE == zend_lookup_class(fdat->classname, 
strlen(fdat->classname),
+               if (FAILURE == zend_u_lookup_class(fdat->classname_type, 
fdat->classname, fdat->classname_len,
                                        (zend_class_entry ***)&fdat->ce 
TSRMLS_CC)) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING,
                                        "user-filter \"%s\" requires class 
\"%s\", but that class is not defined",
@@ -323,7 +328,7 @@
        PZVAL_IS_REF(obj) = 1;
 
        /* filtername */
-       add_property_string(obj, "filtername", (char*)filtername, 1);
+       add_property_rt_string(obj, "filtername", (char*)filtername, 1);
        
        /* and the parameters, if any */
        if (filterparams) {
@@ -378,9 +383,10 @@
 
 static void filter_item_dtor(struct php_user_filter_data *fdat)
 {
+       efree(fdat->classname.v);
 }
 
-/* {{{ proto object stream_bucket_make_writeable(resource brigade)
+/* {{{ proto object stream_bucket_make_writeable(resource brigade) U
    Return a bucket object from the brigade for operating on */
 PHP_FUNCTION(stream_bucket_make_writeable)
 {
@@ -405,7 +411,7 @@
                zval_ptr_dtor(&zbucket);
                if (bucket->buf_type == IS_UNICODE) {
                        add_property_unicodel(return_value, "data", 
bucket->buf.u, bucket->buflen, 1);
-                       add_property_long(return_value, "datalen", 
bucket->buflen);
+                       add_property_long(return_value, "datalen", 
u_countChar32(bucket->buf.u, bucket->buflen));
                } else {
                        add_property_stringl(return_value, "data", 
bucket->buf.s, bucket->buflen, 1);
                        add_property_long(return_value, "datalen", 
bucket->buflen);
@@ -485,7 +491,7 @@
 }
 /* }}} */
 
-/* {{{ proto void stream_bucket_prepend(resource brigade, resource bucket)
+/* {{{ proto void stream_bucket_prepend(resource brigade, resource bucket) U
    Prepend bucket to brigade */
 PHP_FUNCTION(stream_bucket_prepend)
 {
@@ -493,7 +499,7 @@
 }
 /* }}} */
 
-/* {{{ proto void stream_bucket_append(resource brigade, resource bucket)
+/* {{{ proto void stream_bucket_append(resource brigade, resource bucket) U
    Append bucket to brigade */
 PHP_FUNCTION(stream_bucket_append)
 {
@@ -501,40 +507,40 @@
 }
 /* }}} */
 
-/* {{{ proto resource stream_bucket_new(resource stream, string buffer)
+/* {{{ proto object stream_bucket_new(resource stream, string buffer) U
    Create a new bucket for use on the current stream */
 PHP_FUNCTION(stream_bucket_new)
 {
        zval *zstream, *zbucket;
        php_stream *stream;
-       zval *buffer;
+       zstr buffer;
+       int buffer_len;
+       zend_uchar buffer_type;
        php_stream_bucket *bucket;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &zstream, 
&buffer) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zt", &zstream, 
&buffer, &buffer_len, &buffer_type) == FAILURE) {
                RETURN_FALSE;
        }
 
        php_stream_from_zval(stream, &zstream);
 
        object_init(return_value);
-       if (Z_TYPE_P(buffer) == IS_UNICODE) {
-               UChar *pbuffer = peumalloc(Z_USTRLEN_P(buffer), 
php_stream_is_persistent(stream));
-               memcpy(pbuffer, buffer, UBYTES(Z_USTRLEN_P(buffer)));
+       if (buffer_type == IS_UNICODE) {
+               UChar *pbuffer = peustrndup(buffer.u, buffer_len, 
php_stream_is_persistent(stream));
 
-               bucket = php_stream_bucket_new_unicode(stream, pbuffer, 
Z_USTRLEN_P(buffer), 1, php_stream_is_persistent(stream) TSRMLS_CC);
+               bucket = php_stream_bucket_new_unicode(stream, pbuffer, 
buffer_len, 1, php_stream_is_persistent(stream) TSRMLS_CC);
 
-               add_property_zval(return_value, "data", buffer);
-               add_property_long(return_value, "datalen", Z_USTRLEN_P(buffer));
+               add_property_zstrl(return_value, "data", buffer_type, buffer, 
buffer_len, ZSTR_DUPLICATE);
+               add_property_long(return_value, "datalen", 
u_countChar32(buffer.u, buffer_len));
        } else {
-               char *pbuffer = peumalloc(Z_STRLEN_P(buffer), 
php_stream_is_persistent(stream));
-               memcpy(pbuffer, buffer, Z_STRLEN_P(buffer));
+               char *pbuffer = pestrndup(buffer.s, buffer_len, 
php_stream_is_persistent(stream));
 
-               convert_to_string(buffer);
-               bucket = php_stream_bucket_new(stream, pbuffer, 
Z_STRLEN_P(buffer), 1, php_stream_is_persistent(stream) TSRMLS_CC);
+               bucket = php_stream_bucket_new(stream, pbuffer, buffer_len, 1, 
php_stream_is_persistent(stream) TSRMLS_CC);
  
-               add_property_zval(return_value, "data", buffer);
-               add_property_long(return_value, "datalen", Z_STRLEN_P(buffer));
+               add_property_zstrl(return_value, "data", buffer_type, buffer, 
buffer_len, ZSTR_DUPLICATE);
+               add_property_long(return_value, "datalen", buffer_len);
        }
+
        ALLOC_INIT_ZVAL(zbucket);
        ZEND_REGISTER_RESOURCE(zbucket, bucket, le_bucket);
        add_property_zval(return_value, "bucket", zbucket);
@@ -543,13 +549,14 @@
 }
 /* }}} */
 
-/* {{{ proto array stream_get_filters(void)
+/* {{{ proto array stream_get_filters(void) U
    Returns a list of registered filters */
 PHP_FUNCTION(stream_get_filters)
 {
        zstr filter_name;
        uint key_flags, filter_name_len = 0;
        HashTable *filters_hash;
+       HashPosition pos;
        ulong num_key;
 
        if (ZEND_NUM_ARGS() != 0) {
@@ -561,26 +568,30 @@
        filters_hash = php_get_stream_filters_hash();
 
        if (filters_hash) {
-               for(zend_hash_internal_pointer_reset(filters_hash);
-                       (key_flags = zend_hash_get_current_key_ex(filters_hash, 
&filter_name, &filter_name_len, &num_key, 0, NULL)) != HASH_KEY_NON_EXISTANT;
-                       zend_hash_move_forward(filters_hash))
-                               if (key_flags == HASH_KEY_IS_STRING)
-                                       add_next_index_stringl(return_value, 
filter_name.s, filter_name_len, 1);
+               for(zend_hash_internal_pointer_reset_ex(filters_hash, &pos);
+                       (key_flags = zend_hash_get_current_key_ex(filters_hash, 
&filter_name, &filter_name_len, &num_key, 0, &pos)) != HASH_KEY_NON_EXISTANT;
+                       zend_hash_move_forward_ex(filters_hash, &pos)) {
+                       if (key_flags == HASH_KEY_IS_STRING) {
+                               add_next_index_rt_stringl(return_value, 
filter_name.s, filter_name_len, 1);
+                       }
+               }
        }
        /* It's okay to return an empty array if no filters are registered */
 }
 /* }}} */      
 
-/* {{{ proto bool stream_filter_register(string filtername, string classname)
+/* {{{ proto bool stream_filter_register(string filtername, string classname) U
    Registers a custom filter handler class */
 PHP_FUNCTION(stream_filter_register)
 {
-       char *filtername, *classname;
+       char *filtername;
+       zstr classname;
        int filtername_len, classname_len;
+       zend_uchar classname_type;
        struct php_user_filter_data *fdat;
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &filtername, 
&filtername_len,
-                               &classname, &classname_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "st", &filtername, 
&filtername_len,
+                               &classname, &classname_len, &classname_type) == 
FAILURE) {
                RETURN_FALSE;
        }
 
@@ -601,8 +612,10 @@
                zend_hash_init(BG(user_filter_map), 5, NULL, (dtor_func_t) 
filter_item_dtor, 0);
        }
 
-       fdat = ecalloc(1, sizeof(*fdat) + classname_len);
-       memcpy(fdat->classname, classname, classname_len);
+       fdat = ecalloc(1, sizeof(struct php_user_filter_data));
+       fdat->classname_type = classname_type;
+       fdat->classname = ezstrndup(classname_type, classname, classname_len);
+       fdat->classname_len = classname_len;
 
        if (zend_hash_add(BG(user_filter_map), filtername, filtername_len, 
(void*)fdat,
                                sizeof(*fdat) + classname_len, NULL) == SUCCESS 
&&
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/filters/001.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/standard/tests/filters/001.phpt
diff -u php-src/ext/standard/tests/filters/001.phpt:1.1 
php-src/ext/standard/tests/filters/001.phpt:1.2
--- php-src/ext/standard/tests/filters/001.phpt:1.1     Wed Oct 11 14:57:38 2006
+++ php-src/ext/standard/tests/filters/001.phpt Sun Jan  7 06:29:40 2007
@@ -26,7 +26,7 @@
 Warning: stream_filter_register() expects parameter 1 to be string, array 
given in %s on line %d
 bool(false)
 
-Warning: stream_filter_register() expects parameter 2 to be string, array 
given in %s on line %d
+Warning: stream_filter_register() expects parameter 2 to be string (Unicode or 
binary), array given in %s on line %d
 bool(false)
 Done
 --UEXPECTF--
@@ -43,6 +43,6 @@
 Warning: stream_filter_register() expects parameter 1 to be binary string, 
array given in %s on line %d
 bool(false)
 
-Warning: stream_filter_register() expects parameter 2 to be binary string, 
array given in %s on line %d
+Warning: stream_filter_register() expects parameter 2 to be string (Unicode or 
binary), array given in %s on line %d
 bool(false)
 Done
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/filters/bug35916.phpt?r1=1.2&r2=1.3&diff_format=u
Index: php-src/ext/standard/tests/filters/bug35916.phpt
diff -u php-src/ext/standard/tests/filters/bug35916.phpt:1.2 
php-src/ext/standard/tests/filters/bug35916.phpt:1.3
--- php-src/ext/standard/tests/filters/bug35916.phpt:1.2        Tue Jan 10 
16:14:45 2006
+++ php-src/ext/standard/tests/filters/bug35916.phpt    Sun Jan  7 06:29:40 2007
@@ -28,7 +28,7 @@
 }
 
 stream_filter_register("strtoupper", "strtoupper_filter");
-$fp=fopen($file, "w");
+$fp=fopen($file, "wt");
 stream_filter_append($fp,  "strtoupper");
 fread($fp, 1024);
 fwrite($fp, "Thank you\n");

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

Reply via email to