1 | /* |
2 | +----------------------------------------------------------------------+ |
3 | | PHP Version 5 | |
4 | +----------------------------------------------------------------------+ |
5 | | Copyright (c) 1997-2015 The PHP Group | |
6 | +----------------------------------------------------------------------+ |
7 | | This source file is subject to version 3.01 of the PHP license, | |
8 | | that is bundled with this package in the file LICENSE, and is | |
9 | | available through the world-wide-web at the following url: | |
10 | | http://www.php.net/license/3_01.txt | |
11 | | If you did not receive a copy of the PHP license and are unable to | |
12 | | obtain it through the world-wide-web, please send a note to | |
13 | | license@php.net so we can mail you a copy immediately. | |
14 | +----------------------------------------------------------------------+ |
15 | | Author: Michael Wallner <mike@php.net> | |
16 | +----------------------------------------------------------------------+ |
17 | */ |
18 | |
19 | /* $Id$ */ |
20 | |
21 | #ifndef PHP_OUTPUT_H |
22 | #define PHP_OUTPUT_H |
23 | |
24 | #define PHP_OUTPUT_NEWAPI 1 |
25 | |
26 | /* handler ops */ |
27 | #define PHP_OUTPUT_HANDLER_WRITE 0x00 /* standard passthru */ |
28 | #define PHP_OUTPUT_HANDLER_START 0x01 /* start */ |
29 | #define PHP_OUTPUT_HANDLER_CLEAN 0x02 /* restart */ |
30 | #define PHP_OUTPUT_HANDLER_FLUSH 0x04 /* pass along as much as possible */ |
31 | #define PHP_OUTPUT_HANDLER_FINAL 0x08 /* finalize */ |
32 | #define PHP_OUTPUT_HANDLER_CONT PHP_OUTPUT_HANDLER_WRITE |
33 | #define PHP_OUTPUT_HANDLER_END PHP_OUTPUT_HANDLER_FINAL |
34 | |
35 | /* handler types */ |
36 | #define PHP_OUTPUT_HANDLER_INTERNAL 0x0000 |
37 | #define PHP_OUTPUT_HANDLER_USER 0x0001 |
38 | |
39 | /* handler ability flags */ |
40 | #define PHP_OUTPUT_HANDLER_CLEANABLE 0x0010 |
41 | #define PHP_OUTPUT_HANDLER_FLUSHABLE 0x0020 |
42 | #define PHP_OUTPUT_HANDLER_REMOVABLE 0x0040 |
43 | #define PHP_OUTPUT_HANDLER_STDFLAGS 0x0070 |
44 | |
45 | /* handler status flags */ |
46 | #define PHP_OUTPUT_HANDLER_STARTED 0x1000 |
47 | #define PHP_OUTPUT_HANDLER_DISABLED 0x2000 |
48 | #define PHP_OUTPUT_HANDLER_PROCESSED 0x4000 |
49 | |
50 | /* handler op return values */ |
51 | typedef enum _php_output_handler_status_t { |
52 | PHP_OUTPUT_HANDLER_FAILURE, |
53 | PHP_OUTPUT_HANDLER_SUCCESS, |
54 | PHP_OUTPUT_HANDLER_NO_DATA |
55 | } php_output_handler_status_t; |
56 | |
57 | /* php_output_stack_pop() flags */ |
58 | #define PHP_OUTPUT_POP_TRY 0x000 |
59 | #define PHP_OUTPUT_POP_FORCE 0x001 |
60 | #define PHP_OUTPUT_POP_DISCARD 0x010 |
61 | #define PHP_OUTPUT_POP_SILENT 0x100 |
62 | |
63 | /* real global flags */ |
64 | #define PHP_OUTPUT_IMPLICITFLUSH 0x01 |
65 | #define PHP_OUTPUT_DISABLED 0x02 |
66 | #define PHP_OUTPUT_WRITTEN 0x04 |
67 | #define PHP_OUTPUT_SENT 0x08 |
68 | /* supplementary flags for php_output_get_status() */ |
69 | #define PHP_OUTPUT_ACTIVE 0x10 |
70 | #define PHP_OUTPUT_LOCKED 0x20 |
71 | /* output layer is ready to use */ |
72 | #define PHP_OUTPUT_ACTIVATED 0x100000 |
73 | |
74 | /* handler hooks */ |
75 | typedef enum _php_output_handler_hook_t { |
76 | PHP_OUTPUT_HANDLER_HOOK_GET_OPAQ, |
77 | PHP_OUTPUT_HANDLER_HOOK_GET_FLAGS, |
78 | PHP_OUTPUT_HANDLER_HOOK_GET_LEVEL, |
79 | PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE, |
80 | PHP_OUTPUT_HANDLER_HOOK_DISABLE, |
81 | /* unused */ |
82 | PHP_OUTPUT_HANDLER_HOOK_LAST |
83 | } php_output_handler_hook_t; |
84 | |
85 | #define PHP_OUTPUT_HANDLER_INITBUF_SIZE(s) \ |
86 | ( ((s) > 1) ? \ |
87 | (s) + PHP_OUTPUT_HANDLER_ALIGNTO_SIZE - ((s) % (PHP_OUTPUT_HANDLER_ALIGNTO_SIZE)) : \ |
88 | PHP_OUTPUT_HANDLER_DEFAULT_SIZE \ |
89 | ) |
90 | #define PHP_OUTPUT_HANDLER_ALIGNTO_SIZE 0x1000 |
91 | #define PHP_OUTPUT_HANDLER_DEFAULT_SIZE 0x4000 |
92 | |
93 | typedef struct _php_output_buffer { |
94 | char *data; |
95 | size_t size; |
96 | size_t used; |
97 | uint free:1; |
98 | uint _res:31; |
99 | } php_output_buffer; |
100 | |
101 | typedef struct _php_output_context { |
102 | int op; |
103 | php_output_buffer in; |
104 | php_output_buffer out; |
105 | #ifdef ZTS |
106 | void ***tsrm_ls; |
107 | #endif |
108 | } php_output_context; |
109 | |
110 | #define PHP_OUTPUT_TSRMLS(ctx) TSRMLS_FETCH_FROM_CTX((ctx)->tsrm_ls) |
111 | |
112 | /* old-style, stateless callback */ |
113 | typedef void (*php_output_handler_func_t)(char *output, uint output_len, char **handled_output, uint *handled_output_len, int mode TSRMLS_DC); |
114 | /* new-style, opaque context callback */ |
115 | typedef int (*php_output_handler_context_func_t)(void **handler_context, php_output_context *output_context); |
116 | /* output handler context dtor */ |
117 | typedef void (*php_output_handler_context_dtor_t)(void *opaq TSRMLS_DC); |
118 | /* conflict check callback */ |
119 | typedef int (*php_output_handler_conflict_check_t)(const char *handler_name, size_t handler_name_len TSRMLS_DC); |
120 | /* ctor for aliases */ |
121 | typedef 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 TSRMLS_DC); |
122 | |
123 | typedef struct _php_output_handler_user_func_t { |
124 | zend_fcall_info fci; |
125 | zend_fcall_info_cache fcc; |
126 | zval *zoh; |
127 | } php_output_handler_user_func_t; |
128 | |
129 | typedef struct _php_output_handler { |
130 | char *name; |
131 | size_t name_len; |
132 | int flags; |
133 | int level; |
134 | size_t size; |
135 | php_output_buffer buffer; |
136 | |
137 | void *opaq; |
138 | void (*dtor)(void *opaq TSRMLS_DC); |
139 | |
140 | union { |
141 | php_output_handler_user_func_t *user; |
142 | php_output_handler_context_func_t internal; |
143 | } func; |
144 | } php_output_handler; |
145 | |
146 | ZEND_BEGIN_MODULE_GLOBALS(output) |
147 | int flags; |
148 | zend_stack handlers; |
149 | php_output_handler *active; |
150 | php_output_handler *running; |
151 | const char *output_start_filename; |
152 | int output_start_lineno; |
153 | ZEND_END_MODULE_GLOBALS(output) |
154 | |
155 | PHPAPI ZEND_EXTERN_MODULE_GLOBALS(output); |
156 | |
157 | /* there should not be a need to use OG() from outside of output.c */ |
158 | #ifdef ZTS |
159 | # define OG(v) TSRMG(output_globals_id, zend_output_globals *, v) |
160 | #else |
161 | # define OG(v) (output_globals.v) |
162 | #endif |
163 | |
164 | /* convenience macros */ |
165 | #define PHPWRITE(str, str_len) php_output_write((str), (str_len) TSRMLS_CC) |
166 | #define PHPWRITE_H(str, str_len) php_output_write_unbuffered((str), (str_len) TSRMLS_CC) |
167 | |
168 | #define PUTC(c) (php_output_write(&(c), 1 TSRMLS_CC), (c)) |
169 | #define PUTC_H(c) (php_output_write_unbuffered(&(c), 1 TSRMLS_CC), (c)) |
170 | |
171 | #define PUTS(str) do { \ |
172 | const char *__str = (str); \ |
173 | php_output_write(__str, strlen(__str) TSRMLS_CC); \ |
174 | } while (0) |
175 | #define PUTS_H(str) do { \ |
176 | const char *__str = (str); \ |
177 | php_output_write_unbuffered(__str, strlen(__str) TSRMLS_CC); \ |
178 | } while (0) |
179 | |
180 | |
181 | BEGIN_EXTERN_C() |
182 | |
183 | extern const char php_output_default_handler_name[sizeof("default output handler" )]; |
184 | extern const char php_output_devnull_handler_name[sizeof("null output handler" )]; |
185 | |
186 | #define php_output_tearup() \ |
187 | php_output_startup(); \ |
188 | php_output_activate(TSRMLS_C) |
189 | #define php_output_teardown() \ |
190 | php_output_end_all(TSRMLS_C); \ |
191 | php_output_deactivate(TSRMLS_C); \ |
192 | php_output_shutdown() |
193 | |
194 | /* MINIT */ |
195 | PHPAPI void php_output_startup(void); |
196 | /* MSHUTDOWN */ |
197 | PHPAPI void php_output_shutdown(void); |
198 | |
199 | PHPAPI void php_output_register_constants(TSRMLS_D); |
200 | |
201 | /* RINIT */ |
202 | PHPAPI int php_output_activate(TSRMLS_D); |
203 | /* RSHUTDOWN */ |
204 | PHPAPI void php_output_deactivate(TSRMLS_D); |
205 | |
206 | PHPAPI void php_output_set_status(int status TSRMLS_DC); |
207 | PHPAPI int php_output_get_status(TSRMLS_D); |
208 | PHPAPI void php_output_set_implicit_flush(int flush TSRMLS_DC); |
209 | PHPAPI const char *php_output_get_start_filename(TSRMLS_D); |
210 | PHPAPI int php_output_get_start_lineno(TSRMLS_D); |
211 | |
212 | PHPAPI int php_output_write_unbuffered(const char *str, size_t len TSRMLS_DC); |
213 | PHPAPI int php_output_write(const char *str, size_t len TSRMLS_DC); |
214 | |
215 | PHPAPI int php_output_flush(TSRMLS_D); |
216 | PHPAPI void php_output_flush_all(TSRMLS_D); |
217 | PHPAPI int php_output_clean(TSRMLS_D); |
218 | PHPAPI void php_output_clean_all(TSRMLS_D); |
219 | PHPAPI int php_output_end(TSRMLS_D); |
220 | PHPAPI void php_output_end_all(TSRMLS_D); |
221 | PHPAPI int php_output_discard(TSRMLS_D); |
222 | PHPAPI void php_output_discard_all(TSRMLS_D); |
223 | |
224 | PHPAPI int php_output_get_contents(zval *p TSRMLS_DC); |
225 | PHPAPI int php_output_get_length(zval *p TSRMLS_DC); |
226 | PHPAPI int php_output_get_level(TSRMLS_D); |
227 | PHPAPI php_output_handler* php_output_get_active_handler(TSRMLS_D); |
228 | |
229 | PHPAPI int php_output_start_default(TSRMLS_D); |
230 | PHPAPI int php_output_start_devnull(TSRMLS_D); |
231 | |
232 | PHPAPI int php_output_start_user(zval *output_handler, size_t chunk_size, int flags TSRMLS_DC); |
233 | PHPAPI int php_output_start_internal(const char *name, size_t name_len, php_output_handler_func_t output_handler, size_t chunk_size, int flags TSRMLS_DC); |
234 | |
235 | PHPAPI php_output_handler *php_output_handler_create_user(zval *handler, size_t chunk_size, int flags TSRMLS_DC); |
236 | PHPAPI php_output_handler *php_output_handler_create_internal(const char *name, size_t name_len, php_output_handler_context_func_t handler, size_t chunk_size, int flags TSRMLS_DC); |
237 | |
238 | PHPAPI void php_output_handler_set_context(php_output_handler *handler, void *opaq, void (*dtor)(void* TSRMLS_DC) TSRMLS_DC); |
239 | PHPAPI int php_output_handler_start(php_output_handler *handler TSRMLS_DC); |
240 | PHPAPI int php_output_handler_started(const char *name, size_t name_len TSRMLS_DC); |
241 | PHPAPI int php_output_handler_hook(php_output_handler_hook_t type, void *arg TSRMLS_DC); |
242 | PHPAPI void php_output_handler_dtor(php_output_handler *handler TSRMLS_DC); |
243 | PHPAPI void php_output_handler_free(php_output_handler **handler TSRMLS_DC); |
244 | |
245 | PHPAPI int php_output_handler_conflict(const char *handler_new, size_t handler_new_len, const char *handler_set, size_t handler_set_len TSRMLS_DC); |
246 | PHPAPI int php_output_handler_conflict_register(const char *handler_name, size_t handler_name_len, php_output_handler_conflict_check_t check_func TSRMLS_DC); |
247 | PHPAPI int php_output_handler_reverse_conflict_register(const char *handler_name, size_t handler_name_len, php_output_handler_conflict_check_t check_func TSRMLS_DC); |
248 | |
249 | PHPAPI php_output_handler_alias_ctor_t *php_output_handler_alias(const char *handler_name, size_t handler_name_len TSRMLS_DC); |
250 | PHPAPI int php_output_handler_alias_register(const char *handler_name, size_t handler_name_len, php_output_handler_alias_ctor_t func TSRMLS_DC); |
251 | |
252 | END_EXTERN_C() |
253 | |
254 | |
255 | PHP_FUNCTION(ob_start); |
256 | PHP_FUNCTION(ob_flush); |
257 | PHP_FUNCTION(ob_clean); |
258 | PHP_FUNCTION(ob_end_flush); |
259 | PHP_FUNCTION(ob_end_clean); |
260 | PHP_FUNCTION(ob_get_flush); |
261 | PHP_FUNCTION(ob_get_clean); |
262 | PHP_FUNCTION(ob_get_contents); |
263 | PHP_FUNCTION(ob_get_length); |
264 | PHP_FUNCTION(ob_get_level); |
265 | PHP_FUNCTION(ob_get_status); |
266 | PHP_FUNCTION(ob_implicit_flush); |
267 | PHP_FUNCTION(ob_list_handlers); |
268 | |
269 | PHP_FUNCTION(output_add_rewrite_var); |
270 | PHP_FUNCTION(output_reset_rewrite_vars); |
271 | |
272 | #endif |
273 | |
274 | /* |
275 | * Local variables: |
276 | * tab-width: 4 |
277 | * c-basic-offset: 4 |
278 | * End: |
279 | * vim600: sw=4 ts=4 fdm=marker |
280 | * vim<600: sw=4 ts=4 |
281 | */ |
282 | |