summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/output.c34
-rw-r--r--main/php_output.h1
2 files changed, 35 insertions, 0 deletions
diff --git a/main/output.c b/main/output.c
index 025a0aeeec..040ef62eea 100644
--- a/main/output.c
+++ b/main/output.c
@@ -403,6 +403,40 @@ PHP_FUNCTION(ob_list_handlers)
}
/* }}} */
+/* {{{ php_ob_used_each
+ Sets handler_name to NULL is found
+ */
+static int php_ob_handler_used_each(php_ob_buffer *ob_buffer, char **handler_name)
+{
+ if ((!strcmp(ob_buffer->handler_name, "zlib output compression") && ob_buffer->internal_output_handler && !strcmp("ob_gzhandler", *handler_name))
+ || !strcmp(ob_buffer->handler_name, *handler_name))
+ {
+ *handler_name = NULL;
+ return 1;
+ }
+ return 0;
+}
+/* }}} */
+
+/* {{{ php_ob_used
+ returns 1 if given handler_name is used as output_handler
+ */
+PHPAPI int php_ob_handler_used(char *handler_name TSRMLS_DC)
+{
+ char *tmp = handler_name;
+
+ if (OG(ob_nesting_level)) {
+ if (!strcmp(OG(active_ob_buffer).handler_name, handler_name)) {
+ return 1;
+ }
+ if (OG(ob_nesting_level)>1) {
+ zend_stack_apply_with_argument(&OG(ob_buffers), ZEND_STACK_APPLY_BOTTOMUP, (int (*)(void *element, void *)) php_ob_handler_used_each, &tmp);
+ }
+ }
+ return tmp ? 0 : 1;
+}
+/* }}} */
+
/* {{{ php_ob_append
*/
static void php_ob_append(const char *text, uint text_length TSRMLS_DC)
diff --git a/main/php_output.h b/main/php_output.h
index 977c217d65..db0e89b64e 100644
--- a/main/php_output.h
+++ b/main/php_output.h
@@ -39,6 +39,7 @@ PHPAPI void php_end_implicit_flush(TSRMLS_D);
PHPAPI char *php_get_output_start_filename(TSRMLS_D);
PHPAPI int php_get_output_start_lineno(TSRMLS_D);
PHPAPI void php_ob_set_internal_handler(php_output_handler_func_t internal_output_handler, uint buffer_size, char *handler_name, zend_bool erase TSRMLS_DC);
+PHPAPI int php_ob_handler_used(char *handler_name TSRMLS_DC);
PHP_FUNCTION(ob_start);
PHP_FUNCTION(ob_flush);