]> granicus.if.org Git - php/commitdiff
Inital cut of new dom extension
authorRob Richards <rrichards@php.net>
Thu, 5 Jun 2003 17:06:52 +0000 (17:06 +0000)
committerRob Richards <rrichards@php.net>
Thu, 5 Jun 2003 17:06:52 +0000 (17:06 +0000)
PHP5 only

41 files changed:
ext/dom/TODO [new file with mode: 0644]
ext/dom/attr.c [new file with mode: 0644]
ext/dom/cdatasection.c [new file with mode: 0644]
ext/dom/characterdata.c [new file with mode: 0644]
ext/dom/comment.c [new file with mode: 0644]
ext/dom/config.m4 [new file with mode: 0644]
ext/dom/document.c [new file with mode: 0644]
ext/dom/documentfragment.c [new file with mode: 0644]
ext/dom/documenttype.c [new file with mode: 0644]
ext/dom/dom.dsp [new file with mode: 0644]
ext/dom/dom_ce.h [new file with mode: 0644]
ext/dom/dom_fe.h [new file with mode: 0644]
ext/dom/dom_properties.h [new file with mode: 0644]
ext/dom/domconfiguration.c [new file with mode: 0644]
ext/dom/domerror.c [new file with mode: 0644]
ext/dom/domerrorhandler.c [new file with mode: 0644]
ext/dom/domexception.c [new file with mode: 0644]
ext/dom/domimplementation.c [new file with mode: 0644]
ext/dom/domimplementationlist.c [new file with mode: 0644]
ext/dom/domimplementationsource.c [new file with mode: 0644]
ext/dom/domlocator.c [new file with mode: 0644]
ext/dom/domstringlist.c [new file with mode: 0644]
ext/dom/element.c [new file with mode: 0644]
ext/dom/entity.c [new file with mode: 0644]
ext/dom/entityreference.c [new file with mode: 0644]
ext/dom/namednodemap.c [new file with mode: 0644]
ext/dom/namelist.c [new file with mode: 0644]
ext/dom/node.c [new file with mode: 0644]
ext/dom/nodelist.c [new file with mode: 0644]
ext/dom/notation.c [new file with mode: 0644]
ext/dom/php_dom.c [new file with mode: 0644]
ext/dom/php_dom.h [new file with mode: 0644]
ext/dom/processinginstruction.c [new file with mode: 0644]
ext/dom/string_extend.c [new file with mode: 0644]
ext/dom/tests/dom001.phpt [new file with mode: 0644]
ext/dom/tests/dom_test.inc [new file with mode: 0644]
ext/dom/tests/skipif.inc [new file with mode: 0644]
ext/dom/text.c [new file with mode: 0644]
ext/dom/typeinfo.c [new file with mode: 0644]
ext/dom/userdatahandler.c [new file with mode: 0644]
ext/dom/xml_common.h [new file with mode: 0644]

