diff options
author | Jaroslaw Kolakowski <jarkol@php.net> | 2002-01-19 21:12:05 +0000 |
---|---|---|
committer | Jaroslaw Kolakowski <jarkol@php.net> | 2002-01-19 21:12:05 +0000 |
commit | 833de5e0d2b2de9e8eb6f5dbf698bd52cb8766db (patch) | |
tree | 9a50b97db1912bcc2eaf65e0911877af3a646af7 /ext/domxml/php_domxml.c | |
parent | bf7662a241771697ee8a8aecd7b342873ba96b5a (diff) | |
download | php-git-833de5e0d2b2de9e8eb6f5dbf698bd52cb8766db.tar.gz |
- Fixed passing parameters to domxml_xslt_process(). Now they can be either strings or XPath expressions.
- Several minor fixes in domxml_xslt_process().
Diffstat (limited to 'ext/domxml/php_domxml.c')
-rw-r--r-- | ext/domxml/php_domxml.c | 154 |
1 files changed, 88 insertions, 66 deletions
diff --git a/ext/domxml/php_domxml.c b/ext/domxml/php_domxml.c index 483c84dd65..adf3f58037 100644 --- a/ext/domxml/php_domxml.c +++ b/ext/domxml/php_domxml.c @@ -406,7 +406,7 @@ static zend_function_entry php_domxmlns_class_functions[] = { #if HAVE_DOMXSLT static zend_function_entry php_domxsltstylesheet_class_functions[] = { -/* TODO */ +/* TODO: maybe some more methods? */ PHP_FALIAS(process, domxml_xslt_process, NULL) {NULL, NULL, NULL} }; @@ -3357,38 +3357,6 @@ static zval *php_xsltstylesheet_new(xsltStylesheetPtr obj, int *found TSRMLS_DC) return (wrapper); } -/* {{{ _php_libxslt_ht_char() - Translates a PHP array to a libxslt character array */ -static void _php_libxslt_ht_char(HashTable *php, char **arr) -{ -/* TODO: - - make parameters array('key'=>'string',...) instead of array('key'=>'XPathExpression') - - change error reporting -*/ - zval **value; - char *string_key = NULL; - ulong num_key; - int i = 0; - - for (zend_hash_internal_pointer_reset(php); - zend_hash_get_current_data(php, (void **)&value) == SUCCESS; - zend_hash_move_forward(php)) { - - SEPARATE_ZVAL(value); - convert_to_string_ex(value); - - if (zend_hash_get_current_key(php, &string_key, &num_key, 1) != HASH_KEY_IS_STRING) { - php_error(E_WARNING, "Not a string key in the parameters array"); - } - else - { - arr[i++] = string_key; - arr[i++] = Z_STRVAL_PP(value); - } - } - arr[i++] = NULL; -} - /* {{{ proto object domxml_xslt_stylesheet(string xsltstylesheet) Creates XSLT Stylesheet object from string */ PHP_FUNCTION(domxml_xslt_stylesheet) @@ -3473,74 +3441,128 @@ PHP_FUNCTION(domxml_xslt_stylesheet_file) } /* }}} */ +/* {{{ php_domxslt_string_to_xpathexpr() + Translates a string to a XPath Expression */ +static char *php_domxslt_string_to_xpathexpr(const char *str) +{ + const xmlChar *string = (const xmlChar *)str; + xmlChar *value; + + if (xmlStrchr(string, '"')) { + if (xmlStrchr(string, '\'')) { + php_error(E_WARNING, "Cannot create XPath expression (string contains both quote and double-quotes) in %s", + get_active_function_name(TSRMLS_C)); + return NULL; + } + value = xmlStrdup((const xmlChar *)"'"); + value = xmlStrcat(value, string); + value = xmlStrcat(value, (const xmlChar *)"'"); + } + else { + value = xmlStrdup((const xmlChar *)"\""); + value = xmlStrcat(value, string); + value = xmlStrcat(value, (const xmlChar *)"\""); + } + + return (char *)value; +} + +/* {{{ php_domxslt_make_params() + Translates a PHP array to a libxslt parameters array */ +static char **php_domxslt_make_params(zval *idvars, int xpath_params) +{ + HashTable *parht; + int parsize; + zval **value; + char *xpath_expr, *string_key = NULL; + ulong num_key; + char **params = NULL; + int i = 0; + + parht = HASH_OF(idvars); + parsize = (2 * zend_hash_num_elements(parht) + 1) * sizeof(char *); + params = (char **)emalloc(parsize); + memset((char *)params, 0, parsize); -/* {{{ proto object domxml_xslt_process(object xslstylesheet, object xmldoc, [array xslt_parameters]) + for (zend_hash_internal_pointer_reset(parht); + zend_hash_get_current_data(parht, (void **)&value) == SUCCESS; + zend_hash_move_forward(parht)) { + + if (zend_hash_get_current_key(parht, &string_key, &num_key, 1) != HASH_KEY_IS_STRING) { + php_error(E_WARNING, "Invalid argument or parameter array to %s", + get_active_function_name(TSRMLS_C)); + return; + } + else { + SEPARATE_ZVAL(value); + convert_to_string_ex(value); + + if (!xpath_params) { + xpath_expr = php_domxslt_string_to_xpathexpr(Z_STRVAL_PP(value)); + } + else { + xpath_expr = Z_STRVAL_PP(value); + } + + if (xpath_expr) { + params[i++] = string_key; + params[i++] = xpath_expr; + } + } + } + + params[i++] = NULL; + + return params; +} + +/* {{{ proto object domxml_xslt_process(object xslstylesheet, object xmldoc [, array xslt_parameters [, bool xpath_parameters]]) Perform an XSLT transformation */ PHP_FUNCTION(domxml_xslt_process) { /* TODO: - - make & test memory deallocation + - test memory deallocation - test other stuff - - move HashTable operations outside the function - check xsltsp->errors ??? */ - zval *rv, *idxsl, *idxml, *idvars = NULL; + zval *rv, *idxsl, *idxml, *idparams = NULL; + zend_bool xpath_params = 0; xsltStylesheetPtr xsltstp; xmlDocPtr xmldocp; xmlDocPtr docp; char **params = NULL; int ret, parsize; - DOMXML_GET_THIS(idxsl); xsltstp = php_xsltstylesheet_get_object(idxsl, le_domxsltstylesheetp, 0 TSRMLS_CC); if (!xsltstp) { - php_error(E_WARNING, "%s(): cannot fetch XSLT Stylesheet", get_active_function_name(TSRMLS_C)); - RETURN_FALSE; + php_error(E_WARNING, "%s(): underlying object missing", + get_active_function_name(TSRMLS_C)); + RETURN_FALSE; } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|a", &idxml, &idvars) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|a|b", &idxml, &idparams, &xpath_params) == FAILURE) { RETURN_FALSE; } DOMXML_GET_OBJ(xmldocp, idxml, le_domxmldocp); - if (idvars) { - HashTable *parht = HASH_OF(idvars); - parsize = (2 * zend_hash_num_elements(parht) + 1) * sizeof(char *); - params = (char **)emalloc(parsize); - memset((char *)params, 0, parsize); - _php_libxslt_ht_char(parht, params); + if (idparams) { + params = php_domxslt_make_params(idparams, xpath_params); } docp = xsltApplyStylesheet(xsltstp, xmldocp, (const char**)params); -/* ???: */ - efree(params); + if (params) { + efree(params); + } if (!docp) { RETURN_FALSE; } DOMXML_RET_OBJ(rv, (xmlNodePtr) docp, &ret); -/* ???: */ -/* - add_property_resource(return_value, "doc", ret); - if(docp->name) - add_property_stringl(return_value, "name", (char *) docp->name, strlen(docp->name), 1); - if(docp->URL) - add_property_stringl(return_value, "url", (char *) docp->name, strlen(docp->name), 1); - if(docp->version) - add_property_stringl(return_value, "version", (char *) docp->version, strlen(docp->version), 1); - if(docp->encoding) - add_property_stringl(return_value, "encoding", (char *) docp->encoding, strlen(docp->encoding), 1); - add_property_long(return_value, "standalone", docp->standalone); - add_property_long(return_value, "type", docp->type); - add_property_long(return_value, "compression", docp->compression); - add_property_long(return_value, "charset", docp->charset); - zend_list_addref(ret); -*/ } /* }}} */ |