diff options
Diffstat (limited to 'ext/xslt/sablot.c')
-rw-r--r-- | ext/xslt/sablot.c | 1635 |
1 files changed, 0 insertions, 1635 deletions
diff --git a/ext/xslt/sablot.c b/ext/xslt/sablot.c deleted file mode 100644 index f591433e2e..0000000000 --- a/ext/xslt/sablot.c +++ /dev/null @@ -1,1635 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2002 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 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_02.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. | - +----------------------------------------------------------------------+ - | Author: Sterling Hughes <sterling@php.net> | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" -#include "php_xslt.h" -#include "php_sablot.h" -#include "ext/standard/info.h" - -#if HAVE_SABLOT_BACKEND - -#include <sablot.h> -#include <sdom.h> - -#include <string.h> -#include <stdarg.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -/* functions relating to handlers */ -static void register_sax_handler_pair(zval **, zval **, zval **); - -/* Free processor */ -static void free_processor(zend_rsrc_list_entry *rsrc TSRMLS_DC); - -/* Scheme handler functions */ -static int scheme_getall(void *, SablotHandle, const char *, const char *, char **, int *); -static int scheme_freememory(void *, SablotHandle, char *); -static int scheme_open(void *, SablotHandle, const char *, const char *, int *); -static int scheme_get(void *, SablotHandle, int, char *, int *); -static int scheme_put(void *, SablotHandle, int, const char *, int *); -static int scheme_close(void *, SablotHandle, int); - -/* Sax handler functions */ -static SAX_RETURN sax_startdoc(void *, SablotHandle); -static SAX_RETURN sax_startelement(void *, SablotHandle, const char *, const char **); -static SAX_RETURN sax_endelement(void *, SablotHandle, const char *); -static SAX_RETURN sax_startnamespace(void *, SablotHandle, const char *, const char *); -static SAX_RETURN sax_endnamespace(void *, SablotHandle, const char *); -static SAX_RETURN sax_comment(void *, SablotHandle, const char *); -static SAX_RETURN sax_pi(void *, SablotHandle, const char *, const char *); -static SAX_RETURN sax_characters(void *, SablotHandle, const char *, int); -static SAX_RETURN sax_enddoc(void *, SablotHandle); - -/* Error handlers */ -static MH_ERROR error_makecode(void *, SablotHandle, int, unsigned short, unsigned short); -static MH_ERROR error_log(void *, SablotHandle, MH_ERROR, MH_LEVEL, char **); -static MH_ERROR error_print(void *, SablotHandle, MH_ERROR, MH_LEVEL, char **); - -/* Resource related */ -#define le_xslt_name "XSLT Processor" -static int le_xslt; - -/* {{{ xslt_functions[] - */ -function_entry xslt_functions[] = { - PHP_FE(xslt_create, NULL) - PHP_FE(xslt_set_sax_handlers, NULL) - PHP_FE(xslt_set_scheme_handlers, NULL) - PHP_FE(xslt_process, NULL) - PHP_FE(xslt_set_base, NULL) - PHP_FE(xslt_set_log, NULL) - PHP_FE(xslt_set_error_handler, NULL) -#ifdef HAVE_SABLOT_SET_ENCODING - PHP_FE(xslt_set_encoding, NULL) -#endif - PHP_FE(xslt_free, NULL) - - PHP_FE(xslt_error, NULL) - PHP_FE(xslt_errno, NULL) - {NULL, NULL, NULL} -}; -/* }}} */ - -/* {{{ xslt_module_entry - */ -zend_module_entry xslt_module_entry = { - STANDARD_MODULE_HEADER, - "xslt", - xslt_functions, - PHP_MINIT(xslt), - NULL, - NULL, - NULL, - PHP_MINFO(xslt), - NO_VERSION_YET, - STANDARD_MODULE_PROPERTIES -}; -/* }}} */ - -#ifdef COMPILE_DL_XSLT -ZEND_GET_MODULE(xslt) -#endif - -/* {{{ handler structs - A structure containing the sax handlers, automatically - registered whether the user defines them or not */ -static SAXHandler sax_handlers = -{ - sax_startdoc, - sax_startelement, - sax_endelement, - sax_startnamespace, - sax_endnamespace, - sax_comment, - sax_pi, - sax_characters, - sax_enddoc -}; - -/* Error handlers, automatically registered */ -static MessageHandler message_handler = { - error_makecode, - error_log, - error_print -}; - -/* Scheme handlers automatically registered */ -static SchemeHandler scheme_handler = { - scheme_getall, - scheme_freememory, - scheme_open, - scheme_get, - scheme_put, - scheme_close -}; -/* }}} */ - -/* {{{ PHP_MINIT_FUNCTION - */ -PHP_MINIT_FUNCTION(xslt) -{ - le_xslt = zend_register_list_destructors_ex(free_processor, NULL, le_xslt_name, module_number); - return SUCCESS; -} -/* }}} */ - -/* {{{ PHP_MINFO_FUNCTION - */ -PHP_MINFO_FUNCTION(xslt) -{ - php_info_print_table_start(); - php_info_print_table_row(2, "XSLT support", "enabled"); - php_info_print_table_end(); -} -/* }}} */ - -/* {{{ proto resource xslt_create(void) - Create a new XSLT processor */ -PHP_FUNCTION(xslt_create) -{ - php_xslt *handle; /* The php -> sablotron handle */ - SablotSituation ctx; /* Sablotron situation */ - SablotHandle processor; /* The sablotron processor */ - int error; /* The error container */ - - /* Allocate the php-sablotron handle */ - handle = ecalloc(1, sizeof(php_xslt)); - handle->handlers = ecalloc(1, sizeof(struct xslt_handlers)); - handle->err = ecalloc(1, sizeof(struct xslt_error)); - - XSLT_LOG(handle).path = NULL; - - /* Unless SAX handlers are */ - handle->cacheable = 1; - - /* Allocate the processor ctx */ - error = SablotCreateSituation(&ctx); - if (error) { - XSLT_ERRNO(handle) = error; - RETURN_FALSE; - } - - XSLT_CONTEXT(handle) = ctx; - - /* Allocate the actual processor itself, via sablotron */ - error = SablotCreateProcessorForSituation(XSLT_CONTEXT(handle), &processor); - if (error) { - XSLT_ERRNO(handle) = error; - RETURN_FALSE; - } - - /* Save the processor and set the default handlers */ - XSLT_PROCESSOR(handle) = processor; - SablotRegHandler(XSLT_PROCESSOR(handle), HLR_SAX, (void *) &sax_handlers, (void *) handle); - SablotRegHandler(XSLT_PROCESSOR(handle), HLR_MESSAGE, (void *) &message_handler, (void *) handle); - SablotRegHandler(XSLT_PROCESSOR(handle), HLR_SCHEME, (void *) &scheme_handler, (void *) handle); - - /* Register the processor as a resource and return it to the user */ - ZEND_REGISTER_RESOURCE(return_value, handle, le_xslt); - - /* The resource index, save it for later use */ - handle->processor.idx = Z_LVAL_P(return_value); -} -/* }}} */ - -/* {{{ proto void xslt_set_sax_handlers(resource processor, array handlers) - Set the SAX handlers to be called when the XML document gets processed */ -PHP_FUNCTION(xslt_set_sax_handlers) -{ - zval **processor_p, /* Resource pointer to the php->sablotron handle */ - **sax_handlers_p, /* Pointer to the sax handlers php array */ - **handler; /* Individual handler, or handler pair */ - HashTable *sax_handlers; /* PHP array of sax handlers */ - php_xslt *handle; /* Pointer to a php_xslt handle */ - char *string_key; /* String key for the hash */ - ulong num_key; /* (unused) hash's numerical key */ - int key_type; /* The type of the current hash key */ - - if (ZEND_NUM_ARGS() != 2 || - zend_get_parameters_ex(2, &processor_p, &sax_handlers_p) == FAILURE) { - WRONG_PARAM_COUNT; - } - ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - - handle->cacheable = 0; - - /* Convert the sax_handlers_p zval ** to a hash table we can process */ - sax_handlers = HASH_OF(*sax_handlers_p); - if (!sax_handlers) { - php_error(E_WARNING, "Expecting an array as the second argument to xslt_set_sax_handlers()"); - return; - } - - /* Loop through the HashTable containing the SAX handlers */ - for (zend_hash_internal_pointer_reset(sax_handlers); - zend_hash_get_current_data(sax_handlers, (void **) &handler) == SUCCESS; - zend_hash_move_forward(sax_handlers)) { - - key_type = zend_hash_get_current_key(sax_handlers, &string_key, &num_key, 0); - if (key_type == HASH_KEY_IS_LONG) { - convert_to_string_ex(handler); - php_error(E_NOTICE, "Skipping numerical index %d (with value %s) in xslt_set_sax_handlers()", - num_key, Z_STRVAL_PP(handler)); - continue; - } - - /* Document handlers (document start, document end) */ - if (!strcmp(string_key, "document")) { - SEPARATE_ZVAL(handler); - register_sax_handler_pair(&XSLT_SAX(handle).doc_start, - &XSLT_SAX(handle).doc_end, - handler); - } - /* Element handlers, start of an element, and end of an element */ - else if (!strcmp(string_key, "element")) { - SEPARATE_ZVAL(handler); - register_sax_handler_pair(&XSLT_SAX(handle).element_start, - &XSLT_SAX(handle).element_end, - handler); - } - /* Namespace handlers, start of a namespace, end of a namespace */ - else if (!strcmp(string_key, "namespace")) { - SEPARATE_ZVAL(handler); - register_sax_handler_pair(&XSLT_SAX(handle).namespace_start, - &XSLT_SAX(handle).namespace_end, - handler); - } - /* Comment handlers, called when a comment is reached */ - else if (!strcmp(string_key, "comment")) { - XSLT_SAX(handle).comment = *handler; - zval_add_ref(&XSLT_SAX(handle).comment); - } - /* Processing instructions handler called when processing instructions - (<? ?>) */ - else if (!strcmp(string_key, "pi")) { - XSLT_SAX(handle).pi = *handler; - zval_add_ref(&XSLT_SAX(handle).pi); - } - /* Character handler, called when data is found */ - else if (!strcmp(string_key, "character")) { - XSLT_SAX(handle).characters = *handler; - zval_add_ref(&XSLT_SAX(handle).characters); - } - /* Invalid handler name, tsk, tsk, tsk :) */ - else { - php_error(E_WARNING, "Invalid option to xslt_set_sax_handlers(): %s", string_key); - } - } -} -/* }}} */ - -/* {{{ proto void xslt_set_scheme_handlers(resource processor, array handlers) - Set the scheme handlers for the XSLT processor */ -PHP_FUNCTION(xslt_set_scheme_handlers) -{ - zval **processor_p, /* Resource pointer to the php->sablotron handle */ - **scheme_handlers_p, /* Pointer to the scheme handler array */ - **handler; /* Individual scheme handler */ - zval **assign_handle; /* The handler to assign to */ - HashTable *scheme_handlers; /* Scheme handler array */ - php_xslt *handle; /* php->sablotron handle */ - char *string_key; /* Hash key (string) */ - ulong num_key; /* (unused) Hash key (number) */ - int key_type; /* The type of the current key */ - - if (ZEND_NUM_ARGS() != 2 || - zend_get_parameters_ex(2, &processor_p, &scheme_handlers_p) == FAILURE) { - WRONG_PARAM_COUNT; - } - ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - - scheme_handlers = HASH_OF(*scheme_handlers_p); - if (!scheme_handlers) { - php_error(E_WARNING, "2nd argument to xslt_set_scheme_handlers() must be an array"); - return; - } - - /* Loop through the scheme handlers array, setting the given - scheme handlers */ - for (zend_hash_internal_pointer_reset(scheme_handlers); - zend_hash_get_current_data(scheme_handlers, (void **) &handler) == SUCCESS; - zend_hash_move_forward(scheme_handlers)) { - - key_type = zend_hash_get_current_key(scheme_handlers, &string_key, &num_key, 0); - if (key_type == HASH_KEY_IS_LONG) { - php_error(E_NOTICE, "Numerical key %d (with value %s) being ignored " - "in xslt_set_scheme_handlers()", - num_key, Z_STRVAL_PP(handler)); - continue; - } - - /* Open the URI and return the whole string */ - if (!strcmp(string_key, "get_all")) { - assign_handle = &XSLT_SCHEME(handle).get_all; - } - /* Open the URI and return a handle */ - else if (!strcmp(string_key, "open")) { - assign_handle = &XSLT_SCHEME(handle).open; - } - /* Retrieve data from the URI */ - else if (!strcmp(string_key, "get")) { - assign_handle = &XSLT_SCHEME(handle).get; - } - /* Save data to the URI */ - else if (!strcmp(string_key, "put")) { - assign_handle = &XSLT_SCHEME(handle).put; - } - /* Close the URI */ - else if (!strcmp(string_key, "close")) { - assign_handle = &XSLT_SCHEME(handle).close; - } - /* Invalid handler name */ - else { - php_error(E_WARNING, "%s() invalid option '%s', skipping", - get_active_function_name(TSRMLS_C), string_key); - continue; - } - - *assign_handle = *handler; - zval_add_ref(assign_handle); - } -} -/* }}} */ - -/* {{{ proto void xslt_set_error_handler(resource processor, mixed error_func) - Set the error handler, to be called when an XSLT error happens */ -PHP_FUNCTION(xslt_set_error_handler) -{ - zval **processor_p, /* Resource Pointer to a PHP-XSLT processor */ - **error_func; /* Name of the user defined error function */ - php_xslt *handle; /* A PHP-XSLT processor */ - - if (ZEND_NUM_ARGS() != 2 || - zend_get_parameters_ex(2, &processor_p, &error_func) == FAILURE) { - WRONG_PARAM_COUNT; - } - ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - - XSLT_ERROR(handle) = *error_func; - zval_add_ref(&XSLT_ERROR(handle)); -} -/* }}} */ - -/* {{{ proto void xslt_set_base(resource processor, string base) - Sets the base URI for all XSLT transformations */ -PHP_FUNCTION(xslt_set_base) -{ - zval **processor_p, /* Resource Pointer to a PHP-XSLT processor */ - **base; /* The base URI for the transformation */ - php_xslt *handle; /* A PHP-XSLT processor */ - - if (ZEND_NUM_ARGS() != 2 || - zend_get_parameters_ex(2, &processor_p, &base) == FAILURE) { - WRONG_PARAM_COUNT; - } - ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - convert_to_string_ex(base); - - /* Set the base */ - SablotSetBase(XSLT_PROCESSOR(handle), Z_STRVAL_PP(base)); -} -/* }}} */ - -/* {{{ proto void xslt_set_encoding(resource processor, string encoding) - Set the output encoding for the current stylesheet */ -PHP_FUNCTION(xslt_set_encoding) -{ -/* The user has to explicitly compile sablotron with sablotron - encoding functions in order for SablotSetEncoding to be - enabled. config.m4 automatically checks for this... */ - -#ifdef HAVE_SABLOT_SET_ENCODING - zval **processor_p, /* Resource Pointer to a PHP-XSLT processor */ - **encoding; /* The encoding to use for the output */ - php_xslt *handle; /* A PHP-XSLT processor */ - - if (ZEND_NUM_ARGS() != 2 || - zend_get_parameters_ex(2, &processor_p, &encoding) == FAILURE) { - WRONG_PARAM_COUNT; - } - ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - convert_to_string_ex(encoding); - - /* Set the encoding */ - SablotSetEncoding(XSLT_PROCESSOR(handle), Z_STRVAL_PP(encoding)); -#else - php_error(E_WARNING, "Sablotron not compiled with encoding support"); -#endif - -} -/* }}} */ - -/* {{{ proto void xslt_set_log(resource processor, string logfile) - Set the log file to write the errors to (defaults to stderr) */ -PHP_FUNCTION(xslt_set_log) -{ - zval **processor_p, /* Resource pointer to a PHP-XSLT processor */ - **logfile; /* Path to the logfile */ - php_xslt *handle; /* A PHP-XSLT processor */ - int argc = ZEND_NUM_ARGS(); /* Argument count */ - - if (argc < 1 || argc > 2 || - zend_get_parameters_ex(argc, &processor_p, &logfile) == FAILURE) { - WRONG_PARAM_COUNT; - } - ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - - if (Z_TYPE_PP(logfile) == IS_LONG || - Z_TYPE_PP(logfile) == IS_BOOL || - Z_TYPE_PP(logfile) == IS_DOUBLE) { - XSLT_LOG(handle).do_log = Z_LVAL_PP(logfile); - RETURN_NULL(); - } - else { - convert_to_string_ex(logfile); - } - - /* If the log file already exists, free it */ - if (XSLT_LOG(handle).path) { - efree(XSLT_LOG(handle).path); - } - - /* Copy the path */ - XSLT_LOG(handle).path = estrndup(Z_STRVAL_PP(logfile), - Z_STRLEN_PP(logfile)); -} -/* }}} */ - -/* {{{ S_DOM *_php_sablot_dom_proc(php_xslt *, char *, size_t, zval **) - */ -static SDOM_Document -_php_sablot_dom_proc(php_xslt *handle, char *datap, size_t data_len, zval **args) -{ - SDOM_Document domtree; - - if (!strncmp(datap, "arg:", 4)) { - zval **data; - - if (zend_hash_find(Z_ARRVAL_PP(args), - datap + 4, - data_len - 3, - (void **) &data) == FAILURE && - zend_hash_find(Z_ARRVAL_PP(args), - datap + 5, - data_len - 4, - (void **) &data) == FAILURE) { - php_error(E_WARNING, "Cannot find argument: %s", datap); - return NULL; - } - - SablotParseBuffer(XSLT_CONTEXT(handle), Z_STRVAL_PP(data), &domtree); - } - else { - SablotParse(XSLT_CONTEXT(handle), datap, &domtree); - } - - return domtree; -} -/* }}} */ - -/* {{{ proto string xslt_process(resource processor, string xml, string xslt[, mixed result[, array args[, array params]]]) - Perform the xslt transformation */ -PHP_FUNCTION(xslt_process) -{ - zval **processor_p; /* Resource Pointer to a PHP-XSLT processor */ - zval **xml_p; /* A zval pointer to the XML data */ - zval **xsl_p; /* A zval pointer to the XSL data */ - zval **result_p; /* A zval pointer to the transformation results */ - zval **params_p; /* A zval pointer to the XSL parameters array */ - zval **args_p; /* A zval pointer to the XSL arguments array */ - zval **data; /* Parameter data */ - php_xslt *handle; /* A PHP-XSLT processor */ - SDOM_Document xml_dom; /* XML DOM tree to SablotRunProcessorGen */ - SDOM_Document xsl_dom; /* XSL DOM tree to SablotRunProcessorGen */ - char *string_key; /* String key from xslt_process() */ - char *result; /* The result file or argument buffer */ - int argc; /* The number of arguments given */ - int error; /* Our error container */ - ulong num_key; /* Numerical key */ - - argc = ZEND_NUM_ARGS(); - - if (argc < 3 || argc > 6 || - zend_get_parameters_ex(argc, &processor_p, &xml_p, &xsl_p, - &result_p, &args_p, ¶ms_p) == FAILURE) { - WRONG_PARAM_COUNT; - } - ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - - /* Convert the XML and XSLT strings to S_DOM * handles */ - convert_to_string_ex(xml_p); - convert_to_string_ex(xsl_p); - - xml_dom = _php_sablot_dom_proc(handle, - Z_STRVAL_PP(xml_p), - Z_STRLEN_PP(xml_p), - args_p); - if (!xml_dom) { - RETURN_FALSE; - } - - xsl_dom = _php_sablot_dom_proc(handle, - Z_STRVAL_PP(xsl_p), - Z_STRLEN_PP(xsl_p), - args_p); - if (!xsl_dom) { - RETURN_FALSE; - } - - - SablotAddArgTree(XSLT_CONTEXT(handle), - XSLT_PROCESSOR(handle), - "xml", - xml_dom); - SablotAddArgTree(XSLT_CONTEXT(handle), - XSLT_PROCESSOR(handle), - "xsl", - xsl_dom); - - /* Well, no result file was given or result buffer, that means (guess what?) - * we're returning the result yipp di doo! - */ - if (argc < 4 || - Z_TYPE_PP(result_p) == IS_NULL || - !strcmp(Z_STRVAL_PP(result_p), "arg:/result")) { - result = "result"; - SablotAddArgBuffer(XSLT_CONTEXT(handle), - XSLT_PROCESSOR(handle), - result, - NULL); - } - /* The result buffer to place the data into, either a file or - * an argument buffer, etc. - */ - else { - convert_to_string_ex(result_p); - result = Z_STRVAL_PP(result_p); - } - - /* Add the XSLT parameters */ - if (argc > 5) { - for (zend_hash_internal_pointer_reset(Z_ARRVAL_PP(params_p)); - zend_hash_get_current_data(Z_ARRVAL_PP(params_p), (void **) &data) == FAILURE; - zend_hash_move_forward(Z_ARRVAL_PP(params_p))) { - if (zend_hash_get_current_key(Z_ARRVAL_PP(params_p), - &string_key, - &num_key, - 0) == HASH_KEY_IS_LONG) { - php_error(E_WARNING, "Only string keys are allowed as XSLT parameters"); - RETURN_FALSE; - } - - SablotAddParam(XSLT_CONTEXT(handle), - XSLT_PROCESSOR(handle), - string_key, - Z_STRVAL_PP(data)); - } - } - - /* Perform transformation */ - error = SablotRunProcessorGen(XSLT_CONTEXT(handle), - XSLT_PROCESSOR(handle), - "arg:/xsl", - "arg:/xml", - result); - if (error) { - XSLT_ERRNO(handle) = error; - RETURN_FALSE; - } - - SablotDestroyDocument(XSLT_CONTEXT(handle), xml_dom); - SablotDestroyDocument(XSLT_CONTEXT(handle), xsl_dom); - - /* If the result buffer is specified, then we return the results of the XSLT - transformation */ - if (!strcmp(result, "arg:/result")) { - char *trans_result; - - /* Fetch the result buffer into trans_result */ - error = SablotGetResultArg(XSLT_PROCESSOR(handle), - "arg:/result", - &trans_result); - if (error) { - /* Save the error number */ - XSLT_ERRNO(handle) = error; - RETURN_FALSE; - } - - RETVAL_STRING(trans_result, 1); - SablotFree(trans_result); - } - else { - RETURN_TRUE; - } -} -/* }}} */ - -/* {{{ proto void xslt_free(resource processor) - Free the xslt processor up */ -PHP_FUNCTION(xslt_free) -{ - zval **processor_p; /* Resource pointer to a php-xslt processor */ - php_xslt *handle; /* A PHP-XSLT processor */ - - if (ZEND_NUM_ARGS() != 1 || - zend_get_parameters_ex(1, &processor_p) == FAILURE) { - WRONG_PARAM_COUNT; - } - ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - - /* Remove the entry from the list */ - zend_list_delete(Z_LVAL_PP(processor_p)); -} -/* }}} */ - -/* {{{ proto int xslt_errno(resource processor) - Error number */ -PHP_FUNCTION(xslt_errno) -{ - zval **processor_p; /* Resource pointer to a PHP-XSLT processor */ - php_xslt *handle; /* A PHP-XSLT processor */ - - if (ZEND_NUM_ARGS() != 1 || - zend_get_parameters_ex(1, &processor_p) == FAILURE) { - WRONG_PARAM_COUNT; - } - ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - - RETURN_LONG(XSLT_ERRNO(handle)); -} -/* }}} */ - -/* {{{ proto string xslt_error(resource processor) - Error string */ -PHP_FUNCTION(xslt_error) -{ - zval **processor_p; /* Resource pointer to a PHP-XSLT processor */ - php_xslt *handle; /* A PHP-XSLT processor */ - - if (ZEND_NUM_ARGS() != 1 || - zend_get_parameters_ex(1, &processor_p) == FAILURE) { - WRONG_PARAM_COUNT; - } - ZEND_FETCH_RESOURCE(handle, php_xslt *, processor_p, -1, le_xslt_name, le_xslt); - - if(XSLT_ERRSTR(handle)) { - RETURN_STRING(XSLT_ERRSTR(handle), 1); - } else { - RETURN_FALSE; - } -} -/* }}} */ - -/* {{{ free_processor() - Free an XSLT processor */ -static void free_processor(zend_rsrc_list_entry *rsrc TSRMLS_DC) -{ - php_xslt *handle = (php_xslt *) rsrc->ptr; /* A PHP-XSLT processor */ - - /* Free the processor */ - if (XSLT_PROCESSOR(handle)) { - SablotUnregHandler(XSLT_PROCESSOR(handle), HLR_MESSAGE, NULL, NULL); - SablotUnregHandler(XSLT_PROCESSOR(handle), HLR_SAX, NULL, NULL); - SablotUnregHandler(XSLT_PROCESSOR(handle), HLR_SCHEME, NULL, NULL); - SablotDestroyProcessor(XSLT_PROCESSOR(handle)); - } - - if (XSLT_CONTEXT(handle)) { - SablotDestroySituation(XSLT_CONTEXT(handle)); - } - - /* Free Scheme handlers */ - XSLT_FUNCH_FREE(XSLT_SCHEME(handle).get_all); - XSLT_FUNCH_FREE(XSLT_SCHEME(handle).open); - XSLT_FUNCH_FREE(XSLT_SCHEME(handle).get); - XSLT_FUNCH_FREE(XSLT_SCHEME(handle).put); - XSLT_FUNCH_FREE(XSLT_SCHEME(handle).close); - /* Free SAX handlers */ - XSLT_FUNCH_FREE(XSLT_SAX(handle).doc_start); - XSLT_FUNCH_FREE(XSLT_SAX(handle).element_start); - XSLT_FUNCH_FREE(XSLT_SAX(handle).element_end); - XSLT_FUNCH_FREE(XSLT_SAX(handle).namespace_start); - XSLT_FUNCH_FREE(XSLT_SAX(handle).namespace_end); - XSLT_FUNCH_FREE(XSLT_SAX(handle).comment); - XSLT_FUNCH_FREE(XSLT_SAX(handle).pi); - XSLT_FUNCH_FREE(XSLT_SAX(handle).characters); - XSLT_FUNCH_FREE(XSLT_SAX(handle).doc_end); - /* Free error handler */ - XSLT_FUNCH_FREE(XSLT_ERROR(handle)); - - /* Free error message, if any */ - if (XSLT_ERRSTR(handle)) { - efree(XSLT_ERRSTR(handle)); - } - - /* Close log file */ - if (XSLT_LOG(handle).fd) { - close(XSLT_LOG(handle).fd); - } - - /* Free log file path */ - if (XSLT_LOG(handle).path) { - efree(XSLT_LOG(handle).path); - } - - /* Free up the handle */ - efree(handle->handlers); - efree(handle->err); - efree(handle); -} -/* }}} */ - -/* {{{ register_sax_handler_pair() - Register a pair of sax handlers */ -static void register_sax_handler_pair(zval **handler1, zval **handler2, zval **handler) -{ - zval **current; /* The current handler we're grabbing */ - - /* Grab and assign handler 1 */ - if (zend_hash_index_find(Z_ARRVAL_PP(handler), 0, (void **) ¤t) == SUCCESS) { - *handler1 = *current; - zval_add_ref(handler1); - } - else { - php_error(E_WARNING, "Wrong format of arguments to xslt_set_sax_handlers()"); - return; - } - - /* Grab and assign handler 2 */ - if (zend_hash_index_find(Z_ARRVAL_PP(handler), 1, (void **) ¤t) == SUCCESS) { - *handler2 = *current; - zval_add_ref(handler2); - } - else { - php_error(E_WARNING, "Wrong format of arguments to xslt_set_sax_handlers()"); - return; - } -} -/* }}} */ - -/* {{{ scheme_getall() - The getall scheme handler */ -static int scheme_getall(void *user_data, - SablotHandle proc, - const char *scheme, - const char *rest, - char **buffer, - int *byte_count) -{ - zval *argv[3]; /* Arguments to the scheme getall function */ - zval *retval; /* Return value from the scheme getall function */ - php_xslt *handle = (php_xslt *) user_data; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* If the scheme handler get all function doesn't - exist, exit out */ - if (!XSLT_SCHEME(handle).get_all) { - return 0; - } - - /* Allocate and initialize */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - MAKE_STD_ZVAL(argv[2]); - - /* Argument 1: XSLT processor (resource) - Argument 2: Scheme (string) - Argument 3: Rest (string) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_STRING(argv[1], (char *) scheme, 1); - ZVAL_STRING(argv[2], (char *) rest, 1); - - xslt_call_function("scheme get all", XSLT_SCHEME(handle).get_all, - 3, argv, &retval); - - /* Save the return value in the buffer (copying it) */ - *buffer = estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval)); - *byte_count = Z_STRLEN_P(retval); - - /* Free return value */ - zval_ptr_dtor(&retval); - - return 0; -} -/* }}} */ - -/* {{{ scheme_handler_is_registered() - Check to see if the scheme handler is registered with the user */ -static int scheme_handler_is_registered(php_xslt *handle) -{ - /* If one of the functions is exists, then scheme - handlers are registered */ - if (XSLT_SCHEME(handle).get_all || - XSLT_SCHEME(handle).open || - XSLT_SCHEME(handle).get || - XSLT_SCHEME(handle).put || - XSLT_SCHEME(handle).close) - return 1; - /* otherwise, no cigar */ - else - return 0; -} -/* }}} */ - -/* {{{ scheme_freememory() - Called when sablotron needs to free memory related to scheme handling */ -static int scheme_freememory(void *user_data, SablotHandle proc, char *buffer) -{ - /* If we don't have any scheme handler's registered, then emalloc() wasn't - used, and if emalloc() wasn't then efree shouldn't be used */ - if (!scheme_handler_is_registered((php_xslt *) user_data)) { - return 0; - } - - /* Free the memory using efree() and remove it from the register */ - efree(buffer); - - return 0; -} -/* }}} */ - -/* {{{ scheme_open() - Called when the URI needs to be opened */ -static int scheme_open(void *user_data, - SablotHandle proc, - const char *scheme, - const char *rest, - int *fd) -{ - zval *argv[3]; /* Arguments to the scheme open function */ - zval *retval; /* The return value from the scheme open function */ - php_xslt *handle = (php_xslt *) user_data; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* If no open handler exists, let's exit */ - if (!XSLT_SCHEME(handle).open) { - return 0; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - MAKE_STD_ZVAL(argv[2]); - - /* Argument 1: XSLT Processor (resource) - Argument 2: Scheme (string) - Argument 3: Rest (string) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_STRING(argv[1], (char *) scheme, 1); - ZVAL_STRING(argv[2], (char *) rest, 1); - - /* Call the function */ - xslt_call_function("scheme open", XSLT_SCHEME(handle).open, - 3, argv, &retval); - - /* Return value is a resource pointer to an open file */ - *fd = Z_LVAL_P(retval); - - /* Free it all up */ - zval_ptr_dtor(&retval); - - /* return success */ - return 0; -} -/* }}} */ - -/* {{{ scheme_get() - Called when data needs to be fetched from the URI */ -static int scheme_get(void *user_data, SablotHandle proc, int fd, char *buffer, int *byte_count) -{ - zval *argv[3]; /* Arguments to the scheme get function */ - zval *retval; /* Return value from the scheme get function */ - php_xslt *handle = (php_xslt *) user_data; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* If no get handler exists, let's exit */ - if (!XSLT_SCHEME(handle).get) { - return 0; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - MAKE_STD_ZVAL(argv[2]); - - /* Argument 1: XSLT Processor (resource) - Argument 2: File Pointer (resource) - Argument 3: Data (string) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_RESOURCE(argv[1], fd); - zend_list_addref(fd); - ZVAL_STRINGL(argv[2], buffer, *byte_count, 0); - - /* Call the function */ - xslt_call_function("scheme get", XSLT_SCHEME(handle).get, - 3, argv, &retval); - - /* Returns the number of bytes read */ - *byte_count = Z_LVAL_P(retval); - - /* Free things up */ - zval_ptr_dtor(&retval); - - /* return success */ - return 0; -} -/* }}} */ - -/* {{{ scheme_put() - Called when data needs to be written */ -static int scheme_put(void *user_data, - SablotHandle proc, - int fd, - const char *buffer, - int *byte_count) -{ - zval *argv[3]; /* Arguments to the scheme put function */ - zval *retval; /* Return value from the scheme put function */ - php_xslt *handle = (php_xslt *) user_data; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* If no put handler exists, let's exit */ - if (!XSLT_SCHEME(handle).put) { - return 0; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - MAKE_STD_ZVAL(argv[2]); - - /* Argument 1: XSLT processor (resource) - Argument 2: File pointer (resource) - Argument 3: Data (string) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_RESOURCE(argv[1], fd); - zend_list_addref(fd); - ZVAL_STRINGL(argv[2], (char *) buffer, *byte_count, 1); - - /* Call the scheme put function already */ - xslt_call_function("scheme put", XSLT_SCHEME(handle).put, - 3, argv, &retval); - - /* The return value is the number of bytes written */ - *byte_count = Z_LVAL_P(retval); - - /* Free everything up */ - zval_ptr_dtor(&retval); - - /* Return success */ - return 0; -} -/* }}} */ - -/* {{{ scheme_close() - Called when its time to close the fd */ -static int scheme_close(void *user_data, SablotHandle proc, int fd) -{ - zval *argv[2]; /* Arguments to the scheme close function*/ - zval *retval; /* Return value from the scheme close function */ - php_xslt *handle = (php_xslt *) user_data; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* if no close handler exists, exit */ - if (!XSLT_SCHEME(handle).close) { - return 0; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - - /* Argument 1: XSLT processor (resource) - Argument 2: File pointer (resource) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_RESOURCE(argv[1], fd); - zend_list_addref(fd); - - /* Call the scheme handler close function */ - xslt_call_function("scheme close", XSLT_SCHEME(handle).close, - 2, argv, &retval); - - /* Free everything up */ - zval_ptr_dtor(&retval); - - /* Return success */ - return 0; -} -/* }}} */ - -/* {{{ sax_startdoc() - Called when the document starts to be processed */ -static SAX_RETURN sax_startdoc(void *ctx, SablotHandle proc) -{ - zval *argv[1]; /* Arguments to the sax start doc function */ - zval *retval; /* Return value from sax start doc function */ - php_xslt *handle = (php_xslt *) ctx; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* if no document start function exists, exit */ - if (!XSLT_SAX(handle).doc_start) { - return; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - - /* Argument 1: XSLT processor (resource) */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - - /* Call the Sax start doc function */ - xslt_call_function("sax start doc", XSLT_SAX(handle).doc_start, - 1, argv, &retval); - - /* Cleanup */ - zval_ptr_dtor(&retval); -} -/* }}} */ - -/* {{{ sax_startelement() - Called when an element is begun to be processed */ -static SAX_RETURN sax_startelement(void *ctx, - SablotHandle proc, - const char *name, - const char **attr) -{ - zval *argv[3]; /* Arguments to the sax start element function */ - zval *retval; /* Return value from the sax start element function */ - php_xslt *handle = (php_xslt *) ctx; /* A PHP-XSLT processor */ - char **p; /* Pointer to attributes */ - TSRMLS_FETCH(); - - /* If no element start function is found, exit */ - if (!XSLT_SAX(handle).element_start) { - return; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - MAKE_STD_ZVAL(argv[2]); - array_init(argv[2]); - - /* Argument 1: XSLT processor (resource) - Argument 2: Element name (string) - Argument 3: Element attributes (array) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_STRING(argv[1], (char *) name, 1); - - /* loop through the attributes array, copying it onto our - php array */ - p = (char **) attr; - while (p && *p) { - add_assoc_string(argv[2], *p, *(p + 1), 1); - p += 2; - } - - /* Call the sax element start function */ - xslt_call_function("sax start element", XSLT_SAX(handle).element_start, - 3, argv, &retval); - - /* Cleanup */ - zval_ptr_dtor(&retval); -} -/* }}} */ - -/* {{{ sax_endelement() - Called when an ending XML element is encountered */ -static SAX_RETURN sax_endelement(void *ctx, SablotHandle proc, const char *name) -{ - zval *argv[2]; /* Arguments to the sax end element function */ - zval *retval; /* Return value from the sax end element function */ - php_xslt *handle = (php_xslt *) ctx; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* If no element end function exists, exit */ - if (!XSLT_SAX(handle).element_end) { - return; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - - /* Argument 1: XSLT processor (resource) - Argument 2: Element name (string) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_STRING(argv[1], (char *) name, 1); - - /* Call the sax end element function */ - xslt_call_function("sax end element", XSLT_SAX(handle).element_end, - 2, argv, &retval); - - /* Cleanup */ - zval_ptr_dtor(&retval); -} -/* }}} */ - -/* {{{ sax_startnamespace() - Called at the beginning of the parsing of a new namespace */ -static SAX_RETURN sax_startnamespace(void *ctx, - SablotHandle proc, - const char *prefix, - const char *uri) -{ - zval *argv[3]; /* Arguments to the sax start namespace function */ - zval *retval; /* Return value from the sax start namespace function */ - php_xslt *handle = (php_xslt *) ctx; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* if no namespace start function exists, exit */ - if (!XSLT_SAX(handle).namespace_start) { - return; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - MAKE_STD_ZVAL(argv[2]); - - /* Argument 1: XSLT processor (resource) - Argument 2: Prefix (string) - Argument 3: URI (string) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_STRING(argv[1], (char *) prefix, 1); - ZVAL_STRING(argv[2], (char *) uri, 1); - - /* Call the sax start namespace function */ - xslt_call_function("sax start namespace", XSLT_SAX(handle).namespace_start, - 3, argv, &retval); - - /* Cleanup */ - zval_ptr_dtor(&retval); -} -/* }}} */ - -/* {{{ sax_endnamespace() - Called when a new namespace is finished being parsed */ -static SAX_RETURN sax_endnamespace(void *ctx, SablotHandle proc, const char *prefix) -{ - zval *argv[2]; /* Arguments to the sax end namespace function */ - zval *retval; /* Return value from the sax end namespace function */ - php_xslt *handle = (php_xslt *) ctx; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* If no namespace end function exists, exit */ - if (!XSLT_SAX(handle).namespace_end) { - return; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - - /* Argument 1: XSLT processor (resource) - Argument 2: Prefix (string) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_STRING(argv[1], (char *) prefix, 1); - - /* Call the sax end namespace function */ - xslt_call_function("sax end namespace", XSLT_SAX(handle).namespace_end, - 2, argv, &retval); - - /* Cleanup */ - zval_ptr_dtor(&retval); -} -/* }}} */ - -/* {{{ sax_comment() - Called when a comment is found */ -static SAX_RETURN sax_comment(void *ctx, SablotHandle proc, const char *contents) -{ - zval *argv[2]; /* Arguments to the sax comment function */ - zval *retval; /* Return value from the sax comment function */ - php_xslt *handle = (php_xslt *) ctx; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* if no comment function exists, exit */ - if (!XSLT_SAX(handle).comment) { - return; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - - /* Argument 1: XSLT processor (resource) - Argument 2: Comment contents (string) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_STRING(argv[1], (char *) contents, 1); - - /* Call the sax comment function */ - xslt_call_function("sax comment", XSLT_SAX(handle).comment, - 2, argv, &retval); - - /* Cleanup */ - zval_ptr_dtor(&retval); -} -/* }}} */ - -/* {{{ sax_pi() - Called when processing instructions are found */ -static SAX_RETURN sax_pi(void *ctx, - SablotHandle proc, - const char *target, - const char *contents) -{ - zval *argv[3]; /* Arguments to the sax processing instruction function */ - zval *retval; /* Return value from the sax processing instruction function */ - php_xslt *handle; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - handle = (php_xslt *) ctx; - - /* If no processing instructions function exists, exit */ - if (!XSLT_SAX(handle).pi) { - return; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - MAKE_STD_ZVAL(argv[2]); - - /* Argument 1: XSLT processor (resource) - Argument 2: Target of the pi (string) - Argument 3: Contents of the pi (string) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_STRING(argv[1], (char *) target, 1); - ZVAL_STRING(argv[2], (char *) contents, 1); - - /* Call processing instructions function */ - xslt_call_function("sax processing instructions", XSLT_SAX(handle).pi, - 3, argv, &retval); - - /* Cleanup */ - zval_ptr_dtor(&retval); -} -/* }}} */ - -/* {{{ sax_characters() - Called when characters are come upon */ -static SAX_RETURN sax_characters(void *ctx, - SablotHandle proc, - const char *contents, - int length) -{ - zval *argv[2]; /* Arguments to the sax characters function */ - zval *retval; /* Return value to the sax characters function */ - php_xslt *handle = (php_xslt *) ctx; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* If no characters function exists, exit */ - if (!XSLT_SAX(handle).characters) { - return; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - - /* Argument 1: XSLT processor (resource) - Argument 2: Contents (string) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_STRINGL(argv[1], (char *) contents, length, 1); - - /* Call characters function */ - xslt_call_function("sax characters", XSLT_SAX(handle).characters, - 2, argv, &retval); - - /* Cleanup */ - zval_ptr_dtor(&retval); -} -/* }}} */ - -/* {{{ sax_enddoc() - Called when the document is finished being parsed */ -static SAX_RETURN sax_enddoc(void *ctx, SablotHandle proc) -{ - zval *argv[1]; /* Arguments to the end document function */ - zval *retval; /* Return value from the end document function */ - php_xslt *handle = (php_xslt *) ctx; /* A PHP-XSLT processor */ - TSRMLS_FETCH(); - - /* If no end document function exists, exit */ - if (!XSLT_SAX(handle).doc_end) { - return; - } - - /* Allocate and initialize arguments */ - MAKE_STD_ZVAL(argv[0]); - - /* Argument 1: XSLT Processor (resource) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - - /* Call the function */ - xslt_call_function("sax end doc", XSLT_SAX(handle).doc_end, - 1, argv, &retval); - - /* Cleanup */ - zval_ptr_dtor(&retval); -} -/* }}} */ - - -/* {{{ _error_parse() - Parse a char ** array into an _error_fields structure */ -struct _error_fields { - char *message; - char *type; - char *line; -}; - -static void -_error_parse (char **fields, struct _error_fields *xse) -{ - char *val; - char *p; - int pos; - int len; - - /* Prep structure */ - memset(xse, 0, sizeof(struct _error_fields)); - - while (*fields) { - p = strchr(*fields, ':'); - if (p == NULL) - continue; - - len = strlen(*fields); - - pos = p - *fields; - val = estrndup(*fields + pos + 1, len - pos); - - if (!strncmp(*fields, "msg", MIN(3, pos+1))) { - xse->message = val; - } - else if (!strncmp(*fields, "type", MIN(4, pos+1))) { - xse->type = val; - } - else if (!strncmp(*fields, "line", MIN(4, pos+1))) { - xse->line = val; - } - - ++fields; - } - - if (!xse->type) - xse->type = estrdup("unknown error type"); - - if (!xse->line) - xse->line = estrdup("unknown line"); - - if (!xse->message) - xse->message = estrdup("unknown error"); -} -/* }}} */ - -/* {{{ _free_error_field_struct() - Free an error field structure created by _error_parse() */ -static void -_free_error_field_struct(struct _error_fields *xse) -{ - if (xse->message) efree(xse->message); - if (xse->type) efree(xse->type); - if (xse->line) efree(xse->line); -} -/* }}} */ - -/* {{{ error_makecode() - Make the error code */ -static MH_ERROR error_makecode(void *user_data, - SablotHandle proc, - int severity, - unsigned short facility, - unsigned short code) -{ - return 0; -} -/* }}} */ - -/* {{{ error_log() - Called when its time to log data */ -static MH_ERROR error_log(void *user_data, - SablotHandle proc, - MH_ERROR code, - MH_LEVEL level, - char **fields) -{ - php_xslt *handle = (php_xslt *) user_data; /* A PHP-XSLT processor */ - struct _error_fields err; /* Error structure */ - char *msgbuf; /* Message buffer */ - int msgbuf_len; /* Message buffer len */ - int error = 0; /* Error container */ - -#define msgformat "Sablotron message on line %s, level %s: %s\n" - - /* Skip, if logging is disabled */ - if (!XSLT_LOG(handle).do_log) - return 0; - - /* parse error list into a structure */ - _error_parse(fields, &err); - - /* Allocate the message buf and copy the data into it */ - msgbuf_len = (sizeof(msgformat) - 6) + - strlen(err.message) + - strlen(err.line) + - strlen(err.type); - msgbuf = emalloc(msgbuf_len + 1); - snprintf(msgbuf, msgbuf_len, msgformat, err.line, err.type, err.message); - - /* If the error is serious enough, copy it to our error buffer - which will show up when someone calls the xslt_error() function */ - if (level == MH_LEVEL_WARN || - level == MH_LEVEL_ERROR || - level == MH_LEVEL_CRITICAL) { - if (XSLT_ERRSTR(handle)) - efree(XSLT_ERRSTR(handle)); - - XSLT_ERRSTR(handle) = estrndup(msgbuf, msgbuf_len); - } - - /* If we haven't allocated and opened the file yet */ - if (!XSLT_LOG(handle).fd) { - /* Lets open up a file */ - if (XSLT_LOG(handle).path && strcmp(XSLT_LOG(handle).path, "php://stderr")) { - /* open for append */ - XSLT_LOG(handle).fd = open(XSLT_LOG(handle).path, - O_WRONLY|O_CREAT|O_APPEND, - S_IRUSR|S_IRGRP|S_IROTH|S_IWUSR); - if (XSLT_LOG(handle).fd == -1) { - php_error(E_WARNING, "Cannot open log file, %s [%d]: %s", - XSLT_LOG(handle).path, errno, strerror(errno)); - XSLT_LOG(handle).fd = 0; - } - } - /* Default is stderr, or if the user provided "php://stderr" that's the - stream */ - else { - XSLT_LOG(handle).fd = 2; - } - } - - /* Write the error to the file */ - error = write(XSLT_LOG(handle).fd, msgbuf, msgbuf_len); - if (error == -1) { - php_error(E_WARNING, "Cannot write data to log file, %s, with fd, %d [%d]: %s", - (XSLT_LOG(handle).path ? XSLT_LOG(handle).path : "stderr"), - XSLT_LOG(handle).fd, - errno, - strerror(errno)); - return 0; - } - - /* Cleanup */ - if (msgbuf) efree(msgbuf); - _free_error_field_struct(&err); - - return 0; -} -/* }}} */ - -/* {{{ error_print() - Print out an error message or call the error handler */ -static MH_ERROR error_print(void *user_data, - SablotHandle proc, - MH_ERROR code, - MH_LEVEL level, - char **fields) -{ - php_xslt *handle = (php_xslt *) user_data; /* A PHP-XSLT processor */ - struct _error_fields err; /* Error field structure */ - - _error_parse(fields, &err); - - if (XSLT_ERROR(handle)) { - zval *argv[4]; /* Arguments to the error function */ - zval *retval; /* Return value from the error function */ - TSRMLS_FETCH(); - - /* Allocate and initialize */ - MAKE_STD_ZVAL(argv[0]); - MAKE_STD_ZVAL(argv[1]); - MAKE_STD_ZVAL(argv[2]); - MAKE_STD_ZVAL(argv[3]); - array_init(argv[3]); - - /* Argument 1: XSLT Processor (resource) - Argument 2: Error level (long) - Argument 3: Error code (long) - Argument 4: Error messages (array) - */ - ZVAL_RESOURCE(argv[0], handle->processor.idx); - zend_list_addref(handle->processor.idx); - ZVAL_LONG(argv[1], level); - ZVAL_LONG(argv[2], code); - - add_assoc_string_ex(argv[3], "type", sizeof("type") - 1, err.type, 0); - add_assoc_string_ex(argv[3], "message", sizeof("message") - 1, err.message, 0); - add_assoc_long_ex(argv[3], "line", sizeof("line") - 1, atoi(err.line)); - - /* Call the function */ - xslt_call_function("error handler", XSLT_ERROR(handle), - 4, argv, &retval); - - /* Free up */ - zval_ptr_dtor(&retval); - } - else { - char *msgbuf; /* Message buffer */ - size_t msgbuf_len; /* Message buffer length */ - -#define msgformat "Sablotron error on line %s: %s" - - /* If the error is not serious, exit out */ - if (code == MH_LEVEL_WARN || - code == MH_LEVEL_ERROR || - code == MH_LEVEL_CRITICAL) { - return 0; - } - - /* Allocate the message buffer and copy the data onto it */ - msgbuf_len = (sizeof(msgformat) - 4) + - strlen(err.message) + - strlen(err.line); - msgbuf = emalloc(msgbuf_len + 1); - - snprintf(msgbuf, msgbuf_len, msgformat, err.line, err.message); - - /* Copy the error message onto the handle for use when - the xslt_error function is called */ - XSLT_ERRSTR(handle) = estrndup(msgbuf, msgbuf_len); - - /* Output a warning */ - php_error(E_WARNING, msgbuf); - - /* Cleanup */ - efree(msgbuf); - _free_error_field_struct(&err); - } - - return 0; -} -/* }}} */ - -#endif - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: fdm=marker - * vim: noet sw=4 ts=4 - */ |