rrichards Mon Sep 8 14:28:36 2003 EDT
Modified files:
/php-src/ext/dom document.c dom_fe.h dom_properties.h php_dom.c
php_dom.h xml_common.h xpath.c
Log:
move some document properties internally
add xpath namespace support (by Shane)
Index: php-src/ext/dom/document.c
diff -u php-src/ext/dom/document.c:1.23 php-src/ext/dom/document.c:1.24
--- php-src/ext/dom/document.c:1.23 Wed Sep 3 06:48:02 2003
+++ php-src/ext/dom/document.c Mon Sep 8 14:28:35 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: document.c,v 1.23 2003/09/03 10:48:02 rrichards Exp $ */
+/* $Id: document.c,v 1.24 2003/09/08 18:28:35 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -85,39 +85,6 @@
{NULL, NULL, NULL}
};
-/* {{{ void add_domdocument_properties(zval *id) */
-void add_domdocument_properties(zval *id TSRMLS_DC) {
- add_property_bool(id, "formatOutput", 0);
- add_property_bool(id, "validateOnParse", 0);
- add_property_bool(id, "resolveExternals", 0);
- add_property_bool(id, "preserveWhiteSpace", 1);
- add_property_bool(id, "substituteEntities", 0);
-}
-/* }}} end add_domdocument_properties */
-
-/* {{{ static int dom_document_get_property_int(zval *id, char *property TSRMLS_DC) */
-static int dom_document_get_property_int(zval *id, char *property TSRMLS_DC) {
- zval *format, *member;
- zend_object_handlers *std_hnd;
- int retformat = 0;
-
- MAKE_STD_ZVAL(member);
- ZVAL_STRING(member, property, 1);
-
- std_hnd = zend_get_std_object_handlers();
- format = std_hnd->read_property(id, member, 0 TSRMLS_CC);
-
- if (format->type == IS_BOOL) {
- retformat = Z_BVAL_P(format);
- }
-
- zval_dtor(member);
- FREE_ZVAL(member);
-
- return retformat;
-}
-/* }}} end dom_document_get_property_int */
-
static void php_dom_validate_error(void *ctx, const char *msg, ...)
{
char *buf;
@@ -386,8 +353,6 @@
/* }}} */
-
-
/* {{{ proto strict_error_checking boolean
readonly=no
URL:
http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-strictErrorChecking
@@ -395,9 +360,12 @@
*/
int dom_document_strict_error_checking_read(dom_object *obj, zval **retval TSRMLS_DC)
{
+ dom_doc_props *doc_prop;
+
ALLOC_ZVAL(*retval);
if (obj->document) {
- ZVAL_BOOL(*retval, obj->document->stricterror);
+ doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(*retval, doc_prop->stricterror);
} else {
ZVAL_FALSE(*retval);
}
@@ -406,11 +374,11 @@
int dom_document_strict_error_checking_write(dom_object *obj, zval *newval TSRMLS_DC)
{
- int stricterror;
+ dom_doc_props *doc_prop;
if (obj->document && newval->type == IS_BOOL) {
- stricterror = Z_LVAL_P(newval);
- obj->document->stricterror = stricterror;
+ doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->stricterror = Z_LVAL_P(newval);
}
return SUCCESS;
@@ -418,6 +386,158 @@
/* }}} */
+/* {{{ proto formatOutput boolean
+readonly=no
+*/
+int dom_document_format_output_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+ dom_doc_props *doc_prop;
+
+ ALLOC_ZVAL(*retval);
+ if (obj->document) {
+ doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(*retval, doc_prop->formatoutput);
+ } else {
+ ZVAL_FALSE(*retval);
+ }
+ return SUCCESS;
+}
+
+int dom_document_format_output_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+ dom_doc_props *doc_prop;
+
+ if (obj->document && newval->type == IS_BOOL) {
+ doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->formatoutput = Z_LVAL_P(newval);
+ }
+
+ return SUCCESS;
+}
+/* }}} */
+
+/* {{{ proto validateonParse boolean
+readonly=no
+*/
+int dom_document_validate_on_parse_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+ dom_doc_props *doc_prop;
+
+ ALLOC_ZVAL(*retval);
+ if (obj->document) {
+ doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(*retval, doc_prop->validateonparse);
+ } else {
+ ZVAL_FALSE(*retval);
+ }
+ return SUCCESS;
+}
+
+int dom_document_validate_on_parse_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+ dom_doc_props *doc_prop;
+
+ if (obj->document && newval->type == IS_BOOL) {
+ doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->validateonparse = Z_LVAL_P(newval);
+ }
+
+ return SUCCESS;
+}
+/* }}} */
+
+
+/* {{{ proto resolveExternals boolean
+readonly=no
+*/
+int dom_document_resolve_externals_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+ dom_doc_props *doc_prop;
+
+ ALLOC_ZVAL(*retval);
+ if (obj->document) {
+ doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(*retval, doc_prop->resolveexternals);
+ } else {
+ ZVAL_FALSE(*retval);
+ }
+ return SUCCESS;
+}
+
+int dom_document_resolve_externals_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+ dom_doc_props *doc_prop;
+
+ if (obj->document && newval->type == IS_BOOL) {
+ doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->resolveexternals = Z_LVAL_P(newval);
+ }
+
+ return SUCCESS;
+}
+/* }}} */
+
+
+/* {{{ proto preserveWhiteSpace boolean
+readonly=no
+*/
+int dom_document_preserve_whitespace_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+ dom_doc_props *doc_prop;
+
+ ALLOC_ZVAL(*retval);
+ if (obj->document) {
+ doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(*retval, doc_prop->preservewhitespace);
+ } else {
+ ZVAL_FALSE(*retval);
+ }
+ return SUCCESS;
+}
+
+int dom_document_preserve_whitespace_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+ dom_doc_props *doc_prop;
+
+ if (obj->document && newval->type == IS_BOOL) {
+ doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->preservewhitespace = Z_LVAL_P(newval);
+ }
+
+ return SUCCESS;
+}
+/* }}} */
+
+
+/* {{{ proto substituteEntities boolean
+readonly=no
+*/
+int dom_document_substitue_entities_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+ dom_doc_props *doc_prop;
+
+ ALLOC_ZVAL(*retval);
+ if (obj->document) {
+ doc_prop = dom_get_doc_props(obj->document);
+ ZVAL_BOOL(*retval, doc_prop->substituteentities);
+ } else {
+ ZVAL_FALSE(*retval);
+ }
+ return SUCCESS;
+}
+
+int dom_document_substitue_entities_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+ dom_doc_props *doc_prop;
+
+ if (obj->document && newval->type == IS_BOOL) {
+ doc_prop = dom_get_doc_props(obj->document);
+ doc_prop->substituteentities = Z_LVAL_P(newval);
+ }
+
+ return SUCCESS;
+}
+/* }}} */
/* {{{ proto document_uri string
@@ -1078,8 +1198,6 @@
php_dom_set_object(intern, (xmlNodePtr) docp TSRMLS_CC);
}
-
- add_domdocument_properties(id TSRMLS_CC);
}
/* }}} end dom_document_document */
@@ -1088,18 +1206,24 @@
xmlDocPtr ret;
xmlParserCtxtPtr ctxt;
char *directory = NULL;
+ dom_doc_props *doc_props;
+ dom_object *intern;
+ dom_ref_obj *document = NULL;
int validate, resolve_externals, keep_blanks, substitute_ent;
if (id != NULL) {
- validate = dom_document_get_property_int(id, "validateOnParse"
TSRMLS_CC);
- resolve_externals = dom_document_get_property_int(id,
"resolveExternals" TSRMLS_CC);
- keep_blanks = dom_document_get_property_int(id, "preserveWhiteSpace"
TSRMLS_CC);
- substitute_ent = dom_document_get_property_int(id,
"substituteEntities" TSRMLS_CC);
- } else {
- validate = 0;
- resolve_externals = 0;
- keep_blanks = 1;
- substitute_ent = 0;
+ intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+ document = intern->document;
+ }
+
+ doc_props = dom_get_doc_props(document);
+ validate = doc_props->validateonparse;
+ resolve_externals = doc_props->resolveexternals;
+ keep_blanks = doc_props->preservewhitespace;
+ substitute_ent = doc_props->substituteentities;
+
+ if (document == NULL) {
+ efree(doc_props);
}
xmlInitParser();
@@ -1123,7 +1247,7 @@
ctxt->recovery = 0;
ctxt->validate = validate;
- ctxt->loadsubset = resolve_externals;
+ ctxt->loadsubset = (resolve_externals * XML_COMPLETE_ATTRS);
ctxt->keepBlanks = keep_blanks;
ctxt->replaceEntities = substitute_ent;
@@ -1153,6 +1277,7 @@
static void dom_parse_document(INTERNAL_FUNCTION_PARAMETERS, int mode) {
zval *id, *rv = NULL;
xmlDoc *docp = NULL, *newdoc;
+ dom_doc_props *doc_prop;
dom_object *intern;
char *source;
int source_len, refcount, ret;
@@ -1178,8 +1303,11 @@
intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
if (intern != NULL) {
docp = (xmlDocPtr) dom_object_get_node(intern);
+ doc_prop = NULL;
if (docp != NULL) {
decrement_node_ptr(intern TSRMLS_CC);
+ doc_prop = intern->document->doc_props;
+ intern->document->doc_props = NULL;
refcount = decrement_document_reference(intern
TSRMLS_CC);
if (refcount != 0) {
docp->_private = NULL;
@@ -1187,6 +1315,7 @@
}
intern->document = NULL;
increment_document_reference(intern, newdoc TSRMLS_CC);
+ intern->document->doc_props = doc_prop;
}
php_dom_set_object(intern, (xmlNodePtr) newdoc TSRMLS_CC);
@@ -1227,6 +1356,7 @@
xmlDoc *docp;
int file_len, bytes, format;
dom_object *intern;
+ dom_doc_props *doc_props;
char *file;
DOM_GET_THIS_OBJ(docp, id, xmlDocPtr, intern);
@@ -1240,7 +1370,9 @@
}
/* encoding handled by property on doc */
- format = dom_document_get_property_int(id, "formatOutput" TSRMLS_CC);
+
+ doc_props = dom_get_doc_props(intern->document);
+ format = doc_props->formatoutput;
bytes = xmlSaveFormatFileEnc(file, docp, NULL, format);
if (bytes == -1) {
@@ -1262,6 +1394,7 @@
xmlBufferPtr buf;
xmlChar *mem;
dom_object *intern, *nodeobj;
+ dom_doc_props *doc_props;
int size, format;
DOM_GET_THIS_OBJ(docp, id, xmlDocPtr, intern);
@@ -1270,7 +1403,8 @@
return;
}
- format = dom_document_get_property_int(id, "formatOutput" TSRMLS_CC);
+ doc_props = dom_get_doc_props(intern->document);
+ format = doc_props->formatoutput;
if (nodep != NULL) {
/* Dump contents of Node */
@@ -1341,6 +1475,7 @@
zval *id, *rv = NULL;
xmlDoc *docp = NULL, *newdoc;
dom_object *intern;
+ dom_doc_props *doc_prop;
char *source;
int source_len, refcount, ret;
@@ -1366,8 +1501,11 @@
intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
if (intern != NULL) {
docp = (xmlDocPtr) dom_object_get_node(intern);
+ doc_prop = NULL;
if (docp != NULL) {
decrement_node_ptr(intern TSRMLS_CC);
+ doc_prop = intern->document->doc_props;
+ intern->document->doc_props = NULL;
refcount = decrement_document_reference(intern
TSRMLS_CC);
if (refcount != 0) {
docp->_private = NULL;
@@ -1375,6 +1513,7 @@
}
intern->document = NULL;
increment_document_reference(intern, newdoc TSRMLS_CC);
+ intern->document->doc_props = doc_prop;
}
php_dom_set_object(intern, (xmlNodePtr) newdoc TSRMLS_CC);
@@ -1412,6 +1551,7 @@
xmlDoc *docp;
int file_len, bytes, format;
dom_object *intern;
+ dom_doc_props *doc_props;
char *file;
DOM_GET_THIS_OBJ(docp, id, xmlDocPtr, intern);
@@ -1425,7 +1565,9 @@
}
/* encoding handled by property on doc */
- format = dom_document_get_property_int(id, "formatOutput" TSRMLS_CC);
+
+ doc_props = dom_get_doc_props(intern->document);
+ format = doc_props->formatoutput;
bytes = htmlSaveFileFormat(file, docp, NULL, format);
if (bytes == -1) {
Index: php-src/ext/dom/dom_fe.h
diff -u php-src/ext/dom/dom_fe.h:1.4 php-src/ext/dom/dom_fe.h:1.5
--- php-src/ext/dom/dom_fe.h:1.4 Wed Sep 3 06:11:53 2003
+++ php-src/ext/dom/dom_fe.h Mon Sep 8 14:28:35 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dom_fe.h,v 1.4 2003/09/03 10:11:53 rrichards Exp $ */
+/* $Id: dom_fe.h,v 1.5 2003/09/08 18:28:35 rrichards Exp $ */
#ifndef DOM_FE_H
#define DOM_FE_H
@@ -246,6 +246,7 @@
#if defined(LIBXML_XPATH_ENABLED)
/* xpath methods */
PHP_FUNCTION(dom_xpath_xpath);
+PHP_FUNCTION(dom_xpath_register_ns);
PHP_FUNCTION(dom_xpath_query);
#endif
Index: php-src/ext/dom/dom_properties.h
diff -u php-src/ext/dom/dom_properties.h:1.3 php-src/ext/dom/dom_properties.h:1.4
--- php-src/ext/dom/dom_properties.h:1.3 Thu Jul 24 09:18:40 2003
+++ php-src/ext/dom/dom_properties.h Mon Sep 8 14:28:35 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dom_properties.h,v 1.3 2003/07/24 13:18:40 rrichards Exp $ */
+/* $Id: dom_properties.h,v 1.4 2003/09/08 18:28:35 rrichards Exp $ */
#ifndef DOM_PROPERTIES_H
#define DOM_PROPERTIES_H
@@ -51,6 +51,16 @@
int dom_document_document_uri_read(dom_object *obj, zval **retval TSRMLS_DC);
int dom_document_document_uri_write(dom_object *obj, zval *newval TSRMLS_DC);
int dom_document_config_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_format_output_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_format_output_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_document_validate_on_parse_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_validate_on_parse_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_document_resolve_externals_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_resolve_externals_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_document_preserve_whitespace_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_preserve_whitespace_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_document_substitue_entities_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_substitue_entities_write(dom_object *obj, zval *newval TSRMLS_DC);
/* documenttype properties */
int dom_documenttype_name_read(dom_object *obj, zval **retval TSRMLS_DC);
Index: php-src/ext/dom/php_dom.c
diff -u php-src/ext/dom/php_dom.c:1.31 php-src/ext/dom/php_dom.c:1.32
--- php-src/ext/dom/php_dom.c:1.31 Wed Sep 3 14:13:11 2003
+++ php-src/ext/dom/php_dom.c Mon Sep 8 14:28:35 2003
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_dom.c,v 1.31 2003/09/03 18:13:11 sebastian Exp $ */
+/* $Id: php_dom.c,v 1.32 2003/09/08 18:28:35 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -114,15 +114,45 @@
}
/* }}} end dom_node_children_valid */
-int dom_get_strict_error(dom_ref_obj *document) {
- if (document) {
- return document->stricterror;
+/* {{{ dom_get_doc_props() */
+dom_doc_propsptr dom_get_doc_props(dom_ref_obj *document)
+{
+ dom_doc_props *doc_props;
+
+ if (document && document->doc_props) {
+ return document->doc_props;
} else {
- return 1;
+ doc_props = emalloc(sizeof(dom_doc_props));
+ doc_props->formatoutput = 0;
+ doc_props->validateonparse = 0;
+ doc_props->resolveexternals = 0;
+ doc_props->preservewhitespace = 1;
+ doc_props->substituteentities = 0;
+ doc_props->stricterror = 1;
+ if (document) {
+ document->doc_props = doc_props;
+ }
+ return doc_props;
+ }
+}
+/* }}} */
+
+/* {{{ dom_get_strict_error() */
+int dom_get_strict_error(dom_ref_obj *document) {
+ int stricterror;
+ dom_doc_props *doc_props;
+
+ doc_props = dom_get_doc_props(document);
+ stricterror = doc_props->stricterror;
+ if (document == NULL) {
+ efree(doc_props);
}
+
+ return stricterror;
}
+/* }}} */
-/* {{{ int increment_document_reference(dom_object *object) */
+/* {{{ increment_document_reference() */
int increment_document_reference(dom_object *object, xmlDocPtr docp TSRMLS_DC) {
int ret_refcount = -1;
@@ -134,7 +164,7 @@
object->document = emalloc(sizeof(dom_ref_obj));
object->document->ptr = docp;
object->document->refcount = ret_refcount;
- object->document->stricterror = 1;
+ object->document->doc_props = NULL;
}
return ret_refcount;
@@ -153,6 +183,9 @@
xmlFreeDoc((xmlDoc *) object->document->ptr);
object->document->ptr = NULL;
}
+ if (object->document->doc_props != NULL) {
+ efree(object->document->doc_props);
+ }
efree(object->document);
}
object->document = NULL;
@@ -465,6 +498,12 @@
dom_register_prop_handler(&dom_document_prop_handlers, "strictErrorChecking",
dom_document_strict_error_checking_read, dom_document_strict_error_checking_write
TSRMLS_CC);
dom_register_prop_handler(&dom_document_prop_handlers, "documentURI",
dom_document_document_uri_read, dom_document_document_uri_write TSRMLS_CC);
dom_register_prop_handler(&dom_document_prop_handlers, "config",
dom_document_config_read, NULL TSRMLS_CC);
+ dom_register_prop_handler(&dom_document_prop_handlers, "formatOutput",
dom_document_format_output_read, dom_document_format_output_write TSRMLS_CC);
+ dom_register_prop_handler(&dom_document_prop_handlers, "validateOnParse",
dom_document_validate_on_parse_read, dom_document_validate_on_parse_write TSRMLS_CC);
+ dom_register_prop_handler(&dom_document_prop_handlers, "resolveExternals",
dom_document_resolve_externals_read, dom_document_resolve_externals_write TSRMLS_CC);
+ dom_register_prop_handler(&dom_document_prop_handlers, "preserveWhiteSpace",
dom_document_preserve_whitespace_read, dom_document_preserve_whitespace_write
TSRMLS_CC);
+ dom_register_prop_handler(&dom_document_prop_handlers, "substituteEntities",
dom_document_substitue_entities_read, dom_document_substitue_entities_write TSRMLS_CC);
+
zend_hash_merge(&dom_document_prop_handlers, &dom_node_prop_handlers, NULL,
NULL, sizeof(dom_prop_handler), 0);
zend_hash_add(&classes, ce.name, ce.name_length + 1,
&dom_document_prop_handlers, sizeof(dom_document_prop_handlers), NULL);
@@ -1074,10 +1113,7 @@
}
object_init_ex(wrapper, ce);
- /* Add object properties not needing function calls */
- if (obj->type == XML_DOCUMENT_NODE || obj->type == XML_HTML_DOCUMENT_NODE) {
- add_domdocument_properties(wrapper TSRMLS_CC);
- }
+
intern = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC);
if (obj->doc != NULL) {
if (domobj != NULL) {
Index: php-src/ext/dom/php_dom.h
diff -u php-src/ext/dom/php_dom.h:1.15 php-src/ext/dom/php_dom.h:1.16
--- php-src/ext/dom/php_dom.h:1.15 Wed Sep 3 06:48:02 2003
+++ php-src/ext/dom/php_dom.h Mon Sep 8 14:28:35 2003
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_dom.h,v 1.15 2003/09/03 10:48:02 rrichards Exp $ */
+/* $Id: php_dom.h,v 1.16 2003/09/08 18:28:35 rrichards Exp $ */
#ifndef PHP_DOM_H
#define PHP_DOM_H
@@ -66,6 +66,7 @@
void php_dom_set_object(dom_object *object, xmlNodePtr obj TSRMLS_DC);
dom_object *dom_object_get_data(xmlNodePtr obj);
xmlNodePtr dom_object_get_node(dom_object *obj);
+dom_doc_propsptr dom_get_doc_props(dom_ref_obj *document);
zend_object_value dom_objects_new(zend_class_entry *class_type TSRMLS_DC);
#if defined(LIBXML_XPATH_ENABLED)
zend_object_value dom_xpath_objects_new(zend_class_entry *class_type TSRMLS_DC);
@@ -86,7 +87,6 @@
void php_dom_create_implementation(zval **retval TSRMLS_DC);
int dom_hierarchy(xmlNodePtr parent, xmlNodePtr child);
int dom_has_feature(char *feature, char *version);
-void add_domdocument_properties(zval *id TSRMLS_DC);
int dom_node_is_read_only(xmlNodePtr node);
int dom_node_children_valid(xmlNodePtr node);
Index: php-src/ext/dom/xml_common.h
diff -u php-src/ext/dom/xml_common.h:1.13 php-src/ext/dom/xml_common.h:1.14
--- php-src/ext/dom/xml_common.h:1.13 Sun Aug 24 06:24:22 2003
+++ php-src/ext/dom/xml_common.h Mon Sep 8 14:28:35 2003
@@ -17,15 +17,26 @@
+----------------------------------------------------------------------+
*/
-/* $Id: xml_common.h,v 1.13 2003/08/24 10:24:22 rrichards Exp $ */
+/* $Id: xml_common.h,v 1.14 2003/09/08 18:28:35 rrichards Exp $ */
#ifndef PHP_XML_COMMON_H
#define PHP_XML_COMMON_H
+typedef struct _dom_doc_props {
+ int formatoutput;
+ int validateonparse;
+ int resolveexternals;
+ int preservewhitespace;
+ int substituteentities;
+ int stricterror;
+} dom_doc_props;
+
+typedef dom_doc_props *dom_doc_propsptr;
+
typedef struct _dom_ref_obj {
void *ptr;
int refcount;
- int stricterror;
+ dom_doc_props *doc_props;
} dom_ref_obj;
typedef struct _node_ptr {
Index: php-src/ext/dom/xpath.c
diff -u php-src/ext/dom/xpath.c:1.3 php-src/ext/dom/xpath.c:1.4
--- php-src/ext/dom/xpath.c:1.3 Sun Aug 24 06:24:22 2003
+++ php-src/ext/dom/xpath.c Mon Sep 8 14:28:35 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: xpath.c,v 1.3 2003/08/24 10:24:22 rrichards Exp $ */
+/* $Id: xpath.c,v 1.4 2003/09/08 18:28:35 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -36,6 +36,7 @@
zend_function_entry php_dom_xpath_class_functions[] = {
PHP_FALIAS(domxpath, dom_xpath_xpath, NULL)
+ PHP_FALIAS(register_namespace, dom_xpath_register_ns, NULL)
PHP_FALIAS(query, dom_xpath_query, NULL)
{NULL, NULL, NULL}
};
@@ -98,6 +99,35 @@
return SUCCESS;
}
+/* {{{ proto boolean dom_xpath_register_ns(string prefix, string uri); */
+PHP_FUNCTION(dom_xpath_register_ns)
+{
+ zval *id;
+ xmlXPathContextPtr ctxp;
+ int prefix_len, ns_uri_len;
+ dom_object *intern;
+ unsigned char *prefix, *ns_uri;
+
+ DOM_GET_THIS(id);
+
+ intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+
+ ctxp = (xmlXPathContextPtr) intern->ptr;
+ if (ctxp == NULL) {
+ php_error(E_WARNING, "Invalid XPath Context");
+ RETURN_FALSE;
+ }
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &prefix,
&prefix_len, &ns_uri, &ns_uri_len) == FAILURE) {
+ RETURN_FALSE;
+ }
+ fprintf(stderr,"register %s=%s\n",prefix, ns_uri);
+ if (xmlXPathRegisterNs(ctxp, prefix, ns_uri) != 0) {
+ RETURN_FALSE
+ }
+ RETURN_TRUE;
+}
+
/* {{{ proto domnodelist dom_xpath_query(string expr [,domNode context]); */
PHP_FUNCTION(dom_xpath_query)
{
@@ -105,9 +135,11 @@
xmlXPathContextPtr ctxp;
xmlNodePtr nodep = NULL;
xmlXPathObjectPtr xpathobjp;
- int expr_len, ret;
+ int expr_len, ret, nsnbr = 0;
dom_object *intern, *nodeobj;
char *expr;
+ xmlDoc *docp = NULL;
+ xmlNsPtr *ns;
DOM_GET_THIS(id);
@@ -119,21 +151,50 @@
RETURN_FALSE;
}
+ docp = (xmlDocPtr) ctxp->doc;
+ if (docp == NULL) {
+ php_error(E_WARNING, "Invalid XPath Document Pointer");
+ RETURN_FALSE;
+ }
+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|o", &expr, &expr_len,
&context) == FAILURE) {
- return;
+ RETURN_FALSE;
}
if (context != NULL) {
DOM_GET_OBJ(nodep, context, xmlNodePtr, nodeobj);
}
+ if (!nodep) {
+ nodep = xmlDocGetRootElement(docp);
+ }
+
+ if (docp != nodep->doc) {
+ php_error(E_WARNING, "Node From Wrong Document");
+ RETURN_FALSE;
+ }
+
ctxp->node = nodep;
+ /* Register namespaces in the node */
+ ns = xmlGetNsList(docp, nodep);
+
+ if (ns != NULL) {
+ while (ns[nsnbr] != NULL)
+ nsnbr++;
+ }
+
+
+ ctxp->namespaces = ns;
+ ctxp->nsNr = nsnbr;
+
xpathobjp = xmlXPathEvalExpression(expr, ctxp);
ctxp->node = NULL;
- if (!xpathobjp) {
- RETURN_FALSE;
+ if (ns != NULL) {
+ xmlFree(ns);
+ ctxp->namespaces = NULL;
+ ctxp->nsNr = 0;
}
if (xpathobjp->type == XPATH_NODESET) {
@@ -155,8 +216,6 @@
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);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php