diff options
| author | Thies C. Arntzen <thies@php.net> | 1999-10-27 18:30:41 +0000 |
|---|---|---|
| committer | Thies C. Arntzen <thies@php.net> | 1999-10-27 18:30:41 +0000 |
| commit | ea880d2b86729f8dc68c5cb4d7572463d089d9b1 (patch) | |
| tree | 9ca5eb989986c52c6aa6ac5c75c93d2790d902a3 /output.c | |
| parent | c171eecd7aea11c22a8d7b111fc6b8a34b243216 (diff) | |
| download | php-git-ea880d2b86729f8dc68c5cb4d7572463d089d9b1.tar.gz | |
moved output.c into ext/standart and made it thread-safe.
moved output-buffering related functions from basic_functions to output.c
Win32 project need to be updated to reflect new position.
# i'm not really happy with this solution, but it seemed the easiest one!
# the whole output code is a bit hard to understand...
@- Output-Buffering system is now Thread-Safe. (Thies)
Diffstat (limited to 'output.c')
| -rw-r--r-- | output.c | 232 |
1 files changed, 0 insertions, 232 deletions
diff --git a/output.c b/output.c deleted file mode 100644 index a748ed5cbb..0000000000 --- a/output.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP version 4.0 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997, 1998, 1999 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.0 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_0.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "php.h" -#include "ext/standard/head.h" -#include "ext/session/php_session.h" -#include "SAPI.h" - -/* output functions */ -PHPAPI int (*php_body_write)(const char *str, uint str_length); /* string output */ -PHPAPI int (*php_header_write)(const char *str, uint str_length); /* unbuffer string output */ -static int php_ub_body_write(const char *str, uint str_length); -static int php_ub_body_write_no_header(const char *str, uint str_length); -static int php_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; -static void php_ob_init(uint initial_size, uint block_size); -static void php_ob_destroy(); -static void php_ob_append(const char *text, uint text_length); -static void php_ob_prepend(const char *text, uint text_length); -static inline void php_ob_send(); - - -/* - * Main - */ - -/* Start output layer */ -PHPAPI void php_output_startup() -{ - ob_buffer = NULL; - php_body_write = php_ub_body_write; - php_header_write = sapi_module.ub_write; -} - - -/* Start output buffering */ -void php_start_ob_buffering() -{ - php_ob_init(4096, 1024); - php_body_write = php_b_body_write; -} - - -/* End output buffering */ -void php_end_ob_buffering(int send_buffer) -{ - SLS_FETCH(); - - if (!ob_buffer) { - return; - } - if (SG(headers_sent) && !SG(request_info).headers_only) { - php_body_write = php_ub_body_write_no_header; - } else { - php_body_write = php_ub_body_write; - } - if (send_buffer) { - php_ob_send(); - } - php_ob_destroy(); -} - - -/* - * Output buffering - implementation - */ - -static inline void php_ob_allocate() -{ - if (ob_buffer_size<ob_text_length) { - while ((ob_buffer_size+=ob_block_size) < ob_text_length); - ob_buffer = (char *) erealloc(ob_buffer, ob_buffer_size+1); - } -} - - -static void php_ob_init(uint initial_size, uint block_size) -{ - if (ob_buffer) { - return; - } - ob_block_size = block_size; - ob_buffer_size = initial_size; - ob_buffer = (char *) emalloc(initial_size+1); - ob_text_length = 0; -} - - -static void php_ob_destroy() -{ - if (ob_buffer) { - efree(ob_buffer); - ob_buffer = NULL; - } -} - - -static void php_ob_append(const char *text, uint text_length) -{ - char *target; - int original_ob_text_length=ob_text_length; - - ob_text_length += text_length; - php_ob_allocate(); - target = ob_buffer+original_ob_text_length; - memcpy(target, text, text_length); - target[text_length]=0; -} - - -static void php_ob_prepend(const char *text, uint text_length) -{ - char *p, *start; - - ob_text_length += text_length; - php_ob_allocate(); - - /* php_ob_allocate() may change ob_buffer, so we can't initialize p&start earlier */ - p = ob_buffer+ob_text_length; - start = ob_buffer; - - while (--p>=start) { - p[text_length] = *p; - } - memcpy(ob_buffer, text, text_length); - ob_buffer[ob_text_length]=0; -} - - -static inline void php_ob_send() -{ - /* header_write is a simple, unbuffered output function */ - php_body_write(ob_buffer, ob_text_length); -} - - -/* Return the current output buffer */ -int php_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 php_b_body_write(const char *str, uint str_length) -{ - php_ob_append(str, str_length); - return str_length; -} - - -static int php_ub_body_write_no_header(const char *str, uint str_length) -{ - char *newstr = NULL; - uint new_length=0; - int result; - - session_adapt_uris(str, str_length, &newstr, &new_length); - - if (newstr) { - str = newstr; - str_length = new_length; - } - - result = php_header_write(str, str_length); - - if (newstr) { - free(newstr); - } - - return result; -} - - -static int php_ub_body_write(const char *str, uint str_length) -{ - int result = 0; - SLS_FETCH(); - - if (SG(request_info).headers_only) { - zend_bailout(); - } - if (php3_header()) { - php_body_write = php_ub_body_write_no_header; - result = php_ub_body_write_no_header(str, str_length); - } - - return result; -} - - -/* - * HEAD support - */ - -void set_header_request(int value) -{ - /* deprecated */ -} |
