Index: main/output.c =================================================================== RCS file: /repository/php-src/main/output.c,v retrieving revision 1.206 diff -u -p -d -r1.206 output.c --- main/output.c 3 Mar 2007 10:27:04 -0000 1.206 +++ main/output.c 6 Sep 2007 08:45:48 -0000 @@ -216,6 +216,38 @@ PHPAPI zval *php_output_get_devnull_hand } /* }}} */ +/* {{{ php_output_write_func_t php_output_set_write_func(php_output_write_func_type_t, php_output_write_func_t) + Set other write functions for unbuffered write (sapi_module.ub_write) and buffered write (php_output_op_write). */ +PHPAPI php_output_write_func_t php_output_set_write_func(php_output_write_func_type_t which, php_output_write_func_t new_func TSRMLS_DC) +{ + php_output_write_func_t old_func; + + switch (which) { + case PHP_OUTPUT_UB_WRITE_FUNC: + old_func = OG(ub_write); + OG(ub_write) = new_func; + break; + case PHP_OUTPUT_OB_WRITE_FUNC: + old_func = OG(ob_write); + OG(ob_write) = new_func; + break; + default: + old_func = NULL; + } + + return old_func; +} +/* }}} */ + +/* {{{ int php_output_op_write(const char *, size_t TSRMLS_DC) + Buffered write for OG(ob_write) hooks */ +PHPAPI int php_output_op_write(const char *str, size_t len TSRMLS_DC) +{ + php_output_op(PHP_OUTPUT_HANDLER_WRITE, str, len TSRMLS_CC); + return (int) len; +} +/* }}} */ + /* {{{ int php_output_write_unbuffered(const char *str, size_t len TSRMLS_DC) Unbuffered write */ PHPAPI int php_output_write_unbuffered(const char *str, size_t len TSRMLS_DC) @@ -223,7 +255,11 @@ PHPAPI int php_output_write_unbuffered(c if (OG(flags) & PHP_OUTPUT_DISABLED) { return 0; } - return sapi_module.ub_write(str, len TSRMLS_CC); + if (OG(ub_write)) { + return OG(ub_write)(str, len TSRMLS_CC); + } else { + return sapi_module.ub_write(str, len TSRMLS_CC); + } } /* }}} */ @@ -290,7 +326,11 @@ PHPAPI int php_output_write_encoded(cons } if (U_SUCCESS(status)) { - php_output_op(PHP_OUTPUT_HANDLER_WRITE, new_str, new_len TSRMLS_CC); + if (OG(ob_write)) { + OG(ob_write)(new_str, new_len TSRMLS_CC); + } else { + php_output_op(PHP_OUTPUT_HANDLER_WRITE, new_str, new_len TSRMLS_CC); + } } else { len = 0; } @@ -310,7 +350,11 @@ PHPAPI int php_output_write(const char * if (OG(flags) & PHP_OUTPUT_DISABLED) { return 0; } - php_output_op(PHP_OUTPUT_HANDLER_WRITE, str, len TSRMLS_CC); + if (OG(ob_write)) { + OG(ob_write)(str, len TSRMLS_CC); + } else { + php_output_op(PHP_OUTPUT_HANDLER_WRITE, str, len TSRMLS_CC); + } return (int) len; } /* }}} */ @@ -1057,7 +1101,6 @@ static inline php_output_handler_status_ } /* }}} */ - /* {{{ static void php_output_op(int op, const char *str, size_t len TSRMLS_DC) Output op dispatcher, passes input and output handlers output through the output handler stack until it gets written to the SAPI */ static inline void php_output_op(int op, const char *str, size_t len TSRMLS_DC) @@ -1109,7 +1152,11 @@ static inline void php_output_op(int op, fprintf(stderr, "!!! output started at: %s (%d)\n", OG(output_start_filename), OG(output_start_lineno)); #endif } - sapi_module.ub_write(context.out.data, context.out.used TSRMLS_CC); + if (OG(ub_write)) { + OG(ub_write)(context.out.data, context.out.used TSRMLS_CC); + } else { + sapi_module.ub_write(context.out.data, context.out.used TSRMLS_CC); + } if (OG(flags) & PHP_OUTPUT_IMPLICITFLUSH) { sapi_flush(TSRMLS_C); } Index: main/php_output.h =================================================================== RCS file: /repository/php-src/main/php_output.h,v retrieving revision 1.71 diff -u -p -d -r1.71 php_output.h --- main/php_output.h 1 Jan 2007 09:29:35 -0000 1.71 +++ main/php_output.h 6 Sep 2007 08:45:48 -0000 @@ -139,6 +139,13 @@ typedef struct _php_output_handler { } func; } php_output_handler; +typedef enum _php_output_write_func_type_t { + PHP_OUTPUT_UB_WRITE_FUNC, + PHP_OUTPUT_OB_WRITE_FUNC, +} php_output_write_func_type_t; + +typedef int (*php_output_write_func_t)(const char *output, size_t TSRMLS_DC); + ZEND_BEGIN_MODULE_GLOBALS(output) int flags; zend_stack *handlers; @@ -148,6 +155,8 @@ ZEND_BEGIN_MODULE_GLOBALS(output) int output_start_lineno; zval *default_output_handler_name; zval *devnull_output_handler_name; + php_output_write_func_t ub_write; + php_output_write_func_t ob_write; struct { UConverter *western; } conv; @@ -207,6 +216,9 @@ PHPAPI void php_output_set_implicit_flus PHPAPI char *php_output_get_start_filename(TSRMLS_D); PHPAPI int php_output_get_start_lineno(TSRMLS_D); +PHPAPI php_output_write_func_t php_output_set_write_func(php_output_write_func_type_t which, php_output_write_func_t new_func TSRMLS_DC); +PHPAPI int php_output_op_write(const char *str, size_t len TSRMLS_DC); + PHPAPI int php_output_write_unbuffered(const char *str, size_t len TSRMLS_DC); PHPAPI int php_output_write_encoded(const void *str, size_t len, UConverter *src_encoding_conv, UConverter *dst_encoding_conv TSRMLS_DC); PHPAPI int php_output_write_unicode(const UChar *str, size_t len TSRMLS_DC);