diff options
author | Rob Richards <rrichards@php.net> | 2003-07-24 13:18:40 +0000 |
---|---|---|
committer | Rob Richards <rrichards@php.net> | 2003-07-24 13:18:40 +0000 |
commit | e8a87e5430dadb4b049d0d0ea0c849fd75c5e0be (patch) | |
tree | 1fb458db6264620f9debeea6f83d0f0013338b4c /ext/dom/xpath.c | |
parent | 55097d1dcf6eee94413dc2795f923c0ef9f45d3f (diff) | |
download | php-git-e8a87e5430dadb4b049d0d0ea0c849fd75c5e0be.tar.gz |
initial xpath implementation
make dom_object generic
Diffstat (limited to 'ext/dom/xpath.c')
-rw-r--r-- | ext/dom/xpath.c | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/ext/dom/xpath.c b/ext/dom/xpath.c new file mode 100644 index 0000000000..2302733260 --- /dev/null +++ b/ext/dom/xpath.c @@ -0,0 +1,167 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 4 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2003 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_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: Christian Stocker <chregu@php.net> | + | Rob Richards <rrichards@php.net> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "php_dom.h" + + +/* +* class domxpath +*/ + +#if defined(LIBXML_XPATH_ENABLED) + +zend_function_entry php_dom_xpath_class_functions[] = { + PHP_FALIAS(domxpath, dom_xpath_xpath, NULL) + PHP_FALIAS(query, dom_xpath_query, NULL) + {NULL, NULL, NULL} +}; + +/* {{{ proto domxpath dom_xpath_xpath(domDocument doc); */ +PHP_FUNCTION(dom_xpath_xpath) +{ + zval *id, *doc; + xmlDocPtr docp = NULL; + dom_object *docobj, *intern; + xmlXPathContextPtr ctx, oldctx; + + id = getThis(); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &doc) == FAILURE) { + return; + } + + DOM_GET_OBJ(docp, doc, xmlDocPtr, docobj); + + ctx = xmlXPathNewContext(docp); + if (ctx == NULL) { + RETURN_FALSE; + } + + intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC); + if (intern != NULL) { + oldctx = (xmlXPathContextPtr)intern->ptr; + if (oldctx != NULL) { + decrement_document_reference(intern TSRMLS_CC); + xmlXPathFreeContext(oldctx); + } + intern->ptr = ctx; + intern->document = docobj->document; + increment_document_reference(intern, docp TSRMLS_CC); + } +} +/* }}} end dom_xpath_xpath */ + +/* {{{ proto domdocument document document */ +int dom_xpath_document_read(dom_object *obj, zval **retval TSRMLS_DC) +{ + xmlDoc *docp = NULL; + xmlXPathContextPtr ctx; + int ret; + + ctx = (xmlXPathContextPtr) obj->ptr; + + if (ctx) { + docp = (xmlDocPtr) ctx->doc; + } else { + printf("NONE"); + } + + ALLOC_ZVAL(*retval); + if (NULL == (*retval = php_dom_create_object((xmlNodePtr) docp, &ret, NULL, *retval, obj TSRMLS_CC))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object"); + return FAILURE; + } + return SUCCESS; +} + +/* {{{ proto domnodelist dom_xpath_query(string expr [,domNode context]); */ +PHP_FUNCTION(dom_xpath_query) +{ + zval *id, *context = NULL; + xmlXPathContextPtr ctxp; + xmlNodePtr nodep = NULL; + xmlXPathObjectPtr xpathobjp; + int expr_len, ret; + dom_object *intern, *nodeobj; + char *expr; + + DOM_GET_THIS(id); + + intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC); + + ctxp = (xmlXPathContextPtr) intern->ptr; + if (ctxp == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid XPath Context"); + RETURN_FALSE; + } + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|o", &expr, &expr_len, &context) == FAILURE) { + return; + } + + if (context != NULL) { + DOM_GET_OBJ(nodep, context, xmlNodePtr, nodeobj); + } + + ctxp->node = nodep; + + xpathobjp = xmlXPathEvalExpression(expr, ctxp); + ctxp->node = NULL; + + if (!xpathobjp) { + RETURN_FALSE; + } + + if (xpathobjp->type == XPATH_NODESET) { + int i; + xmlNodeSetPtr nodesetp; + + if (NULL == (nodesetp = xpathobjp->nodesetval)) { + xmlXPathFreeObject (xpathobjp); + RETURN_FALSE; + } + + array_init(return_value); + + for (i = 0; i < nodesetp->nodeNr; i++) { + xmlNodePtr node = nodesetp->nodeTab[i]; + zval *child; + MAKE_STD_ZVAL(child); + + child = php_dom_create_object(node, &ret, NULL, child, intern TSRMLS_CC); + add_next_index_zval(return_value, child); + } + } else { + printf("Type: %d", xpathobjp->type); + } + + xmlXPathFreeObject(xpathobjp); +} +/* }}} end dom_xpath_query */ + +#endif /* LIBXML_XPATH_ENABLED */ + +/* }}} */ |