mike            Wed Aug  9 13:56:45 2006 UTC

  Added files:                 
    /php-src/tests/output       ob_018.phpt ob_019.phpt 

  Modified files:              
    /php-src/main       output.c php_output.h 
    /php-src/tests/output       ob_013.phpt 
  Log:
  - error message enhancements
  - avoid duplicate error messages
  - add PHP_OUTPUT_HANDLER_FLUSHABLE
  - add PHP_OUTPUT_HANDLER_HOOK_GET_LEVEL
  - add more tests
  
  
http://cvs.php.net/viewvc.cgi/php-src/main/output.c?r1=1.186&r2=1.187&diff_format=u
Index: php-src/main/output.c
diff -u php-src/main/output.c:1.186 php-src/main/output.c:1.187
--- php-src/main/output.c:1.186 Wed Aug  9 10:57:46 2006
+++ php-src/main/output.c       Wed Aug  9 13:56:45 2006
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: output.c,v 1.186 2006/08/09 10:57:46 mike Exp $ */
+/* $Id: output.c,v 1.187 2006/08/09 13:56:45 mike Exp $ */
 
 #ifndef PHP_OUTPUT_DEBUG
 #      define PHP_OUTPUT_DEBUG 0
@@ -157,6 +157,7 @@
        REGISTER_MAIN_LONG_CONSTANT("PHP_OUTPUT_HANDLER_END", 
PHP_OUTPUT_HANDLER_FINAL, CONST_CS | CONST_PERSISTENT);
 
        REGISTER_MAIN_LONG_CONSTANT("PHP_OUTPUT_HANDLER_CLEANABLE", 
PHP_OUTPUT_HANDLER_CLEANABLE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_MAIN_LONG_CONSTANT("PHP_OUTPUT_HANDLER_FLUSHABLE", 
PHP_OUTPUT_HANDLER_FLUSHABLE, CONST_CS | CONST_PERSISTENT);
        REGISTER_MAIN_LONG_CONSTANT("PHP_OUTPUT_HANDLER_REMOVABLE", 
PHP_OUTPUT_HANDLER_REMOVABLE, CONST_CS | CONST_PERSISTENT);
        REGISTER_MAIN_LONG_CONSTANT("PHP_OUTPUT_HANDLER_STDFLAGS", 
PHP_OUTPUT_HANDLER_STDFLAGS, CONST_CS | CONST_PERSISTENT);
        REGISTER_MAIN_LONG_CONSTANT("PHP_OUTPUT_HANDLER_STARTED", 
PHP_OUTPUT_HANDLER_STARTED, CONST_CS | CONST_PERSISTENT);
@@ -266,13 +267,13 @@
 }
 /* }}} */
 
-/* {{{ void php_output_flush(TSRMLS_D)
+/* {{{ SUCCESS|FAILURE php_output_flush(TSRMLS_D)
        Flush the most recent output handlers buffer */
