20#ifndef PHP_OUTPUT_DEBUG
21# define PHP_OUTPUT_DEBUG 0
23#ifndef PHP_OUTPUT_NOINLINE
24# define PHP_OUTPUT_NOINLINE 0
36const char php_output_default_handler_name[
sizeof(
"default output handler")] =
"default output handler";
39#if PHP_OUTPUT_NOINLINE || PHP_OUTPUT_DEBUG
45static HashTable php_output_handler_aliases;
46static HashTable php_output_handler_conflicts;
47static HashTable php_output_handler_reverse_conflicts;
51static inline bool php_output_lock_error(
int op);
52static inline void php_output_op(
int op,
const char *str,
size_t len);
64static int php_output_stack_pop(
int flags);
65static int php_output_stack_apply_op(
void *h,
void *c);
66static int php_output_stack_apply_clean(
void *h,
void *c);
67static int php_output_stack_apply_list(
void *h,
void *z);
68static int php_output_stack_apply_status(
void *h,
void *z);
77static inline void php_output_init_globals(zend_output_globals *
G)
84static size_t php_output_stdout(
const char *str,
size_t str_len)
86 fwrite(str, 1, str_len, stdout);
89static size_t php_output_stderr(
const char *str,
size_t str_len)
91 fwrite(str, 1, str_len, stderr);
98static size_t (*php_output_direct)(
const char *str,
size_t str_len) = php_output_stderr;
102static void php_output_header(
void)
117 fprintf(stderr,
"!!! output started at: %s (%d)\n",
128static void reverse_conflict_dtor(
zval *
zv)
141 zend_hash_init(&php_output_handler_reverse_conflicts, 8,
NULL, reverse_conflict_dtor, 1);
142 php_output_direct = php_output_stdout;
150 php_output_direct = php_output_stderr;
162 memset(TSRMG_BULK_STATIC(output_globals_id, zend_output_globals*), 0,
sizeof(zend_output_globals));
164 memset(&output_globals, 0,
sizeof(zend_output_globals));
231 return php_output_direct(str,
len);
246 return php_output_direct(str,
len);
264 php_output_context_dtor(&
context);
290 php_output_context_dtor(&
context);
540 if (
NULL != (conflict = zend_hash_find_ptr(&php_output_handler_conflicts,
handler->name))) {
545 if (
NULL != (rconflicts = zend_hash_find_ptr(&php_output_handler_reverse_conflicts,
handler->name))) {
569 for (i = 0; i <
count; ++i) {
585 if (handler_new_len != handler_set_len || memcmp(handler_new, handler_set, handler_set_len)) {
602 if (!
EG(current_module)) {
607 zend_hash_update_ptr(&php_output_handler_conflicts, str, check_func);
619 if (!
EG(current_module)) {
624 if (
NULL != (rev_ptr = zend_hash_str_find_ptr(&php_output_handler_reverse_conflicts,
name, name_len))) {
625 return zend_hash_next_index_insert_ptr(rev_ptr, check_func) ?
SUCCESS :
FAILURE;
630 if (
NULL == zend_hash_next_index_insert_ptr(&rev, check_func)) {
635 zend_hash_update_mem(&php_output_handler_reverse_conflicts, str, &rev,
sizeof(
HashTable));
646 return zend_hash_str_find_ptr(&php_output_handler_aliases,
name, name_len);
656 if (!
EG(current_module)) {
661 zend_hash_update_ptr(&php_output_handler_aliases, str,
func);
759static inline bool php_output_lock_error(
int op)
765 php_error_docref(
"ref.outcontrol",
E_ERROR,
"Cannot use output buffering in output buffering display handlers");
786 php_output_context_dtor(
context);
881 size_t grow_max =
MAX(grow_int, grow_buf);
884 handler->buffer.size += grow_max;
932 if (php_output_lock_error(
context->op)) {
958 handler->func.user->fci.param_count = 2;
959 handler->func.user->fci.params = ob_args;
962#define PHP_OUTPUT_USER_SUCCESS(retval) ((Z_TYPE(retval) != IS_UNDEF) && !(Z_TYPE(retval) == IS_FALSE))
1021 php_output_context_reset(
context);
1038static inline void php_output_op(
int op,
const char *str,
size_t len)
1044 if (php_output_lock_error(op)) {
1048 php_output_context_init(&
context, op);
1056 context.in.data = (
char *) str;
1064 php_output_context_pass(&
context);
1067 context.out.data = (
char *) str;
1072 php_output_header();
1087 php_output_context_dtor(&
context);
1093static int php_output_stack_apply_op(
void *h,
void *c)
1117 php_output_context_swap(
context);
1126 php_output_context_pass(
context);
1131 php_output_context_swap(
context);
1141static int php_output_stack_apply_clean(
void *h,
void *c)
1148 php_output_context_reset(
context);
1155static int php_output_stack_apply_list(
void *h,
void *z)
1167static int php_output_stack_apply_status(
void *h,
void *z)
1172 add_next_index_zval(array, php_output_handler_status(
handler, &arr));
1184 add_assoc_str(entry,
"name", zend_string_copy(
handler->name));
1198static int php_output_stack_pop(
int flags)
1226 php_output_handler_op(orphan, &
context);
1244 php_output_context_dtor(&
context);
1258 char *out_str =
NULL;
1261 func(output_context->
in.
data, output_context->
in.
used, &out_str, &out_len, output_context->
op);
1264 output_context->
out.
data = out_str;
1265 output_context->
out.
used = out_len;
1268 php_output_context_pass(output_context);
1281 php_output_context_pass(output_context);
1309 if (chunk_size < 0) {
1490 bool full_status = 0;
1542 size_t name_len, value_len;
SAPI_API sapi_module_struct sapi_module
SAPI_API int sapi_flush(void)
fprintf($stream, string $format, mixed ... $values)
ob_get_status(bool $full_status=false)
fwrite($stream, string $data, ?int $length=null)
output_add_rewrite_var(string $name, string $value)
count(Countable|array $value, int $mode=COUNT_NORMAL)
ob_implicit_flush(bool $enable=true)
ob_start($callback=null, int $chunk_size=0, int $flags=PHP_OUTPUT_HANDLER_STDFLAGS)
output_reset_rewrite_vars()
headers_sent(&$filename=null, &$line=null)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
PHPAPI bool php_header(void)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
PHPAPI zend_result php_output_handler_hook(php_output_handler_hook_t type, void *arg)
PHPAPI void php_output_handler_dtor(php_output_handler *handler)
PHPAPI void php_output_end_all(void)
PHPAPI bool php_output_handler_conflict(const char *handler_new, size_t handler_new_len, const char *handler_set, size_t handler_set_len)
PHPAPI int php_output_activate(void)
PHPAPI zend_result php_output_start_devnull(void)
PHPAPI bool php_output_handler_started(const char *name, size_t name_len)
PHPAPI void php_output_flush_all(void)
PHPAPI void php_output_set_status(int status)
PHPAPI zend_result php_output_start_user(zval *output_handler, size_t chunk_size, int flags)
PHPAPI php_output_handler * php_output_handler_create_user(zval *output_handler, size_t chunk_size, int flags)
#define PHP_OUTPUT_USER_SUCCESS(retval)
PHPAPI zend_result php_output_get_length(zval *p)
PHPAPI void php_output_discard_all(void)
PHPAPI zend_result php_output_handler_conflict_register(const char *name, size_t name_len, php_output_handler_conflict_check_t check_func)
PHPAPI const char * php_output_get_start_filename(void)
PHPAPI size_t php_output_write_unbuffered(const char *str, size_t len)
PHPAPI void php_output_handler_free(php_output_handler **h)
PHPAPI void php_output_shutdown(void)
PHPAPI zend_result php_output_discard(void)
PHPAPI size_t php_output_write(const char *str, size_t len)
PHPAPI php_output_handler * php_output_handler_create_internal(const char *name, size_t name_len, php_output_handler_context_func_t output_handler, size_t chunk_size, int flags)
PHPAPI php_output_handler_alias_ctor_t php_output_handler_alias(const char *name, size_t name_len)
PHPAPI void php_output_set_implicit_flush(int flush)
PHPAPI zend_result php_output_end(void)
PHPAPI php_output_handler * php_output_get_active_handler(void)
PHPAPI int php_output_get_level(void)
PHPAPI zend_result php_output_handler_alias_register(const char *name, size_t name_len, php_output_handler_alias_ctor_t func)
PHPAPI zend_result php_output_start_internal(const char *name, size_t name_len, php_output_handler_func_t output_handler, size_t chunk_size, int flags)
PHPAPI zend_result php_output_clean(void)
PHPAPI zend_result php_output_start_default(void)
PHPAPI void php_output_clean_all(void)
PHPAPI zend_result php_output_handler_start(php_output_handler *handler)
PHPAPI int php_output_get_start_lineno(void)
PHPAPI int php_output_get_status(void)
PHPAPI void php_output_startup(void)
PHPAPI void php_output_handler_set_context(php_output_handler *handler, void *opaq, void(*dtor)(void *))
PHPAPI zend_result php_output_get_contents(zval *p)
PHPAPI zend_result php_output_flush(void)
PHPAPI zend_result php_output_handler_reverse_conflict_register(const char *name, size_t name_len, php_output_handler_conflict_check_t check_func)
PHPAPI void php_output_deactivate(void)
php_output_handler * active
#define PHP_OUTPUT_HANDLER_DISABLED
@ PHP_OUTPUT_HANDLER_FAILURE
@ PHP_OUTPUT_HANDLER_SUCCESS
@ PHP_OUTPUT_HANDLER_NO_DATA
enum _php_output_handler_status_t php_output_handler_status_t
zend_string * output_start_filename
#define PHP_OUTPUT_POP_FORCE
#define PHP_OUTPUT_HANDLER_PROCESSED
#define PHP_OUTPUT_HANDLER_REMOVABLE
#define PHP_OUTPUT_HANDLER_WRITE
#define PHP_OUTPUT_HANDLER_INITBUF_SIZE(s)
#define PHP_OUTPUT_HANDLER_FLUSHABLE
struct _php_output_handler php_output_handler
#define PHP_OUTPUT_DISABLED
php_output_handler * running
enum _php_output_handler_hook_t php_output_handler_hook_t
#define PHP_OUTPUT_WRITTEN
#define PHP_OUTPUT_IMPLICITFLUSH
const char php_output_devnull_handler_name[sizeof("null output handler")]
#define PHP_OUTPUT_HANDLER_FLUSH
#define PHP_OUTPUT_POP_TRY
#define PHP_OUTPUT_HANDLER_STDFLAGS
@ PHP_OUTPUT_HANDLER_HOOK_GET_LEVEL
@ PHP_OUTPUT_HANDLER_HOOK_DISABLE
@ PHP_OUTPUT_HANDLER_HOOK_GET_FLAGS
@ PHP_OUTPUT_HANDLER_HOOK_GET_OPAQ
@ PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE
#define PHP_OUTPUT_HANDLER_USER
#define PHP_OUTPUT_HANDLER_CLEAN
#define PHP_OUTPUT_LOCKED
#define PHP_OUTPUT_ACTIVE
struct _php_output_buffer php_output_buffer
#define PHP_OUTPUT_HANDLER_INTERNAL
#define PHP_OUTPUT_POP_DISCARD
#define PHP_OUTPUT_HANDLER_FINAL
#define PHP_OUTPUT_HANDLER_DEFAULT_SIZE
struct _php_output_handler_user_func_t php_output_handler_user_func_t
#define PHP_OUTPUT_HANDLER_CLEANABLE
#define PHP_OUTPUT_ACTIVATED
#define PHP_OUTPUT_HANDLER_STARTED
struct _php_output_context php_output_context
zend_result(* php_output_handler_context_func_t)(void **handler_context, php_output_context *output_context)
#define PHP_OUTPUT_POP_SILENT
struct _php_output_handler *(* php_output_handler_alias_ctor_t)(const char *handler_name, size_t handler_name_len, size_t chunk_size, int flags)
zend_result(* php_output_handler_conflict_check_t)(const char *handler_name, size_t handler_name_len)
#define PHP_OUTPUT_HANDLER_ABILITY_FLAGS(bitmask)
void(* php_output_handler_func_t)(char *output, size_t output_len, char **handled_output, size_t *handled_output_len, int mode)
#define PHP_OUTPUT_HANDLER_START
zend_fcall_info_cache fcc
PHPAPI zend_result php_url_scanner_add_var(const char *name, size_t name_len, const char *value, size_t value_len, bool encode)
PHPAPI zend_result php_url_scanner_reset_vars(void)
ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format,...)
ZEND_API zend_result zend_fcall_info_init(zval *callable, uint32_t check_flags, zend_fcall_info *fci, zend_fcall_info_cache *fcc, zend_string **callable_name, char **error)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API zend_result add_next_index_str(zval *arg, zend_string *str)
#define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor)
#define ZEND_DECLARE_MODULE_GLOBALS(module_name)
#define zend_parse_parameters_none()
#define ZVAL_STRINGL(z, s, l)
ZEND_API zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
#define ZVAL_EMPTY_STRING(z)
#define safe_erealloc(ptr, nmemb, size, offset)
#define estrndup(s, length)
#define ecalloc(nmemb, size)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API bool zend_is_compiling(void)
ZEND_API int zend_get_compiled_lineno(void)
ZEND_API zend_string * zend_get_compiled_filename(void)
ZEND_API uint32_t zend_get_executed_lineno(void)
ZEND_API zend_string * zend_get_executed_filename_ex(void)
ZEND_API bool zend_is_executing(void)
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
#define ZEND_HASH_PACKED_FOREACH_PTR(ht, _ptr)
#define ZEND_HASH_FOREACH_END()
struct _zend_string zend_string
#define convert_to_string(op)
ZEND_API int zend_stack_push(zend_stack *stack, const void *element)
ZEND_API void * zend_stack_base(const zend_stack *stack)
ZEND_API void * zend_stack_top(const zend_stack *stack)
ZEND_API int zend_stack_count(const zend_stack *stack)
ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, zend_stack_apply_direction type, int(*apply_function)(void *element, void *arg), void *arg)
ZEND_API void zend_stack_destroy(zend_stack *stack)
ZEND_API void zend_stack_init(zend_stack *stack, int size)
ZEND_API void zend_stack_del_top(zend_stack *stack)
@ ZEND_STACK_APPLY_BOTTOMUP
@ ZEND_STACK_APPLY_TOPDOWN
ZEND_API zend_string_init_interned_func_t zend_string_init_interned
#define Z_STRVAL_P(zval_p)
struct _zend_array HashTable
#define Z_STRLEN_P(zval_p)
ZEND_RESULT_CODE zend_result
ZEND_API void zval_ptr_dtor(zval *zval_ptr)
fbc internal_function handler(call, ret)