diff --git a/ext/dom/TODO b/ext/dom/TODO
new file mode 100644 (file)
index 0000000..f6b7fe2
--- /dev/null
@@ -0,0 +1,12 @@
+1) Change _node_list_pointer to something faster than just a linked list.
+       Currently there to test that unlinked node tracking works
+2) Possible create new object type for documents as these are the only types which need to track nodes
+       - Would also require its own dtor functionality
+3) Define correct behavior. When certain types of nodes are destroyed, 
+       do we unlink children (if referenced) or just destroy them. (Element/Attribute nodes)
+4) Find out where XPath goes (this extension or its own)
+5) What DOM object types are really needed (i.e. not currently using DOMString)
+6) Determine how to handle non speced functionality.
+       i.e validation (add method or implement as property for processing)
+
+
diff --git a/ext/dom/attr.c b/ext/dom/attr.c
new file mode 100644 (file)
index 0000000..2136b2a
--- /dev/null
@@ -0,0 +1,226 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domattr extends domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-637646024
+* Since: 
+*/
+
+zend_function_entry php_dom_attr_class_functions[] = {
+       PHP_FALIAS(isId, dom_attr_is_id, NULL)
+       PHP_FALIAS(domattr, dom_attr_attr, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ proto domnode dom_attr_attr(string name, [string value]); */
+PHP_FUNCTION(dom_attr_attr)
+{
+
+       zval *id;
+       xmlAttrPtr nodep = NULL;
+       xmlNodePtr oldnode = NULL;
+       dom_object *intern;
+       char *name, *value = NULL;
+       int name_len, value_len;
+
+       id = getThis();
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &name, &name_len, &value, &value_len) == FAILURE) {
+               return;
+       }
+
+       if (name_len == 0) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute name is required");
+               RETURN_FALSE;
+       }
+
+       nodep = xmlNewProp(NULL, (xmlChar *) name, value);
+
+       if (!nodep)
+               RETURN_FALSE;
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               oldnode = (xmlNodePtr)intern->ptr;
+               if (oldnode != NULL) {
+                       node_free_resource(oldnode  TSRMLS_CC);
+               }
+               php_dom_set_object(id, (xmlNodePtr) nodep TSRMLS_CC);
+       }
+}
+
+/* }}} end dom_attr_attr */
+
+
+/* {{{ proto name      string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-1112119403
+Since: 
+*/
+int dom_attr_name_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlAttrPtr attrp;
+
+       attrp = obj->ptr;
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, (char *) (attrp->name), 1);
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto specified boolean 
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-862529273
+Since: 
+*/
+int dom_attr_specified_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       /* TODO */
+       ALLOC_ZVAL(*retval);
+       ZVAL_TRUE(*retval);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto value     string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-221662474
+Since: 
+*/
+int dom_attr_value_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlAttrPtr attrp;
+       xmlChar *content;
+
+       attrp = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+
+       
+       if ((content = xmlNodeGetContent((xmlNodePtr) attrp)) != NULL) {
+               ZVAL_STRING(*retval, content, 1);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+
+       xmlFree(content);
+
+       return SUCCESS;
+
+}
+
+int dom_attr_value_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       xmlAttrPtr attrp;
+
+       attrp = obj->ptr;
+
+       if (attrp->children) {
+               node_list_unlink(attrp->children TSRMLS_CC);
+       }
+       xmlNodeSetContentLen((xmlNodePtr) attrp, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto ownerElement      element 
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Attr-ownerElement
+Since: DOM Level 2
+*/
+int dom_attr_owner_element_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+
+       zval *wrapper;
+       xmlNodePtr nodep, nodeparent;
+       int ret;
+
+       nodep = obj->ptr;
+
+       nodeparent = nodep->parent;
+       if (!nodeparent) {
+               return FAILURE;
+       }
+
+       wrapper = dom_object_get_data(nodeparent);
+       if (wrapper == NULL) {
+               ALLOC_ZVAL(*retval);
+       }
+       if (NULL == (*retval = php_dom_create_object(nodeparent, &ret, wrapper, *retval TSRMLS_CC))) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
+               return FAILURE;
+       }
+       return SUCCESS;
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto schemaTypeInfo    typeinfo        
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Attr-schemaTypeInfo
+Since: DOM Level 3
+*/
+int dom_attr_schema_type_info_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not yet implemented");
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+
+/* {{{ proto boolean dom_attr_is_id();
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Attr-isId
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_attr_is_id)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_attr_is_id */
diff --git a/ext/dom/cdatasection.c b/ext/dom/cdatasection.c
new file mode 100644 (file)
index 0000000..21ccefe
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domcdatasection extends domtext 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-667469212
+* Since: 
+*/
+
+zend_function_entry php_dom_cdatasection_class_functions[] = {
+       PHP_FALIAS("domcdatasection", dom_cdatasection_cdatasection, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ proto domnode dom_cdatasection_cdatasection([string value]); */
+PHP_FUNCTION(dom_cdatasection_cdatasection)
+{
+
+       zval *id;
+       xmlNodePtr nodep = NULL, oldnode = NULL;
+       dom_object *intern;
+       char *value = NULL;
+       int value_len;
+
+       id = getThis();
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE) {
+               return;
+       }
+
+
+       nodep = xmlNewCDataBlock(NULL, (xmlChar *) value, value_len);
+
+       if (!nodep)
+               RETURN_FALSE;
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               oldnode = (xmlNodePtr)intern->ptr;
+               if (oldnode != NULL) {
+                       node_free_resource(oldnode  TSRMLS_CC);
+               }
+               php_dom_set_object(id, nodep TSRMLS_CC);
+       }
+}
+/* }}} end dom_cdatasection_cdatasection */
diff --git a/ext/dom/characterdata.c b/ext/dom/characterdata.c
new file mode 100644 (file)
index 0000000..4bc656a
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domcharacterdata extends domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-FF21A306
+* Since: 
+*/
+
+zend_function_entry php_dom_characterdata_class_functions[] = {
+       PHP_FALIAS(substringData, dom_characterdata_substring_data, NULL)
+       PHP_FALIAS(appendData, dom_characterdata_append_data, NULL)
+       PHP_FALIAS(insertData, dom_characterdata_insert_data, NULL)
+       PHP_FALIAS(deleteData, dom_characterdata_delete_data, NULL)
+       PHP_FALIAS(replaceData, dom_characterdata_replace_data, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ proto data      string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-72AB8359
+Since: 
+*/
+int dom_characterdata_data_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNodePtr nodep;
+       xmlChar *content;
+
+       nodep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       
+       if ((content = xmlNodeGetContent(nodep)) != NULL) {
+               ZVAL_STRING(*retval, content, 1);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+
+       xmlFree(content);
+
+       return SUCCESS;
+}
+
+int dom_characterdata_data_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       xmlNode *nodep;
+
+       nodep = obj->ptr;
+       xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+long dom_utf16Length (xmlChar *utf8str) {
+       long len = 0L, i;
+       char c;
+
+       for (i = 0L; (c = utf8str[i]) != '\0'; i++)
+               if ((c & 0xf8) == 0xf0)
+                       len += 2L;
+               else if ((c & 0xc0) != 0x80)
+                       len++;
+
+       return len;
+}
+
+/* {{{ proto length    unsigned long   
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-7D61178C
+Since: 
+*/
+int dom_characterdata_length_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNodePtr nodep;
+       xmlChar *content;
+       long length;
+
+       nodep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       
+       content = xmlNodeGetContent(nodep);
+       length = dom_utf16Length(content);
+       xmlFree(content);
+       ZVAL_LONG(*retval, length);
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+
+/* {{{ proto domstring dom_characterdata_substring_data(unsigned long offset, unsigned long count);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-6531BCCF
+Since: 
+*/
+PHP_FUNCTION(dom_characterdata_substring_data)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_characterdata_substring_data */
+
+
+/* {{{ proto dom_void dom_characterdata_append_data(string arg);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-32791A2F
+Since: 
+*/
+PHP_FUNCTION(dom_characterdata_append_data)
+{
+       zval *id;
+       xmlNode *nodep;
+       char *arg;
+       int arg_len;
+
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
+               return;
+       }
+
+       xmlTextConcat(nodep, arg, arg_len);
+
+       RETURN_TRUE;
+}
+/* }}} end dom_characterdata_append_data */
+
+
+/* {{{ proto dom_void dom_characterdata_insert_data(unsigned long offset, string arg);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-3EDB695F
+Since: 
+*/
+PHP_FUNCTION(dom_characterdata_insert_data)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_characterdata_insert_data */
+
+
+/* {{{ proto dom_void dom_characterdata_delete_data(unsigned long offset, unsigned long count);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-7C603781
+Since: 
+*/
+PHP_FUNCTION(dom_characterdata_delete_data)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_characterdata_delete_data */
+
+
+/* {{{ proto dom_void dom_characterdata_replace_data(unsigned long offset, unsigned long count, string arg);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-E5CBA7FB
+Since: 
+*/
+PHP_FUNCTION(dom_characterdata_replace_data)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_characterdata_replace_data */
diff --git a/ext/dom/comment.c b/ext/dom/comment.c
new file mode 100644 (file)
index 0000000..7d6c6e9
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domcomment extends domcharacterdata 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-1728279322
+* Since: 
+*/
+
+zend_function_entry php_dom_comment_class_functions[] = {
+       PHP_FALIAS(domcomment, dom_comment_comment, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ proto dom_comment_comment([string value]); */
+PHP_FUNCTION(dom_comment_comment)
+{
+
+       zval *id;
+       xmlNodePtr nodep = NULL, oldnode = NULL;
+       dom_object *intern;
+       char *value = NULL;
+       int value_len;
+
+       id = getThis();
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &value, &value_len) == FAILURE) {
+               return;
+       }
+
+       nodep = xmlNewComment((xmlChar *) value);
+
+       if (!nodep)
+               RETURN_FALSE;
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               oldnode = (xmlNodePtr)intern->ptr;
+               if (oldnode != NULL) {
+                       node_free_resource(oldnode  TSRMLS_CC);
+               }
+               php_dom_set_object(id, nodep TSRMLS_CC);
+       }
+}
+/* }}} end dom_comment_comment */
diff --git a/ext/dom/config.m4 b/ext/dom/config.m4
new file mode 100644 (file)
index 0000000..c214474
--- /dev/null
@@ -0,0 +1,81 @@
+dnl
+dnl $Id$
+dnl
+
+AC_DEFUN(PHP_DOM_CHECK_VERSION,[
+  old_CPPFLAGS=$CPPFLAGS
+  CPPFLAGS=-I$DOM_DIR/include$DOM_DIR_ADD
+  AC_MSG_CHECKING(for libxml version)
+  AC_EGREP_CPP(yes,[
+#include <libxml/xmlversion.h>
+#if LIBXML_VERSION >= 20414
+  yes
+#endif
+  ],[
+    AC_MSG_RESULT(>= 2.4.14)
+  ],[
+    AC_MSG_ERROR(libxml version 2.4.14 or greater required.)
+  ])
+  CPPFLAGS=$old_CPPFLAGS
+])
+
+PHP_ARG_WITH(dom5, for DOM support,
+[  --with-dom5[=DIR]       Include new DOM support (requires libxml >= 2.4.14).
+                          DIR is the libxml install directory.])
+
+if test -z "$PHP_ZLIB_DIR"; then
+  PHP_ARG_WITH(zlib-dir, for the location of libz,
+  [  --with-zlib-dir[=DIR]     DOM: Set the path to libz install prefix.], no, no)
+fi
+
+if test "$PHP_DOM5" != "no"; then
+
+  DOM_DIR_ADD=""
+  if test -r $PHP_DOM5/include/libxml2/libxml/tree.h; then
+    DOM_DIR=$PHP_DOM5
+    DOM_DIR_ADD="/libxml2"
+  elif test -r $PHP_DOM5/include/libxml/tree.h; then
+    DOM_DIR=$PHP_DOM5
+  else
+    for i in /usr/local /usr; do
+      test -r $i/include/libxml/tree.h && DOM_DIR=$i
+      test -r $i/include/libxml2/libxml/tree.h && DOM_DIR=$i && DOM_DIR_ADD="/libxml2"
+    done
+  fi
+
+  if test -z "$DOM_DIR"; then
+    AC_MSG_RESULT(not found)
+    AC_MSG_ERROR(Please reinstall the libxml >= 2.4.14 distribution)
+  fi
+
+  PHP_DOM_CHECK_VERSION
+
+  if test -f $DOM_DIR/lib/libxml2.a -o -f $DOM_DIR/lib/libxml2.$SHLIB_SUFFIX_NAME ; then
+    DOM_LIBNAME=xml2
+  else
+    DOM_LIBNAME=xml
+  fi
+
+  XML2_CONFIG=$DOM_DIR/bin/xml2-config
+  if test -x $XML2_CONFIG; then
+    DOM_LIBS=`$XML2_CONFIG --libs`
+    PHP_EVAL_LIBLINE($DOM_LIBS, DOM_SHARED_LIBADD)
+  else 
+    PHP_ADD_LIBRARY_WITH_PATH($DOM_LIBNAME, $DOM_DIR/lib, DOM_SHARED_LIBADD)
+  fi
+
+  PHP_ADD_INCLUDE($DOM_DIR/include$DOM_DIR_ADD)
+
+  if test "$PHP_ZLIB_DIR" = "no"; then
+    AC_MSG_ERROR(DOM requires ZLIB. Use --with-zlib-dir=<DIR>)
+  else
+    PHP_ADD_LIBRARY_WITH_PATH(z, $PHP_ZLIB_DIR/lib, DOM_SHARED_LIBADD)
+  fi
+  
+  AC_DEFINE(HAVE_DOM,1,[ ])
+  PHP_NEW_EXTENSION(dom, php_dom.c attr.c document.c domerrorhandler.c domstringlist.c domexception.c namelist.c processinginstruction.c cdatasection.c documentfragment.c domimplementation.c element.c node.c string_extend.c characterdata.c documenttype.c domimplementationlist.c entity.c nodelist.c text.c comment.c domconfiguration.c domimplementationsource.c entityreference.c notation.c typeinfo.c domerror.c domlocator.c namednodemap.c userdatahandler.c , $ext_shared)
+  PHP_SUBST(DOM_SHARED_LIBADD)
+fi
+
+
diff --git a/ext/dom/document.c b/ext/dom/document.c
new file mode 100644 (file)
index 0000000..a323e73
--- /dev/null
@@ -0,0 +1,1125 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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"
+
+typedef struct _idsIterator idsIterator;
+struct _idsIterator {
+       xmlChar *elementId;
+       xmlNode *element;
+};
+
+static void idsHashScanner(void *payload, void *data, xmlChar *name)
+{
+       idsIterator *priv = (idsIterator *) data;
+
+       if (priv->element == NULL && xmlStrEqual (name, priv->elementId)) {
+               priv->element = ((xmlNode *)((xmlID *)payload)->attr)->parent;
+       }
+}
+
+/*
+* class domdocument extends domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-i-Document
+* Since: 
+*/
+
+zend_function_entry php_dom_document_class_functions[] = {
+       PHP_FALIAS(createElement, dom_document_create_element, NULL)
+       PHP_FALIAS(createDocumentFragment, dom_document_create_document_fragment, NULL)
+       PHP_FALIAS(createTextNode, dom_document_create_text_node, NULL)
+       PHP_FALIAS(createComment, dom_document_create_comment, NULL)
+       PHP_FALIAS(createCDATASection, dom_document_create_cdatasection, NULL)
+       PHP_FALIAS(createProcessingInstruction, dom_document_create_processing_instruction, NULL)
+       PHP_FALIAS(createAttribute, dom_document_create_attribute, NULL)
+       PHP_FALIAS(createEntityReference, dom_document_create_entity_reference, NULL)
+       PHP_FALIAS(getElementsByTagName, dom_document_get_elements_by_tag_name, NULL)
+       PHP_FALIAS(importNode, dom_document_import_node, NULL)
+       PHP_FALIAS(createElementNS, dom_document_create_element_ns, NULL)
+       PHP_FALIAS(createAttributeNS, dom_document_create_attribute_ns, NULL)
+       PHP_FALIAS(getElementsByTagNameNS, dom_document_get_elements_by_tag_name_ns, NULL)
+       PHP_FALIAS(getElementById, dom_document_get_element_by_id, NULL)
+       PHP_FALIAS(adoptNode, dom_document_adopt_node, NULL)
+       PHP_FALIAS(normalizeDocument, dom_document_normalize_document, NULL)
+       PHP_FALIAS(renameNode, dom_document_rename_node, NULL)
+       PHP_FALIAS(load, dom_document_load, NULL)
+       PHP_FALIAS(save, dom_document_save, NULL)
+       PHP_FALIAS(loadXML, dom_document_loadxml, NULL)
+       PHP_FALIAS(saveXML, dom_document_savexml, NULL)
+       PHP_FALIAS(domdocument, dom_document_document, NULL)
+       {NULL, NULL, NULL}
+};
+
+
+/* {{{ proto doctype   documenttype    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-B63ED1A31
+Since: 
+*/
+int dom_document_doctype_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       zval *wrapper;
+       xmlDoc *docp;
+       xmlDtdPtr dtdptr;
+       int ret;
+
+       docp = obj->ptr;
+
+
+       dtdptr = xmlGetIntSubset(docp);
+       if (!dtdptr) {
+               return FAILURE;
+       }
+
+       wrapper = dom_object_get_data((xmlNodePtr) dtdptr);
+       if (wrapper == NULL) {
+               ALLOC_ZVAL(*retval);
+       }
+       if (NULL == (*retval = php_dom_create_object((xmlNodePtr) dtdptr, &ret, wrapper, *retval TSRMLS_CC))) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
+               return FAILURE;
+       }
+       return SUCCESS;
+       
+}
+
+/* }}} */
+
+
+
+/* {{{ proto implementation    domimplementation       
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1B793EBA
+Since: 
+*/
+int dom_document_implementation_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       php_dom_create_implementation(retval TSRMLS_CC);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto domelement document_element       documentElement 
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-87CD092
+Since: 
+*/
+int dom_document_document_element_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       zval *wrapper;
+       xmlDoc *docp;
+       xmlNode *root;
+       int ret;
+
+       docp = obj->ptr;
+
+       root = xmlDocGetRootElement(docp);
+       if (!root) {
+               return FAILURE;
+       }
+
+       wrapper = dom_object_get_data(root);
+       if (wrapper == NULL) {
+               ALLOC_ZVAL(*retval);
+       }
+       if (NULL == (*retval = php_dom_create_object(root, &ret, wrapper, *retval TSRMLS_CC))) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
+               return FAILURE;
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto actual_encoding   string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-actualEncoding
+Since: DOM Level 3
+*/
+/* READ ONLY FOR NOW USING ENCODING PROPERTY
+int dom_document_actual_encoding_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+int dom_document_actual_encoding_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       return SUCCESS;
+}
+*/
+
+/* }}} */
+
+/* {{{ proto encoding  string
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-encoding
+Since: DOM Level 3
+*/
+int dom_document_encoding_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlDoc *docp;
+       char *encoding;
+
+       docp = obj->ptr;
+       encoding = (char *) docp->encoding;
+       ALLOC_ZVAL(*retval);
+
+       if (encoding != NULL) {
+               ZVAL_STRING(*retval, encoding, 1);
+       } else {
+               ZVAL_NULL(*retval);
+       }
+
+       return SUCCESS;
+}
+
+int dom_document_encoding_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       xmlDoc *docp;
+       int charset;
+
+       docp = (xmlDoc *) obj->ptr;
+       if (docp->encoding != NULL) {
+               xmlFree((xmlChar *)docp->encoding);
+       }
+
+       docp->encoding = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
+    charset = (int)xmlParseCharEncoding( (const char*)docp->encoding );
+    if ( charset > 0 ) {
+        docp->charset = charset;
+               return SUCCESS;
+    } else {
+        /* TODO: ERROR XML_CHAR_ENCODING_ERROR */
+    }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto standalone        boolean 
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-standalone
+Since: DOM Level 3
+*/
+int dom_document_standalone_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlDoc *docp;
+       int standalone;
+
+       docp = obj->ptr;
+       ALLOC_ZVAL(*retval);
+       standalone = docp->standalone;
+       ZVAL_BOOL(*retval, standalone);
+
+       return SUCCESS;
+}
+
+int dom_document_standalone_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       xmlDoc *docp;
+       int standalone;
+
+       docp = obj->ptr;
+       standalone = Z_LVAL_P(newval);
+    if (standalone > 0) {
+        docp->standalone = 1;
+    }
+    else if (standalone < 0) {
+        docp->standalone = -1;
+    }
+    else {
+        docp->standalone = 0;
+    }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto version   string  
+readonly=no
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-version
+Since: DOM Level 3
+*/
+int dom_document_version_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlDoc *docp;
+       char *version;
+
+       docp = obj->ptr;
+       version = (char *) docp->version;
+       ALLOC_ZVAL(*retval);
+
+       if (version != NULL) {
+               ZVAL_STRING(*retval, version, 1);
+       } else {
+               ZVAL_NULL(*retval);
+       }
+
+       return SUCCESS;
+}
+
+int dom_document_version_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       xmlDoc *docp;
+
+       docp = obj->ptr;
+       if (docp->version != NULL) {
+               xmlFree((xmlChar *) docp->version );
+       }
+
+       docp->version = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ 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
+Since: DOM Level 3
+*/
+int dom_document_strict_error_checking_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+int dom_document_strict_error_checking_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto document_uri      string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-documentURI
+Since: DOM Level 3
+*/
+int dom_document_document_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlDoc *docp;
+       char *url;
+
+       docp = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       url = (char *) docp->URL;
+       if (url != NULL) {
+               ZVAL_STRING(*retval, url, 1);
+       } else {
+               ZVAL_NULL(*retval);
+       }
+
+       return SUCCESS;
+}
+
+int dom_document_document_uri_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       xmlDoc *docp;
+
+       docp = obj->ptr;
+       if (docp->URL != NULL) {
+               xmlFree((xmlChar *) docp->URL);
+       }
+
+       docp->URL = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto config    domconfiguration        
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-config
+Since: DOM Level 3
+*/
+int dom_document_config_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto domelement dom_document_create_element(string tagName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-2141741547
+Since: 
+*/
+PHP_FUNCTION(dom_document_create_element)
+{
+       zval *id, *rv = NULL;
+       xmlNode *node;
+       xmlDocPtr docp;
+       int ret, name_len;
+       char *name;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       node = xmlNewDocNode(docp, NULL, name, NULL);
+       if (!node) {
+               RETURN_FALSE;
+       }
+
+       dom_add_to_list(node, docp TSRMLS_CC);
+       DOM_RET_OBJ(rv, node, &ret);
+}
+/* }}} end dom_document_create_element */
+
+
+/* {{{ proto domdocumentfragment dom_document_create_document_fragment();
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-35CB04B5
+Since: 
+*/
+PHP_FUNCTION(dom_document_create_document_fragment)
+{
+       zval *id, *rv = NULL;
+       xmlNode *node;
+       xmlDocPtr docp;
+       int ret;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       node =  xmlNewDocFragment(docp);
+       if (!node) {
+               RETURN_FALSE;
+       }
+
+       dom_add_to_list(node, docp TSRMLS_CC);
+       DOM_RET_OBJ(rv, node, &ret);
+}
+/* }}} end dom_document_create_document_fragment */
+
+
+/* {{{ proto domtext dom_document_create_text_node(string data);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1975348127
+Since: 
+*/
+PHP_FUNCTION(dom_document_create_text_node)
+{
+       zval *id, *rv = NULL;
+       xmlNode *node;
+       xmlDocPtr docp;
+       int ret, value_len;
+       char *value;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE) {
+               return;
+       }
+
+       node = xmlNewDocText(docp, (xmlChar *) value);
+       if (!node) {
+               RETURN_FALSE;
+       }
+
+       dom_add_to_list(node, docp TSRMLS_CC);
+       DOM_RET_OBJ(rv, node, &ret);
+}
+/* }}} end dom_document_create_text_node */
+
+
+/* {{{ proto domcomment dom_document_create_comment(string data);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1334481328
+Since: 
+*/
+PHP_FUNCTION(dom_document_create_comment)
+{
+       zval *id, *rv = NULL;
+       xmlNode *node;
+       xmlDocPtr docp;
+       int ret, value_len;
+       char *value;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE) {
+               return;
+       }
+
+       node = xmlNewDocComment(docp, (xmlChar *) value);
+       if (!node) {
+               RETURN_FALSE;
+       }
+
+       dom_add_to_list(node, docp TSRMLS_CC);
+       DOM_RET_OBJ(rv, node, &ret);
+}
+/* }}} end dom_document_create_comment */
+
+
+/* {{{ proto domcdatasection dom_document_create_cdatasection(string data);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D26C0AF8
+Since: 
+*/
+PHP_FUNCTION(dom_document_create_cdatasection)
+{
+       zval *id, *rv = NULL;
+       xmlNode *node;
+       xmlDocPtr docp;
+       int ret, value_len;
+       char *value;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE) {
+               return;
+       }
+
+       node = xmlNewCDataBlock(docp, (xmlChar *) value, value_len);
+       if (!node) {
+               RETURN_FALSE;
+       }
+
+       dom_add_to_list(node, docp TSRMLS_CC);
+       DOM_RET_OBJ(rv, node, &ret);
+}
+/* }}} end dom_document_create_cdatasection */
+
+
+/* {{{ proto domprocessinginstruction dom_document_create_processing_instruction(string target, string data);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-135944439
+Since: 
+*/
+PHP_FUNCTION(dom_document_create_processing_instruction)
+{
+       zval *id, *rv = NULL;
+       xmlNode *node;
+       xmlDocPtr docp;
+       int ret, value_len, name_len;
+       char *name, *value = NULL;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &name, &name_len, &value, &value_len) == FAILURE) {
+               return;
+       }
+
+       node = xmlNewPI((xmlChar *) name, (xmlChar *) value);
+       if (!node) {
+               RETURN_FALSE;
+       }
+
+       node->doc = docp;
+
+       dom_add_to_list(node, docp TSRMLS_CC);
+       DOM_RET_OBJ(rv, node, &ret);
+}
+/* }}} end dom_document_create_processing_instruction */
+
+
+/* {{{ proto domattr dom_document_create_attribute(string name);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1084891198
+Since: 
+*/
+PHP_FUNCTION(dom_document_create_attribute)
+{
+       zval *id, *rv = NULL;
+       xmlAttrPtr node;
+       xmlDocPtr docp;
+       int ret, name_len;
+       char *name;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       if (name_len == 0) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute name is required");
+               RETURN_FALSE;
+       }
+
+       node = xmlNewDocProp(docp, (xmlChar *) name, NULL);
+       if (!node) {
+               RETURN_FALSE;
+       }
+
+       dom_add_to_list((xmlNodePtr) node, docp TSRMLS_CC);
+       DOM_RET_OBJ(rv, (xmlNodePtr) node, &ret);
+
+}
+/* }}} end dom_document_create_attribute */
+
+
+/* {{{ proto domentityreference dom_document_create_entity_reference(string name);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-392B75AE
+Since: 
+*/
+PHP_FUNCTION(dom_document_create_entity_reference)
+{
+       zval *id, *rv = NULL;
+       xmlNode *node;
+       xmlDocPtr docp = NULL;
+       int ret, name_len;
+       char *name;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       node = xmlNewReference(docp, name);
+       if (!node) {
+               RETURN_FALSE;
+       }
+
+       dom_add_to_list((xmlNodePtr) node, docp TSRMLS_CC);
+       DOM_RET_OBJ(rv, (xmlNodePtr) node, &ret);
+}
+/* }}} end dom_document_create_entity_reference */
+
+
+/* {{{ proto domnodelist dom_document_get_elements_by_tag_name(string tagname);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-A6C9094
+Since: 
+*/
+PHP_FUNCTION(dom_document_get_elements_by_tag_name)
+{
+       zval *id;
+       xmlXPathContextPtr ctxp;
+       xmlDocPtr docp;
+       xmlXPathObjectPtr xpathobjp;
+       int name_len, ret;
+       char *str,*name;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       ctxp = xmlXPathNewContext(docp);
+
+       ctxp->node = NULL;
+       str = (char*) emalloc((name_len+3) * sizeof(char)) ;
+       sprintf(str ,"//%s",name);
+
+       xpathobjp = xmlXPathEval(str, ctxp);
+       efree(str);
+       ctxp->node = NULL;
+
+       if (!xpathobjp) {
+               RETURN_FALSE;
+       }
+
+       if (xpathobjp->type ==  XPATH_NODESET) {
+               int i;
+               xmlNodeSetPtr nodesetp;
+
+               if (NULL == (nodesetp = xpathobjp->nodesetval)) {
+                       xmlXPathFreeObject (xpathobjp);
+                       xmlXPathFreeContext(ctxp);
+                       RETURN_FALSE;
+               }
+
+               array_init(return_value);
+
+               for (i = 0; i < nodesetp->nodeNr; i++) {
+                       xmlNodePtr node = nodesetp->nodeTab[i];
+                       zval *child=NULL;
+                       zval *wrapper;
+                       wrapper = dom_object_get_data(node);
+                       if (wrapper == NULL) {
+                               MAKE_STD_ZVAL(child);
+                       }
+
+                       child = php_dom_create_object(node, &ret, wrapper, child TSRMLS_CC);
+                       add_next_index_zval(return_value, child);
+               }
+       }
+
+       xmlXPathFreeObject(xpathobjp);
+       xmlXPathFreeContext(ctxp);
+}
+/* }}} end dom_document_get_elements_by_tag_name */
+
+
+/* {{{ proto domnode dom_document_import_node(node importedNode, boolean deep);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Core-Document-importNode
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_document_import_node)
+{
+       zval *rv = NULL;
+       zval *id, *node;
+       xmlDocPtr docp;
+       xmlNodePtr nodep, retnodep;
+       int ret; 
+       long recursive = 0;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|l", &node, &recursive) == FAILURE) {
+               return;
+       }
+
+       DOM_GET_OBJ(nodep, node, xmlNodePtr);
+
+       if (nodep->type == XML_HTML_DOCUMENT_NODE || nodep->type == XML_DOCUMENT_NODE 
+               || nodep->type == XML_DOCUMENT_TYPE_NODE) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot import: Node Type Not Supported");
+               RETURN_FALSE;
+       }
+
+       if (nodep->doc == docp) {
+               retnodep = nodep;
+       } else {
+               retnodep = xmlDocCopyNode(nodep, docp, recursive);
+               if (!retnodep) {
+                       RETURN_FALSE;
+               }
+               dom_add_to_list((xmlNodePtr) retnodep, docp TSRMLS_CC);
+       }
+
+       DOM_RET_OBJ(rv, (xmlNodePtr) retnodep, &ret);
+}
+/* }}} end dom_document_import_node */
+
+
+/* {{{ proto domelement dom_document_create_element_ns(string namespaceURI, string qualifiedName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-DocCrElNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_document_create_element_ns)
+{
+       zval *id, *rv = NULL;
+       xmlDocPtr docp;
+       xmlNodePtr nodep = NULL;
+       xmlNsPtr nsptr;
+       int ret, uri_len = 0, name_len = 0;
+       char *uri, *name;
+       xmlChar *localname = NULL;
+       int errorcode;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &uri, &uri_len, &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       nsptr = dom_get_ns(uri, name, uri_len, name_len, &errorcode, (char **) &localname);
+       if (errorcode == 0) {
+               if (nsptr != NULL) {
+                       dom_set_old_ns(docp, nsptr);
+                       nodep = xmlNewDocNode (docp, nsptr, localname, NULL);
+               } else {
+                       nodep = xmlNewDocNode (docp, NULL, name, NULL);
+               }
+       }
+       if (localname != NULL) {
+               xmlFree(localname);
+       }
+
+       if (errorcode != 0) {
+               php_dom_throw_error(errorcode, &return_value TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+               RETURN_FALSE;
+       }
+
+       if (nodep == NULL) {
+               RETURN_FALSE;
+       }
+
+       dom_add_to_list(nodep, docp TSRMLS_CC);
+       DOM_RET_OBJ(rv, nodep, &ret);
+}
+/* }}} end dom_document_create_element_ns */
+
+
+/* {{{ proto domattr dom_document_create_attribute_ns(string namespaceURI, string qualifiedName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-DocCrAttrNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_document_create_attribute_ns)
+{
+       zval *id, *rv = NULL;
+       xmlDocPtr docp;
+       xmlNodePtr nodep = NULL;
+       xmlNsPtr nsptr;
+       int ret, uri_len = 0, name_len = 0;
+       char *uri, *name;
+       xmlChar *localname = NULL;
+       int errorcode;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &uri, &uri_len, &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       nsptr = dom_get_ns(uri, name, uri_len, name_len, &errorcode, (char **) &localname);
+       if (errorcode == 0) {
+               if (nsptr != NULL) {
+                       nodep = (xmlNodePtr) xmlNewDocProp(docp, localname, NULL);
+                       dom_set_old_ns(docp, nsptr);
+                       if (nodep != NULL) {
+                               xmlSetNs(nodep, nsptr);
+                       }
+               } else {
+                       nodep = (xmlNodePtr) xmlNewDocProp(docp, name, NULL);
+               }
+       }
+       if (localname != NULL) {
+               xmlFree(localname);
+       }
+
+       if (errorcode != 0) {
+               php_dom_throw_error(errorcode, &return_value TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+               RETURN_FALSE;
+       }
+
+       if (nodep == NULL) {
+               RETURN_FALSE;
+       }
+
+       dom_add_to_list(nodep, docp TSRMLS_CC);
+       DOM_RET_OBJ(rv, nodep, &ret);
+}
+/* }}} end dom_document_create_attribute_ns */
+
+
+/* {{{ proto domnodelist dom_document_get_elements_by_tag_name_ns(string namespaceURI, string localName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getElBTNNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_document_get_elements_by_tag_name_ns)
+{
+       zval *id;
+       xmlDocPtr docp;
+       xmlNodePtr elemp;
+       int uri_len, name_len;
+       char *uri, *name;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &uri, &uri_len, &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       array_init(return_value);
+       elemp = xmlDocGetRootElement(docp);
+
+       dom_get_elements_by_tag_name_ns_raw(elemp, uri, name, &return_value TSRMLS_CC);
+}
+/* }}} end dom_document_get_elements_by_tag_name_ns */
+
+
+/* {{{ proto domelement dom_document_get_element_by_id(string elementId);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getElBId
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_document_get_element_by_id)
+{
+       zval *id, *rv = NULL;
+       xmlDocPtr docp;
+       idsIterator iter;
+       xmlHashTable *ids = NULL;
+       int ret,idname_len;
+       char *idname;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &idname, &idname_len) == FAILURE) {
+               return;
+       }
+
+       ids = (xmlHashTable *) docp->ids;
+       if (ids) {
+               iter.elementId = (xmlChar *) idname;
+               iter.element = NULL;
+               xmlHashScan(ids, (void *)idsHashScanner, &iter);
+               DOM_RET_OBJ(rv, (xmlNodePtr) iter.element, &ret);
+       } else {
+               RETVAL_NULL();
+       }
+}
+/* }}} end dom_document_get_element_by_id */
+
+
+/* {{{ proto domnode dom_document_adopt_node(node source);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-adoptNode
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_document_adopt_node)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_document_adopt_node */
+
+
+/* {{{ proto dom_void dom_document_normalize_document();
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-normalizeDocument
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_document_normalize_document)
+{
+       zval *id;
+       xmlDocPtr docp;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       DOM_NO_ARGS();
+
+       dom_normalize((xmlNodePtr) docp TSRMLS_CC);
+}
+/* }}} end dom_document_normalize_document */
+
+
+/* {{{ proto domnode dom_document_rename_node(node n, string namespaceURI, string qualifiedName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-renameNode
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_document_rename_node)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_document_rename_node */
+
+/* {{{ proto domnode dom_document_document([string version], [string encoding]); */
+PHP_FUNCTION(dom_document_document)
+{
+
+       zval *id;
+       xmlDoc *docp = NULL, *olddoc;
+       dom_object *intern;
+       char *encoding, *version = NULL;
+       int encoding_len, version_len;
+
+       id = getThis();
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ss", &version, &version_len, &encoding, &encoding_len) == FAILURE) {
+               return;
+       }
+
+       docp = xmlNewDoc(version);
+       if (!docp)
+               RETURN_FALSE;
+
+       if (encoding_len > 0) {
+               docp->encoding = (const xmlChar*)xmlStrdup(encoding);
+       }
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               olddoc = (xmlDocPtr)intern->ptr;
+               if (olddoc != NULL) {
+                       node_free_resource((xmlNode *) olddoc  TSRMLS_CC);
+               }
+               php_dom_set_object(id, docp TSRMLS_CC);
+       }
+
+}
+/* }}} end dom_document_document */
+
+/* {{{ proto boolean domnode dom_document_load(string source);
+URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-load
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_document_load)
+{
+       zval *id;
+       xmlDoc *docp = NULL, *newdoc;
+       dom_object *intern;
+       char *source;
+       int source_len;
+
+       id = getThis();
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &source, &source_len) == FAILURE) {
+               return;
+       }
+
+       newdoc = docp = xmlParseFile(source);
+
+       if (!newdoc)
+               RETURN_FALSE;
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               docp = (xmlDocPtr)intern->ptr;
+               if (docp != NULL) {
+                       node_free_resource((xmlNode *) docp  TSRMLS_CC);
+               }
+       }
+
+       php_dom_set_object(id, newdoc TSRMLS_CC);
+
+       RETURN_TRUE;
+}
+/* }}} end dom_document_load */
+
+/* {{{ proto boolean domnode dom_document_loadxml(string source);
+URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-loadXML
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_document_loadxml)
+{
+       zval *id;
+       xmlDoc *docp = NULL, *newdoc;
+       dom_object *intern;
+       char *buffer;
+       int buffer_len;
+
+       id = getThis();
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buffer, &buffer_len) == FAILURE) {
+               return;
+       }
+
+       newdoc = xmlParseDoc(buffer);
+       if (!newdoc)
+               RETURN_FALSE;
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               docp = (xmlDocPtr)intern->ptr;
+               if (docp != NULL) {
+                       node_free_resource((xmlNode *) docp  TSRMLS_CC);
+               }
+       }
+
+       php_dom_set_object(id, newdoc TSRMLS_CC);
+
+       RETURN_TRUE;
+}
+/* }}} end dom_document_loadxml */
+
+/* {{{ proto long domnode dom_document_save(string file);
+Convenience method to save to file
+*/
+PHP_FUNCTION(dom_document_save)
+{
+       zval *id;
+       xmlDoc *docp;
+       int file_len, bytes;
+       char *file;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &file_len) == FAILURE) {
+               return;
+       }
+       
+       if ((PG(safe_mode) && (!php_checkuid(file, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(file TSRMLS_CC)) {
+               RETURN_FALSE;
+       }
+
+       bytes = xmlSaveFile(file, docp);
+
+       if (bytes == -1) {
+               RETURN_FALSE;
+       }
+       RETURN_LONG(bytes);
+}
+/* }}} end dom_document_save */
+
+/* {{{ proto string domnode dom_document_savexml([node n]);
+URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-saveXML
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_document_savexml)
+{
+       zval *id, *nodep = NULL;
+       xmlDoc *docp;
+       xmlNode *node;
+       xmlBufferPtr buf;
+       xmlChar *mem;
+       int size;
+
+       DOM_GET_THIS_OBJ(docp, id, xmlDocPtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|o", &nodep) == FAILURE) {
+               return;
+       }
+
+       if (nodep != NULL) {
+               /* Dump contents of Node */
+               DOM_GET_OBJ(node, nodep, xmlNodePtr);
+               if (node->doc != docp) {
+                       php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Node not from same document");
+                       RETURN_FALSE;
+               }
+               buf = xmlBufferCreate();
+               if (!buf) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not fetch buffer");
+                       RETURN_FALSE;
+               }
+               xmlNodeDump(buf, docp, node, 0, 0);
+               mem = (xmlChar*) xmlBufferContent(buf);
+               if (!mem) {
+                       xmlBufferFree(buf);
+                       RETURN_FALSE;
+               }
+               RETVAL_STRING(mem,  1);
+               xmlBufferFree(buf);
+       } else {
+               /* Dump Document Contents 
+               Encoding is handled from the encoding property set on the document */
+               xmlDocDumpMemory(docp, &mem, &size);
+               if (!size) {
+                       RETURN_FALSE;
+               }
+               RETVAL_STRINGL(mem, size, 1);
+               xmlFree(mem);
+       }
+}
+/* }}} end dom_document_savexml */
diff --git a/ext/dom/documentfragment.c b/ext/dom/documentfragment.c
new file mode 100644 (file)
index 0000000..e9039d9
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domdocumentfragment extends domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-B63ED1A3
+* Since: 
+*/
+
+zend_function_entry php_dom_documentfragment_class_functions[] = {
+       PHP_FALIAS(domdocumentfragment, dom_documentfragment_documentfragment, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ proto dom_documentfragment_documentfragment(); */
+PHP_FUNCTION(dom_documentfragment_documentfragment)
+{
+
+       zval *id;
+       xmlNodePtr nodep = NULL, oldnode = NULL;
+       dom_object *intern;
+
+       id = getThis();
+
+       nodep = xmlNewDocFragment(NULL);
+
+       if (!nodep)
+               RETURN_FALSE;
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               oldnode = (xmlNodePtr)intern->ptr;
+               if (oldnode != NULL) {
+                       node_free_resource(oldnode  TSRMLS_CC);
+               }
+               php_dom_set_object(id, nodep TSRMLS_CC);
+       }
+}
+/* }}} end dom_documentfragment_documentfragment */
diff --git a/ext/dom/documenttype.c b/ext/dom/documenttype.c
new file mode 100644 (file)
index 0000000..a3715b8
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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"
+
+typedef struct _nodeIterator nodeIterator;
+struct _nodeIterator {
+       int cur;
+       int index;
+       xmlNode *node;
+};
+
+static void itemHashScanner (void *payload, void *data, xmlChar *name) {
+       nodeIterator *priv = (nodeIterator *)data;
+
+       if(priv->cur < priv->index) {
+               priv->cur++;
+       } else {
+               if(priv->node == NULL) {
+                       priv->node = (xmlNode *)payload;
+               }
+       }
+}
+
+/*
+* class domdocumenttype extends domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-412266927
+* Since: 
+*/
+
+zend_function_entry php_dom_documenttype_class_functions[] = {
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto name      string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1844763134
+Since: 
+*/
+int dom_documenttype_name_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlDtdPtr dtdptr;
+
+       dtdptr = obj->ptr;
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, (char *) (dtdptr->name), 1);
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto entities  namednodemap    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1788794630
+Since: 
+*/
+int dom_documenttype_entities_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlDtdPtr doctypep;
+       xmlHashTable *entityht;
+       nodeIterator *iter;
+       xmlNode *nodep = NULL;
+       int ret, htsize, index = 0;
+
+       doctypep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       array_init(*retval);
+
+       entityht = (xmlHashTable *) doctypep->entities;
+       if (entityht) {
+               if ((htsize = xmlHashSize(entityht)) > 0) {
+                       iter = emalloc(sizeof(nodeIterator));
+                       while (index < htsize) {
+                               iter->cur = 0;
+                               iter->index = index;
+                               iter->node = NULL;
+                               xmlHashScan(entityht, itemHashScanner, iter);
+                               index++;
+                               nodep = iter->node;
+                               if (nodep != NULL) {
+                                       zval *child = NULL;
+                                       zval *wrapper;
+                                       wrapper = dom_object_get_data(nodep);
+                                       if (wrapper == NULL) {
+                                               MAKE_STD_ZVAL(child);
+                                       }
+                                       child = php_dom_create_object(nodep, &ret, wrapper, child TSRMLS_CC);
+                                       add_assoc_zval(*retval, (char *) nodep->name, child);
+                               }
+                       }
+                       efree(iter);
+               }
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto notations namednodemap    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D46829EF
+Since: 
+*/
+int dom_documenttype_notations_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlDtdPtr doctypep;
+       xmlHashTable *notationht;
+       nodeIterator *iter;
+       xmlNode *nodep = NULL;
+       int ret, htsize, index = 0;
+
+       doctypep = obj->ptr;
+
+       MAKE_STD_ZVAL(*retval);
+       array_init(*retval);
+
+       notationht = (xmlHashTable *) doctypep->notations;
+       if (notationht) {
+               if ((htsize = xmlHashSize(notationht)) > 0) {
+                       iter = emalloc(sizeof(nodeIterator));
+                       while (index < htsize) {
+                               iter->cur = 0;
+                               iter->index = index;
+                               iter->node = NULL;
+                               xmlHashScan(notationht, itemHashScanner, iter);
+                               index++;
+                               nodep = iter->node;
+                               if (nodep != NULL) {
+                                       zval *child = NULL;
+                                       zval *wrapper;
+                                       wrapper = dom_object_get_data(nodep);
+                                       if (wrapper == NULL) {
+                                               MAKE_STD_ZVAL(child);
+                                       }
+                                       child = php_dom_create_object(nodep, &ret, wrapper, child TSRMLS_CC);
+                                       add_assoc_zval(*retval, (char *) nodep->name, child);
+                               }
+                       }
+                       efree(iter);
+               }
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto public_id string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-Core-DocType-publicId
+Since: DOM Level 2
+*/
+int dom_documenttype_public_id_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlDtdPtr dtdptr;
+
+       dtdptr = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       if (dtdptr->ExternalID) {
+               ZVAL_STRING(*retval, (char *) (dtdptr->ExternalID), 1);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+       return SUCCESS;
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto system_id string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-Core-DocType-systemId
+Since: DOM Level 2
+*/
+int dom_documenttype_system_id_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlDtdPtr dtdptr;
+
+       dtdptr = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       if (dtdptr->SystemID) {
+               ZVAL_STRING(*retval, (char *) (dtdptr->ExternalID), 1);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto internal_subset   string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-Core-DocType-internalSubset
+Since: DOM Level 2
+*/
+int dom_documenttype_internal_subset_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+
+       xmlDtdPtr dtdptr;
+       xmlDtd *intsubset;
+       xmlOutputBuffer *buff = NULL;
+       xmlChar *strintsubset;
+
+       dtdptr = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+
+       if (dtdptr->doc != NULL && ((intsubset = dtdptr->doc->intSubset) != NULL)) {
+               buff = xmlAllocOutputBuffer(NULL);
+               if (buff != NULL) {
+                       xmlNodeDumpOutput (buff, NULL, (xmlNodePtr) intsubset, 0, 0, NULL);
+                       xmlOutputBufferFlush(buff);
+                       strintsubset = xmlStrndup(buff->buffer->content, buff->buffer->use);
+                       (void)xmlOutputBufferClose(buff);
+                       ZVAL_STRING(*retval, (char *) strintsubset, 1);
+                       return SUCCESS;
+               }
+       }
+
+       ZVAL_EMPTY_STRING(*retval);
+
+       return SUCCESS;
+
+}
+
+/* }}} */
+
+
diff --git a/ext/dom/dom.dsp b/ext/dom/dom.dsp
new file mode 100644 (file)
index 0000000..707da9e
--- /dev/null
@@ -0,0 +1,246 @@
+# Microsoft Developer Studio Project File - Name="dom" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102\r
+\r
+CFG=dom - Win32 Release_TS\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "dom.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "dom.mak" CFG="dom - Win32 Release_TS"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "dom - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE "dom - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+MTL=midl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "dom - Win32 Release_TS"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release_TS"\r
+# PROP BASE Intermediate_Dir "Release_TS"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release_TS"\r
+# PROP Intermediate_Dir "Release_TS"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "..\..\..\TSRM" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_DOM" /D ZTS=1 /YX /FD /c\r
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D ZEND_DEBUG=0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "DOM_EXPORTS" /D "COMPILE_DL_DOM" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_DOM=1 /D HAVE_DOMXSLT=1 /D LIBXML_STATIC=1 /D LIBXSLT_STATIC=1 /YX /FD /c\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x406 /d "NDEBUG"\r
+# ADD RSC /l 0x406 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386\r
+# ADD LINK32 wsock32.lib php4ts.lib libxml2_a.lib libxslt_a.lib iconv.lib resolv.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_dom.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" /libpath:"..\..\..\bindlib_w32\Release" /libpath:"..\..\..\php_build\lib\libxslt"\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF  "$(CFG)" == "dom - Win32 Debug_TS"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Debug_TS"\r
+# PROP BASE Intermediate_Dir "Debug_TS"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Debug_TS"\r
+# PROP Intermediate_Dir "Debug_TS"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "mssql-70" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_DOM" /D ZTS=1 /YX /FD /c\r
+# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "DOM_EXPORTS" /D "COMPILE_DL_DOM" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_DOM=1 /D LIBXML_STATIC=1 /FR /YX /FD /c\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x406 /d "NDEBUG"\r
+# ADD RSC /l 0x406 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386\r
+# ADD LINK32 php4ts_debug.lib ws2_32.lib libxml2_a.lib iconv.lib resolv.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /debug /machine:I386 /nodefaultlib:"msvcrt" /out:"..\..\Debug_TS/php_dom.dll" /libpath:"..\..\Debug_TS" /libpath:"..\..\..\bindlib_w32\Release" /libpath:"..\..\..\php_build\lib\libxslt"\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "dom - Win32 Release_TS"\r
+# Name "dom - Win32 Debug_TS"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\attr.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\cdatasection.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\characterdata.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\comment.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\document.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\documentfragment.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\documenttype.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\domconfiguration.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\domerror.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\domerrorhandler.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\domexception.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\domimplementation.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\domimplementationlist.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\domimplementationsource.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\domlocator.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\domstringlist.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\element.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\entity.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\entityreference.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\namednodemap.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\namelist.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\node.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\nodelist.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\notation.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\php_dom.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\processinginstruction.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\string_extend.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\text.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\typeinfo.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\userdatahandler.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=.\dom_ce.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\dom_fe.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\dom_properties.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\php_dom.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\xml_common.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/ext/dom/dom_ce.h b/ext/dom/dom_ce.h
new file mode 100644 (file)
index 0000000..0089086
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | Authors: Christian Stocker <chregu@php.net>                          |
+   |          Rob Richards <rrichards@php.net>                            |
+   +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+#ifndef DOM_CE_H
+#define DOM_CE_H
+
+zend_class_entry *dom_domexception_class_entry;
+zend_class_entry *dom_domstringlist_class_entry;
+zend_class_entry *dom_namelist_class_entry;
+zend_class_entry *dom_domimplementationlist_class_entry;
+zend_class_entry *dom_domimplementationsource_class_entry;
+zend_class_entry *dom_domimplementation_class_entry;
+zend_class_entry *dom_documentfragment_class_entry;
+zend_class_entry *dom_document_class_entry;
+zend_class_entry *dom_node_class_entry;
+zend_class_entry *dom_nodelist_class_entry;
+zend_class_entry *dom_namednodemap_class_entry;
+zend_class_entry *dom_characterdata_class_entry;
+zend_class_entry *dom_attr_class_entry;
+zend_class_entry *dom_element_class_entry;
+zend_class_entry *dom_text_class_entry;
+zend_class_entry *dom_comment_class_entry;
+zend_class_entry *dom_typeinfo_class_entry;
+zend_class_entry *dom_userdatahandler_class_entry;
+zend_class_entry *dom_domerror_class_entry;
+zend_class_entry *dom_domerrorhandler_class_entry;
+zend_class_entry *dom_domlocator_class_entry;
+zend_class_entry *dom_domconfiguration_class_entry;
+zend_class_entry *dom_cdatasection_class_entry;
+zend_class_entry *dom_documenttype_class_entry;
+zend_class_entry *dom_notation_class_entry;
+zend_class_entry *dom_entity_class_entry;
+zend_class_entry *dom_entityreference_class_entry;
+zend_class_entry *dom_processinginstruction_class_entry;
+zend_class_entry *dom_string_extend_class_entry;
+
+#endif /* DOM_CE_H */
diff --git a/ext/dom/dom_fe.h b/ext/dom/dom_fe.h
new file mode 100644 (file)
index 0000000..d001bbd
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | Authors: Christian Stocker <chregu@php.net>                          |
+   |          Rob Richards <rrichards@php.net>                            |
+   +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+#ifndef DOM_FE_H
+#define DOM_FE_H
+
+extern zend_function_entry php_dom_domexception_class_functions[];
+extern zend_function_entry php_dom_domstringlist_class_functions[];
+extern zend_function_entry php_dom_namelist_class_functions[];
+extern zend_function_entry php_dom_domimplementationlist_class_functions[];
+extern zend_function_entry php_dom_domimplementationsource_class_functions[];
+extern zend_function_entry php_dom_domimplementation_class_functions[];
+extern zend_function_entry php_dom_documentfragment_class_functions[];
+extern zend_function_entry php_dom_document_class_functions[];
+extern zend_function_entry php_dom_node_class_functions[];
+extern zend_function_entry php_dom_nodelist_class_functions[];
+extern zend_function_entry php_dom_namednodemap_class_functions[];
+extern zend_function_entry php_dom_characterdata_class_functions[];
+extern zend_function_entry php_dom_attr_class_functions[];
+extern zend_function_entry php_dom_element_class_functions[];
+extern zend_function_entry php_dom_text_class_functions[];
+extern zend_function_entry php_dom_comment_class_functions[];
+extern zend_function_entry php_dom_typeinfo_class_functions[];
+extern zend_function_entry php_dom_userdatahandler_class_functions[];
+extern zend_function_entry php_dom_domerror_class_functions[];
+extern zend_function_entry php_dom_domerrorhandler_class_functions[];
+extern zend_function_entry php_dom_domlocator_class_functions[];
+extern zend_function_entry php_dom_domconfiguration_class_functions[];
+extern zend_function_entry php_dom_cdatasection_class_functions[];
+extern zend_function_entry php_dom_documenttype_class_functions[];
+extern zend_function_entry php_dom_notation_class_functions[];
+extern zend_function_entry php_dom_entity_class_functions[];
+extern zend_function_entry php_dom_entityreference_class_functions[];
+extern zend_function_entry php_dom_processinginstruction_class_functions[];
+extern zend_function_entry php_dom_string_extend_class_functions[];
+
+/* domexception errors */
+typedef enum {
+       INDEX_SIZE_ERR                 = 1,
+       DOMSTRING_SIZE_ERR             = 2,
+       HIERARCHY_REQUEST_ERR          = 3,
+       WRONG_DOCUMENT_ERR             = 4,
+       INVALID_CHARACTER_ERR          = 5,
+       NO_DATA_ALLOWED_ERR            = 6,
+       NO_MODIFICATION_ALLOWED_ERR    = 7,
+       NOT_FOUND_ERR                  = 8,
+       NOT_SUPPORTED_ERR              = 9,
+       INUSE_ATTRIBUTE_ERR            = 10,
+// Introduced in DOM Level 2:
+       INVALID_STATE_ERR              = 11,
+// Introduced in DOM Level 2:
+       SYNTAX_ERR                     = 12,
+// Introduced in DOM Level 2:
+       INVALID_MODIFICATION_ERR       = 13,
+// Introduced in DOM Level 2:
+       NAMESPACE_ERR                  = 14,
+// Introduced in DOM Level 2:
+       INVALID_ACCESS_ERR             = 15,
+// Introduced in DOM Level 3:
+       VALIDATION_ERR                 = 16
+} dom_exception_code;
+
+/* domstringlist methods */
+PHP_FUNCTION(dom_domstringlist_item);
+
+/* domnamelist methods */
+PHP_FUNCTION(dom_namelist_get_name);
+PHP_FUNCTION(dom_namelist_get_namespace_uri);
+
+/* domimplementationlist methods */
+PHP_FUNCTION(dom_domimplementationlist_item);
+
+/* domimplementationsource methods */
+PHP_FUNCTION(dom_domimplementationsource_get_domimplementation);
+PHP_FUNCTION(dom_domimplementationsource_get_domimplementations);
+
+/* domimplementation methods */
+PHP_FUNCTION(dom_domimplementation_has_feature);
+PHP_FUNCTION(dom_domimplementation_create_document_type);
+PHP_FUNCTION(dom_domimplementation_create_document);
+PHP_FUNCTION(dom_domimplementation_get_feature);
+
+/* domdocumentfragment methods */
+PHP_FUNCTION(dom_documentfragment_documentfragment);
+
+/* domdocument methods */
+PHP_FUNCTION(dom_document_create_element);
+PHP_FUNCTION(dom_document_create_document_fragment);
+PHP_FUNCTION(dom_document_create_text_node);
+PHP_FUNCTION(dom_document_create_comment);
+PHP_FUNCTION(dom_document_create_cdatasection);
+PHP_FUNCTION(dom_document_create_processing_instruction);
+PHP_FUNCTION(dom_document_create_attribute);
+PHP_FUNCTION(dom_document_create_entity_reference);
+PHP_FUNCTION(dom_document_get_elements_by_tag_name);
+PHP_FUNCTION(dom_document_import_node);
+PHP_FUNCTION(dom_document_create_element_ns);
+PHP_FUNCTION(dom_document_create_attribute_ns);
+PHP_FUNCTION(dom_document_get_elements_by_tag_name_ns);
+PHP_FUNCTION(dom_document_get_element_by_id);
+PHP_FUNCTION(dom_document_adopt_node);
+PHP_FUNCTION(dom_document_normalize_document);
+PHP_FUNCTION(dom_document_rename_node);
+PHP_FUNCTION(dom_document_document);
+       /* convienience methods */
+PHP_FUNCTION(dom_document_load);
+PHP_FUNCTION(dom_document_save);
+PHP_FUNCTION(dom_document_loadxml);
+PHP_FUNCTION(dom_document_savexml);
+
+/* domnode methods */
+PHP_FUNCTION(dom_node_insert_before);
+PHP_FUNCTION(dom_node_replace_child);
+PHP_FUNCTION(dom_node_remove_child);
+PHP_FUNCTION(dom_node_append_child);
+PHP_FUNCTION(dom_node_has_child_nodes);
+PHP_FUNCTION(dom_node_clone_node);
+PHP_FUNCTION(dom_node_normalize);
+PHP_FUNCTION(dom_node_is_supported);
+PHP_FUNCTION(dom_node_has_attributes);
+PHP_FUNCTION(dom_node_compare_document_position);
+PHP_FUNCTION(dom_node_is_same_node);
+PHP_FUNCTION(dom_node_lookup_prefix);
+PHP_FUNCTION(dom_node_is_default_namespace);
+PHP_FUNCTION(dom_node_lookup_namespace_uri);
+PHP_FUNCTION(dom_node_is_equal_node);
+PHP_FUNCTION(dom_node_get_feature);
+PHP_FUNCTION(dom_node_set_user_data);
+PHP_FUNCTION(dom_node_get_user_data);
+
+/* domnodelist methods */
+PHP_FUNCTION(dom_nodelist_item);
+
+/* domnamednodemap methods */
+PHP_FUNCTION(dom_namednodemap_get_named_item);
+PHP_FUNCTION(dom_namednodemap_set_named_item);
+PHP_FUNCTION(dom_namednodemap_remove_named_item);
+PHP_FUNCTION(dom_namednodemap_item);
+PHP_FUNCTION(dom_namednodemap_get_named_item_ns);
+PHP_FUNCTION(dom_namednodemap_set_named_item_ns);
+PHP_FUNCTION(dom_namednodemap_remove_named_item_ns);
+
+/* domcharacterdata methods */
+PHP_FUNCTION(dom_characterdata_substring_data);
+PHP_FUNCTION(dom_characterdata_append_data);
+PHP_FUNCTION(dom_characterdata_insert_data);
+PHP_FUNCTION(dom_characterdata_delete_data);
+PHP_FUNCTION(dom_characterdata_replace_data);
+
+/* domattr methods */
+PHP_FUNCTION(dom_attr_is_id);
+PHP_FUNCTION(dom_attr_attr);
+
+/* domelement methods */
+PHP_FUNCTION(dom_element_get_attribute);
+PHP_FUNCTION(dom_element_set_attribute);
+PHP_FUNCTION(dom_element_remove_attribute);
+PHP_FUNCTION(dom_element_get_attribute_node);
+PHP_FUNCTION(dom_element_set_attribute_node);
+PHP_FUNCTION(dom_element_remove_attribute_node);
+PHP_FUNCTION(dom_element_get_elements_by_tag_name);
+PHP_FUNCTION(dom_element_get_attribute_ns);
+PHP_FUNCTION(dom_element_set_attribute_ns);
+PHP_FUNCTION(dom_element_remove_attribute_ns);
+PHP_FUNCTION(dom_element_get_attribute_node_ns);
+PHP_FUNCTION(dom_element_set_attribute_node_ns);
+PHP_FUNCTION(dom_element_get_elements_by_tag_name_ns);
+PHP_FUNCTION(dom_element_has_attribute);
+PHP_FUNCTION(dom_element_has_attribute_ns);
+PHP_FUNCTION(dom_element_set_id_attribute);
+PHP_FUNCTION(dom_element_set_id_attribute_ns);
+PHP_FUNCTION(dom_element_set_id_attribute_node);
+PHP_FUNCTION(dom_element_element);
+
+/* domtext methods */
+PHP_FUNCTION(dom_text_split_text);
+PHP_FUNCTION(dom_text_is_whitespace_in_element_content);
+PHP_FUNCTION(dom_text_replace_whole_text);
+PHP_FUNCTION(dom_text_text);
+
+/* domcomment methods */
+PHP_FUNCTION(dom_comment_comment);
+
+/* domtypeinfo methods */
+
+/* domuserdatahandler methods */
+PHP_FUNCTION(dom_userdatahandler_handle);
+
+/* domdomerror methods */
+
+/* domerrorhandler methods */
+PHP_FUNCTION(dom_domerrorhandler_handle_error);
+
+/* domlocator methods */
+
+/* domconfiguration methods */
+PHP_FUNCTION(dom_domconfiguration_set_parameter);
+PHP_FUNCTION(dom_domconfiguration_get_parameter);
+PHP_FUNCTION(dom_domconfiguration_can_set_parameter);
+
+/* domcdatasection methods */
+PHP_FUNCTION(dom_cdatasection_cdatasection);
+
+/* domdocumenttype methods */
+
+/* domnotation methods */
+
+/* domentity methods */
+
+/* domentityreference methods */
+PHP_FUNCTION(dom_entityreference_entityreference);
+
+/* domprocessinginstruction methods */
+PHP_FUNCTION(dom_processinginstruction_processinginstruction);
+
+/* string_extend methods */
+PHP_FUNCTION(dom_string_extend_find_offset16);
+PHP_FUNCTION(dom_string_extend_find_offset32);
+
+#endif /* DOM_FE_H */
diff --git a/ext/dom/dom_properties.h b/ext/dom/dom_properties.h
new file mode 100644 (file)
index 0000000..9ac2702
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | Authors: Christian Stocker <chregu@php.net>                          |
+   |          Rob Richards <rrichards@php.net>                            |
+   +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+#ifndef DOM_PROPERTIES_H
+#define DOM_PROPERTIES_H
+
+/* attr properties */
+int dom_attr_name_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_attr_specified_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_attr_value_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_attr_value_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_attr_owner_element_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_attr_schema_type_info_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* characterdata properties */
+int dom_characterdata_data_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_characterdata_data_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_characterdata_length_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* document properties */
+int dom_document_doctype_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_implementation_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_document_element_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_actual_encoding_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_actual_encoding_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_document_encoding_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_encoding_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_document_standalone_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_standalone_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_document_version_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_version_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_document_strict_error_checking_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_document_strict_error_checking_write(dom_object *obj, zval *newval TSRMLS_DC);
+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);
+
+/* documenttype properties */
+int dom_documenttype_name_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_documenttype_entities_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_documenttype_notations_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_documenttype_public_id_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_documenttype_system_id_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_documenttype_internal_subset_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* domerror properties */
+int dom_domerror_severity_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_domerror_message_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_domerror_type_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_domerror_related_exception_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_domerror_related_data_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_domerror_location_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* domimplementationlist properties */
+int dom_domimplementationlist_length_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* domlocator properties */
+int dom_domlocator_line_number_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_domlocator_column_number_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_domlocator_offset_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_domlocator_related_node_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_domlocator_uri_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* domstringlist properties */
+int dom_domstringlist_length_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* element properties */
+int dom_element_tag_name_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_element_schema_type_info_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* entity properties */
+int dom_entity_public_id_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_entity_system_id_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_entity_notation_name_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_entity_actual_encoding_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_entity_actual_encoding_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_entity_encoding_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_entity_encoding_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_entity_version_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_entity_version_write(dom_object *obj, zval *newval TSRMLS_DC);
+
+/* namednodemap properties */
+int dom_namednodemap_length_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* namelist properties */
+int dom_namelist_length_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* node properties */
+int dom_node_node_name_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_node_value_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_node_value_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_node_node_type_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_parent_node_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_child_nodes_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_first_child_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_last_child_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_previous_sibling_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_next_sibling_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_attributes_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_owner_document_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_namespace_uri_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_prefix_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_prefix_write(dom_object *obj, zval *newval TSRMLS_DC);
+int dom_node_local_name_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_base_uri_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_text_content_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_node_text_content_write(dom_object *obj, zval *newval TSRMLS_DC);
+
+/* nodelist properties */
+int dom_nodelist_length_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* notation properties */
+int dom_notation_public_id_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_notation_system_id_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* processinginstruction properties */
+int dom_processinginstruction_target_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_processinginstruction_data_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_processinginstruction_data_write(dom_object *obj, zval *newval TSRMLS_DC);
+
+/* text properties */
+int dom_text_whole_text_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+/* typeinfo properties */
+int dom_typeinfo_type_name_read(dom_object *obj, zval **retval TSRMLS_DC);
+int dom_typeinfo_type_namespace_read(dom_object *obj, zval **retval TSRMLS_DC);
+
+#endif /* DOM_PROPERTIERS_H */
diff --git a/ext/dom/domconfiguration.c b/ext/dom/domconfiguration.c
new file mode 100644 (file)
index 0000000..0456e25
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domdomconfiguration 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration
+* Since: DOM Level 3
+*/
+
+zend_function_entry php_dom_domconfiguration_class_functions[] = {
+       PHP_FALIAS(setParameter, dom_domconfiguration_set_parameter, NULL)
+       PHP_FALIAS(getParameter, dom_domconfiguration_get_parameter, NULL)
+       PHP_FALIAS(canSetParameter, dom_domconfiguration_can_set_parameter, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+
+/* {{{ proto dom_void dom_domconfiguration_set_parameter(string name, domuserdata value);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-property
+Since: 
+*/
+PHP_FUNCTION(dom_domconfiguration_set_parameter)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_domconfiguration_set_parameter */
+
+
+/* {{{ proto domdomuserdata dom_domconfiguration_get_parameter(string name);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-getParameter
+Since: 
+*/
+PHP_FUNCTION(dom_domconfiguration_get_parameter)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_domconfiguration_get_parameter */
+
+
+/* {{{ proto boolean dom_domconfiguration_can_set_parameter(string name, domuserdata value);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-canSetParameter
+Since: 
+*/
+PHP_FUNCTION(dom_domconfiguration_can_set_parameter)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_domconfiguration_can_set_parameter */
diff --git a/ext/dom/domerror.c b/ext/dom/domerror.c
new file mode 100644 (file)
index 0000000..f73d486
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domerror 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ERROR-Interfaces-DOMError
+* Since: DOM Level 3
+*/
+
+zend_function_entry php_dom_domerror_class_functions[] = {
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto severity  unsigned short  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ERROR-DOMError-severity
+Since: 
+*/
+int dom_domerror_severity_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto message   string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ERROR-DOMError-message
+Since: 
+*/
+int dom_domerror_message_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto type      string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ERROR-DOMError-type
+Since: 
+*/
+int dom_domerror_type_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto relatedException  object  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ERROR-DOMError-relatedException
+Since: 
+*/
+int dom_domerror_related_exception_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto relatedData       domobject       
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ERROR-DOMError-relatedData
+Since: 
+*/
+int dom_domerror_related_data_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto location  domlocator      
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ERROR-DOMError-location
+Since: 
+*/
+int dom_domerror_location_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
diff --git a/ext/dom/domerrorhandler.c b/ext/dom/domerrorhandler.c
new file mode 100644 (file)
index 0000000..0186567
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domerrorhandler 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ERROR-Interfaces-DOMErrorHandler
+* Since: DOM Level 3
+*/
+
+zend_function_entry php_dom_domerrorhandler_class_functions[] = {
+       PHP_FALIAS(handleError, dom_domerrorhandler_handle_error, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+
+/* {{{ proto dom_boolean dom_domerrorhandler_handle_error(domerror error);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-ERRORS-DOMErrorHandler-handleError
+Since: 
+*/
+PHP_FUNCTION(dom_domerrorhandler_handle_error)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_domerrorhandler_handle_error */
diff --git a/ext/dom/domexception.c b/ext/dom/domexception.c
new file mode 100644 (file)
index 0000000..4f62eaa
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domexception 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-17189187
+* Since: 
+*/
+
+extern zend_class_entry *dom_domexception_class_entry;
+
+zend_function_entry php_dom_domexception_class_functions[] = {
+       {NULL, NULL, NULL}
+};
+
+/* {{{ php_dom_throw_error */
+void php_dom_throw_error(int error_code, zval **retval TSRMLS_DC)
+{
+       zval *dom_exception;
+       char *error_message;
+
+       ALLOC_ZVAL(dom_exception);
+       Z_TYPE_P(dom_exception) = IS_OBJECT;
+       object_init_ex(dom_exception, dom_domexception_class_entry);
+       dom_exception->refcount = 1;
+       dom_exception->is_ref = 1;
+       switch (error_code)
+       {
+               case INDEX_SIZE_ERR:
+                       error_message = "Index Size Error";
+                       break;
+               case DOMSTRING_SIZE_ERR:
+                       error_message = "DOM String Size Error";
+                       break;
+               case HIERARCHY_REQUEST_ERR:
+                       error_message = "Hierarchy Request Error";
+                       break;
+               case WRONG_DOCUMENT_ERR:
+                       error_message = "Wrong Document Error";
+                       break;
+               case INVALID_CHARACTER_ERR:
+                       error_message = "Invalid Character Error";
+                       break;
+               case NO_DATA_ALLOWED_ERR:
+                       error_message = "No Data Allowed Error";
+                       break;
+               case NO_MODIFICATION_ALLOWED_ERR:
+                       error_message = "No Modification Allowed Error";
+                       break;
+               case NOT_FOUND_ERR:
+                       error_message = "Not Found Error";
+                       break;
+               case NOT_SUPPORTED_ERR:
+                       error_message = "Not Supported Error";
+                       break;
+               case INUSE_ATTRIBUTE_ERR:
+                       error_message = "Inuse Attribute Error";
+                       break;
+               case INVALID_STATE_ERR:
+                       error_message = "Invalid State Error";
+                       break;
+               case SYNTAX_ERR:
+                       error_message = "Syntax Error";
+                       break;
+               case INVALID_MODIFICATION_ERR:
+                       error_message = "Invalid Modification Error";
+                       break;
+               case NAMESPACE_ERR:
+                       error_message = "Namespace Error";
+                       break;
+               case INVALID_ACCESS_ERR:
+                       error_message = "Invalid Access Error";
+                       break;
+               case VALIDATION_ERR:
+                       error_message = "Validation Error";
+                       break;
+               default:
+                       error_message = "Unhandled Error";
+       }
+
+       add_property_long(dom_exception, "code", error_code);
+       add_property_stringl(dom_exception, "message", error_message, strlen(error_message), 1);
+       EG(exception) = dom_exception;
+}
+/* }}} end php_dom_throw_error */
diff --git a/ext/dom/domimplementation.c b/ext/dom/domimplementation.c
new file mode 100644 (file)
index 0000000..6654d6d
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domimplementation 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-102161490
+* Since: 
+*/
+
+zend_function_entry php_dom_domimplementation_class_functions[] = {
+       PHP_FALIAS(hasFeature, dom_domimplementation_has_feature, NULL)
+       PHP_FALIAS(createDocumentType, dom_domimplementation_create_document_type, NULL)
+       PHP_FALIAS(createDocument, dom_domimplementation_create_document, NULL)
+       PHP_FALIAS(getFeature, dom_domimplementation_get_feature, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+
+/* {{{ proto boolean dom_domimplementation_has_feature(string feature, string version);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-5CED94D7
+Since: 
+*/
+PHP_FUNCTION(dom_domimplementation_has_feature)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_domimplementation_has_feature */
+
+
+/* {{{ proto domdocumenttype dom_domimplementation_create_document_type(string qualifiedName, string publicId, string systemId);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocType
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_domimplementation_create_document_type)
+{
+       zval *rv = NULL;
+       xmlDtd *doctype;
+       int ret, name_len, publicid_len, systemid_len;
+       char *name, *publicid, *systemid;
+       xmlChar *pch1 = NULL, *pch2 = NULL, *localname = NULL;
+       xmlURIPtr uri;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sss", &name, &name_len, &publicid, &publicid_len, &systemid, &systemid_len) == FAILURE) {
+               return;
+       }
+
+       if (name_len == 0) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "qualifiedName is required");
+               RETURN_FALSE;
+       }
+
+       if (publicid_len > 0)
+               pch1 = publicid;
+       if (systemid_len > 0)
+               pch2 = systemid;
+
+       uri = xmlParseURI(name);
+       if (uri->opaque != NULL) {
+               localname = xmlStrdup(uri->opaque);
+               if (xmlStrchr(localname, (xmlChar) ':') != NULL) {
+                       php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC);
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+                       xmlFreeURI(uri);
+                       xmlFree(localname);
+                       RETURN_FALSE;
+               }
+       } else {
+               localname = xmlStrdup(name);
+       }
+
+       /* TODO: Test that localname has no invalid chars 
+       php_dom_throw_error(INVALID_CHARACTER_ERR, TSRMLS_CC);
+       */
+
+       xmlFreeURI(uri);
+
+       doctype = xmlCreateIntSubset(NULL, localname, pch1, pch2);
+       xmlFree(localname);
+
+       DOM_RET_OBJ(rv, (xmlNodePtr) doctype, &ret);
+}
+/* }}} end dom_domimplementation_create_document_type */
+
+
+/* {{{ proto domdocument dom_domimplementation_create_document(string namespaceURI, string qualifiedName, documenttype doctype);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocument
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_domimplementation_create_document)
+{
+       zval *node = NULL, *rv = NULL;
+       xmlDoc *docp;
+       xmlNode *nodep;
+       xmlDtdPtr doctype = NULL, dtd = NULL;
+       xmlNsPtr nsptr = NULL;
+       int ret, uri_len = 0, name_len = 0;
+       char *uri, *name;
+       xmlChar *prefix = NULL, *localname = NULL;
+       xmlURIPtr uristruct;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sso", &uri, &uri_len, &name, &name_len, &node) == FAILURE) {
+               return;
+       }
+
+       if (doctype != NULL) {
+               DOM_GET_OBJ(doctype, node, xmlDtdPtr);
+               if (doctype->type == XML_DOCUMENT_TYPE_NODE) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid DocumentType object");
+                       RETURN_FALSE;
+               }
+               if (doctype->doc != NULL) {
+                       php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "DocumentType: Wrong Document");
+                       RETURN_FALSE;
+               }
+       }
+
+       if (uri_len > 0 || name_len > 0 || doctype != NULL) {
+               if (name_len == 0 && uri_len > 0) {
+                       php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC);
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+               }
+               if (name_len > 0) {
+                       uristruct = xmlParseURI(name);
+                       if (uristruct->opaque != NULL) {
+                               prefix = xmlStrdup(uristruct->scheme);
+                               localname = xmlStrdup(uristruct->opaque);
+                               if (xmlStrchr(localname, (xmlChar) ':') != NULL) {
+                                       php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC);
+                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+                                       xmlFreeURI(uristruct);
+                                       xmlFree(prefix);
+                                       xmlFree(localname);
+                                       RETURN_FALSE;
+                               }
+                               if (!strcmp (prefix, "xml") && strcmp(uri, XML_XML_NAMESPACE)) {
+                                       php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC);
+                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+                                       xmlFreeURI(uristruct);
+                                       xmlFree(prefix);
+                                       xmlFree(localname);
+                                       RETURN_FALSE;
+                               }
+                       } else {
+                               localname = xmlStrdup(name);
+                       }
+
+                       /* TODO: Test that localname has no invalid chars 
+                       php_dom_throw_error(INVALID_CHARACTER_ERR, TSRMLS_CC);
+                       */
+
+                       xmlFreeURI(uristruct);
+
+                       if (uri_len > 0) {
+                               if (prefix == NULL) {
+                                       php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC);
+                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+                                       xmlFree(localname);
+                                       RETURN_FALSE;
+                               } else {
+                                       if ((nsptr = xmlNewNs(NULL, uri, prefix)) == NULL) {
+                                               php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC);
+                                               xmlFree(prefix);
+                                               xmlFree(localname);
+                                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+                                               RETURN_FALSE;   
+                                       }
+                               }
+                       }
+                       if (prefix != NULL) {
+                               xmlFree(prefix);
+                       }
+               }
+       }
+
+       /* currently letting libxml2 set the version string */
+       docp = xmlNewDoc(NULL);
+       if (!docp) {
+               if (localname != NULL) {
+                       xmlFree(localname);
+               }
+               RETURN_FALSE;
+       }
+
+       if (doctype != NULL) {
+               dtd = xmlCreateIntSubset (docp, doctype->name, 
+                       doctype->ExternalID, doctype->SystemID);
+       }
+
+       if (localname != NULL) {
+               nodep = xmlNewDocNode (docp, nsptr, localname, NULL);
+               if (!nodep) {
+                       xmlFreeDoc(docp);
+                       xmlFree(localname);
+                       /* Need some type of error here */
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unexpected Error");
+                       RETURN_FALSE;
+               }
+               xmlDocSetRootElement(docp, nodep);
+               xmlFree(localname);
+       }
+
+       DOM_RET_OBJ(rv, (xmlNodePtr) docp, &ret);
+}
+/* }}} end dom_domimplementation_create_document */
+
+
+/* {{{ proto domnode dom_domimplementation_get_feature(string feature, string version);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementation3-getFeature
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_domimplementation_get_feature)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_domimplementation_get_feature */
diff --git a/ext/dom/domimplementationlist.c b/ext/dom/domimplementationlist.c
new file mode 100644 (file)
index 0000000..45f86f4
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domimplementationlist 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementationList
+* Since: DOM Level 3
+*/
+
+zend_function_entry php_dom_domimplementationlist_class_functions[] = {
+       PHP_FALIAS(item, dom_domimplementationlist_item, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto length    unsigned long   
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementationList-length
+Since: 
+*/
+int dom_domimplementationlist_length_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+
+/* {{{ proto domdomimplementation dom_domimplementationlist_item(unsigned long index);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementationList-item
+Since: 
+*/
+PHP_FUNCTION(dom_domimplementationlist_item)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_domimplementationlist_item */
diff --git a/ext/dom/domimplementationsource.c b/ext/dom/domimplementationsource.c
new file mode 100644 (file)
index 0000000..e0fcaff
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domimplementationsource 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementationSource
+* Since: DOM Level 3
+*/
+
+zend_function_entry php_dom_domimplementationsource_class_functions[] = {
+       PHP_FALIAS(getDomimplementation, dom_domimplementationsource_get_domimplementation, NULL)
+       PHP_FALIAS(getDomimplementations, dom_domimplementationsource_get_domimplementations, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+
+/* {{{ proto domdomimplementation dom_domimplementationsource_get_domimplementation(string features);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-getDOMImpl
+Since: 
+*/
+PHP_FUNCTION(dom_domimplementationsource_get_domimplementation)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_domimplementationsource_get_domimplementation */
+
+
+/* {{{ proto domimplementationlist dom_domimplementationsource_get_domimplementations(string features);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-getDOMImpls
+Since: 
+*/
+PHP_FUNCTION(dom_domimplementationsource_get_domimplementations)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_domimplementationsource_get_domimplementations */
diff --git a/ext/dom/domlocator.c b/ext/dom/domlocator.c
new file mode 100644 (file)
index 0000000..d1d778d
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domlocator 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Interfaces-DOMLocator
+* Since: DOM Level 3
+*/
+
+zend_function_entry php_dom_domlocator_class_functions[] = {
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto line_number       long    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMLocator-line-number
+Since: 
+*/
+int dom_domlocator_line_number_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto column_number     long    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMLocator-column-number
+Since: 
+*/
+int dom_domlocator_column_number_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto offset    long    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMLocator-offset
+Since: 
+*/
+int dom_domlocator_offset_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto related_node      node    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMLocator-node
+Since: 
+*/
+int dom_domlocator_related_node_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto uri       string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMLocator-uri
+Since: 
+*/
+int dom_domlocator_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
diff --git a/ext/dom/domstringlist.c b/ext/dom/domstringlist.c
new file mode 100644 (file)
index 0000000..b1079ea
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domstringlist 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMStringList
+* Since: DOM Level 3
+*/
+
+zend_function_entry php_dom_domstringlist_class_functions[] = {
+       PHP_FALIAS(item, dom_domstringlist_item, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto length    unsigned long   
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMStringList-length
+Since: 
+*/
+int dom_domstringlist_length_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+
+/* {{{ proto domstring dom_domstringlist_item(unsigned long index);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMStringList-item
+Since: 
+*/
+PHP_FUNCTION(dom_domstringlist_item)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_domstringlist_item */
diff --git a/ext/dom/element.c b/ext/dom/element.c
new file mode 100644 (file)
index 0000000..96ce213
--- /dev/null
@@ -0,0 +1,779 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domelement extends domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-745549614
+* Since: 
+*/
+
+zend_function_entry php_dom_element_class_functions[] = {
+       PHP_FALIAS(getAttribute, dom_element_get_attribute, NULL)
+       PHP_FALIAS(setAttribute, dom_element_set_attribute, NULL)
+       PHP_FALIAS(removeAttribute, dom_element_remove_attribute, NULL)
+       PHP_FALIAS(getAttributeNode, dom_element_get_attribute_node, NULL)
+       PHP_FALIAS(setAttributeNode, dom_element_set_attribute_node, NULL)
+       PHP_FALIAS(removeAttributeNode, dom_element_remove_attribute_node, NULL)
+       PHP_FALIAS(getElementsByTagName, dom_element_get_elements_by_tag_name, NULL)
+       PHP_FALIAS(getAttributeNS, dom_element_get_attribute_ns, NULL)
+       PHP_FALIAS(setAttributeNS, dom_element_set_attribute_ns, NULL)
+       PHP_FALIAS(removeAttributeNS, dom_element_remove_attribute_ns, NULL)
+       PHP_FALIAS(getAttributeNodeNS, dom_element_get_attribute_node_ns, NULL)
+       PHP_FALIAS(setAttributeNodeNS, dom_element_set_attribute_node_ns, NULL)
+       PHP_FALIAS(getElementsByTagNameNS, dom_element_get_elements_by_tag_name_ns, NULL)
+       PHP_FALIAS(hasAttribute, dom_element_has_attribute, NULL)
+       PHP_FALIAS(hasAttributeNS, dom_element_has_attribute_ns, NULL)
+       PHP_FALIAS(setIdAttribute, dom_element_set_id_attribute, NULL)
+       PHP_FALIAS(setIdAttributeNS, dom_element_set_id_attribute_ns, NULL)
+       PHP_FALIAS(setIdAttributeNode, dom_element_set_id_attribute_node, NULL)
+       PHP_FALIAS(domelement, dom_element_element, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ proto domnode dom_element_element(string name, [string value]); */
+PHP_FUNCTION(dom_element_element)
+{
+
+       zval *id;
+       xmlNodePtr nodep = NULL, oldnode = NULL;
+       dom_object *intern;
+       char *name, *value = NULL;
+       int name_len, value_len;
+
+       id = getThis();
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &name, &name_len, &value, &value_len) == FAILURE) {
+               return;
+       }
+
+       if (name_len == 0) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Element name is required");
+               RETURN_FALSE;
+       }
+
+       nodep = xmlNewNode(NULL, (xmlChar *) name);
+
+       if (!nodep)
+               RETURN_FALSE;
+
+       if (value_len > 0) {
+               xmlNodeSetContentLen(nodep, value, value_len);
+       }
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               oldnode = (xmlNodePtr)intern->ptr;
+               if (oldnode != NULL) {
+                       node_free_resource(oldnode  TSRMLS_CC);
+               }
+               php_dom_set_object(id, nodep TSRMLS_CC);
+       }
+}
+/* }}} end dom_element_element */
+
+/* {{{ proto tagName   string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-104682815
+Since: 
+*/
+int dom_element_tag_name_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNodePtr nodep;
+
+       nodep = obj->ptr;
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, (char *) (nodep->name), 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto schemaTypeInfo    typeinfo        
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Element-schemaTypeInfo
+Since: DOM Level 3
+*/
+int dom_element_schema_type_info_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto domstring dom_element_get_attribute(string name);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-666EE0F9
+Since:
+*/
+PHP_FUNCTION(dom_element_get_attribute)
+{
+       zval *id;
+       xmlNode *nodep;
+       char *name, *value;
+       int name_len;
+
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       value = xmlGetProp(nodep, name);
+       if (value == NULL) {
+               RETURN_EMPTY_STRING();
+       } else {
+               RETVAL_STRING(value, 1);
+               xmlFree(value);
+       }
+}
+/* }}} end dom_element_get_attribute */
+
+
+/* {{{ proto dom_void dom_element_set_attribute(string name, string value);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68F082
+Since: 
+*/
+PHP_FUNCTION(dom_element_set_attribute)
+{
+       zval *id, *rv = NULL;
+       xmlNode *nodep;
+       xmlAttr *attr;
+       int ret, name_len, value_len;
+       char *name, *value;
+
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",  &name, &name_len, &value, &value_len) == FAILURE) {
+               return;
+       }
+
+       attr = xmlHasProp(nodep,name);
+       if (attr != NULL) {
+               node_list_unlink(attr->children TSRMLS_CC);
+       }
+       attr = xmlSetProp(nodep, name, value);
+       if (!attr) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such attribute '%s'", name);
+               RETURN_FALSE;
+       }
+
+       DOM_RET_OBJ(rv, (xmlNodePtr) attr, &ret);
+
+}
+/* }}} end dom_element_set_attribute */
+
+
+/* {{{ proto dom_void dom_element_remove_attribute(string name);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D6AC0F9
+Since: 
+*/
+PHP_FUNCTION(dom_element_remove_attribute)
+{
+       zval *id;
+       xmlNode *nodep;
+       xmlAttr *attrp;
+       int name_len;
+       char *name;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       attrp = xmlHasProp(nodep,name);
+       if (attrp == NULL) {
+               RETURN_FALSE;
+       }
+
+       /*      TODO: DTD defined attributes are handled special */
+       if (dom_object_get_data((xmlNodePtr) attrp) == NULL) {
+               node_list_unlink(attrp->children TSRMLS_CC);
+               xmlUnlinkNode((xmlNodePtr) attrp);
+               xmlFreeProp(attrp);
+       } else {
+               dom_add_to_list((xmlNodePtr) attrp, attrp->doc TSRMLS_CC);
+               xmlUnlinkNode((xmlNodePtr) attrp);
+       }
+
+       RETURN_TRUE;
+}
+/* }}} end dom_element_remove_attribute */
+
+
+/* {{{ proto domattr dom_element_get_attribute_node(string name);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-217A91B8
+Since: 
+*/
+PHP_FUNCTION(dom_element_get_attribute_node)
+{
+       zval *id, *rv = NULL;
+       xmlNode *nodep;
+       xmlAttr  *attrp;
+       int name_len, ret;
+       char *name;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",  &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       attrp = xmlHasProp(nodep,name);
+       if (attrp == NULL) {
+               RETURN_FALSE;
+       }
+       DOM_RET_OBJ(rv, (xmlNodePtr) attrp, &ret);
+}
+/* }}} end dom_element_get_attribute_node */
+
+
+/* {{{ proto domattr dom_element_set_attribute_node(attr newAttr);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-887236154
+Since: 
+*/
+PHP_FUNCTION(dom_element_set_attribute_node)
+{
+       zval *id, *node, *oldzval, *rv = NULL;
+       xmlNode *nodep;
+       xmlAttr *attrp, *existattrp = NULL;
+       int ret;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) {
+               return;
+       }
+
+       DOM_GET_OBJ(attrp, node, xmlAttrPtr);
+
+       if (attrp->type != XML_ATTRIBUTE_NODE) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute node is required");
+               RETURN_FALSE;
+       }
+
+       existattrp = xmlHasProp(nodep,attrp->name);
+       if (existattrp != NULL) {
+               if ((oldzval = dom_object_get_data((xmlNodePtr) existattrp)) == NULL) {
+                       dom_add_to_list((xmlNodePtr) existattrp, existattrp->doc TSRMLS_CC);
+                       xmlUnlinkNode((xmlNodePtr) existattrp);
+               } else {
+                       if (oldzval == node) {
+                               RETURN_NULL();
+                       }
+                       dom_add_to_list((xmlNodePtr) existattrp, existattrp->doc TSRMLS_CC);
+                       xmlUnlinkNode((xmlNodePtr) existattrp);
+               }
+       }
+
+       xmlAddChild(nodep, (xmlNodePtr) attrp);
+       dom_del_from_list((xmlNodePtr) attrp, attrp->doc TSRMLS_CC);
+
+       /* Returns old property if removed otherwise NULL */
+       if (existattrp != NULL) {
+               DOM_RET_OBJ(rv, (xmlNodePtr) existattrp, &ret);
+       } else {
+               RETVAL_NULL();
+       }
+
+}
+/* }}} end dom_element_set_attribute_node */
+
+
+/* {{{ proto domattr dom_element_remove_attribute_node(attr oldAttr);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D589198
+Since: 
+*/
+PHP_FUNCTION(dom_element_remove_attribute_node)
+{
+       zval *id;
+       xmlNode *nodep;
+       xmlAttr *attrp;
+       int name_len;
+       char *name;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",  &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       attrp = xmlHasProp(nodep,name);
+       if (attrp == NULL) {
+               RETURN_FALSE;
+       }
+
+       /*      Check for registered nodes within attributes tree when attribute is not referenced  
+               Unlink dependant nodes and free attribute if not registered */
+       if (dom_object_get_data((xmlNodePtr) attrp) == NULL) {
+               node_list_unlink(attrp->children TSRMLS_CC);
+               xmlUnlinkNode((xmlNodePtr) attrp);
+               xmlFreeProp(attrp);
+       } else {
+               dom_add_to_list((xmlNodePtr) attrp, attrp->doc TSRMLS_CC);
+               xmlUnlinkNode((xmlNodePtr) attrp);
+       }
+
+       RETURN_TRUE;
+
+}
+/* }}} end dom_element_remove_attribute_node */
+
+
+/* {{{ proto domnodelist dom_element_get_elements_by_tag_name(string name);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1938918D
+Since: 
+*/
+PHP_FUNCTION(dom_element_get_elements_by_tag_name)
+{
+       zval *id;
+       xmlXPathContextPtr ctxp;
+       xmlNodePtr nodep;
+       xmlDocPtr docp;
+       xmlXPathObjectPtr xpathobjp;
+       int name_len, ret;
+       char *str,*name;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       docp = nodep->doc;
+
+       ctxp = xmlXPathNewContext(docp);
+
+       ctxp->node = nodep;
+       str = (char*) emalloc((name_len+3) * sizeof(char)) ;
+       sprintf(str ,"//%s",name);
+
+       xpathobjp = xmlXPathEval(str, ctxp);
+       efree(str);
+
+       if (!xpathobjp) {
+               RETURN_FALSE;
+       }
+
+       if (xpathobjp->type ==  XPATH_NODESET) {
+               int i;
+               xmlNodeSetPtr nodesetp;
+
+               if (NULL == (nodesetp = xpathobjp->nodesetval)) {
+                       xmlXPathFreeObject (xpathobjp);
+                       xmlXPathFreeContext(ctxp);
+                       RETURN_FALSE;
+               }
+
+               array_init(return_value);
+
+               for (i = 0; i < nodesetp->nodeNr; i++) {
+                       xmlNodePtr node = nodesetp->nodeTab[i];
+                       zval *child = NULL;
+                       zval *wrapper;
+                       wrapper = dom_object_get_data(node);
+                       if (wrapper == NULL) {
+                               MAKE_STD_ZVAL(child);
+                       }
+
+                       child = php_dom_create_object(node, &ret, wrapper, child TSRMLS_CC);
+                       add_next_index_zval(return_value, child);
+               }
+       }
+
+       xmlXPathFreeObject(xpathobjp);
+       xmlXPathFreeContext(ctxp);
+}
+/* }}} end dom_element_get_elements_by_tag_name */
+
+
+/* {{{ proto domstring dom_element_get_attribute_ns(string namespaceURI, string localName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAttrNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_element_get_attribute_ns)
+{
+       zval *id;
+       xmlNodePtr elemp;
+       xmlNsPtr nsptr;
+       int uri_len = 0, name_len = 0;
+       char *uri, *name, *strattr;
+
+       DOM_GET_THIS_OBJ(elemp, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &uri, &uri_len, &name, &name_len) == FAILURE) {
+               return;
+       }
+       strattr = xmlGetNsProp(elemp, name, uri);
+
+       if (strattr != NULL) {
+               RETVAL_STRING(strattr, 1);
+               xmlFree(strattr);
+       } else {
+               if (xmlStrEqual(uri, DOM_XMLNS_NAMESPACE)) {
+                       nsptr = dom_get_nsdecl(elemp, name);
+                       if (nsptr != NULL) {
+                               RETVAL_STRING((char *) nsptr->href, 1);
+                       } else {
+                               RETVAL_EMPTY_STRING();
+                       }
+               } else {
+                       RETVAL_EMPTY_STRING();
+               }
+       }
+
+}
+/* }}} end dom_element_get_attribute_ns */
+
+
+/* {{{ proto dom_void dom_element_set_attribute_ns(string namespaceURI, string qualifiedName, string value);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAttrNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_element_set_attribute_ns)
+{
+       zval *id, *rv = NULL;
+       xmlNodePtr elemp, nodep = NULL;
+       xmlNsPtr nsptr;
+       int ret, uri_len = 0, name_len = 0;
+       char *uri, *name;
+       xmlChar *localname = NULL;
+       int errorcode = 0;
+
+       DOM_GET_THIS_OBJ(elemp, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &uri, &uri_len, &name, &name_len) == FAILURE) {
+               return;
+       }
+       nsptr = xmlSearchNsByHref (elemp->doc, elemp, uri);
+       if (nsptr == NULL) {
+               nsptr = dom_get_ns(uri, name, uri_len, name_len, &errorcode, (char **) &localname);
+               if (nsptr != NULL) {
+                       dom_set_old_ns(elemp->doc, nsptr);
+               }
+       }
+       if (errorcode == 0) {
+               if (nsptr != NULL) {
+                       nodep = (xmlNodePtr) xmlSetNsProp(elemp, nsptr, localname, NULL);
+               } else {
+                       nodep = (xmlNodePtr) xmlSetProp(elemp, name, NULL);
+               }
+       }
+       if (localname != NULL) {
+               xmlFree(localname);
+       }
+
+       if (errorcode != 0) {
+               php_dom_throw_error(errorcode, &return_value TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+               RETURN_FALSE;
+       }
+
+       if (nodep == NULL) {
+               RETURN_FALSE;
+       }
+
+       DOM_RET_OBJ(rv, nodep, &ret);
+}
+/* }}} end dom_element_set_attribute_ns */
+
+
+/* {{{ proto dom_void dom_element_remove_attribute_ns(string namespaceURI, string localName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElRemAtNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_element_remove_attribute_ns)
+{
+       zval *id;
+       xmlNode *nodep;
+       xmlAttr *attrp;
+       int name_len, uri_len;
+       char *name, *uri;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &uri, &uri_len, &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       if (xmlStrEqual(uri, DOM_XMLNS_NAMESPACE)) {
+               DOM_NOT_IMPLEMENTED();
+       } else {
+               attrp = xmlHasNsProp(nodep, name, uri);
+               if (attrp == NULL) {
+                       RETURN_FALSE;
+               }
+
+               if (dom_object_get_data((xmlNodePtr) attrp) == NULL) {
+                       node_list_unlink(attrp->children TSRMLS_CC);
+                       xmlUnlinkNode((xmlNodePtr) attrp);
+                       xmlFreeProp(attrp);
+               } else {
+                       dom_add_to_list((xmlNodePtr) attrp, attrp->doc TSRMLS_CC);
+                       xmlUnlinkNode((xmlNodePtr) attrp);
+               }
+       }
+
+       RETURN_TRUE;
+}
+/* }}} end dom_element_remove_attribute_ns */
+
+
+/* {{{ proto domattr dom_element_get_attribute_node_ns(string namespaceURI, string localName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAtNodeNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_element_get_attribute_node_ns)
+{
+       zval *id;
+       xmlNodePtr elemp;
+       xmlNs *nsp;
+       int uri_len, name_len;
+       char *uri, *name, *value;
+
+       DOM_GET_THIS_OBJ(elemp, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &uri, &uri_len, &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       value = xmlGetNsProp(elemp, name, uri);
+
+       if (value != NULL) {
+               RETVAL_STRING(value, 1);
+               xmlFree(value);
+       } else {
+               if (xmlStrEqual(name, DOM_XMLNS_NAMESPACE)) {
+                       nsp = dom_get_nsdecl(elemp, name);
+                       if (nsp != NULL) {
+                               RETVAL_STRING((char *) nsp->href, 1);
+                       } else {
+                               RETVAL_EMPTY_STRING();
+                       }
+               } else {
+                       RETVAL_EMPTY_STRING();
+               }
+       }
+
+}
+/* }}} end dom_element_get_attribute_node_ns */
+
+
+/* {{{ proto domattr dom_element_set_attribute_node_ns(attr newAttr);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAtNodeNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_element_set_attribute_node_ns)
+{
+       zval *id, *node, *oldzval, *rv = NULL;
+       xmlNode *nodep;
+       xmlNs *nsp;
+       xmlAttr *attrp, *existattrp = NULL;
+       int ret;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) {
+               return;
+       }
+
+       DOM_GET_OBJ(attrp, node, xmlAttrPtr);
+
+       if (attrp->type != XML_ATTRIBUTE_NODE) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute node is required");
+               RETURN_FALSE;
+       }
+
+    nsp = attrp->ns;
+    if (nsp != NULL) {
+        existattrp = xmlHasNsProp(nodep, nsp->href, attrp->name);
+    } else {
+        existattrp = xmlHasProp(nodep, attrp->name);
+    }
+
+       if (existattrp != NULL) {
+               if ((oldzval = dom_object_get_data((xmlNodePtr) existattrp)) == NULL) {
+                       dom_add_to_list((xmlNodePtr) existattrp, existattrp->doc TSRMLS_CC);
+                       xmlUnlinkNode((xmlNodePtr) existattrp);
+               } else {
+                       if (oldzval == node) {
+                               RETURN_NULL();
+                       }
+                       dom_add_to_list((xmlNodePtr) existattrp, existattrp->doc TSRMLS_CC);
+                       xmlUnlinkNode((xmlNodePtr) existattrp);
+               }
+       }
+
+       xmlAddChild(nodep, (xmlNodePtr) attrp);
+       if (existattrp == NULL) {
+               xmlReconciliateNs(nodep->doc, nodep);
+       }
+
+       dom_del_from_list((xmlNodePtr) attrp, attrp->doc TSRMLS_CC);
+
+       /* Returns old property if removed otherwise NULL */
+       if (existattrp != NULL) {
+               DOM_RET_OBJ(rv, (xmlNodePtr) existattrp, &ret);
+       } else {
+               RETVAL_NULL();
+       }
+
+}
+/* }}} end dom_element_set_attribute_node_ns */
+
+
+
+/* {{{ proto domnodelist dom_element_get_elements_by_tag_name_ns(string namespaceURI, string localName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-A6C90942
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_element_get_elements_by_tag_name_ns)
+{
+       zval *id;
+       xmlNodePtr elemp;
+       int uri_len, name_len;
+       char *uri, *name;
+
+       DOM_GET_THIS_OBJ(elemp, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &uri, &uri_len, &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       array_init(return_value);
+
+       dom_get_elements_by_tag_name_ns_raw(elemp->children, uri, name, &return_value TSRMLS_CC);
+}
+/* }}} end dom_element_get_elements_by_tag_name_ns */
+
+
+/* {{{ proto boolean dom_element_has_attribute(string name);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttr
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_element_has_attribute)
+{
+       zval *id;
+       xmlNode *nodep;
+       char *name, *value;
+       int name_len;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",  &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       value = xmlGetProp(nodep, name);
+       if (value == NULL) {
+               RETURN_FALSE;
+       } else {
+               xmlFree(value);
+               RETURN_TRUE;
+       }
+}
+/* }}} end dom_element_has_attribute */
+
+
+/* {{{ proto boolean dom_element_has_attribute_ns(string namespaceURI, string localName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttrNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_element_has_attribute_ns)
+{
+       zval *id;
+       xmlNodePtr elemp;
+       xmlNs *nsp;
+       int uri_len, name_len;
+       char *uri, *name, *value;
+
+       DOM_GET_THIS_OBJ(elemp, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &uri, &uri_len, &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       value = xmlGetNsProp(elemp, name, uri);
+
+       if (value != NULL) {
+               xmlFree(value);
+               RETURN_TRUE;
+       } else {
+               if (xmlStrEqual(uri, DOM_XMLNS_NAMESPACE)) {
+                       nsp = dom_get_nsdecl(elemp, name);
+                       if (nsp != NULL) {
+                               RETURN_TRUE;
+                       }
+               }
+       }
+
+       RETURN_FALSE;
+}
+/* }}} end dom_element_has_attribute_ns */
+
+
+/* {{{ proto dom_void dom_element_set_id_attribute(string name, boolean isId);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttr
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_element_set_id_attribute)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_element_set_id_attribute */
+
+
+/* {{{ proto dom_void dom_element_set_id_attribute_ns(string namespaceURI, string localName, boolean isId);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNS
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_element_set_id_attribute_ns)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_element_set_id_attribute_ns */
+
+
+/* {{{ proto dom_void dom_element_set_id_attribute_node(attr idAttr, boolean isId);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNode
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_element_set_id_attribute_node)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_element_set_id_attribute_node */
diff --git a/ext/dom/entity.c b/ext/dom/entity.c
new file mode 100644 (file)
index 0000000..2b5051b
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domentity extends domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-527DCFF2
+* Since: 
+*/
+
+zend_function_entry php_dom_entity_class_functions[] = {
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto public_id string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-D7303025
+Since: 
+*/
+int dom_entity_public_id_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlEntity *nodep;
+       nodep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       if (nodep->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) {
+               ZVAL_NULL(*retval);
+       } else {
+               ZVAL_STRING(*retval, (char *) (nodep->ExternalID), 1);
+       }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto system_id string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-D7C29F3E
+Since: 
+*/
+int dom_entity_system_id_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlEntity *nodep;
+       nodep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       if (nodep->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) {
+               ZVAL_NULL(*retval);
+       } else {
+               ZVAL_STRING(*retval, (char *) (nodep->SystemID), 1);
+       }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto notation_name     string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-6ABAEB38
+Since: 
+*/
+int dom_entity_notation_name_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlEntity *nodep;
+       char *content;
+
+       nodep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       if (nodep->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) {
+               ZVAL_NULL(*retval);
+       } else {
+               content = xmlNodeGetContent((xmlNodePtr) nodep);
+               ZVAL_STRING(*retval, content, 1);
+               xmlFree(content);
+       }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto actual_encoding   string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Entity3-actualEncoding
+Since: DOM Level 3
+*/
+int dom_entity_actual_encoding_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+int dom_entity_actual_encoding_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto encoding  string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Entity3-encoding
+Since: DOM Level 3
+*/
+int dom_entity_encoding_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+int dom_entity_encoding_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto version   string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Entity3-version
+Since: DOM Level 3
+*/
+int dom_entity_version_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+int dom_entity_version_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       return SUCCESS;
+}
+
+/* }}} */
+
+
diff --git a/ext/dom/entityreference.c b/ext/dom/entityreference.c
new file mode 100644 (file)
index 0000000..d492780
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domentityreference extends domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-11C98490
+* Since: 
+*/
+
+zend_function_entry php_dom_entityreference_class_functions[] = {
+       PHP_FALIAS(domentityreference, dom_entityreference_entityreference, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ proto domnode dom_entityreference_entityreference(string name); */
+PHP_FUNCTION(dom_entityreference_entityreference)
+{
+       zval *id;
+       xmlNode *node;
+       xmlNodePtr oldnode = NULL;
+       dom_object *intern;
+       char *name;
+       int name_len;
+
+       id = getThis();
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
+               return;
+       }
+
+       if (name_len == 0) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Entity Reference name is required");
+               RETURN_FALSE;
+       }
+
+       node = xmlNewReference(NULL, name);
+
+       if (!node)
+               RETURN_FALSE;
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               oldnode = (xmlNodePtr)intern->ptr;
+               if (oldnode != NULL) {
+                       node_free_resource(oldnode  TSRMLS_CC);
+               }
+               php_dom_set_object(id, node TSRMLS_CC);
+       }
+}
+
+/* }}} end dom_entityreference_entityreference */
diff --git a/ext/dom/namednodemap.c b/ext/dom/namednodemap.c
new file mode 100644 (file)
index 0000000..27aed13
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domnamednodemap 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1780488922
+* Since: 
+*/
+
+zend_function_entry php_dom_namednodemap_class_functions[] = {
+       PHP_FALIAS(getNamedItem, dom_namednodemap_get_named_item, NULL)
+       PHP_FALIAS(setNamedItem, dom_namednodemap_set_named_item, NULL)
+       PHP_FALIAS(removeNamedItem, dom_namednodemap_remove_named_item, NULL)
+       PHP_FALIAS(item, dom_namednodemap_item, NULL)
+       PHP_FALIAS(getNamedItemNS, dom_namednodemap_get_named_item_ns, NULL)
+       PHP_FALIAS(setNamedItemNS, dom_namednodemap_set_named_item_ns, NULL)
+       PHP_FALIAS(removeNamedItemNS, dom_namednodemap_remove_named_item_ns, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto length    unsigned long   
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D0FB19E
+Since: 
+*/
+int dom_namednodemap_length_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+
+/* {{{ proto domnode dom_namednodemap_get_named_item(string name);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1074577549
+Since: 
+*/
+PHP_FUNCTION(dom_namednodemap_get_named_item)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_namednodemap_get_named_item */
+
+
+/* {{{ proto domnode dom_namednodemap_set_named_item(node arg);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1025163788
+Since: 
+*/
+PHP_FUNCTION(dom_namednodemap_set_named_item)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_namednodemap_set_named_item */
+
+
+/* {{{ proto domnode dom_namednodemap_remove_named_item(string name);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D58B193
+Since: 
+*/
+PHP_FUNCTION(dom_namednodemap_remove_named_item)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_namednodemap_remove_named_item */
+
+
+/* {{{ proto domnode dom_namednodemap_item(unsigned long index);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-349467F9
+Since: 
+*/
+PHP_FUNCTION(dom_namednodemap_item)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_namednodemap_item */
+
+
+/* {{{ proto domnode dom_namednodemap_get_named_item_ns(string namespaceURI, string localName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getNamedItemNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_namednodemap_get_named_item_ns)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_namednodemap_get_named_item_ns */
+
+
+/* {{{ proto domnode dom_namednodemap_set_named_item_ns(node arg);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-setNamedItemNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_namednodemap_set_named_item_ns)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_namednodemap_set_named_item_ns */
+
+
+/* {{{ proto domnode dom_namednodemap_remove_named_item_ns(string namespaceURI, string localName);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-removeNamedItemNS
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_namednodemap_remove_named_item_ns)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_namednodemap_remove_named_item_ns */
diff --git a/ext/dom/namelist.c b/ext/dom/namelist.c
new file mode 100644 (file)
index 0000000..ece384c
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domnamelist 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#NameList
+* Since: DOM Level 3
+*/
+
+zend_function_entry php_dom_namelist_class_functions[] = {
+       PHP_FALIAS(getName, dom_namelist_get_name, NULL)
+       PHP_FALIAS(getNamespaceURI, dom_namelist_get_namespace_uri, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto length    unsigned long   
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#NameList-length
+Since: 
+*/
+int dom_namelist_length_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+
+/* {{{ proto domstring dom_namelist_get_name(unsigned long index);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#NameList-getName
+Since: 
+*/
+PHP_FUNCTION(dom_namelist_get_name)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_namelist_get_name */
+
+
+/* {{{ proto domstring dom_namelist_get_namespace_uri(unsigned long index);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#NameList-getNamespaceURI
+Since: 
+*/
+PHP_FUNCTION(dom_namelist_get_namespace_uri)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_namelist_get_namespace_uri */
diff --git a/ext/dom/node.c b/ext/dom/node.c
new file mode 100644 (file)
index 0000000..8b9ab30
--- /dev/null
@@ -0,0 +1,1274 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1950641247
+* Since: 
+*/
+
+zend_function_entry php_dom_node_class_functions[] = {
+       PHP_FALIAS(insertBefore, dom_node_insert_before, NULL)
+       PHP_FALIAS(replaceChild, dom_node_replace_child, NULL)
+       PHP_FALIAS(removeChild, dom_node_remove_child, NULL)
+       PHP_FALIAS(appendChild, dom_node_append_child, NULL)
+       PHP_FALIAS(hasChildNodes, dom_node_has_child_nodes, NULL)
+       PHP_FALIAS(cloneNode, dom_node_clone_node, NULL)
+       PHP_FALIAS(normalize, dom_node_normalize, NULL)
+       PHP_FALIAS(isSupported, dom_node_is_supported, NULL)
+       PHP_FALIAS(hasAttributes, dom_node_has_attributes, NULL)
+       PHP_FALIAS(compareDocumentPosition, dom_node_compare_document_position, NULL)
+       PHP_FALIAS(isSameNode, dom_node_is_same_node, NULL)
+       PHP_FALIAS(lookupPrefix, dom_node_lookup_prefix, NULL)
+       PHP_FALIAS(isDefaultNamespace, dom_node_is_default_namespace, NULL)
+       PHP_FALIAS(lookupNamespaceUri, dom_node_lookup_namespace_uri, NULL)
+       PHP_FALIAS(isEqualNode, dom_node_is_equal_node, NULL)
+       PHP_FALIAS(getFeature, dom_node_get_feature, NULL)
+       PHP_FALIAS(setUserData, dom_node_set_user_data, NULL)
+       PHP_FALIAS(getUserData, dom_node_get_user_data, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ proto nodeName  string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68D095
+Since: 
+*/
+int dom_node_node_name_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNode *nodep;
+       char *str = NULL;
+
+       nodep = obj->ptr;
+
+       switch (nodep->type) {
+               case XML_ATTRIBUTE_NODE:
+               case XML_ELEMENT_NODE:
+               case XML_DOCUMENT_TYPE_NODE:
+               case XML_DTD_NODE:
+               case XML_PI_NODE:
+               case XML_ENTITY_DECL:
+               case XML_ENTITY_REF_NODE:
+               case XML_NOTATION_NODE:
+                       str = (char *) nodep->name;
+                       break;
+               case XML_CDATA_SECTION_NODE:
+                       str = "#cdata-section";
+                       break;
+               case XML_COMMENT_NODE:
+                       str = "#comment";
+                       break;
+               case XML_HTML_DOCUMENT_NODE:
+               case XML_DOCUMENT_NODE:
+                       str = "#document";
+                       break;
+               case XML_DOCUMENT_FRAG_NODE:
+                       str = "#document-fragment";
+                       break;
+               case XML_TEXT_NODE:
+                       str = "#text";
+                       break;
+               case XML_NAMESPACE_DECL:
+                       if (nodep->ns != NULL) {
+                               str = (char *) nodep->ns->prefix;
+                       }
+                       break;
+               default:
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Node Type");
+                       return FAILURE;
+       }
+
+       ALLOC_ZVAL(*retval);
+
+       if(str != NULL) {
+               ZVAL_STRING(*retval, str, 1);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+
+       return SUCCESS;
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto nodeValue string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68D080
+Since: 
+*/
+int dom_node_node_value_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNode *nodep;
+       char *str = NULL;
+
+       nodep = obj->ptr;
+/* TODO: Element node is invalid for this property -
+currently here as a convience method while developing */
+       switch (nodep->type) {
+               case XML_ATTRIBUTE_NODE:
+               case XML_TEXT_NODE:
+               case XML_ELEMENT_NODE:
+               case XML_COMMENT_NODE:
+               case XML_CDATA_SECTION_NODE:
+               case XML_PI_NODE:
+                       str = xmlNodeGetContent(nodep);
+                       break;
+               default:
+                       str = NULL;
+                       break;
+       }
+
+       ALLOC_ZVAL(*retval);
+
+       if(str != NULL) {
+               ZVAL_STRING(*retval, str, 1);
+               xmlFree(str);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+
+
+       return SUCCESS;
+
+}
+
+int dom_node_node_value_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       xmlNode *nodep;
+
+       nodep = obj->ptr;
+
+       switch (nodep->type) {
+               case XML_ATTRIBUTE_NODE:
+                       if (nodep->children) {
+                               node_list_unlink(nodep->children TSRMLS_CC);
+                       }
+               case XML_TEXT_NODE:
+               case XML_COMMENT_NODE:
+               case XML_CDATA_SECTION_NODE:
+               case XML_PI_NODE:
+                       xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
+                       break;
+               default:
+                       break;
+       }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto nodeType  unsigned short  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-111237558
+Since: 
+*/
+int dom_node_node_type_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNode *nodep;
+
+       nodep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       ZVAL_LONG(*retval, nodep->type);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto parentNode        node    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1060184317
+Since: 
+*/
+int dom_node_parent_node_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       zval *wrapper;
+       xmlNode *nodep, *nodeparent;
+       int ret;
+
+       nodep = obj->ptr;
+
+       nodeparent = nodep->parent;
+       if (!nodeparent) {
+               return FAILURE;
+       }
+
+       wrapper = dom_object_get_data(nodeparent);
+       if (wrapper == NULL) {
+               ALLOC_ZVAL(*retval);
+       }
+       if (NULL == (*retval = php_dom_create_object(nodeparent, &ret, wrapper, *retval TSRMLS_CC))) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
+               return FAILURE;
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto childNodes        nodelist        
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1451460987
+Since: 
+*/
+int dom_node_child_nodes_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNodePtr nodep, last;
+       int ret;
+       nodep = obj->ptr;
+
+       if ((nodep->type == XML_DOCUMENT_NODE) || (nodep->type == XML_HTML_DOCUMENT_NODE)) {
+               last = ((xmlDoc *) nodep)->children;
+       } else {
+               last = nodep->children;
+       }
+       MAKE_STD_ZVAL(*retval);
+       array_init(*retval);
+       
+       if (last) {
+               while (last) {
+                       zval *child = NULL;
+                       zval *wrapper;
+                       wrapper = dom_object_get_data(last);
+                       if (wrapper == NULL) {
+                               MAKE_STD_ZVAL(child);
+                       }
+                       child = php_dom_create_object(last, &ret, wrapper, child TSRMLS_CC);
+                       add_next_index_zval(*retval, child);
+                       last = last->next;
+               }
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto firstChild node   
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-169727388
+Since: 
+*/
+int dom_node_first_child_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       zval *wrapper;
+       xmlNode *nodep, *first;
+       int ret;
+
+       nodep = obj->ptr;
+
+
+       first = nodep->children;
+       if (!first) {
+               return FAILURE;
+       }
+
+       wrapper = dom_object_get_data(first);
+       if (wrapper == NULL) {
+               ALLOC_ZVAL(*retval);
+       }
+       if (NULL == (*retval = php_dom_create_object(first, &ret, wrapper, *retval TSRMLS_CC))) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
+               return FAILURE;
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto lastChild node    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-61AD09FB
+Since: 
+*/
+int dom_node_last_child_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       zval *wrapper;
+       xmlNode *nodep, *last;
+       int ret;
+
+       nodep = obj->ptr;
+
+       last = nodep->last;
+       if (!last) {
+               return FAILURE;
+       }
+
+       wrapper = dom_object_get_data(last);
+       if (wrapper == NULL) {
+               ALLOC_ZVAL(*retval);
+       }
+       if (NULL == (*retval = php_dom_create_object(last, &ret, wrapper, *retval TSRMLS_CC))) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
+               return FAILURE;
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto previousSibling   node    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-640FB3C8
+Since: 
+*/
+int dom_node_previous_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       zval *wrapper;
+       xmlNode *nodep, *prevsib;
+       int ret;
+
+       nodep = obj->ptr;
+
+       prevsib = nodep->prev;
+       if (!prevsib) {
+               return FAILURE;
+       }
+
+       wrapper = dom_object_get_data(prevsib);
+       if (wrapper == NULL) {
+               ALLOC_ZVAL(*retval);
+       }
+       if (NULL == (*retval = php_dom_create_object(prevsib, &ret, wrapper, *retval TSRMLS_CC))) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
+               return FAILURE;
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto nextSibling       node    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6AC54C2F
+Since: 
+*/
+int dom_node_next_sibling_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       zval *wrapper;
+       xmlNode *nodep, *nextsib;
+       int ret;
+
+       nodep = obj->ptr;
+
+       nextsib = nodep->next;
+       if (!nextsib) {
+               return FAILURE;
+       }
+
+       wrapper = dom_object_get_data(nextsib);
+       if (wrapper == NULL) {
+               ALLOC_ZVAL(*retval);
+       }
+       if (NULL == (*retval = php_dom_create_object(nextsib, &ret, wrapper, *retval TSRMLS_CC))) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
+               return FAILURE;
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto attributes        namednodemap    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-84CF096
+Since: 
+*/
+int dom_node_attributes_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNodePtr nodep;
+       xmlAttr *attr;
+
+       int ret;
+       nodep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+
+       if (nodep->type == XML_ELEMENT_NODE) {
+               attr = nodep->properties;
+               array_init(*retval);
+       
+               while (attr) {
+                       zval *curattr = NULL;
+                       zval *wrapper;
+                       wrapper = dom_object_get_data((xmlNodePtr) attr);
+                       if (wrapper == NULL) {
+                               MAKE_STD_ZVAL(curattr);
+                       }
+                       curattr = php_dom_create_object((xmlNodePtr) attr, &ret, wrapper, curattr TSRMLS_CC);
+                       add_assoc_zval(*retval, (char *) attr->name, curattr);
+                       attr = attr->next;
+               }
+        } else {
+               ZVAL_NULL(*retval);
+        }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto ownerDocument     dom_document    
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-node-ownerDoc
+Since: 
+*/
+int dom_node_owner_document_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       zval *wrapper;
+       xmlNode *nodep;
+       xmlDocPtr docp;
+       int ret;
+
+       nodep = obj->ptr;
+
+       if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
+               ALLOC_ZVAL(*retval);
+               ZVAL_NULL(*retval);
+               return SUCCESS;
+       }
+
+       docp = nodep->doc;
+       if (!docp) {
+               return FAILURE;
+       }
+
+       wrapper = dom_object_get_data((xmlNodePtr) docp);
+       if (wrapper == NULL) {
+               ALLOC_ZVAL(*retval);
+       }
+       if (NULL == (*retval = php_dom_create_object((xmlNodePtr) docp, &ret, wrapper, *retval TSRMLS_CC))) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
+               return FAILURE;
+       }
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto namespaceUri      string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSname
+Since: DOM Level 2
+*/
+int dom_node_namespace_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNode *nodep;
+       char *str = NULL;
+
+       nodep = obj->ptr;
+
+       switch (nodep->type) {
+               case XML_ELEMENT_NODE:
+               case XML_ATTRIBUTE_NODE:
+                       if (nodep->ns != NULL) {
+                               str = (char *) nodep->ns->href;
+                       }
+                       break;
+               default:
+                       str = NULL;
+                       break;
+       }
+
+       ALLOC_ZVAL(*retval);
+
+       if(str != NULL) {
+               ZVAL_STRING(*retval, str, 1);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto prefix    string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSPrefix
+Since: DOM Level 2
+*/
+int dom_node_prefix_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNode *nodep;
+       xmlNsPtr ns;
+       char *str = NULL;
+
+       nodep = obj->ptr;
+
+       switch (nodep->type) {
+               case XML_ELEMENT_NODE:
+               case XML_ATTRIBUTE_NODE:
+                       ns = nodep->ns;
+                       if (ns != NULL) {
+                               if (ns->prefix) {
+                                       str = (char *) ns->prefix;
+                               }
+                       }
+                       break;
+               default:
+                       str = NULL;
+                       break;
+       }
+
+       ALLOC_ZVAL(*retval);
+
+       if (str == NULL) {
+               ZVAL_EMPTY_STRING(*retval);
+       } else {
+               ZVAL_STRING(*retval, str, 1);
+       }
+       return SUCCESS;
+
+}
+
+int dom_node_prefix_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       xmlNode *nodep;
+       xmlDocPtr doc;
+       xmlNsPtr ns, curns = NULL;
+       char *strURI;
+       char *prefix;
+
+       nodep = obj->ptr;
+
+       switch (nodep->type) {
+               case XML_ELEMENT_NODE:
+               case XML_ATTRIBUTE_NODE:
+                       ns = nodep->ns;
+                       strURI = NULL;
+                       if (nodep->ns != NULL) {
+                               strURI = (char *) nodep->ns->href;
+                       }
+                       prefix = Z_STRVAL_P(newval);
+                       if (strURI == NULL || 
+                               (!strcmp (prefix, "xml") && strcmp(strURI, XML_XML_NAMESPACE)) ||
+                               (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (prefix, "xmlns") &&
+                                strcmp (strURI, DOM_XMLNS_NAMESPACE)) ||
+                               (nodep->type == XML_ATTRIBUTE_NODE && !strcmp (nodep->name, "xmlns"))) {
+
+                               /* TODO: throw error - find out how to without a return_value
+                               php_dom_throw_error(NAMESPACE_ERR, &return_value TSRMLS_CC); */
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Namespace");
+                               return FAILURE; 
+                       }
+                       ns = xmlNewNs(NULL, nodep->ns->href, (xmlChar *)prefix);
+                       if (nodep->doc != NULL) {
+                               doc = nodep->doc;
+                               if (doc->oldNs == NULL) {
+                                       doc->oldNs = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
+                                       memset(doc->oldNs, 0, sizeof(xmlNs));
+                                       doc->oldNs->type = XML_LOCAL_NAMESPACE;
+                                       doc->oldNs->href = xmlStrdup(XML_XML_NAMESPACE); 
+                                       doc->oldNs->prefix = xmlStrdup((const xmlChar *)"xml"); 
+                               }
+
+                               curns = doc->oldNs;
+                               while (curns->next != NULL) {
+                                       curns = curns->next;
+                               }
+                               curns->next = ns;
+                       }
+
+                       nodep->ns = curns;
+                       break;
+               default:
+                       break;
+       }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto localName string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeNSLocalN
+Since: DOM Level 2
+*/
+int dom_node_local_name_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNode *nodep;
+       nodep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+
+       if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE) {
+               ZVAL_STRING(*retval, (char *) (nodep->name), 1);
+       } else {
+               ZVAL_NULL(*retval);
+       }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto baseURI   string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-baseURI
+Since: DOM Level 3
+*/
+int dom_node_base_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       /* TODO: Implement this feature */
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto textContent       string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-textContent
+Since: DOM Level 3
+*/
+int dom_node_text_content_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNode *nodep;
+       char *str = NULL;
+
+       nodep = obj->ptr;
+
+       str = xmlNodeGetContent(nodep);
+
+       ALLOC_ZVAL(*retval);
+
+       if(str != NULL) {
+               ZVAL_STRING(*retval, str, 1);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+       xmlFree(str);
+
+       return SUCCESS;
+}
+
+int dom_node_text_content_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+
+/* {{{ proto domnode dom_node_insert_before(node newChild, node refChild);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727
+Since: 
+*/
+PHP_FUNCTION(dom_node_insert_before)
+{
+       zval *id, *node, *ref, *rv = NULL;
+       xmlNodePtr child, new_child, parentp, refp;
+       int ret;
+
+       DOM_GET_THIS_OBJ(parentp, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oo!", &node, &ref) == FAILURE) {
+               return;
+       }
+
+       DOM_GET_OBJ(child, node, xmlNodePtr);
+
+       new_child = NULL;
+
+       if (dom_hierarchy(parentp, child) == FAILURE) {
+               php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
+       }
+       
+       if (child->doc != parentp->doc && child->doc != NULL) {
+               php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as it was created from a different document");
+               RETURN_FALSE;
+       }
+
+       if (ref != NULL) {
+               DOM_GET_OBJ(refp, ref, xmlNodePtr);
+               if (refp->parent != parentp) {
+                       php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as refnode is not child of node");
+                       RETURN_FALSE;
+               }
+
+               if (child->parent != NULL) {
+                       xmlUnlinkNode(child);
+               }
+
+               if (child->type == XML_TEXT_NODE) {
+                       if (refp->type == XML_TEXT_NODE) {
+                               xmlChar *tmp;
+
+                               tmp = xmlStrdup(child->content);
+                               tmp = xmlStrcat(tmp, refp->content);
+                               xmlNodeSetContent(refp, tmp);
+                               xmlFree(tmp);
+                               node_free_resource(child TSRMLS_CC);
+                               DOM_RET_OBJ(rv, refp, &ret);
+                               return;
+                       }
+                       if ((refp->prev != NULL) && (refp->prev->type == XML_TEXT_NODE)
+                               && (refp->name == refp->prev->name)) {
+                               xmlNodeAddContent(refp->prev, child->content);
+                               node_free_resource(child TSRMLS_CC);
+                               DOM_RET_OBJ(rv, refp->prev, &ret);
+                               return;
+                       }
+               } else if (child->type == XML_ATTRIBUTE_NODE) {
+                       xmlAttrPtr lastattr;
+
+                       if (child->ns == NULL)
+                               lastattr = xmlHasProp(refp->parent, child->name);
+                       else
+                               lastattr = xmlHasNsProp(refp->parent, child->name, child->ns->href);
+                       if (lastattr != NULL) {
+                               if (lastattr != (xmlAttrPtr) child) {
+                                       xmlUnlinkNode((xmlNodePtr) lastattr);
+                                       node_free_resource((xmlNodePtr) lastattr TSRMLS_CC);
+                                       xmlFreeProp(lastattr);
+                               } else {
+                                       DOM_RET_OBJ(rv, child, &ret);
+                                       return;
+                               }
+                       }
+
+               }
+               new_child = xmlAddPrevSibling(refp, child);
+       } else {
+               if (child->parent == parentp){
+                       xmlUnlinkNode(child);
+               }
+               if (child->type == XML_TEXT_NODE) {
+                       if ((parentp->type == XML_TEXT_NODE) &&
+                       (parentp->content != NULL) &&
+                       (parentp != child)) {
+                               xmlNodeAddContent(parentp, child->content);
+                               node_free_resource(child TSRMLS_CC);
+                               DOM_RET_OBJ(rv, parentp, &ret);
+                               return;
+                       }
+                       if ((parentp->last != NULL) && (parentp->last->type == XML_TEXT_NODE) &&
+                       (parentp->last->name == child->name) &&
+                       (parentp->last != child)) {
+                               xmlNodeAddContent(parentp->last, child->content);
+                               node_free_resource(child TSRMLS_CC);
+                               DOM_RET_OBJ(rv, parentp->last, &ret);
+                               return;
+                       }
+               } else  if (child->type == XML_ATTRIBUTE_NODE) {
+                       xmlAttrPtr lastattr;
+
+                       if (child->ns == NULL)
+                               lastattr = xmlHasProp(parentp, child->name);
+                       else
+                               lastattr = xmlHasNsProp(parentp, child->name, child->ns->href);
+                       if (lastattr != NULL) {
+                               if (lastattr != (xmlAttrPtr) child) {
+                                       xmlUnlinkNode((xmlNodePtr) lastattr);
+                                       node_free_resource((xmlNodePtr) lastattr TSRMLS_CC);
+                                       xmlFreeProp(lastattr);
+                               } else {
+                                       DOM_RET_OBJ(rv, child, &ret);
+                                       return;
+                               }
+                       }
+               } else  if (child->type == XML_DOCUMENT_FRAG_NODE) {
+                       new_child = xmlAddChildList(parentp, child->children);
+                       if (new_child != NULL) {
+                               child->children = NULL;
+                       }
+                       dom_add_to_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
+                       DOM_RET_OBJ(rv, new_child, &ret);
+                       return;
+               }
+               new_child = xmlAddChild(parentp, child);
+       }
+
+       if (NULL == new_child) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as the previous sibling of refnode");
+               RETURN_FALSE;
+       }
+
+       dom_del_from_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
+
+       DOM_RET_OBJ(rv, new_child, &ret);
+
+}
+/* }}} end dom_node_insert_before */
+
+
+/* {{{ proto domnode dom_node_replace_child(node newChild, node oldChild);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-785887307
+Since: 
+*/
+PHP_FUNCTION(dom_node_replace_child)
+{
+       zval *id, *newnode, *oldnode;
+       xmlNodePtr children, newchild, oldchild, nodep;
+       int foundoldchild = 0;
+       int ret;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oo", &newnode, &oldnode) == FAILURE) {
+               return;
+       }
+
+       DOM_GET_OBJ(newchild, newnode, xmlNodePtr);
+       DOM_GET_OBJ(oldchild, oldnode, xmlNodePtr);
+
+       children = nodep->children;
+       if (!children) {
+               RETURN_FALSE;
+       }
+
+       if (newchild->doc != nodep->doc && newchild->doc != NULL) {
+               php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't add newnode as it was created from a different document");
+               RETURN_FALSE;
+       }
+
+       if (dom_hierarchy(nodep, newchild) == FAILURE) {
+               php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
+       }
+
+       /* check for the old child and wether the new child is already a child */
+       while (children) {
+               if (children == oldchild) {
+                       foundoldchild = 1;
+                       break;
+               }
+               children = children->next;
+       }
+
+       if (foundoldchild) {
+               zval *rv = NULL;
+               if (oldchild != newchild) {
+                       xmlNodePtr node;
+                       if (newchild->parent == NULL && newchild->doc != NULL) {
+                               dom_del_from_list(newchild, (xmlDocPtr) newchild->doc TSRMLS_CC);
+                       }
+                       if((node = xmlReplaceNode(oldchild, newchild)) != NULL) {
+                               dom_add_to_list(node, (xmlDocPtr) node->doc TSRMLS_CC);
+                       }
+               }
+               DOM_RET_OBJ(rv, oldchild, &ret);
+               return;
+       } else {
+               php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
+               RETURN_FALSE;
+       }
+
+}
+/* }}} end dom_node_replace_child */
+
+
+/* {{{ proto domnode dom_node_remove_child(node oldChild);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1734834066
+Since: 
+*/
+PHP_FUNCTION(dom_node_remove_child)
+{
+       zval *id, *node;
+       xmlNodePtr children, child, nodep;
+       int ret;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) {
+               return;
+       }
+
+       DOM_GET_OBJ(child, node, xmlNodePtr);
+
+       children = nodep->children;
+       if (!children) {
+               php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
+               RETURN_FALSE;
+       }
+
+       while (children) {
+               if (children == child) {
+                       zval *rv = NULL;
+                       xmlUnlinkNode(child);
+                       dom_add_to_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
+                       DOM_RET_OBJ(rv, child, &ret);
+                       return;
+               }
+               children = children->next;
+       }
+
+       php_dom_throw_error(NOT_FOUND_ERR, &return_value TSRMLS_CC);
+       RETURN_FALSE
+}
+/* }}} end dom_node_remove_child */
+
+
+/* {{{ proto domnode dom_node_append_child(node newChild);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-184E7107
+Since: 
+*/
+PHP_FUNCTION(dom_node_append_child)
+{
+       zval *id, *node, *rv = NULL;
+       xmlNodePtr child, nodep, new_child = NULL;
+       int ret;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) {
+               return;
+       }
+
+       DOM_GET_OBJ(child, node, xmlNodePtr);
+
+       if (dom_hierarchy(nodep, child) == FAILURE) {
+               php_dom_throw_error(HIERARCHY_REQUEST_ERR, &return_value TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hierarchy Request Error");
+       }
+
+       if (!(child->doc == NULL || child->doc == nodep->doc)) {
+               php_dom_throw_error(WRONG_DOCUMENT_ERR, &return_value TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't append node, which is in a different document than the parent node");
+               RETURN_FALSE;
+       }
+
+       if (child->parent != NULL){
+               xmlUnlinkNode(child);
+       }
+
+       if (child->type == XML_TEXT_NODE) {
+               if ((nodep->type == XML_TEXT_NODE) &&
+               (nodep->content != NULL)) {
+                       xmlNodeAddContent(nodep, child->content);
+                       node_free_resource(child TSRMLS_CC);
+                       DOM_RET_OBJ(rv, nodep, &ret);
+                       return;
+               }
+               if ((nodep->last != NULL) && (nodep->last->type == XML_TEXT_NODE) &&
+               (nodep->last->name == child->name)) {
+                       xmlNodeAddContent(nodep->last, child->content);
+                       node_free_resource(child TSRMLS_CC);
+                       DOM_RET_OBJ(rv, nodep->last, &ret);
+                       return;
+               }
+       } else  if (child->type == XML_ATTRIBUTE_NODE) {
+               xmlAttrPtr lastattr;
+
+               if (child->ns == NULL)
+                       lastattr = xmlHasProp(nodep, child->name);
+               else
+                       lastattr = xmlHasNsProp(nodep, child->name, child->ns->href);
+               if (lastattr != NULL) {
+                       if (lastattr != (xmlAttrPtr) child) {
+                               xmlUnlinkNode((xmlNodePtr) lastattr);
+                               node_free_resource((xmlNodePtr) lastattr TSRMLS_CC);
+                               xmlFreeProp(lastattr);
+                       }
+               }
+       } else  if (child->type == XML_DOCUMENT_FRAG_NODE) {
+               new_child = xmlAddChildList(nodep, child->children);
+               if (new_child != NULL) {
+                       child->children = NULL;
+               }
+               dom_add_to_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
+               DOM_RET_OBJ(rv, new_child, &ret);
+               return;
+       }
+
+       new_child = xmlAddChild(nodep, child);
+
+       if (new_child == NULL) {
+               dom_add_to_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't append node");
+               RETURN_FALSE;
+       }
+
+       dom_del_from_list(child, (xmlDocPtr) child->doc TSRMLS_CC);
+
+       DOM_RET_OBJ(rv, new_child, &ret);
+}
+/* }}} end dom_node_append_child */
+
+
+/* {{{ proto boolean dom_node_has_child_nodes();
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-810594187
+Since: 
+*/
+PHP_FUNCTION(dom_node_has_child_nodes)
+{
+       zval *id;
+       xmlNode *nodep;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       DOM_NO_ARGS();
+
+       if (nodep->children) {
+               RETURN_TRUE;
+       } else {
+               RETURN_FALSE;
+       }
+}
+/* }}} end dom_node_has_child_nodes */
+
+
+/* {{{ proto domnode dom_node_clone_node(boolean deep);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-3A0ED0A4
+Since: 
+*/
+PHP_FUNCTION(dom_node_clone_node)
+{
+       zval *rv = NULL;
+       zval *id;
+       xmlNode *n, *node;
+       int ret; 
+       long recursive = 0;
+
+       DOM_GET_THIS_OBJ(n, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &recursive) == FAILURE) {
+               return;
+       }
+
+       node = xmlCopyNode(n, recursive);
+       if (!node) {
+               RETURN_FALSE;
+       }
+       dom_add_to_list(node, (xmlDocPtr) node->doc TSRMLS_CC);
+
+       DOM_RET_OBJ(rv, node, &ret);
+}
+/* }}} end dom_node_clone_node */
+
+
+
+/* {{{ proto dom_void dom_node_normalize();
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-normalize
+Since: 
+*/
+PHP_FUNCTION(dom_node_normalize)
+{
+       zval *id;
+       xmlNode *nodep;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       DOM_NO_ARGS();
+
+       dom_normalize(nodep TSRMLS_CC);
+
+}
+/* }}} end dom_node_normalize */
+
+
+/* {{{ proto boolean dom_node_is_supported(string feature, string version);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-Node-supports
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_node_is_supported)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_node_is_supported */
+
+
+/* {{{ proto boolean dom_node_has_attributes();
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeHasAttrs
+Since: DOM Level 2
+*/
+PHP_FUNCTION(dom_node_has_attributes)
+{
+       zval *id;
+       xmlNode *nodep;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       DOM_NO_ARGS();
+
+       if (nodep->type != XML_ELEMENT_NODE)
+               RETURN_FALSE;
+
+       if (nodep->properties) {
+               RETURN_TRUE;
+       } else {
+               RETURN_FALSE;
+       }
+}
+/* }}} end dom_node_has_attributes */
+
+
+/* {{{ proto unsigned short dom_node_compare_document_position(node other);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-compareDocumentPosition
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_node_compare_document_position)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_node_compare_document_position */
+
+
+/* {{{ proto boolean dom_node_is_same_node(node other);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isSameNode
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_node_is_same_node)
+{
+       zval *id, *node;
+       xmlNodePtr nodeotherp, nodep;
+
+       DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) {
+               return;
+       }
+
+       DOM_GET_OBJ(nodeotherp, node, xmlNodePtr);
+
+       if (nodep == nodeotherp) {
+               RETURN_TRUE;
+       } else {
+               RETURN_FALSE;
+       }
+}
+/* }}} end dom_node_is_same_node */
+
+
+/* {{{ proto domstring dom_node_lookup_prefix(string namespaceURI);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-lookupNamespacePrefix
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_node_lookup_prefix)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_node_lookup_prefix */
+
+
+/* {{{ proto boolean dom_node_is_default_namespace(string namespaceURI);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isDefaultNamespace
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_node_is_default_namespace)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_node_is_default_namespace */
+
+
+/* {{{ proto domstring dom_node_lookup_namespace_uri(string prefix);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-lookupNamespaceURI
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_node_lookup_namespace_uri)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_node_lookup_namespace_uri */
+
+
+/* {{{ proto boolean dom_node_is_equal_node(node arg);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isEqualNode
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_node_is_equal_node)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_node_is_equal_node */
+
+
+/* {{{ proto domnode dom_node_get_feature(string feature, string version);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getFeature
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_node_get_feature)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_node_get_feature */
+
+
+/* {{{ proto domuserdata dom_node_set_user_data(string key, domuserdata data, userdatahandler handler);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-setUserData
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_node_set_user_data)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_node_set_user_data */
+
+
+/* {{{ proto domuserdata dom_node_get_user_data(string key);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getUserData
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_node_get_user_data)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_node_get_user_data */
diff --git a/ext/dom/nodelist.c b/ext/dom/nodelist.c
new file mode 100644 (file)
index 0000000..e4f1955
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domnodelist 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-536297177
+* Since: 
+*/
+
+zend_function_entry php_dom_nodelist_class_functions[] = {
+       PHP_FALIAS(item, dom_nodelist_item, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto length    unsigned long   
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-203510337
+Since: 
+*/
+int dom_nodelist_length_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, "TEST", 1);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+
+/* {{{ proto domnode dom_nodelist_item(unsigned long index);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-844377136
+Since: 
+*/
+PHP_FUNCTION(dom_nodelist_item)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_nodelist_item */
diff --git a/ext/dom/notation.c b/ext/dom/notation.c
new file mode 100644 (file)
index 0000000..4cd8fc9
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domnotation extends domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-5431D1B9
+* Since: 
+*/
+
+zend_function_entry php_dom_notation_class_functions[] = {
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto public_id string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-54F2B4D0
+Since: 
+*/
+int dom_notation_public_id_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNotationPtr nodep;
+
+       nodep = obj->ptr;
+       ALLOC_ZVAL(*retval);
+       if (nodep->PublicID) {
+               ZVAL_STRING(*retval, (char *) (nodep->PublicID), 1);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto system_id string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-E8AAB1D0
+Since: 
+*/
+int dom_notation_system_id_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNotationPtr nodep;
+
+       nodep = obj->ptr;
+       ALLOC_ZVAL(*retval);
+       if (nodep->SystemID) {
+               ZVAL_STRING(*retval, (char *) (nodep->PublicID), 1);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
new file mode 100644 (file)
index 0000000..c78c6c2
--- /dev/null
@@ -0,0 +1,1144 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | Authors: Christian Stocker <chregu@php.net>                          |
+   |          Rob Richards <rrichards@php.net>                                                   |
+   |          Marcus Borger <helly@php.net>                               |
+   +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#include "ext/standard/php_rand.h"
+#include "php_dom.h"
+#include "dom_ce.h"
+#include "dom_properties.h"
+
+#if HAVE_DOM
+
+#include "zend_execute_locks.h"
+#include "ext/standard/info.h"
+#define PHP_XPATH 1
+#define PHP_XPTR 2
+
+zend_object_handlers dom_object_handlers;
+
+static HashTable classes;
+
+static HashTable dom_domstringlist_prop_handlers;
+static HashTable dom_namelist_prop_handlers;
+static HashTable dom_domimplementationlist_prop_handlers;
+static HashTable dom_document_prop_handlers;
+static HashTable dom_node_prop_handlers;
+static HashTable dom_nodelist_prop_handlers;
+static HashTable dom_namednodemap_prop_handlers;
+static HashTable dom_characterdata_prop_handlers;
+static HashTable dom_attr_prop_handlers;
+static HashTable dom_element_prop_handlers;
+static HashTable dom_text_prop_handlers;
+static HashTable dom_typeinfo_prop_handlers;
+static HashTable dom_domerror_prop_handlers;
+static HashTable dom_domlocator_prop_handlers;
+static HashTable dom_documenttype_prop_handlers;
+static HashTable dom_notation_prop_handlers;
+static HashTable dom_entity_prop_handlers;
+static HashTable dom_processinginstruction_prop_handlers;
+
+
+typedef int (*dom_read_t)(dom_object *obj, zval **retval TSRMLS_DC);
+typedef int (*dom_write_t)(dom_object *obj, zval *newval TSRMLS_DC);
+
+typedef struct _dom_prop_handler {
+       dom_read_t read_func;
+       dom_write_t write_func;
+} dom_prop_handler;
+
+static zend_function_entry dom_functions[] = {
+       {NULL, NULL, NULL}
+};
+
+/* {{{ dom_object_set_data */
+static void dom_object_set_data(xmlNodePtr obj, zval *wrapper TSRMLS_DC)
+{
+
+       obj->_private = wrapper;
+}
+/* }}} */
+
+/* {{{ dom_object_get_data */
+zval *dom_object_get_data(xmlNodePtr obj)
+{
+       return (zval *) obj->_private;
+}
+/* }}} */
+
+/* {{{ php_dom_clear_object */
+static void php_dom_clear_object(zval *wrapper TSRMLS_DC)
+{
+       dom_object *object;
+
+       object = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC);
+       object->ptr = NULL;
+}
+/* }}} */
+
+/* {{{ php_dom_set_object */
+void php_dom_set_object(zval *wrapper, void *obj TSRMLS_DC)
+{
+       dom_object *object;
+
+       object = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC);
+       object->ptr = obj;
+       dom_object_set_data(obj, wrapper TSRMLS_CC);
+}
+/* }}} */
+
+/* {{{ dom_unregister_node */
+void dom_unregister_node(xmlNodePtr nodep TSRMLS_DC)
+{
+       zval *wrapper;
+
+       wrapper = dom_object_get_data(nodep);
+       if (wrapper != NULL ) {
+               if (nodep->parent == NULL && nodep->doc != NULL && (xmlNodePtr) nodep->doc != nodep) {
+                       dom_del_from_list(nodep, (xmlDocPtr) nodep->doc TSRMLS_CC);
+               }
+               dom_object_set_data(nodep, NULL TSRMLS_CC);
+               php_dom_clear_object(wrapper TSRMLS_CC);
+       }
+}
+/* }}} */
+
+/* {{{ dom_del_from_list */
+void dom_del_from_list(xmlNodePtr nodep, xmlDocPtr docp TSRMLS_DC)
+{
+       zval *wrapper;
+       dom_object *object;
+       xmlNodePtr cur;
+       node_list_pointer *cur_element, *prev;
+
+       if (docp != NULL && nodep != NULL) {
+               wrapper = dom_object_get_data((xmlNodePtr) docp);
+
+               if (wrapper != NULL) {
+                       object = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC);
+                       cur_element = object->node_list;
+                       prev = NULL;
+                       while (cur_element != NULL) {
+                               cur = cur_element->nodep;
+                               if (cur == nodep) {
+                                       if (prev == NULL) {
+                                               object->node_list = cur_element->next;
+                                       } else {
+                                               prev->next = cur_element->next;
+                                       }
+                                       efree(cur_element);
+                                       return;
+                               } else {
+                                       prev = cur_element;
+                                       cur_element = cur_element->next;
+                               }
+                       }
+               }
+       }
+}
+/* }}} */
+
+/* {{{ dom_add_to_list */
+void dom_add_to_list(xmlNodePtr nodep, xmlDocPtr docp TSRMLS_DC)
+{
+       zval *wrapper;
+       dom_object *object;
+       node_list_pointer *cur_element;
+
+       if (docp != NULL && nodep != NULL) {
+               if (nodep->parent == NULL) {
+                       wrapper = dom_object_get_data((xmlNodePtr) docp);
+                       if (wrapper != NULL) {
+                               object = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC);
+                               dom_del_from_list(nodep, docp TSRMLS_CC);
+                               cur_element = emalloc(sizeof(node_list_pointer));
+                               cur_element->nodep = nodep;
+                               cur_element->next = NULL;
+                               if (object->node_list != NULL) {
+                                       cur_element->next = object->node_list;
+                               }
+                               object->node_list = cur_element;
+                       }
+               }
+       }
+}
+/* }}} */
+
+/* {{{ dom_read_na */
+static int dom_read_na(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       *retval = NULL;
+       php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot read property");
+       return FAILURE;
+}
+/* }}} */
+
+/* {{{ dom_write_na */
+static int dom_write_na(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot write property");
+       return FAILURE;
+}
+/* }}} */
+
+/* {{{ dom_register_prop_handler */
+static void dom_register_prop_handler(HashTable *prop_handler, char *name, dom_read_t read_func, dom_write_t write_func TSRMLS_DC)
+{
+       dom_prop_handler hnd;
+       
+       hnd.read_func = read_func ? read_func : dom_read_na;
+       hnd.write_func = write_func ? write_func : dom_write_na;
+       zend_hash_add(prop_handler, name, strlen(name)+1, &hnd, sizeof(dom_prop_handler), NULL);
+}
+/* }}} */
+
+/* {{{ dom_read_property */
+zval *dom_read_property(zval *object, zval *member TSRMLS_DC)
+{
+       dom_object *obj;
+       zval tmp_member;
+       zval *retval;
+       dom_prop_handler *hnd;
+       zend_object_handlers *std_hnd;
+       int ret;
+
+       if (member->type != IS_STRING) {
+               tmp_member = *member;
+               zval_copy_ctor(&tmp_member);
+               convert_to_string(&tmp_member);
+               member = &tmp_member;
+       }
+
+       ret = FAILURE;
+       obj = (dom_object *)zend_objects_get_address(object TSRMLS_CC);
+       if (obj->prop_handler != NULL) {
+               ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
+       }
+       if (ret == SUCCESS) {
+               hnd->read_func(obj, &retval TSRMLS_CC);
+               if (retval) {
+                       /* ensure we're creating a temporary variable */
+                       retval->refcount = 1;
+                       PZVAL_UNLOCK(retval);
+               } else {
+                       retval = EG(uninitialized_zval_ptr);
+               }
+       } else {
+               std_hnd = zend_get_std_object_handlers();
+               retval = std_hnd->read_property(object, member TSRMLS_CC);
+       }
+       if (member == &tmp_member) {
+               zval_dtor(member);
+       }
+       return retval;
+}
+/* }}} */
+
+/* {{{ dom_write_property */
+void dom_write_property(zval *object, zval *member, zval *value TSRMLS_DC)
+{
+       dom_object *obj;
+       zval tmp_member;
+       dom_prop_handler *hnd;
+       zend_object_handlers *std_hnd;
+       int ret;
+
+       if (member->type != IS_STRING) {
+               tmp_member = *member;
+               zval_copy_ctor(&tmp_member);
+               convert_to_string(&tmp_member);
+               member = &tmp_member;
+       }
+
+       ret = FAILURE;
+       obj = (dom_object *)zend_objects_get_address(object TSRMLS_CC);
+
+       if (obj->prop_handler != NULL) {
+               ret = zend_hash_find((HashTable *)obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
+       }
+       if (ret == SUCCESS) {
+               hnd->write_func(obj, value TSRMLS_CC);
+       } else {
+               std_hnd = zend_get_std_object_handlers();
+               std_hnd->write_property(object, member, value TSRMLS_CC);
+       }
+       if (member == &tmp_member) {
+               zval_dtor(member);
+       }
+}
+/* }}} */
+
+zend_module_entry dom_module_entry = {
+       STANDARD_MODULE_HEADER,
+       "dom",
+       dom_functions,
+       PHP_MINIT(dom),
+       PHP_MSHUTDOWN(dom),
+       NULL,
+       NULL,
+       PHP_MINFO(dom),
+       DOM_API_VERSION, /* Extension versionnumber */
+       STANDARD_MODULE_PROPERTIES
+};
+
+#ifdef COMPILE_DL_DOM
+ZEND_GET_MODULE(dom)
+#endif
+
+/* {{{ PHP_MINIT_FUNCTION(dom) */
+PHP_MINIT_FUNCTION(dom)
+{
+       zend_class_entry ce;
+
+       memcpy(&dom_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+       dom_object_handlers.read_property = dom_read_property;
+       dom_object_handlers.write_property = dom_write_property;
+
+       zend_hash_init(&classes, 0, NULL, NULL, 1);
+
+       REGISTER_DOM_CLASS(ce, "domexception", NULL, php_dom_domexception_class_functions, dom_domexception_class_entry);
+       REGISTER_DOM_CLASS(ce, "domstringlist", NULL, php_dom_domstringlist_class_functions, dom_domstringlist_class_entry);
+       
+       zend_hash_init(&dom_domstringlist_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_domstringlist_prop_handlers, "length", dom_domstringlist_length_read, NULL TSRMLS_CC);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_domstringlist_prop_handlers, sizeof(dom_domstringlist_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domnamelist", NULL, php_dom_namelist_class_functions, dom_namelist_class_entry);
+       
+       zend_hash_init(&dom_namelist_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_namelist_prop_handlers, "length", dom_namelist_length_read, NULL TSRMLS_CC);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_namelist_prop_handlers, sizeof(dom_namelist_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domimplementationlist", NULL, php_dom_domimplementationlist_class_functions, dom_domimplementationlist_class_entry);
+       
+       zend_hash_init(&dom_domimplementationlist_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_domimplementationlist_prop_handlers, "length", dom_domimplementationlist_length_read, NULL TSRMLS_CC);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_domimplementationlist_prop_handlers, sizeof(dom_domimplementationlist_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domimplementationsource", NULL, php_dom_domimplementationsource_class_functions, dom_domimplementationsource_class_entry);
+       REGISTER_DOM_CLASS(ce, "domimplementation", NULL, php_dom_domimplementation_class_functions, dom_domimplementation_class_entry);
+
+       REGISTER_DOM_CLASS(ce, "domnode", NULL, php_dom_node_class_functions, dom_node_class_entry);
+       
+       zend_hash_init(&dom_node_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_node_prop_handlers, "nodeName", dom_node_node_name_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "nodeValue", dom_node_node_value_read, dom_node_node_value_write TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "nodeType", dom_node_node_type_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "parentNode", dom_node_parent_node_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "childNodes", dom_node_child_nodes_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "firstChild", dom_node_first_child_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "lastChild", dom_node_last_child_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "previousSibling", dom_node_previous_sibling_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "nextSibling", dom_node_next_sibling_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "attributes", dom_node_attributes_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "ownerDocument", dom_node_owner_document_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "namespaceURI", dom_node_namespace_uri_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "prefix", dom_node_prefix_read, dom_node_prefix_write TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "localName", dom_node_local_name_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "baseURI", dom_node_base_uri_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_node_prop_handlers, "textContent", dom_node_text_content_read, dom_node_text_content_write TSRMLS_CC);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_node_prop_handlers, sizeof(dom_node_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domdocumentfragment", dom_node_class_entry, php_dom_documentfragment_class_functions, dom_documentfragment_class_entry);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_node_prop_handlers, sizeof(dom_node_prop_handlers), NULL);
+       
+       REGISTER_DOM_CLASS(ce, "domdocument", dom_node_class_entry, php_dom_document_class_functions, dom_document_class_entry);
+       zend_hash_init(&dom_document_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_document_prop_handlers, "doctype", dom_document_doctype_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_document_prop_handlers, "implementation", dom_document_implementation_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_document_prop_handlers, "documentElement", dom_document_document_element_read, NULL TSRMLS_CC);
+/* actualEncoding currently set as read only alias to encoding
+       dom_register_prop_handler(&dom_document_prop_handlers, "actualEncoding", dom_document_actual_encoding_read, dom_document_actual_encoding_write TSRMLS_CC); */
+       dom_register_prop_handler(&dom_document_prop_handlers, "actualEncoding", dom_document_encoding_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_document_prop_handlers, "encoding", dom_document_encoding_read, dom_document_encoding_write TSRMLS_CC);
+       dom_register_prop_handler(&dom_document_prop_handlers, "standalone", dom_document_standalone_read, dom_document_standalone_write TSRMLS_CC);
+       dom_register_prop_handler(&dom_document_prop_handlers, "version", dom_document_version_read, dom_document_version_write TSRMLS_CC);
+       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);
+       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);
+
+       REGISTER_DOM_CLASS(ce, "domnodelist", NULL, php_dom_nodelist_class_functions, dom_nodelist_class_entry);
+       
+       zend_hash_init(&dom_nodelist_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_nodelist_prop_handlers, "length", dom_nodelist_length_read, NULL TSRMLS_CC);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_nodelist_prop_handlers, sizeof(dom_nodelist_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domnamednodemap", NULL, php_dom_namednodemap_class_functions, dom_namednodemap_class_entry);
+       
+       zend_hash_init(&dom_namednodemap_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_namednodemap_prop_handlers, "length", dom_namednodemap_length_read, NULL TSRMLS_CC);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_namednodemap_prop_handlers, sizeof(dom_namednodemap_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domcharacterdata", dom_node_class_entry, php_dom_characterdata_class_functions, dom_characterdata_class_entry);
+       
+       zend_hash_init(&dom_characterdata_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_characterdata_prop_handlers, "data", dom_characterdata_data_read, dom_characterdata_data_write TSRMLS_CC);
+       dom_register_prop_handler(&dom_characterdata_prop_handlers, "length", dom_characterdata_length_read, NULL TSRMLS_CC);
+       zend_hash_merge(&dom_characterdata_prop_handlers, &dom_node_prop_handlers, NULL, NULL, sizeof(dom_prop_handler), 0);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_characterdata_prop_handlers, sizeof(dom_characterdata_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domattr", dom_node_class_entry, php_dom_attr_class_functions, dom_attr_class_entry);
+       
+       zend_hash_init(&dom_attr_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_attr_prop_handlers, "name", dom_attr_name_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_attr_prop_handlers, "specified", dom_attr_specified_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_attr_prop_handlers, "value", dom_attr_value_read, dom_attr_value_write TSRMLS_CC);
+       dom_register_prop_handler(&dom_attr_prop_handlers, "ownerElement", dom_attr_owner_element_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_attr_prop_handlers, "schemaTypeInfo", dom_attr_schema_type_info_read, NULL TSRMLS_CC);
+       zend_hash_merge(&dom_attr_prop_handlers, &dom_node_prop_handlers, NULL, NULL, sizeof(dom_prop_handler), 0);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_attr_prop_handlers, sizeof(dom_attr_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domelement", dom_node_class_entry, php_dom_element_class_functions, dom_element_class_entry);
+       
+       zend_hash_init(&dom_element_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_element_prop_handlers, "tagName", dom_element_tag_name_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_element_prop_handlers, "schemaTypeInfo", dom_element_schema_type_info_read, NULL TSRMLS_CC);
+       zend_hash_merge(&dom_element_prop_handlers, &dom_node_prop_handlers, NULL, NULL, sizeof(dom_prop_handler), 0);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_element_prop_handlers, sizeof(dom_element_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domtext", dom_characterdata_class_entry, php_dom_text_class_functions, dom_text_class_entry);
+       
+       zend_hash_init(&dom_text_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_text_prop_handlers, "whole_text", dom_text_whole_text_read, NULL TSRMLS_CC);
+       zend_hash_merge(&dom_text_prop_handlers, &dom_characterdata_prop_handlers, NULL, NULL, sizeof(dom_prop_handler), 0);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_text_prop_handlers, sizeof(dom_text_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domcomment", dom_characterdata_class_entry, php_dom_comment_class_functions, dom_comment_class_entry);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_characterdata_prop_handlers, sizeof(dom_typeinfo_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domtypeinfo", NULL, php_dom_typeinfo_class_functions, dom_typeinfo_class_entry);
+       
+       zend_hash_init(&dom_typeinfo_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_typeinfo_prop_handlers, "typeName", dom_typeinfo_type_name_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_typeinfo_prop_handlers, "typeNamespace", dom_typeinfo_type_namespace_read, NULL TSRMLS_CC);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_typeinfo_prop_handlers, sizeof(dom_typeinfo_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domuserdatahandler", NULL, php_dom_userdatahandler_class_functions, dom_userdatahandler_class_entry);
+       REGISTER_DOM_CLASS(ce, "domdomerror", NULL, php_dom_domerror_class_functions, dom_domerror_class_entry);
+       
+       zend_hash_init(&dom_domerror_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_domerror_prop_handlers, "severity", dom_domerror_severity_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_domerror_prop_handlers, "message", dom_domerror_message_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_domerror_prop_handlers, "type", dom_domerror_type_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_domerror_prop_handlers, "relatedException", dom_domerror_related_exception_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_domerror_prop_handlers, "related_data", dom_domerror_related_data_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_domerror_prop_handlers, "location", dom_domerror_location_read, NULL TSRMLS_CC);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_domerror_prop_handlers, sizeof(dom_domerror_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domdomerrorhandler", NULL, php_dom_domerrorhandler_class_functions, dom_domerrorhandler_class_entry);
+       REGISTER_DOM_CLASS(ce, "domdomlocator", NULL, php_dom_domlocator_class_functions, dom_domlocator_class_entry);
+       
+       zend_hash_init(&dom_domlocator_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_domlocator_prop_handlers, "lineNumber", dom_domlocator_line_number_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_domlocator_prop_handlers, "columnNumber", dom_domlocator_column_number_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_domlocator_prop_handlers, "offset", dom_domlocator_offset_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_domlocator_prop_handlers, "relatedNode", dom_domlocator_related_node_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_domlocator_prop_handlers, "uri", dom_domlocator_uri_read, NULL TSRMLS_CC);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_domlocator_prop_handlers, sizeof(dom_domlocator_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domdomconfiguration", NULL, php_dom_domconfiguration_class_functions, dom_domconfiguration_class_entry);
+       REGISTER_DOM_CLASS(ce, "domcdatasection", dom_text_class_entry, php_dom_cdatasection_class_functions, dom_cdatasection_class_entry);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_text_prop_handlers, sizeof(dom_documenttype_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domdocumenttype", dom_node_class_entry, php_dom_documenttype_class_functions, dom_documenttype_class_entry);
+       
+       zend_hash_init(&dom_documenttype_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_documenttype_prop_handlers, "name", dom_documenttype_name_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_documenttype_prop_handlers, "entities", dom_documenttype_entities_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_documenttype_prop_handlers, "notations", dom_documenttype_notations_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_documenttype_prop_handlers, "publicId", dom_documenttype_public_id_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_documenttype_prop_handlers, "systemId", dom_documenttype_system_id_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_documenttype_prop_handlers, "internalSubset", dom_documenttype_internal_subset_read, NULL TSRMLS_CC);
+       zend_hash_merge(&dom_documenttype_prop_handlers, &dom_node_prop_handlers, NULL, NULL, sizeof(dom_prop_handler), 0);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_documenttype_prop_handlers, sizeof(dom_documenttype_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domnotation", dom_node_class_entry, php_dom_notation_class_functions, dom_notation_class_entry);
+       
+       zend_hash_init(&dom_notation_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_notation_prop_handlers, "publicId", dom_notation_public_id_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_notation_prop_handlers, "systemId", dom_notation_system_id_read, NULL TSRMLS_CC);
+       zend_hash_merge(&dom_notation_prop_handlers, &dom_node_prop_handlers, NULL, NULL, sizeof(dom_prop_handler), 0);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_notation_prop_handlers, sizeof(dom_notation_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domentity", dom_node_class_entry, php_dom_entity_class_functions, dom_entity_class_entry);
+       
+       zend_hash_init(&dom_entity_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_entity_prop_handlers, "publicId", dom_entity_public_id_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_entity_prop_handlers, "systemId", dom_entity_system_id_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_entity_prop_handlers, "notationName", dom_entity_notation_name_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_entity_prop_handlers, "actualEncoding", dom_entity_actual_encoding_read, dom_entity_actual_encoding_write TSRMLS_CC);
+       dom_register_prop_handler(&dom_entity_prop_handlers, "encoding", dom_entity_encoding_read, dom_entity_encoding_write TSRMLS_CC);
+       dom_register_prop_handler(&dom_entity_prop_handlers, "version", dom_entity_version_read, dom_entity_version_write TSRMLS_CC);
+       zend_hash_merge(&dom_entity_prop_handlers, &dom_node_prop_handlers, NULL, NULL, sizeof(dom_prop_handler), 0);
+
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_entity_prop_handlers, sizeof(dom_entity_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domentityreference", dom_node_class_entry, php_dom_entityreference_class_functions, dom_entityreference_class_entry);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_node_prop_handlers, sizeof(dom_entity_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domprocessinginstruction", dom_node_class_entry, php_dom_processinginstruction_class_functions, dom_processinginstruction_class_entry);
+       
+       zend_hash_init(&dom_processinginstruction_prop_handlers, 0, NULL, NULL, 1);
+       dom_register_prop_handler(&dom_processinginstruction_prop_handlers, "target", dom_processinginstruction_target_read, NULL TSRMLS_CC);
+       dom_register_prop_handler(&dom_processinginstruction_prop_handlers, "data", dom_processinginstruction_data_read, dom_processinginstruction_data_write TSRMLS_CC);
+       zend_hash_merge(&dom_processinginstruction_prop_handlers, &dom_node_prop_handlers, NULL, NULL, sizeof(dom_prop_handler), 0);
+       zend_hash_add(&classes, ce.name, ce.name_length + 1, &dom_processinginstruction_prop_handlers, sizeof(dom_processinginstruction_prop_handlers), NULL);
+
+       REGISTER_DOM_CLASS(ce, "domstring_extend", NULL, php_dom_string_extend_class_functions, dom_string_extend_class_entry);
+
+       REGISTER_LONG_CONSTANT("XML_ELEMENT_NODE",                      XML_ELEMENT_NODE,                       CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_NODE",            XML_ATTRIBUTE_NODE,                     CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_TEXT_NODE",                         XML_TEXT_NODE,                          CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_CDATA_SECTION_NODE",        XML_CDATA_SECTION_NODE,         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ENTITY_REF_NODE",           XML_ENTITY_REF_NODE,            CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ENTITY_NODE",                       XML_ENTITY_NODE,                        CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_PI_NODE",                           XML_PI_NODE,                            CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_COMMENT_NODE",                      XML_COMMENT_NODE,                       CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_DOCUMENT_NODE",                     XML_DOCUMENT_NODE,                      CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_DOCUMENT_TYPE_NODE",        XML_DOCUMENT_TYPE_NODE,         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_DOCUMENT_FRAG_NODE",        XML_DOCUMENT_FRAG_NODE,         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_NOTATION_NODE",                     XML_NOTATION_NODE,                      CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_HTML_DOCUMENT_NODE",        XML_HTML_DOCUMENT_NODE,         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_DTD_NODE",                          XML_DTD_NODE,                           CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ELEMENT_DECL_NODE",         XML_ELEMENT_DECL,                       CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_DECL_NODE",       XML_ATTRIBUTE_DECL,                     CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ENTITY_DECL_NODE",          XML_ENTITY_DECL,                        CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_NAMESPACE_DECL_NODE",       XML_NAMESPACE_DECL,                     CONST_CS | CONST_PERSISTENT);
+#ifdef XML_GLOBAL_NAMESPACE
+       REGISTER_LONG_CONSTANT("XML_GLOBAL_NAMESPACE",          XML_GLOBAL_NAMESPACE,           CONST_CS | CONST_PERSISTENT);
+#endif
+       REGISTER_LONG_CONSTANT("XML_LOCAL_NAMESPACE",           XML_LOCAL_NAMESPACE,            CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_CDATA",           XML_ATTRIBUTE_CDATA,            CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_ID",                      XML_ATTRIBUTE_ID,                       CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_IDREF",           XML_ATTRIBUTE_IDREF,            CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_IDREFS",          XML_ATTRIBUTE_IDREFS,           CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_ENTITY",          XML_ATTRIBUTE_ENTITIES,         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_NMTOKEN",         XML_ATTRIBUTE_NMTOKEN,          CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_NMTOKENS",        XML_ATTRIBUTE_NMTOKENS,         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_ENUMERATION",     XML_ATTRIBUTE_ENUMERATION,      CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("XML_ATTRIBUTE_NOTATION",        XML_ATTRIBUTE_NOTATION,         CONST_CS | CONST_PERSISTENT);
+
+
+       xmlInitParser();
+
+       return SUCCESS;
+}
+/* }}} */
+
+/* {{{ */
+PHP_MINFO_FUNCTION(dom)
+{
+       php_info_print_table_start();
+       php_info_print_table_row(2, "DOM/XML", "enabled");
+       php_info_print_table_row(2, "DOM/XML API Version", DOM_API_VERSION);
+       php_info_print_table_row(2, "libxml Version", xmlParserVersion);
+#if defined(LIBXML_HTML_ENABLED)
+       php_info_print_table_row(2, "HTML Support", "enabled");
+#endif
+#if defined(LIBXML_XPATH_ENABLED)
+       php_info_print_table_row(2, "XPath Support", "enabled");
+#endif
+#if defined(LIBXML_XPTR_ENABLED)
+       php_info_print_table_row(2, "XPointer Support", "enabled");
+#endif
+       php_info_print_table_end();
+}
+/* }}} */
+
+PHP_MSHUTDOWN_FUNCTION(dom)
+{
+       xmlCleanupParser();
+
+       zend_hash_destroy(&dom_domstringlist_prop_handlers);
+       zend_hash_destroy(&dom_namelist_prop_handlers);
+       zend_hash_destroy(&dom_domimplementationlist_prop_handlers);
+       zend_hash_destroy(&dom_document_prop_handlers);
+       zend_hash_destroy(&dom_node_prop_handlers);
+       zend_hash_destroy(&dom_nodelist_prop_handlers);
+       zend_hash_destroy(&dom_namednodemap_prop_handlers);
+       zend_hash_destroy(&dom_characterdata_prop_handlers);
+       zend_hash_destroy(&dom_attr_prop_handlers);
+       zend_hash_destroy(&dom_element_prop_handlers);
+       zend_hash_destroy(&dom_text_prop_handlers);
+       zend_hash_destroy(&dom_typeinfo_prop_handlers);
+       zend_hash_destroy(&dom_domerror_prop_handlers);
+       zend_hash_destroy(&dom_domlocator_prop_handlers);
+       zend_hash_destroy(&dom_documenttype_prop_handlers);
+       zend_hash_destroy(&dom_notation_prop_handlers);
+       zend_hash_destroy(&dom_entity_prop_handlers);
+       zend_hash_destroy(&dom_processinginstruction_prop_handlers);
+       zend_hash_destroy(&classes);
+       
+/*     If you want do find memleaks in this module, compile libxml2 with --with-mem-debug and
+       uncomment the following line, this will tell you the amount of not freed memory
+       and the total used memory into apaches error_log  */
+/*  xmlMemoryDump();*/
+
+       return SUCCESS;
+}
+
+/* {{{ dom_clean_nodes */
+void dom_clean_nodes(xmlNodePtr nodep TSRMLS_DC)
+{
+       node_list_pointer *l;
+       zval *wrapper;
+       dom_object *object;
+
+       if (nodep != NULL) {
+               wrapper = dom_object_get_data(nodep);
+               if (wrapper != NULL) {
+                       object = (dom_object *)zend_objects_get_address(wrapper TSRMLS_CC);
+                       l = object->node_list;
+                       while (l != NULL) {
+                               node_free_resource(l->nodep TSRMLS_CC);
+                               l = object->node_list;
+                       }
+               }
+       }
+}
+/* }}} */
+
+/* {{{ node_list_unlink */
+void node_list_unlink(xmlNodePtr node TSRMLS_DC)
+{
+       zval *wrapper;
+
+       while (node != NULL) {
+
+               wrapper = dom_object_get_data(node);
+
+               if (wrapper != NULL ) {
+                       dom_add_to_list(node, node->doc TSRMLS_CC);
+                       xmlUnlinkNode(node);
+               } else {
+                       node_list_unlink(node->children TSRMLS_CC);
+
+                       switch (node->type) {
+                               case XML_ATTRIBUTE_DECL:
+                               case XML_DTD_NODE:
+                               case XML_DOCUMENT_TYPE_NODE:
+                               case XML_ENTITY_DECL:
+                               case XML_ATTRIBUTE_NODE:
+                                       break;
+                               default:
+                                       node_list_unlink((xmlNodePtr) node->properties TSRMLS_CC);
+                       }
+
+               }
+
+               node = node->next;
+       }
+}
+/* }}} end node_list_unlink */
+
+/* {{{ node_free_list */
+void node_free_list(xmlNodePtr node TSRMLS_DC)
+{
+       xmlNodePtr curnode;
+
+       if (node != NULL) {
+               curnode = node->last;
+               while (curnode != NULL) {
+                       node = curnode;
+                       node_free_list(node->children TSRMLS_CC);
+                       switch (node->type) {
+                               /* Skip property freeing for the following types */
+                               case XML_ATTRIBUTE_DECL:
+                               case XML_DTD_NODE:
+                               case XML_DOCUMENT_TYPE_NODE:
+                               case XML_ENTITY_DECL:
+                               case XML_ATTRIBUTE_NODE:
+                                       break;
+                               default:
+                                       node_free_list((xmlNodePtr) node->properties TSRMLS_CC);
+                       }
+                       
+                       dom_unregister_node(node TSRMLS_CC);
+                       curnode = node->prev;
+                       xmlUnlinkNode(node);
+                       xmlFreeNode(node);
+               }
+       }
+}
+/* }}} end node_free_list */
+
+/* {{{ node_free_resource */
+void node_free_resource(xmlNodePtr node TSRMLS_DC)
+{
+       xmlDtdPtr extSubset, intSubset;
+       xmlDocPtr docp;
+       if (!node) {
+               return;
+       }
+       switch (node->type) {
+               case XML_DOCUMENT_NODE:
+               case XML_HTML_DOCUMENT_NODE:
+               {
+                       docp = (xmlDocPtr) node;
+                       dom_clean_nodes(node TSRMLS_CC);
+                       if (docp->ids != NULL) xmlFreeIDTable((xmlIDTablePtr) docp->ids);
+                       docp->ids = NULL;
+                       if (docp->refs != NULL) xmlFreeRefTable((xmlRefTablePtr) docp->refs);
+                       docp->refs = NULL;
+                       extSubset = docp->extSubset;
+                       intSubset = docp->intSubset;
+                       if (intSubset == extSubset)
+                               extSubset = NULL;
+                       if (extSubset != NULL) {
+                               node_free_list((xmlNodePtr) extSubset->children TSRMLS_CC);
+                               xmlUnlinkNode((xmlNodePtr) docp->extSubset);
+                               docp->extSubset = NULL;
+                               xmlFreeDtd(extSubset);
+                       }
+                       if (intSubset != NULL) {
+                               node_free_list((xmlNodePtr) intSubset->children TSRMLS_CC);
+                               xmlUnlinkNode((xmlNodePtr) docp->intSubset);
+                               docp->intSubset = NULL;
+                               xmlFreeDtd(intSubset);
+                       }
+
+                       node_free_list(node->children TSRMLS_CC);
+                       node_free_list((xmlNodePtr) node->properties TSRMLS_CC);
+                       xmlFreeDoc((xmlDoc *) node);
+                       break;
+               }
+               default:
+                       if (node->parent == NULL) {
+                               node_free_list((xmlNodePtr) node->children TSRMLS_CC);
+                               switch (node->type) {
+                                       /* Skip property freeing for the following types */
+                                       case XML_ATTRIBUTE_DECL:
+                                       case XML_DTD_NODE:
+                                       case XML_DOCUMENT_TYPE_NODE:
+                                       case XML_ENTITY_DECL:
+                                       case XML_ATTRIBUTE_NODE:
+                                               break;
+                                       default:
+                                               node_free_list((xmlNodePtr) node->properties TSRMLS_CC);
+                               }
+                               dom_unregister_node(node TSRMLS_CC);
+                               switch (node->type) {
+                                       case XML_ATTRIBUTE_NODE:
+                                               xmlFreeProp((xmlAttrPtr) node);
+                                               break;
+                                       default:
+                                               xmlFreeNode((xmlNode *) node);
+                               }
+                       } else {
+                               dom_object_set_data(node, NULL TSRMLS_CC);
+                       }
+       }
+}
+/* }}} */
+
+/* {{{ dom_objects_clone */
+void dom_objects_clone(void *object, void **object_clone TSRMLS_DC)
+{
+       /* TODO */
+}
+/* }}} */
+
+/* {{{ dom_objects_dtor */
+void dom_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC)
+{
+       dom_object *intern = (dom_object *)object;
+
+       zend_hash_destroy(intern->std.properties);
+       FREE_HASHTABLE(intern->std.properties);
+
+       if (intern->ptr) {
+               node_free_resource(intern->ptr TSRMLS_CC);
+               intern->ptr = NULL;
+       }
+       efree(object);
+}
+/* }}} */
+
+/* {{{ dom_objects_new */
+zend_object_value dom_objects_new(zend_class_entry *class_type TSRMLS_DC)
+{
+       zend_object_value retval;
+       dom_object *intern;
+       zend_class_entry *base_class;
+       zval *tmp;
+
+       intern = emalloc(sizeof(dom_object));
+       intern->std.ce = class_type;
+       intern->std.in_get = 0;
+       intern->std.in_set = 0;
+       intern->ptr = NULL;
+       intern->node_list = NULL;
+       intern->prop_handler = NULL;
+       
+       base_class = class_type;
+       while(base_class->type != ZEND_INTERNAL_CLASS && base_class->parent != NULL) {
+               base_class = base_class->parent;
+       }
+
+       zend_hash_find(&classes, base_class->name , base_class->name_length + 1, (void **) &intern->prop_handler);
+
+       ALLOC_HASHTABLE(intern->std.properties);
+       zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
+       zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
+
+       retval.handle = zend_objects_store_put(intern, dom_objects_dtor, dom_objects_clone TSRMLS_CC);
+       retval.handlers = &dom_object_handlers;
+
+       return retval;
+}
+/* }}} */
+
+/* {{{ php_domobject_new */
+zval *php_dom_create_object(xmlNodePtr obj, int *found, zval *wrapper_in, zval *return_value  TSRMLS_DC)
+{
+       zval *wrapper;
+       zend_class_entry *ce;
+
+       *found = 0;
+
+       if (!obj) {
+               if(!wrapper_in) {
+                       ALLOC_ZVAL(wrapper);
+               } else {
+                       wrapper = wrapper_in;
+               }
+               ZVAL_NULL(wrapper);
+               return wrapper;
+       }
+
+       if ((wrapper = (zval *) dom_object_get_data((void *) obj))) {
+               if (wrapper_in) {
+                       zval_add_ref(&wrapper);
+                       *found = 1;
+                       return wrapper;
+               } else {
+                       *return_value = *wrapper;
+                       zval_copy_ctor(return_value);
+                       *found = 1;
+                       return return_value;
+               }
+       }
+
+       if(!wrapper_in) {
+               wrapper = return_value;
+       } else {
+               wrapper = wrapper_in;
+       }
+
+       switch (obj->type) {
+               case XML_DOCUMENT_NODE:
+               case XML_HTML_DOCUMENT_NODE:
+               {
+                       ce = dom_document_class_entry;
+                       break;
+               }
+               case XML_DTD_NODE:
+               case XML_DOCUMENT_TYPE_NODE:
+               {
+                       ce = dom_documenttype_class_entry;
+                       break;
+               }
+               case XML_ELEMENT_NODE:
+               {
+                       ce = dom_element_class_entry;
+                       break;
+               }
+               case XML_ATTRIBUTE_NODE:
+               {
+                       ce = dom_attr_class_entry;
+                       break;
+               }
+               case XML_TEXT_NODE:
+               {
+                       ce = dom_text_class_entry;
+                       break;
+               }
+               case XML_COMMENT_NODE:
+               {
+                       ce = dom_comment_class_entry;
+                       break;
+               }
+               case XML_PI_NODE:
+               {
+                       ce = dom_processinginstruction_class_entry;
+                       break;
+               }
+               case XML_ENTITY_REF_NODE:
+               {
+                       ce = dom_entityreference_class_entry;
+                       break;
+               }
+               case XML_ENTITY_DECL:
+               case XML_ELEMENT_DECL:
+               {
+                       ce = dom_entity_class_entry;
+                       break;
+               }
+               case XML_CDATA_SECTION_NODE:
+               {
+                       ce = dom_cdatasection_class_entry;
+                       break;
+               }
+               case XML_DOCUMENT_FRAG_NODE:
+               {
+                       ce = dom_documentfragment_class_entry;
+                       break;
+               }
+               case XML_NOTATION_NODE:
+               {
+                       ce = dom_notation_class_entry;
+                       break;
+               }
+               default:
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported node type: %d\n", Z_TYPE_P(obj));
+                       ZVAL_NULL(wrapper);
+                       return wrapper;
+       }
+
+       if(!wrapper_in) {
+               object_init_ex(wrapper, ce);
+       }
+
+       php_dom_set_object(wrapper, (void *) obj TSRMLS_CC);
+       return (wrapper);
+}
+/* }}} end php_domobject_new */
+
+
+void php_dom_create_implementation(zval **retval  TSRMLS_DC) {
+       object_init_ex(*retval, dom_domimplementation_class_entry);
+}
+
+/* {{{ int dom_hierarchy(xmlNodePtr parent, xmlNodePtr child) */
+int dom_hierarchy(xmlNodePtr parent, xmlNodePtr child) 
+{
+       xmlNodePtr nodep;
+
+    if (parent == NULL || child == NULL || child->doc != parent->doc) {
+        return SUCCESS;
+    }
+
+       nodep = parent;
+
+       while (nodep) {
+               if (nodep == child) {
+                       return FAILURE;
+               }
+               nodep = nodep->parent;
+       }
+
+    return SUCCESS;
+}
+/* }}} end dom_hierarchy */
+
+/* {{{ void dom_element_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval  TSRMLS_DC) */
+void dom_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval  TSRMLS_DC)
+{
+       zval *wrapper;
+       int ret;
+
+       while (nodep != NULL) {
+               if (nodep->type == XML_ELEMENT_NODE && xmlStrEqual(nodep->name, local)) {
+                       if (ns == NULL || (nodep->ns != NULL && xmlStrEqual(nodep->ns->href, ns))) {
+                               zval *child = NULL;
+                               wrapper = dom_object_get_data(nodep);
+                               if (wrapper == NULL) {
+                                       MAKE_STD_ZVAL(child);
+                               }
+
+                               child = php_dom_create_object(nodep, &ret, wrapper, child TSRMLS_CC);
+                               add_next_index_zval(*retval, child);
+                       }
+               }
+               dom_get_elements_by_tag_name_ns_raw(nodep->children, ns, local, retval TSRMLS_CC);
+               nodep = nodep->next;
+       }
+}
+/* }}} end dom_element_get_elements_by_tag_name_ns_raw */
+
+
+/* {{{ void dom_normalize (xmlNodePtr nodep TSRMLS_DC) */
+void dom_normalize (xmlNodePtr nodep TSRMLS_DC)
+{
+       xmlNodePtr child, nextp;
+       xmlAttrPtr attr;
+       xmlChar *strContent; 
+
+       child = nodep->children;
+       while(child != NULL) {
+               switch (child->type) {
+                       case XML_TEXT_NODE:
+                               nextp = child->next;
+                               while (nextp != NULL) {
+                                       if (nextp->type == XML_TEXT_NODE) {
+                                               strContent = xmlNodeGetContent(nextp);
+                                               xmlNodeAddContent(child, strContent);
+                                               xmlFree(strContent);
+                                               xmlUnlinkNode(nextp);
+                                               node_free_resource(nextp TSRMLS_CC);
+                                               nextp = child->next;
+                                       }
+                               }
+                               break;
+                       case XML_ELEMENT_NODE:
+                               dom_normalize (child TSRMLS_CC);
+                               attr = child->properties;
+                               while (attr != NULL) {
+                                       dom_normalize((xmlNodePtr) attr TSRMLS_CC);
+                                       attr = attr->next;
+                               }
+                               break;
+                       case XML_ATTRIBUTE_NODE:
+                               dom_normalize (child TSRMLS_CC);
+                               break;
+                       default:
+                               break;
+               }
+               child = child->next;
+       }
+}
+/* }}} end dom_normalize */
+
+
+/* {{{ void dom_set_old_ns(xmlDoc *doc, xmlNs *ns) */
+void dom_set_old_ns(xmlDoc *doc, xmlNs *ns) {
+       xmlNs *cur;
+
+       if (doc == NULL)
+               return;
+
+       if (doc->oldNs == NULL) {
+               doc->oldNs = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
+               if (doc->oldNs == NULL) {
+                       return;
+               }
+               memset(doc->oldNs, 0, sizeof(xmlNs));
+               doc->oldNs->type = XML_LOCAL_NAMESPACE;
+               doc->oldNs->href = xmlStrdup(XML_XML_NAMESPACE); 
+               doc->oldNs->prefix = xmlStrdup((const xmlChar *)"xml"); 
+       }
+
+       cur = doc->oldNs;
+       while (cur->next != NULL) {
+               cur = cur->next;
+       }
+       cur->next = ns;
+}
+/* }}} end dom_set_old_ns */
+
+
+/* {{{ xmlNsPtr dom_get_ns(char *uri, char *qName, int uri_len, int qName_len, int *errorcode, char *localname) */
+xmlNsPtr dom_get_ns(char *uri, char *qName, int uri_len, int qName_len, int *errorcode, char **localname) {
+       xmlNsPtr nsptr = NULL;
+       xmlURIPtr uristruct;
+       char *prefix = NULL;
+
+       *localname = NULL;
+       *errorcode = 0;
+
+       if (uri_len > 0 || qName_len > 0) {
+               if (qName_len == 0 && uri_len > 0) {
+                       *errorcode = NAMESPACE_ERR;
+                       return nsptr;
+               }
+               if (qName_len > 0 && *errorcode == 0) {
+                       uristruct = xmlParseURI(qName);
+                       if (uristruct->opaque != NULL) {
+                               prefix = xmlStrdup(uristruct->scheme);
+                               *localname = xmlStrdup(uristruct->opaque);
+                               if (xmlStrchr(*localname, (xmlChar) ':') != NULL) {
+                                       *errorcode = NAMESPACE_ERR;
+                               } else if (!strcmp (prefix, "xml") && strcmp(uri, XML_XML_NAMESPACE)) {
+                                       *errorcode = NAMESPACE_ERR;
+                               }
+                       }
+
+                       /* TODO: Test that localname has no invalid chars 
+                       php_dom_throw_error(INVALID_CHARACTER_ERR, TSRMLS_CC);
+                       */
+
+                       xmlFreeURI(uristruct);
+                       
+                       if (*errorcode == 0) {
+                               if (uri_len > 0 && prefix == NULL) {
+                                       *errorcode = NAMESPACE_ERR;
+                               } else if (*localname != NULL) {
+                                       nsptr = xmlNewNs(NULL, uri, prefix);
+                               }
+                       }
+               }
+       }
+
+       if (prefix != NULL) {
+               xmlFree(prefix);
+       }
+
+       return nsptr;
+
+}
+/* }}} end dom_get_ns */
+
+/* {{{ xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) */
+xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) {
+       xmlNsPtr cur;
+       xmlNs *ret = NULL;
+       if (node == NULL)
+               return NULL;
+
+       if (localName == NULL || xmlStrEqual(localName, "")) {
+               cur = node->nsDef;
+               while (cur != NULL) {
+                       if (cur->prefix == NULL) {
+                               ret = cur;
+                               break;
+                       }
+                       cur = cur->next;
+               }
+       } else {
+               cur = node->nsDef;
+               while (cur != NULL) {
+                       if (cur->prefix != NULL && xmlStrEqual(localName, cur->prefix)) {
+                               ret = cur;
+                               break;
+                       }
+                       cur = cur->next;
+               }
+       }
+       return ret;
+}
+/* }}} end dom_get_nsdecl */
+
+#endif /* HAVE_DOM */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h
new file mode 100644 (file)
index 0000000..17fe94a
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | Authors: Christian Stocker <chregu@php.net>                          |
+   |          Rob Richards <rrichards@php.net>                                                   |
+   |          Marcus Borger <helly@php.net>                               |
+   +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_DOM_H
+#define PHP_DOM_H
+
+#if HAVE_DOM
+#include <libxml/parser.h>
+#include <libxml/parserInternals.h>
+#include <libxml/tree.h>
+#include <libxml/uri.h>
+#include <libxml/xmlerror.h>
+#include <libxml/xinclude.h>
+#if defined(LIBXML_HTML_ENABLED)
+#include <libxml/HTMLparser.h>
+#include <libxml/HTMLtree.h>
+#endif
+#if defined(LIBXML_XPATH_ENABLED)
+#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
+#endif
+#if defined(LIBXML_XPTR_ENABLED)
+#include <libxml/xpointer.h>
+#endif
+
+#include "xml_common.h"
+
+/* DOM API_VERSION, please bump it up, if you change anything in the API
+    therefore it's easier for the script-programmers to check, what's working how
+   Can be checked with phpversion("dom");
+*/
+#define DOM_API_VERSION "20030413"
+        
+extern zend_module_entry dom_module_entry;
+
+#define dom_module_ptr &dom_module_entry
+
+#include "dom_fe.h"
+
+void php_dom_set_object(zval *wrapper, void *obj TSRMLS_DC);
+zval *dom_object_get_data(xmlNodePtr obj);
+void php_dom_throw_error(int error_code, zval **retval TSRMLS_DC);
+void node_free_resource(xmlNodePtr node TSRMLS_DC);
+void node_list_unlink(xmlNodePtr node TSRMLS_DC);
+void dom_del_from_list(xmlNodePtr nodep, xmlDocPtr docp TSRMLS_DC);
+void dom_add_to_list(xmlNodePtr nodep, xmlDocPtr docp TSRMLS_DC);
+xmlNsPtr dom_get_ns(char *uri, char *qName, int uri_len, int qName_len, int *errorcode, char **localname);
+void dom_set_old_ns(xmlDoc *doc, xmlNs *ns);
+xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName);
+void dom_normalize (xmlNodePtr nodep TSRMLS_DC);
+void dom_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *local, zval **retval  TSRMLS_DC);
+void php_dom_create_implementation(zval **retval  TSRMLS_DC);
+int dom_hierarchy(xmlNodePtr parent, xmlNodePtr child);
+
+#define DOM_NO_ARGS() \
+       if (ZEND_NUM_ARGS() != 0) { \
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Expects exactly 0 parameters, %d given", ZEND_NUM_ARGS()); \
+               return; \
+       }
+
+PHP_MINIT_FUNCTION(dom);
+PHP_MSHUTDOWN_FUNCTION(dom);
+PHP_MINFO_FUNCTION(dom);
+#else
+#define dom_module_ptr NULL
+
+#endif /* HAVE_DOM */
+#define phpext_dom_ptr dom_module_ptr
+
+#endif /* _PHP_DIR_H */
diff --git a/ext/dom/processinginstruction.c b/ext/dom/processinginstruction.c
new file mode 100644 (file)
index 0000000..7e83a37
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domprocessinginstruction extends domnode 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-1004215813
+* Since: 
+*/
+
+zend_function_entry php_dom_processinginstruction_class_functions[] = {
+       PHP_FALIAS("domprocessinginstruction", dom_processinginstruction_processinginstruction, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ proto domnode dom_processinginstruction_processinginstruction(string name, [string value]); */
+PHP_FUNCTION(dom_processinginstruction_processinginstruction)
+{
+
+       zval *id;
+       xmlNodePtr nodep = NULL, oldnode = NULL;
+       dom_object *intern;
+       char *name, *value = NULL;
+       int name_len, value_len;
+
+       id = getThis();
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &name, &name_len, &value, &value_len) == FAILURE) {
+               return;
+       }
+
+       if (name_len == 0) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "PI name is required");
+               RETURN_FALSE;
+       }
+
+       nodep = xmlNewPI((xmlChar *) name, (xmlChar *) value);
+
+       if (!nodep)
+               RETURN_FALSE;
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               oldnode = (xmlNodePtr)intern->ptr;
+               if (oldnode != NULL) {
+                       node_free_resource(oldnode  TSRMLS_CC);
+               }
+               php_dom_set_object(id, nodep TSRMLS_CC);
+       }
+}
+/* }}} end dom_processinginstruction_processinginstruction */
+
+/* {{{ proto target    string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-1478689192
+Since: 
+*/
+int dom_processinginstruction_target_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNodePtr nodep;
+
+       nodep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, (char *) (nodep->name), 1);
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto data      string  
+readonly=no 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-837822393
+Since: 
+*/
+int dom_processinginstruction_data_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       xmlNodePtr nodep;
+       xmlChar *content;
+
+       nodep = obj->ptr;
+
+       ALLOC_ZVAL(*retval);
+
+       
+       if ((content = xmlNodeGetContent(nodep)) != NULL) {
+               ZVAL_STRING(*retval, content, 1);
+       } else {
+               ZVAL_EMPTY_STRING(*retval);
+       }
+
+       xmlFree(content);
+
+       return SUCCESS;
+}
+
+int dom_processinginstruction_data_write(dom_object *obj, zval *newval TSRMLS_DC)
+{
+       xmlNode *nodep;
+
+       nodep = obj->ptr;
+       xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
+
+       return SUCCESS;
+}
+
+/* }}} */
+
+
diff --git a/ext/dom/string_extend.c b/ext/dom/string_extend.c
new file mode 100644 (file)
index 0000000..c71262e
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domstringextend 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#i18n-methods-StringExtend
+* Since: 
+*/
+
+zend_function_entry php_dom_string_extend_class_functions[] = {
+       PHP_FALIAS(findOffset16, dom_string_extend_find_offset16, NULL)
+       PHP_FALIAS(findOffset32, dom_string_extend_find_offset32, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+
+/* {{{ proto int dom_string_extend_find_offset16(int offset32);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#i18n-methods-StringExtend-findOffset16
+Since: 
+*/
+PHP_FUNCTION(dom_string_extend_find_offset16)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_string_extend_find_offset16 */
+
+
+/* {{{ proto int dom_string_extend_find_offset32(int offset16);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#i18n-methods-StringExtend-findOffset32
+Since: 
+*/
+PHP_FUNCTION(dom_string_extend_find_offset32)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_string_extend_find_offset32 */
diff --git a/ext/dom/tests/dom001.phpt b/ext/dom/tests/dom001.phpt
new file mode 100644 (file)
index 0000000..cf3298d
--- /dev/null
@@ -0,0 +1,275 @@
+--TEST--
+Test 1: Accessing single node
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+require_once("dom_test.inc");
+
+echo "Test 1: accessing single nodes from php\n";
+$dom = new domDocument;
+$dom->loadxml($xmlstr);
+if(!$dom) {
+  echo "Error while parsing the document\n";
+  exit;
+}
+
+// children() of of document would result in a memleak
+//$children = $dom->children();
+//print_node_list($children);
+
+echo "--------- root\n";
+$rootnode = $dom->documentElement;
+print_node($rootnode);
+
+echo "--------- children of root\n";
+$children = $rootnode->childNodes;
+print_node_list($children);
+
+// The last node should be identical with the last entry in the children array
+echo "--------- last\n";
+$last = $rootnode->lastChild;
+print_node($last);
+
+// The parent of this last node is the root again
+echo "--------- parent\n";
+$parent = $last->parentNode;
+print_node($parent);
+
+// The children of this parent are the same children as one above
+echo "--------- children of parent\n";
+$children = $parent->childNodes;
+print_node_list($children);
+
+echo "--------- creating a new attribute\n";
+//This is worthless
+//$attr = $dom->createAttribute("src", "picture.gif");
+//print_r($attr);
+
+//$rootnode->set_attributeNode($attr); 
+$attr = $rootnode->setAttribute("src", "picture.gif");
+$attr = $rootnode->getAttribute("src");
+print_r($attr);
+print "\n";
+
+echo "--------- Get Attribute Node\n";
+$attr = $rootnode->getAttributeNode("src");
+print_node($attr);
+
+echo "--------- Remove Attribute Node\n";
+$attr = $rootnode->removeAttribute("src");
+print "Removed " . $attr . " attributes.\n";
+
+echo "--------- attributes of rootnode\n";
+$attrs = $rootnode->attributes;
+print_node_list($attrs);
+
+echo "--------- children of an attribute\n";
+$children = current($attrs)->childNodes;
+print_node_list($children);
+
+echo "--------- Add child to root\n";
+$myelement = new domElement("Silly", "Symphony");
+$newchild = $rootnode->appendChild($myelement);
+print_node($newchild);
+print $dom->saveXML();
+print "\n";
+
+echo "--------- Find element by tagname\n";
+echo "    Using dom\n";
+$children = $dom->getElementsByTagname("Silly");
+print_node_list($children);
+
+echo "    Using elem\n";
+$children = $rootnode->getElementsByTagName("Silly");
+print_node_list($children);
+
+echo "--------- Unlink Node\n";
+print_node($children[0]);
+$rootnode->removeChild($children[0]);
+print_node_list($rootnode->childNodes);
+print $dom->savexml();
+
+echo "--------- Find element by id\n";
+print ("Not implemented\n");
+
+echo "--------- Check various node_name return values\n";
+print ("Not needed\n");
+
+?>
+--EXPECT--
+Test 1: accessing single nodes from php
+--------- root
+Node Name: chapter
+Node Type: 1
+Num Children: 4
+
+--------- children of root
+Node Name: title
+Node Type: 1
+Num Children: 1
+Node Content: Title
+
+Node Name: #text
+Node Type: 3
+Num Children: 0
+Node Content: 
+
+
+Node Name: para
+Node Type: 1
+Num Children: 7
+
+Node Name: #text
+Node Type: 3
+Num Children: 0
+Node Content: 
+
+
+--------- last
+Node Name: #text
+Node Type: 3
+Num Children: 0
+Node Content: 
+
+
+--------- parent
+Node Name: chapter
+Node Type: 1
+Num Children: 4
+
+--------- children of parent
+Node Name: title
+Node Type: 1
+Num Children: 1
+Node Content: Title
+
+Node Name: #text
+Node Type: 3
+Num Children: 0
+Node Content: 
+
+
+Node Name: para
+Node Type: 1
+Num Children: 7
+
+Node Name: #text
+Node Type: 3
+Num Children: 0
+Node Content: 
+
+
+--------- creating a new attribute
+picture.gif
+--------- Get Attribute Node
+Node Name: src
+Node Type: 2
+Num Children: 1
+Node Content: picture.gif
+
+--------- Remove Attribute Node
+Removed 1 attributes.
+--------- attributes of rootnode
+Node Name: language
+Node Type: 2
+Num Children: 1
+Node Content: en
+
+--------- children of an attribute
+Node Name: #text
+Node Type: 3
+Num Children: 0
+Node Content: en
+
+--------- Add child to root
+Node Name: Silly
+Node Type: 1
+Num Children: 1
+Node Content: Symphony
+
+<?xml version="1.0" standalone="yes"?>
+<!DOCTYPE chapter SYSTEM "/share/sgml/Norman_Walsh/db3xml10/db3xml10.dtd" [
+<!ENTITY sp "spanish">
+]>
+<!-- lsfj  -->
+<chapter language="en"><title language="en">Title</title>
+<para language="ge">
+&sp;
+<!-- comment -->
+<informaltable language="&sp;kkk">
+<tgroup cols="3">
+<tbody>
+<row><entry>a1</entry><entry morerows="1">b1</entry><entry>c1</entry></row>
+<row><entry>a2</entry><entry>c2</entry></row>
+<row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
+</tbody>
+</tgroup>
+</informaltable>
+</para>
+<Silly>Symphony</Silly></chapter>
+
+--------- Find element by tagname
+    Using dom
+Node Name: Silly
+Node Type: 1
+Num Children: 1
+Node Content: Symphony
+
+    Using elem
+Node Name: Silly
+Node Type: 1
+Num Children: 1
+Node Content: Symphony
+
+--------- Unlink Node
+Node Name: Silly
+Node Type: 1
+Num Children: 1
+Node Content: Symphony
+
+Node Name: title
+Node Type: 1
+Num Children: 1
+Node Content: Title
+
+Node Name: #text
+Node Type: 3
+Num Children: 0
+Node Content: 
+
+
+Node Name: para
+Node Type: 1
+Num Children: 7
+
+Node Name: #text
+Node Type: 3
+Num Children: 0
+Node Content: 
+
+
+<?xml version="1.0" standalone="yes"?>
+<!DOCTYPE chapter SYSTEM "/share/sgml/Norman_Walsh/db3xml10/db3xml10.dtd" [
+<!ENTITY sp "spanish">
+]>
+<!-- lsfj  -->
+<chapter language="en"><title language="en">Title</title>
+<para language="ge">
+&sp;
+<!-- comment -->
+<informaltable language="&sp;kkk">
+<tgroup cols="3">
+<tbody>
+<row><entry>a1</entry><entry morerows="1">b1</entry><entry>c1</entry></row>
+<row><entry>a2</entry><entry>c2</entry></row>
+<row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
+</tbody>
+</tgroup>
+</informaltable>
+</para>
+</chapter>
+--------- Find element by id
+Not implemented
+--------- Check various node_name return values
+Not needed
diff --git a/ext/dom/tests/dom_test.inc b/ext/dom/tests/dom_test.inc
new file mode 100644 (file)
index 0000000..96acddc
--- /dev/null
@@ -0,0 +1,43 @@
+<?PHP
+$xmlstr = "<?xml version='1.0' standalone='yes'?>
+<!DOCTYPE chapter SYSTEM '/share/sgml/Norman_Walsh/db3xml10/db3xml10.dtd'
+[ <!ENTITY sp \"spanish\">
+]>
+<!-- lsfj  -->
+<chapter language='en'><title language='en'>Title</title>
+<para language='ge'>
+&sp;
+<!-- comment -->
+<informaltable language='&sp;kkk'>
+<tgroup cols='3'>
+<tbody>
+<row><entry>a1</entry><entry morerows='1'>b1</entry><entry>c1</entry></row>
+<row><entry>a2</entry><entry>c2</entry></row>
+<row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
+</tbody>
+</tgroup>
+</informaltable>
+</para>
+</chapter> ";
+
+function print_node($node)
+{
+  print "Node Name: " . $node->nodeName;
+  print "\nNode Type: " . $node->nodeType;
+  $child_count = count($node->childNodes);
+  print "\nNum Children: " . $child_count;
+  if($child_count <= 1){
+    print "\nNode Content: " . $node->nodeValue;
+  }
+  print "\n\n";
+}
+
+function print_node_list($nodelist)
+{
+  foreach($nodelist as $node)
+  {
+    print_node($node);
+  }
+}
+
+?>
diff --git a/ext/dom/tests/skipif.inc b/ext/dom/tests/skipif.inc
new file mode 100644 (file)
index 0000000..08fd695
--- /dev/null
@@ -0,0 +1 @@
+<?php  if (!extension_loaded('dom')) die('skip dom extension not available');?>
\ No newline at end of file
diff --git a/ext/dom/text.c b/ext/dom/text.c
new file mode 100644 (file)
index 0000000..ddbbb73
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domtext extends domcharacterdata 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-1312295772
+* Since: 
+*/
+
+zend_function_entry php_dom_text_class_functions[] = {
+       PHP_FALIAS(splitText, dom_text_split_text, NULL)
+       PHP_FALIAS(isWhitespaceInElementContent, dom_text_is_whitespace_in_element_content, NULL)
+       PHP_FALIAS(replaceWholeText, dom_text_replace_whole_text, NULL)
+       PHP_FALIAS(domtext, dom_text_text, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ proto domtext_text([string value]); */
+PHP_FUNCTION(dom_text_text)
+{
+
+       zval *id;
+       xmlNodePtr nodep = NULL, oldnode = NULL;
+       dom_object *intern;
+       char *value = NULL;
+       int value_len;
+
+       id = getThis();
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &value, &value_len) == FAILURE) {
+               return;
+       }
+
+       nodep = xmlNewText((xmlChar *) value);
+
+       if (!nodep)
+               RETURN_FALSE;
+
+       intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
+       if (intern != NULL) {
+               oldnode = (xmlNodePtr)intern->ptr;
+               if (oldnode != NULL) {
+                       node_free_resource(oldnode  TSRMLS_CC);
+               }
+               php_dom_set_object(id, nodep TSRMLS_CC);
+       }
+}
+/* }}} end dom_text_text */
+
+/* {{{ proto wholeText string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Text3-wholeText
+Since: DOM Level 3
+*/
+int dom_text_whole_text_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+
+/* {{{ proto domtext dom_text_split_text(unsigned long offset);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-38853C1D
+Since: 
+*/
+PHP_FUNCTION(dom_text_split_text)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_text_split_text */
+
+
+/* {{{ proto boolean dom_text_is_whitespace_in_element_content();
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Text3-isWhitespaceInElementContent
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_text_is_whitespace_in_element_content)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_text_is_whitespace_in_element_content */
+
+
+/* {{{ proto domtext dom_text_replace_whole_text(string content);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Text3-replaceWholeText
+Since: DOM Level 3
+*/
+PHP_FUNCTION(dom_text_replace_whole_text)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_text_replace_whole_text */
diff --git a/ext/dom/typeinfo.c b/ext/dom/typeinfo.c
new file mode 100644 (file)
index 0000000..0b0f21a
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domtypeinfo 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#TypeInfo
+* Since: DOM Level 3
+*/
+
+zend_function_entry php_dom_typeinfo_class_functions[] = {
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+/* {{{ proto type_name string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#TypeInfo-typeName
+Since: 
+*/
+int dom_typeinfo_type_name_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
+
+/* {{{ proto type_namespace    string  
+readonly=yes 
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#TypeInfo-typeNamespace
+Since: 
+*/
+int dom_typeinfo_type_namespace_read(dom_object *obj, zval **retval TSRMLS_DC)
+{
+       ALLOC_ZVAL(*retval);
+       ZVAL_NULL(*retval);
+       return SUCCESS;
+}
+
+/* }}} */
+
+
diff --git a/ext/dom/userdatahandler.c b/ext/dom/userdatahandler.c
new file mode 100644 (file)
index 0000000..6f96679
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 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.               |
+   +----------------------------------------------------------------------+
+   | 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 domuserdatahandler 
+*
+* URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#UserDataHandler
+* Since: DOM Level 3
+*/
+
+zend_function_entry php_dom_userdatahandler_class_functions[] = {
+       PHP_FALIAS(handle, dom_userdatahandler_handle, NULL)
+       {NULL, NULL, NULL}
+};
+
+/* {{{ attribute protos, not implemented yet */
+
+
+/* {{{ proto dom_void dom_userdatahandler_handle(unsigned short operation, string key, domobject data, node src, node dst);
+URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-handleUserDataEvent
+Since: 
+*/
+PHP_FUNCTION(dom_userdatahandler_handle)
+{
+ DOM_NOT_IMPLEMENTED();
+}
+/* }}} end dom_userdatahandler_handle */
diff --git a/ext/dom/xml_common.h b/ext/dom/xml_common.h
new file mode 100644 (file)
index 0000000..e3b7b18
--- /dev/null
@@ -0,0 +1,82 @@
+#ifndef PHP_XML_COMMON_H
+#define PHP_XML_COMMON_H 
+
+typedef struct _node_list_pointer {
+       xmlNodePtr nodep;
+       void *next;
+} node_list_pointer;
+
+typedef struct _dom_object {
+       zend_object  std;
+       void *ptr;
+       HashTable *prop_handler;
+       node_list_pointer *node_list;
+} dom_object;
+
+#ifdef PHP_WIN32
+#ifdef PHPAPI
+#undef PHPAPI
+#endif
+#ifdef DOM_EXPORTS
+#define PHPAPI __declspec(dllexport)
+#else
+#define PHPAPI __declspec(dllimport)
+#endif /* DOM_EXPORTS */
+#endif /* PHP_WIN32 */
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
+#define PHP_DOM_EXPORT(__type) PHPAPI __type
+
+PHP_DOM_EXPORT(zval *) php_dom_create_object(xmlNodePtr obj, int *found, zval* in, zval* return_value TSRMLS_DC);
+PHP_DOM_EXPORT(void) dom_objects_clone(void *object, void **object_clone TSRMLS_DC);
+void dom_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC);
+PHP_DOM_EXPORT(zval *) dom_read_property(zval *object, zval *member TSRMLS_DC);
+PHP_DOM_EXPORT(void) dom_write_property(zval *object, zval *member, zval *value TSRMLS_DC);
+zend_object_value dom_objects_new(zend_class_entry *class_type TSRMLS_DC);
+void dom_unregister_node(xmlNodePtr nodep TSRMLS_DC);
+zend_object_handlers dom_object_handlers;
+
+#define DOM_XMLNS_NAMESPACE \
+    (const xmlChar *) "http://www.w3.org/2000/xmlns/"
+
+#define DOM_NOT_IMPLEMENTED() \
+       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not yet implemented"); \
+       return;
+    
+#define REGISTER_DOM_CLASS(ce, name, parent_ce, funcs, entry) \
+INIT_CLASS_ENTRY(ce, name, funcs); \
+ce.create_object = dom_objects_new; \
+entry = zend_register_internal_class_ex(&ce, parent_ce, NULL TSRMLS_CC);
+/* entry = zend_register_internal_ns_class(&ce, parent_ce, ns, NULL TSRMLS_CC); */
+
+#define DOM_GET_OBJ(__ptr, __id, __prtype) { \
+       dom_object *intern = (dom_object *)zend_object_store_get_object(__id TSRMLS_CC); \
+       if (!(__ptr = (__prtype)intern->ptr)) { \
+               php_error(E_WARNING, "Couldn't fetch %s", intern->std.ce->name);\
+               RETURN_NULL();\
+       } \
+}
+
+#define DOM_DOMOBJ_NEW(zval, obj, ret) \
+       if (NULL == (zval = php_dom_create_object(obj, ret, zval, return_value TSRMLS_CC))) { \
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object"); \
+               RETURN_FALSE; \
+       }
+
+#define DOM_RET_OBJ(zval, obj, ret) \
+       DOM_DOMOBJ_NEW(zval, obj, ret);
+
+#define DOM_GET_THIS(zval) \
+       if (NULL == (zval = getThis())) { \
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object missing"); \
+               RETURN_FALSE; \
+       }
+
+#define DOM_GET_THIS_OBJ(__ptr, __id, __prtype) \
+       DOM_GET_THIS(__id); \
+       DOM_GET_OBJ(__ptr, __id, __prtype);
+
+#endif