-PHPAPI void php_output_flush(TSRMLS_D)
+PHPAPI int php_output_flush(TSRMLS_D)
 {
        php_output_context context;
        
-       if (OG(active)) {
+       if (OG(active) && (OG(active)->flags & PHP_OUTPUT_HANDLER_FLUSHABLE)) {
                php_output_context_init(&context, PHP_OUTPUT_HANDLER_FLUSH 
TSRMLS_CC);
                php_output_handler_op(OG(active), &context);
                if (context.out.data && context.out.used) {
@@ -281,7 +282,9 @@
                        zend_stack_push(&OG(handlers), &OG(active), 
sizeof(php_output_handler *));
                }
                php_output_context_dtor(&context);
+               return SUCCESS;
        }
+       return FAILURE;
 }
 /* }}} */
 
@@ -638,7 +641,7 @@
 /* }}} */
 
 /* {{{ SUCCESS|FAILURE php_output_handler_alias_register(zval *name, 
php_output_handler_context_func_t func TSRMLS_DC)
-+      Registers an internal output handler as alias for a user handler */
+       Registers an internal output handler as alias for a user handler */
 PHPAPI int php_output_handler_alias_register_ex(zval *name, 
php_output_handler_context_func_t func TSRMLS_DC)
 {
        if (!EG(current_module)) {
@@ -661,6 +664,8 @@
                        case PHP_OUTPUT_HANDLER_HOOK_GET_FLAGS:
                                *(int *) arg = OG(running)->flags;
                                return SUCCESS;
+                       case PHP_OUTPUT_HANDLER_HOOK_GET_LEVEL:
+                               *(int *) arg = OG(running)->level;
                        case PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE:
                                OG(running)->flags &= 
~PHP_OUTPUT_HANDLER_STDFLAGS;
                                return SUCCESS;
@@ -1165,10 +1170,10 @@
        php_output_handler **current, *orphan = OG(active);
        
        if (!orphan) {
-               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer. No buffer to delete.");
+               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to %s buffer. No buffer to %s", discard?"discard":"send", 
discard?"discard":"send");
                return 0;
        } else if (!shutdown && !(orphan->flags & 
PHP_OUTPUT_HANDLER_REMOVABLE)) {
-               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer %s.", orphan->name);
+               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to %s buffer of %v (%d)", discard?"discard":"send", Z_UNIVAL_P(orphan->name), 
orphan->level);
                return 0;
        } else {
                php_output_context_init(&context, PHP_OUTPUT_HANDLER_FINAL 
TSRMLS_CC);
@@ -1259,7 +1264,7 @@
        long chunk_size = 0;
        long flags = PHP_OUTPUT_HANDLER_STDFLAGS;
        
-       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
"|z/lb", &output_handler, &chunk_size, &flags)) {
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
"|z/ll", &output_handler, &chunk_size, &flags)) {
                RETURN_FALSE;
        }
        if (chunk_size < 0) {
@@ -1286,8 +1291,10 @@
                php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to flush buffer. No buffer to flush");
                RETURN_FALSE;
        }
-       
-       php_output_flush(TSRMLS_C);
+       if (SUCCESS != php_output_flush(TSRMLS_C)) {
+               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to flush buffer of %v (%d)", Z_UNIVAL_P(OG(active)->name), OG(active)->level);
+               RETURN_FALSE;
+       }
        RETURN_TRUE;
 }
 /* }}} */
@@ -1306,7 +1313,7 @@
                RETURN_FALSE;
        }
        if (SUCCESS != php_output_clean(TSRMLS_C)) {
-               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer of %v", Z_UNIVAL_P(OG(active)->name));
+               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer of %v (%d)", Z_UNIVAL_P(OG(active)->name), OG(active)->level);
                RETURN_FALSE;
        }
        RETURN_TRUE;
@@ -1325,11 +1332,7 @@
                php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete and flush buffer. No buffer to delete or flush");
                RETURN_FALSE;
        }
-       if (SUCCESS != php_output_end(TSRMLS_C)) {
-               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer of %v", Z_UNIVAL_P(OG(active)->name));
-               RETURN_FALSE;
-       }
-       RETURN_TRUE;
+       RETURN_BOOL(SUCCESS == php_output_end(TSRMLS_C));
 }
 /* }}} */
 
@@ -1345,11 +1348,7 @@
                php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer. No buffer to delete");
                RETURN_FALSE;
        }
-       if (SUCCESS != php_output_discard(TSRMLS_C)) {
-               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer of %v", Z_UNIVAL_P(OG(active)->name));
-               RETURN_FALSE;
-       }
-       RETURN_TRUE;
+       RETURN_BOOL(SUCCESS == php_output_discard(TSRMLS_C));
 }
 /* }}} */
 
