]> granicus.if.org Git - php/commitdiff
full decopling of size parameters of ob_start() and internal buffer handlers
authorMarcus Boerger <helly@php.net>
Wed, 21 Aug 2002 03:04:17 +0000 (03:04 +0000)
committerMarcus Boerger <helly@php.net>
Wed, 21 Aug 2002 03:04:17 +0000 (03:04 +0000)
#intended behaviour is now fully implemented,

main/output.c
main/php_output.h

index 4a0f81954a9c1c0bdefbee668f1ad7721dfa0608..bb6a1749fbf506f88a086cd7539cc73e1ab4862c 100644 (file)
@@ -135,28 +135,42 @@ PHPAPI int php_start_ob_buffer(zval *output_handler, uint chunk_size, zend_bool
                php_error_docref("ref.outcontrol" TSRMLS_CC, E_ERROR, "Cannot use output buffering in output buffering display handlers");
                return FAILURE;
        }
-       if (OG(ob_nesting_level)==0 && PG(double_buffering) && chunk_size) {            
+       if (OG(ob_nesting_level)==0 && PG(double_buffering)) {          
                initial_chunk_size = php_ob_default_buffer_size(TSRMLS_C);
                initial_size = 4*initial_chunk_size;
                block_size = initial_chunk_size;
                php_ob_init(initial_size, block_size, NULL, initial_chunk_size, erase TSRMLS_CC);
        }
-       if (chunk_size==0) {
-               initial_size = 40*1024;
-               block_size = 10*1024;
-       } else {
-               if (chunk_size==1) {
-                       chunk_size = php_ob_default_buffer_size(TSRMLS_C);
-               }
-               initial_size = chunk_size;
-               block_size = chunk_size;
+       if (chunk_size<2) {
+               chunk_size = php_ob_default_buffer_size(TSRMLS_C);
        }
-       initial_size = chunk_size;
        block_size = chunk_size;
+       initial_size = block_size;
        return php_ob_init(initial_size, block_size, output_handler, chunk_size, erase TSRMLS_CC);
 }
 /* }}} */
 
+/* {{{ php_start_ob_buffer_nc
+ * Start output buffering */
+PHPAPI int php_start_ob_buffer_ibc(zval *output_handler, uint initial_size, uint block_size, uint chunk_size, zend_bool erase TSRMLS_DC)
+{
+       if (OG(ob_lock)) {
+               php_error_docref("ref.outcontrol" TSRMLS_CC, E_ERROR, "Cannot use output buffering in output buffering display handlers");
+               return FAILURE;
+       }
+       if (chunk_size==0) {
+               block_size = 10*1024;
+               initial_size = 4*block_size;
+       } else if (chunk_size==1) {
+               chunk_size = php_ob_default_buffer_size(TSRMLS_C);
+       }
+       if (!block_size)
+               block_size = chunk_size;
+       if (!initial_size)
+               initial_size = block_size;
+       return php_ob_init(initial_size, block_size, output_handler, chunk_size, erase TSRMLS_CC);
+}
+/* }}} */
 
 /* {{{ php_start_ob_buffer_named
  * Start output buffering */
@@ -360,6 +374,7 @@ PHPAPI void php_ob_set_internal_handler(php_output_handler_func_t internal_outpu
        OG(active_ob_buffer).internal_output_handler = internal_output_handler;
        OG(active_ob_buffer).internal_output_handler_buffer = (char *) emalloc(buffer_size);
        OG(active_ob_buffer).internal_output_handler_buffer_size = buffer_size;
+       OG(active_ob_buffer).chunk_size = buffer_size;
        if (OG(active_ob_buffer).handler_name)
                efree(OG(active_ob_buffer).handler_name);
        OG(active_ob_buffer).handler_name = estrdup(handler_name);
@@ -733,7 +748,7 @@ PHP_FUNCTION(ob_start)
                                                          &chunk_size, &erase) == FAILURE)
                RETURN_FALSE;
 
-       if (php_start_ob_buffer(output_handler, chunk_size, erase TSRMLS_CC)==FAILURE) {
+       if (php_start_ob_buffer_ibc(output_handler, 0, 0, chunk_size, erase TSRMLS_CC)==FAILURE) {
                RETURN_FALSE;
        }
        RETURN_TRUE;
index eb26087a0bae933970a9ff12bffa071645171610..a9cb0fd0912da91136a1588a56357ecc3df68b2a 100644 (file)
@@ -31,6 +31,7 @@ PHPAPI int  php_body_write(const char *str, uint str_length TSRMLS_DC);
 PHPAPI int  php_header_write(const char *str, uint str_length TSRMLS_DC);
 PHPAPI int php_start_ob_buffer(zval *output_handler, uint chunk_size, zend_bool erase TSRMLS_DC);
 PHPAPI int php_start_ob_buffer_named(const char *output_handler_name, uint chunk_size, zend_bool erase TSRMLS_DC);
+PHPAPI int php_start_ob_buffer_ibc(zval *output_handler, uint initial_size, uint block_size, uint chunk_size, zend_bool erase TSRMLS_DC);
 PHPAPI void php_end_ob_buffer(zend_bool send_buffer, zend_bool just_flush TSRMLS_DC);
 PHPAPI void php_end_ob_buffers(zend_bool send_buffer TSRMLS_DC);
 PHPAPI int php_ob_get_buffer(zval *p TSRMLS_DC);