File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / main / php_output.h
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 01:32:11 2013 UTC (10 years, 11 months ago) by misho
Branches: php, MAIN
CVS tags: v5_4_29p0, v5_4_20p0, v5_4_20, v5_4_17, HEAD
5.4.17

    1: /*
    2:    +----------------------------------------------------------------------+
    3:    | PHP Version 5                                                        |
    4:    +----------------------------------------------------------------------+
    5:    | Copyright (c) 1997-2013 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: php_output.h,v 1.1.1.3 2013/07/22 01:32:11 misho Exp $ */
   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: /* there should not be a need to use OG() from outside of output.c */
  156: #ifdef ZTS
  157: # define OG(v) TSRMG(output_globals_id, zend_output_globals *, v)
  158: #else
  159: # define OG(v) (output_globals.v)
  160: #endif
  161: 
  162: /* convenience macros */
  163: #define PHPWRITE(str, str_len)		php_output_write((str), (str_len) TSRMLS_CC)
  164: #define PHPWRITE_H(str, str_len)	php_output_write_unbuffered((str), (str_len) TSRMLS_CC)
  165: 
  166: #define PUTC(c)						(php_output_write(&(c), 1 TSRMLS_CC), (c))
  167: #define PUTC_H(c)					(php_output_write_unbuffered(&(c), 1 TSRMLS_CC), (c))
  168: 
  169: #define PUTS(str)					do {				\
  170: 	const char *__str = (str);							\
  171: 	php_output_write(__str, strlen(__str) TSRMLS_CC);	\
  172: } while (0)
  173: #define PUTS_H(str)					do {							\
  174: 	const char *__str = (str);										\
  175: 	php_output_write_unbuffered(__str, strlen(__str) TSRMLS_CC);	\
  176: } while (0)
  177: 
  178: 
  179: BEGIN_EXTERN_C()
  180: 
  181: extern const char php_output_default_handler_name[sizeof("default output handler")];
  182: extern const char php_output_devnull_handler_name[sizeof("null output handler")];
  183: 
  184: #define php_output_tearup() \
  185: 	php_output_startup(); \
  186: 	php_output_activate(TSRMLS_C)
  187: #define php_output_teardown() \
  188: 	php_output_end_all(TSRMLS_C); \
  189: 	php_output_deactivate(TSRMLS_C); \
  190: 	php_output_shutdown()
  191: 
  192: /* MINIT */
  193: PHPAPI void php_output_startup(void);
  194: /* MSHUTDOWN */
  195: PHPAPI void php_output_shutdown(void);
  196: 
  197: PHPAPI void php_output_register_constants(TSRMLS_D);
  198: 
  199: /* RINIT */
  200: PHPAPI int php_output_activate(TSRMLS_D);
  201: /* RSHUTDOWN */
  202: PHPAPI void php_output_deactivate(TSRMLS_D);
  203: 
  204: PHPAPI void php_output_set_status(int status TSRMLS_DC);
  205: PHPAPI int php_output_get_status(TSRMLS_D);
  206: PHPAPI void php_output_set_implicit_flush(int flush TSRMLS_DC);
  207: PHPAPI const char *php_output_get_start_filename(TSRMLS_D);
  208: PHPAPI int php_output_get_start_lineno(TSRMLS_D);
  209: 
  210: PHPAPI int php_output_write_unbuffered(const char *str, size_t len TSRMLS_DC);
  211: PHPAPI int php_output_write(const char *str, size_t len TSRMLS_DC);
  212: 
  213: PHPAPI int php_output_flush(TSRMLS_D);
  214: PHPAPI void php_output_flush_all(TSRMLS_D);
  215: PHPAPI int php_output_clean(TSRMLS_D);
  216: PHPAPI void php_output_clean_all(TSRMLS_D);
  217: PHPAPI int php_output_end(TSRMLS_D);
  218: PHPAPI void php_output_end_all(TSRMLS_D);
  219: PHPAPI int php_output_discard(TSRMLS_D);
  220: PHPAPI void php_output_discard_all(TSRMLS_D);
  221: 
  222: PHPAPI int php_output_get_contents(zval *p TSRMLS_DC);
  223: PHPAPI int php_output_get_length(zval *p TSRMLS_DC);
  224: PHPAPI int php_output_get_level(TSRMLS_D);
  225: PHPAPI php_output_handler* php_output_get_active_handler(TSRMLS_D);
  226: 
  227: PHPAPI int php_output_start_default(TSRMLS_D);
  228: PHPAPI int php_output_start_devnull(TSRMLS_D);
  229: 
  230: PHPAPI int php_output_start_user(zval *output_handler, size_t chunk_size, int flags TSRMLS_DC);
  231: 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);
  232: 
  233: PHPAPI php_output_handler *php_output_handler_create_user(zval *handler, size_t chunk_size, int flags TSRMLS_DC);
  234: 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);
  235: 
  236: PHPAPI void php_output_handler_set_context(php_output_handler *handler, void *opaq, void (*dtor)(void* TSRMLS_DC) TSRMLS_DC);
  237: PHPAPI int php_output_handler_start(php_output_handler *handler TSRMLS_DC);
  238: PHPAPI int php_output_handler_started(const char *name, size_t name_len TSRMLS_DC);
  239: PHPAPI int php_output_handler_hook(php_output_handler_hook_t type, void *arg TSRMLS_DC);
  240: PHPAPI void php_output_handler_dtor(php_output_handler *handler TSRMLS_DC);
  241: PHPAPI void php_output_handler_free(php_output_handler **handler TSRMLS_DC);
  242: 
  243: 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);
  244: 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);
  245: 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);
  246: 
  247: PHPAPI php_output_handler_alias_ctor_t *php_output_handler_alias(const char *handler_name, size_t handler_name_len TSRMLS_DC);
  248: 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);
  249: 
  250: END_EXTERN_C()
  251: 
  252: 
  253: PHP_FUNCTION(ob_start);
  254: PHP_FUNCTION(ob_flush);
  255: PHP_FUNCTION(ob_clean);
  256: PHP_FUNCTION(ob_end_flush);
  257: PHP_FUNCTION(ob_end_clean);
  258: PHP_FUNCTION(ob_get_flush);
  259: PHP_FUNCTION(ob_get_clean);
  260: PHP_FUNCTION(ob_get_contents);
  261: PHP_FUNCTION(ob_get_length);
  262: PHP_FUNCTION(ob_get_level);
  263: PHP_FUNCTION(ob_get_status);
  264: PHP_FUNCTION(ob_implicit_flush);
  265: PHP_FUNCTION(ob_list_handlers);
  266: 
  267: PHP_FUNCTION(output_add_rewrite_var);
  268: PHP_FUNCTION(output_reset_rewrite_vars);
  269: 
  270: #endif
  271: 
  272: /*
  273:  * Local variables:
  274:  * tab-width: 4
  275:  * c-basic-offset: 4
  276:  * End:
  277:  * vim600: sw=4 ts=4 fdm=marker
  278:  * vim<600: sw=4 ts=4
  279:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>