@@ -1366,7 +1365,7 @@
                RETURN_FALSE;
        }
        if (SUCCESS != php_output_end(TSRMLS_C)) {
-               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer of %v", Z_UNIVAL_P(OG(active)->name));
+               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer of %v (%d)", Z_UNIVAL_P(OG(active)->name), OG(active)->level);
        }
 }
 /* }}} */
@@ -1384,7 +1383,7 @@
                RETURN_FALSE;
        }
        if (SUCCESS != php_output_discard(TSRMLS_C)) {
-               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer of %v", Z_UNIVAL_P(OG(active)->name));
+               php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to delete buffer of %v (%d)", Z_UNIVAL_P(OG(active)->name), OG(active)->level);
        }
 }
 /* }}} */
@@ -1443,7 +1442,7 @@
 }
 /* }}} */
 
-/* {{{ proto false|array ob_get_status([bool full_status])
+/* {{{ proto false|array ob_get_status([bool full_status]) U
    Return the status of the active or all output buffers */
 PHP_FUNCTION(ob_get_status)
 {
@@ -1465,7 +1464,7 @@
 }
 /* }}} */
 
-/* {{{ proto void ob_implicit_flush([int flag])
+/* {{{ proto void ob_implicit_flush([int flag]) U
    Turn implicit flush on/off and is equivalent to calling flush() after every 
output call */
 PHP_FUNCTION(ob_implicit_flush)
 {
http://cvs.php.net/viewvc.cgi/php-src/main/php_output.h?r1=1.59&r2=1.60&diff_format=u
Index: php-src/main/php_output.h
diff -u php-src/main/php_output.h:1.59 php-src/main/php_output.h:1.60
--- php-src/main/php_output.h:1.59      Mon Jun 12 18:18:39 2006
+++ php-src/main/php_output.h   Wed Aug  9 13:56:45 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_output.h,v 1.59 2006/06/12 18:18:39 mike Exp $ */
+/* $Id: php_output.h,v 1.60 2006/08/09 13:56:45 mike Exp $ */
 
 #ifndef PHP_OUTPUT_H
 #define PHP_OUTPUT_H
@@ -38,8 +38,9 @@
 
 /* handler ability flags */
 #define PHP_OUTPUT_HANDLER_CLEANABLE   0x0010
-#define PHP_OUTPUT_HANDLER_REMOVABLE   0x0020
-#define PHP_OUTPUT_HANDLER_STDFLAGS            0x0030
+#define PHP_OUTPUT_HANDLER_FLUSHABLE   0x0020
+#define PHP_OUTPUT_HANDLER_REMOVABLE   0x0040
+#define PHP_OUTPUT_HANDLER_STDFLAGS            0x0070
 
 /* handler status flags */
 #define PHP_OUTPUT_HANDLER_STARTED             0x1000
@@ -60,8 +61,9 @@
 /* handler hooks */
 #define PHP_OUTPUT_HANDLER_HOOK_GET_OPAQ       1
 #define PHP_OUTPUT_HANDLER_HOOK_GET_FLAGS      2
-#define PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE      3
-#define PHP_OUTPUT_HANDLER_HOOK_DISABLE                4
+#define PHP_OUTPUT_HANDLER_HOOK_GET_LEVEL      3
+#define PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE      4
+#define PHP_OUTPUT_HANDLER_HOOK_DISABLE                5
 
 #define PHP_OUTPUT_HANDLER_INITBUF_SIZE(s) \
 ( (s) ? \
@@ -183,7 +185,7 @@
 PHPAPI int php_output_write_ascii(const char *str, size_t len TSRMLS_DC);
 PHPAPI int php_output_write(const char *str, size_t len TSRMLS_DC);
 
-PHPAPI void php_output_flush(TSRMLS_D);
+PHPAPI int php_output_flush(TSRMLS_D);
 PHPAPI void php_output_flush_all(TSRMLS_D);
 PHPAPI int php_output_clean(TSRMLS_D);
 PHPAPI void php_output_clean_all(TSRMLS_D);
http://cvs.php.net/viewvc.cgi/php-src/tests/output/ob_013.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/tests/output/ob_013.phpt
diff -u php-src/tests/output/ob_013.phpt:1.1 
php-src/tests/output/ob_013.phpt:1.2
--- php-src/tests/output/ob_013.phpt:1.1        Fri Jun  2 19:51:43 2006
+++ php-src/tests/output/ob_013.phpt    Wed Aug  9 13:56:45 2006
@@ -39,7 +39,7 @@
 (
     [name] => d
     [type] => 1
-    [flags] => 4145
+    [flags] => 4209
     [level] => 4
     [chunk_size] => 0
     [buffer_size] => 16384
@@ -51,7 +51,7 @@
         (
             [name] => default output handler
             [type] => 0
-            [flags] => 48
+            [flags] => 112
             [level] => 0
             [chunk_size] => 0
             [buffer_size] => 16384
@@ -62,7 +62,7 @@
         (
             [name] => a
             [type] => 1
-            [flags] => 49
+            [flags] => 113
             [level] => 1
             [chunk_size] => 0
             [buffer_size] => 16384
@@ -73,7 +73,7 @@
         (
             [name] => b
             [type] => 1
-            [flags] => 49
+            [flags] => 113
             [level] => 2
             [chunk_size] => 0
             [buffer_size] => 16384
@@ -84,7 +84,7 @@
         (
             [name] => c
             [type] => 1
-            [flags] => 49
+            [flags] => 113
             [level] => 3
             [chunk_size] => 0
             [buffer_size] => 16384
@@ -95,7 +95,7 @@
         (
             [name] => d
             [type] => 1
-            [flags] => 4145
+            [flags] => 4209
             [level] => 4
             [chunk_size] => 0
             [buffer_size] => 16384

http://cvs.php.net/viewvc.cgi/php-src/tests/output/ob_018.phpt?view=markup&rev=1.1
Index: php-src/tests/output/ob_018.phpt
+++ php-src/tests/output/ob_018.phpt
--TEST--
output buffering - error message nirvana bug #37714
--ENV--
HTTP_ACCEPT_ENCODING=gzip,deflate
--INI--
display_errors=1
zlib.output_compression=1
--FILE--
<?php
ob_start('ob_gzhandler');
?>
--EXPECTF--
‹

http://cvs.php.net/viewvc.cgi/php-src/tests/output/ob_019.phpt?view=markup&rev=1.1
Index: php-src/tests/output/ob_019.phpt
+++ php-src/tests/output/ob_019.phpt
--TEST--
output buffering - flags
--FILE--
<?php
declare(encoding="latin1");

echo "\n==".ob_get_level()."==\n";
ob_start(null, 0, PHP_OUTPUT_HANDLER_CLEANABLE);
echo "N:clean\n";
ob_clean();
ob_flush();

echo "\n==".ob_get_level()."==\n";
ob_start(null, 0, PHP_OUTPUT_HANDLER_FLUSHABLE);
echo "Y:flush\n";
ob_clean();
ob_flush();

echo "\n==".ob_get_level()."==\n";
ob_start(null, 0, PHP_OUTPUT_HANDLER_REMOVABLE);
echo "N:remove-clean\n";
ob_end_clean();

echo "\n==".ob_get_level()."==\n";
ob_start(null, 0, PHP_OUTPUT_HANDLER_REMOVABLE);
echo "Y:remove-flush\n";
ob_end_flush();

echo "\n==".ob_get_level()."==\n";
ob_start(null, 0, PHP_OUTPUT_HANDLER_STDFLAGS);
echo "N:standard\n";
ob_end_clean();

?>
--EXPECTF--

==0==

Notice: ob_flush(): failed to flush buffer of default output handler (0) in 
%sob_019.php on line %d

==1==
Y:flush

Notice: ob_clean(): failed to delete buffer of default output handler (1) in 
%sob_019.php on line %d

==2==

==2==
Y:remove-flush

==2==

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

Reply via email to