/* +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | +----------------------------------------------------------------------+ | The contents of this source file is the sole property of Andi | | Gutmans and Zeev Suraski, and may not be distributed without prior | | written permission from both of them. | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | +----------------------------------------------------------------------+ */ #include "php.h" #include "ext/standard/head.h" #include "SAPI.h" /* output functions */ PHPAPI int (*zend_body_write)(const char *str, uint str_length); /* string output */ PHPAPI int (*zend_header_write)(const char *str, uint str_length); /* unbuffer string output */ static int zend_ub_body_write(const char *str, uint str_length); static int zend_ub_body_write_no_header(const char *str, uint str_length); static int zend_b_body_write(const char *str, uint str_length); /* output buffering */ static char *ob_buffer; static uint ob_buffer_size; static uint ob_block_size; static uint ob_text_length; void zend_ob_init(uint initial_size, uint block_size); void zend_ob_destroy(); void zend_ob_append(const char *text, uint text_length); void zend_ob_prepend(const char *text, uint text_length); static inline void zend_ob_send(); /* * Main */ PHPAPI void zend_output_startup() { ob_buffer = NULL; zend_body_write = zend_ub_body_write; zend_header_write = sapi_module.ub_write; } void zend_start_ob_buffering() { zend_ob_init(4096, 1024); zend_body_write = zend_b_body_write; } void zend_end_ob_buffering(int send_buffer) { SLS_FETCH(); if (!ob_buffer) { return; } if (SG(headers_sent)) { zend_body_write = zend_ub_body_write_no_header; } else { zend_body_write = zend_ub_body_write; } if (send_buffer) { zend_ob_send(); } zend_ob_destroy(); } /* * Output buffering - implementation */ static inline void zend_ob_allocate() { if (ob_buffer_size=start) { p[text_length] = *p; } memcpy(ob_buffer, text, text_length); ob_buffer[ob_text_length]=0; } static inline void zend_ob_send() { /* header_write is a simple, unbuffered output function */ zend_body_write(ob_buffer, ob_text_length); } int zend_ob_get_buffer(pval *p) { if (!ob_buffer) { return FAILURE; } p->type = IS_STRING; p->value.str.val = estrndup(ob_buffer, ob_text_length); p->value.str.len = ob_text_length; return SUCCESS; } /* * Wrapper functions - implementation */ /* buffered output function */ static int zend_b_body_write(const char *str, uint str_length) { zend_ob_append(str, str_length); return str_length; } static int zend_ub_body_write_no_header(const char *str, uint str_length) { return zend_header_write(str, str_length); } static int zend_ub_body_write(const char *str, uint str_length) { SLS_FETCH(); if (SG(request_info).headers_only) { zend_bailout(); } if (php3_header()) { zend_body_write = zend_ub_body_write_no_header; return zend_header_write(str, str_length); } else { return 0; } } /* * HEAD support */ void set_header_request(int value) { /* deprecated */ }