Annotation of embedaddon/php/ext/dom/document.c, revision 1.1

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | PHP Version 5                                                        |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 1997-2012 The PHP Group                                |
        !             6:    +----------------------------------------------------------------------+
        !             7:    | This source file is subject to version 3.01 of the PHP license,      |
        !             8:    | that is bundled with this package in the file LICENSE, and is        |
        !             9:    | available through the world-wide-web at the following url:           |
        !            10:    | http://www.php.net/license/3_01.txt                                  |
        !            11:    | If you did not receive a copy of the PHP license and are unable to   |
        !            12:    | obtain it through the world-wide-web, please send a note to          |
        !            13:    | license@php.net so we can mail you a copy immediately.               |
        !            14:    +----------------------------------------------------------------------+
        !            15:    | Authors: Christian Stocker <chregu@php.net>                          |
        !            16:    |          Rob Richards <rrichards@php.net>                            |
        !            17:    +----------------------------------------------------------------------+
        !            18: */
        !            19: 
        !            20: /* $Id: document.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            21: 
        !            22: #ifdef HAVE_CONFIG_H
        !            23: #include "config.h"
        !            24: #endif
        !            25: 
        !            26: #include "php.h"
        !            27: #if HAVE_LIBXML && HAVE_DOM
        !            28: #include "php_dom.h"
        !            29: #include <libxml/SAX.h>
        !            30: #ifdef LIBXML_SCHEMAS_ENABLED
        !            31: #include <libxml/relaxng.h>
        !            32: #include <libxml/xmlschemas.h>
        !            33: #endif
        !            34: 
        !            35: typedef struct _idsIterator idsIterator;
        !            36: struct _idsIterator {
        !            37:        xmlChar *elementId;
        !            38:        xmlNode *element;
        !            39: };
        !            40: 
        !            41: #define DOM_LOAD_STRING 0
        !            42: #define DOM_LOAD_FILE 1
        !            43: 
        !            44: /* {{{ arginfo */
        !            45: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_create_element, 0, 0, 1)
        !            46:        ZEND_ARG_INFO(0, tagName)
        !            47:        ZEND_ARG_INFO(0, value)
        !            48: ZEND_END_ARG_INFO();
        !            49: 
        !            50: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_create_document_fragment, 0, 0, 0)
        !            51: ZEND_END_ARG_INFO();
        !            52: 
        !            53: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_create_text_node, 0, 0, 1)
        !            54:        ZEND_ARG_INFO(0, data)
        !            55: ZEND_END_ARG_INFO();
        !            56: 
        !            57: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_create_comment, 0, 0, 1)
        !            58:        ZEND_ARG_INFO(0, data)
        !            59: ZEND_END_ARG_INFO();
        !            60: 
        !            61: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_create_cdatasection, 0, 0, 1)
        !            62:        ZEND_ARG_INFO(0, data)
        !            63: ZEND_END_ARG_INFO();
        !            64: 
        !            65: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_create_processing_instruction, 0, 0, 2)
        !            66:        ZEND_ARG_INFO(0, target)
        !            67:        ZEND_ARG_INFO(0, data)
        !            68: ZEND_END_ARG_INFO();
        !            69: 
        !            70: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_create_attribute, 0, 0, 1)
        !            71:        ZEND_ARG_INFO(0, name)
        !            72: ZEND_END_ARG_INFO();
        !            73: 
        !            74: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_create_entity_reference, 0, 0, 1)
        !            75:        ZEND_ARG_INFO(0, name)
        !            76: ZEND_END_ARG_INFO();
        !            77: 
        !            78: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_get_elements_by_tag_name, 0, 0, 1)
        !            79:        ZEND_ARG_INFO(0, tagName)
        !            80: ZEND_END_ARG_INFO();
        !            81: 
        !            82: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_import_node, 0, 0, 2)
        !            83:        ZEND_ARG_OBJ_INFO(0, importedNode, DOMNode, 0)
        !            84:        ZEND_ARG_INFO(0, deep)
        !            85: ZEND_END_ARG_INFO();
        !            86: 
        !            87: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_create_element_ns, 0, 0, 2)
        !            88:        ZEND_ARG_INFO(0, namespaceURI)
        !            89:        ZEND_ARG_INFO(0, qualifiedName)
        !            90:        ZEND_ARG_INFO(0, value)
        !            91: ZEND_END_ARG_INFO();
        !            92: 
        !            93: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_create_attribute_ns, 0, 0, 2)
        !            94:        ZEND_ARG_INFO(0, namespaceURI)
        !            95:        ZEND_ARG_INFO(0, qualifiedName)
        !            96: ZEND_END_ARG_INFO();
        !            97: 
        !            98: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_get_elements_by_tag_name_ns, 0, 0, 2)
        !            99:        ZEND_ARG_INFO(0, namespaceURI)
        !           100:        ZEND_ARG_INFO(0, localName)
        !           101: ZEND_END_ARG_INFO();
        !           102: 
        !           103: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_get_element_by_id, 0, 0, 1)
        !           104:        ZEND_ARG_INFO(0, elementId)
        !           105: ZEND_END_ARG_INFO();
        !           106: 
        !           107: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_adopt_node, 0, 0, 1)
        !           108:        ZEND_ARG_OBJ_INFO(0, source, DOMNode, 0)
        !           109: ZEND_END_ARG_INFO();
        !           110: 
        !           111: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_normalize_document, 0, 0, 0)
        !           112: ZEND_END_ARG_INFO();
        !           113: 
        !           114: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_rename_node, 0, 0, 3)
        !           115:        ZEND_ARG_OBJ_INFO(0, node, DOMNode, 0)
        !           116:        ZEND_ARG_INFO(0, namespaceURI)
        !           117:        ZEND_ARG_INFO(0, qualifiedName)
        !           118: ZEND_END_ARG_INFO();
        !           119: 
        !           120: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_load, 0, 0, 1)
        !           121:        ZEND_ARG_INFO(0, source)
        !           122:        ZEND_ARG_INFO(0, options)
        !           123: ZEND_END_ARG_INFO();
        !           124: 
        !           125: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_save, 0, 0, 1)
        !           126:        ZEND_ARG_INFO(0, file)
        !           127: ZEND_END_ARG_INFO();
        !           128: 
        !           129: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_loadxml, 0, 0, 1)
        !           130:        ZEND_ARG_INFO(0, source)
        !           131:        ZEND_ARG_INFO(0, options)
        !           132: ZEND_END_ARG_INFO();
        !           133: 
        !           134: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_savexml, 0, 0, 0)
        !           135:        ZEND_ARG_OBJ_INFO(0, node, DOMNode, 1)
        !           136: ZEND_END_ARG_INFO();
        !           137: 
        !           138: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_construct, 0, 0, 0)
        !           139:        ZEND_ARG_INFO(0, version)
        !           140:        ZEND_ARG_INFO(0, encoding)
        !           141: ZEND_END_ARG_INFO();
        !           142: 
        !           143: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_validate, 0, 0, 0)
        !           144: ZEND_END_ARG_INFO();
        !           145: 
        !           146: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_xinclude, 0, 0, 0)
        !           147:        ZEND_ARG_INFO(0, options)
        !           148: ZEND_END_ARG_INFO();
        !           149: 
        !           150: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_loadhtml, 0, 0, 1)
        !           151:        ZEND_ARG_INFO(0, source)
        !           152: ZEND_END_ARG_INFO();
        !           153: 
        !           154: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_loadhtmlfile, 0, 0, 1)
        !           155:        ZEND_ARG_INFO(0, source)
        !           156: ZEND_END_ARG_INFO();
        !           157: 
        !           158: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_savehtml, 0, 0, 0)
        !           159: ZEND_END_ARG_INFO();
        !           160: 
        !           161: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_savehtmlfile, 0, 0, 1)
        !           162:        ZEND_ARG_INFO(0, file)
        !           163: ZEND_END_ARG_INFO();
        !           164: 
        !           165: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_schema_validate_file, 0, 0, 1)
        !           166:        ZEND_ARG_INFO(0, filename)
        !           167: ZEND_END_ARG_INFO();
        !           168: 
        !           169: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_schema_validate_xml, 0, 0, 1)
        !           170:        ZEND_ARG_INFO(0, source)
        !           171: ZEND_END_ARG_INFO();
        !           172: 
        !           173: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_relaxNG_validate_file, 0, 0, 1)
        !           174:        ZEND_ARG_INFO(0, filename)
        !           175: ZEND_END_ARG_INFO();
        !           176: 
        !           177: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_relaxNG_validate_xml, 0, 0, 1)
        !           178:        ZEND_ARG_INFO(0, source)
        !           179: ZEND_END_ARG_INFO();
        !           180: 
        !           181: ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_registernodeclass, 0, 0, 2)
        !           182:        ZEND_ARG_INFO(0, baseClass)
        !           183:        ZEND_ARG_INFO(0, extendedClass)
        !           184: ZEND_END_ARG_INFO();
        !           185: /* }}} */
        !           186: 
        !           187: /*
        !           188: * class DOMDocument extends DOMNode 
        !           189: *
        !           190: * URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-i-Document
        !           191: * Since: 
        !           192: */
        !           193: 
        !           194: const zend_function_entry php_dom_document_class_functions[] = { /* {{{ */
        !           195:        PHP_FALIAS(createElement, dom_document_create_element, arginfo_dom_document_create_element)
        !           196:        PHP_FALIAS(createDocumentFragment, dom_document_create_document_fragment, arginfo_dom_document_create_document_fragment)
        !           197:        PHP_FALIAS(createTextNode, dom_document_create_text_node, arginfo_dom_document_create_text_node)
        !           198:        PHP_FALIAS(createComment, dom_document_create_comment, arginfo_dom_document_create_comment)
        !           199:        PHP_FALIAS(createCDATASection, dom_document_create_cdatasection, arginfo_dom_document_create_cdatasection)
        !           200:        PHP_FALIAS(createProcessingInstruction, dom_document_create_processing_instruction, arginfo_dom_document_create_processing_instruction)
        !           201:        PHP_FALIAS(createAttribute, dom_document_create_attribute, arginfo_dom_document_create_attribute)
        !           202:        PHP_FALIAS(createEntityReference, dom_document_create_entity_reference, arginfo_dom_document_create_entity_reference)
        !           203:        PHP_FALIAS(getElementsByTagName, dom_document_get_elements_by_tag_name, arginfo_dom_document_get_elements_by_tag_name)
        !           204:        PHP_FALIAS(importNode, dom_document_import_node, arginfo_dom_document_import_node)
        !           205:        PHP_FALIAS(createElementNS, dom_document_create_element_ns, arginfo_dom_document_create_element_ns)
        !           206:        PHP_FALIAS(createAttributeNS, dom_document_create_attribute_ns, arginfo_dom_document_create_attribute_ns)
        !           207:        PHP_FALIAS(getElementsByTagNameNS, dom_document_get_elements_by_tag_name_ns, arginfo_dom_document_get_elements_by_tag_name_ns)
        !           208:        PHP_FALIAS(getElementById, dom_document_get_element_by_id, arginfo_dom_document_get_element_by_id)
        !           209:        PHP_FALIAS(adoptNode, dom_document_adopt_node, arginfo_dom_document_adopt_node)
        !           210:        PHP_FALIAS(normalizeDocument, dom_document_normalize_document, arginfo_dom_document_normalize_document)
        !           211:        PHP_FALIAS(renameNode, dom_document_rename_node, arginfo_dom_document_rename_node)
        !           212:        PHP_ME(domdocument, load, arginfo_dom_document_load, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
        !           213:        PHP_FALIAS(save, dom_document_save, arginfo_dom_document_save)
        !           214:        PHP_ME(domdocument, loadXML, arginfo_dom_document_loadxml, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
        !           215:        PHP_FALIAS(saveXML, dom_document_savexml, arginfo_dom_document_savexml)
        !           216:        PHP_ME(domdocument, __construct, arginfo_dom_document_construct, ZEND_ACC_PUBLIC)
        !           217:        PHP_FALIAS(validate, dom_document_validate, arginfo_dom_document_validate)
        !           218:        PHP_FALIAS(xinclude, dom_document_xinclude, arginfo_dom_document_xinclude)
        !           219: #if defined(LIBXML_HTML_ENABLED)
        !           220:        PHP_ME(domdocument, loadHTML, arginfo_dom_document_loadhtml, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
        !           221:        PHP_ME(domdocument, loadHTMLFile, arginfo_dom_document_loadhtmlfile, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
        !           222:        PHP_FALIAS(saveHTML, dom_document_save_html, arginfo_dom_document_savehtml)
        !           223:        PHP_FALIAS(saveHTMLFile, dom_document_save_html_file, arginfo_dom_document_savehtmlfile)
        !           224: #endif  /* defined(LIBXML_HTML_ENABLED) */
        !           225: #if defined(LIBXML_SCHEMAS_ENABLED)
        !           226:        PHP_FALIAS(schemaValidate, dom_document_schema_validate_file, arginfo_dom_document_schema_validate_file)
        !           227:        PHP_FALIAS(schemaValidateSource, dom_document_schema_validate_xml, arginfo_dom_document_schema_validate_xml)
        !           228:        PHP_FALIAS(relaxNGValidate, dom_document_relaxNG_validate_file, arginfo_dom_document_relaxNG_validate_file)
        !           229:        PHP_FALIAS(relaxNGValidateSource, dom_document_relaxNG_validate_xml, arginfo_dom_document_relaxNG_validate_xml)
        !           230: #endif
        !           231:        PHP_ME(domdocument, registerNodeClass, arginfo_dom_document_registernodeclass, ZEND_ACC_PUBLIC)
        !           232:        PHP_FE_END
        !           233: };
        !           234: /* }}} */
        !           235: 
        !           236: /* {{{ docType DOMDocumentType 
        !           237: readonly=yes 
        !           238: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-B63ED1A31
        !           239: Since: 
        !           240: */
        !           241: int dom_document_doctype_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           242: {
        !           243:        xmlDoc *docp;
        !           244:        xmlDtdPtr dtdptr;
        !           245:        int ret;
        !           246: 
        !           247:        docp = (xmlDocPtr) dom_object_get_node(obj);
        !           248: 
        !           249:        if (docp == NULL) {
        !           250:                php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
        !           251:                return FAILURE;
        !           252:        }
        !           253: 
        !           254:        ALLOC_ZVAL(*retval);
        !           255: 
        !           256:        dtdptr = xmlGetIntSubset(docp);
        !           257:        if (!dtdptr) {
        !           258:                ZVAL_NULL(*retval);
        !           259:                return SUCCESS;
        !           260:        }
        !           261: 
        !           262:        if (NULL == (*retval = php_dom_create_object((xmlNodePtr) dtdptr, &ret, NULL, *retval, obj TSRMLS_CC))) {
        !           263:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
        !           264:                return FAILURE;
        !           265:        }
        !           266:        return SUCCESS;
        !           267:        
        !           268: }
        !           269: 
        !           270: /* }}} */
        !           271: 
        !           272: /* {{{ implementation  DOMImplementation       
        !           273: readonly=yes 
        !           274: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1B793EBA
        !           275: Since: 
        !           276: */
        !           277: int dom_document_implementation_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           278: {
        !           279:        ALLOC_ZVAL(*retval);
        !           280:        php_dom_create_implementation(retval TSRMLS_CC);
        !           281:        return SUCCESS;
        !           282: }
        !           283: 
        !           284: /* }}} */
        !           285: 
        !           286: /* {{{ documentElement DOMElement      
        !           287: readonly=yes 
        !           288: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-87CD092
        !           289: Since: 
        !           290: */
        !           291: int dom_document_document_element_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           292: {
        !           293:        xmlDoc *docp;
        !           294:        xmlNode *root;
        !           295:        int ret;
        !           296: 
        !           297:        docp = (xmlDocPtr) dom_object_get_node(obj);
        !           298: 
        !           299:        if (docp == NULL) {
        !           300:                php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
        !           301:                return FAILURE;
        !           302:        }
        !           303: 
        !           304:        ALLOC_ZVAL(*retval);
        !           305: 
        !           306:        root = xmlDocGetRootElement(docp);
        !           307:        if (!root) {
        !           308:                ZVAL_NULL(*retval);
        !           309:                return SUCCESS;
        !           310:        }
        !           311: 
        !           312:        if (NULL == (*retval = php_dom_create_object(root, &ret, NULL, *retval, obj TSRMLS_CC))) {
        !           313:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create required DOM object");
        !           314:                return FAILURE;
        !           315:        }
        !           316:        return SUCCESS;
        !           317: }
        !           318: 
        !           319: /* }}} */
        !           320: 
        !           321: /* {{{ encoding        string
        !           322: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-encoding
        !           323: Since: DOM Level 3
        !           324: */
        !           325: int dom_document_encoding_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           326: {
        !           327:        xmlDoc *docp;
        !           328:        char *encoding;
        !           329: 
        !           330:        docp = (xmlDocPtr) dom_object_get_node(obj);
        !           331: 
        !           332:        if (docp == NULL) {
        !           333:                php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
        !           334:                return FAILURE;
        !           335:        }
        !           336: 
        !           337:        encoding = (char *) docp->encoding;
        !           338:        ALLOC_ZVAL(*retval);
        !           339: 
        !           340:        if (encoding != NULL) {
        !           341:                ZVAL_STRING(*retval, encoding, 1);
        !           342:        } else {
        !           343:                ZVAL_NULL(*retval);
        !           344:        }
        !           345: 
        !           346:        return SUCCESS;
        !           347: }
        !           348: 
        !           349: int dom_document_encoding_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           350: {
        !           351:        zval value_copy;
        !           352:        xmlDoc *docp;
        !           353:        xmlCharEncodingHandlerPtr handler;
        !           354: 
        !           355:        docp = (xmlDocPtr) dom_object_get_node(obj);
        !           356: 
        !           357:        if (docp == NULL) {
        !           358:                php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
        !           359:                return FAILURE;
        !           360:        }
        !           361: 
        !           362:        if (newval->type != IS_STRING) {
        !           363:                if(Z_REFCOUNT_P(newval) > 1) {
        !           364:                        value_copy = *newval;
        !           365:                        zval_copy_ctor(&value_copy);
        !           366:                        newval = &value_copy;
        !           367:                }
        !           368:                convert_to_string(newval);
        !           369:        }
        !           370: 
        !           371:        handler = xmlFindCharEncodingHandler(Z_STRVAL_P(newval));
        !           372: 
        !           373:     if (handler != NULL) {
        !           374:                xmlCharEncCloseFunc(handler);
        !           375:                if (docp->encoding != NULL) {
        !           376:                        xmlFree((xmlChar *)docp->encoding);
        !           377:                }
        !           378:                docp->encoding = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
        !           379:     } else {
        !           380:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Document Encoding");
        !           381:     }
        !           382: 
        !           383:        if (newval == &value_copy) {
        !           384:                zval_dtor(newval);
        !           385:        }
        !           386: 
        !           387:        return SUCCESS;
        !           388: }
        !           389: 
        !           390: /* }}} */
        !           391: 
        !           392: /* {{{ standalone      boolean 
        !           393: readonly=no 
        !           394: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-standalone
        !           395: Since: DOM Level 3
        !           396: */
        !           397: int dom_document_standalone_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           398: {
        !           399:        xmlDoc *docp;
        !           400:        int standalone;
        !           401: 
        !           402:        docp = (xmlDocPtr) dom_object_get_node(obj);
        !           403: 
        !           404:        if (docp == NULL) {
        !           405:                php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
        !           406:                return FAILURE;
        !           407:        }
        !           408: 
        !           409:        ALLOC_ZVAL(*retval);
        !           410:        standalone = docp->standalone;
        !           411:        ZVAL_BOOL(*retval, standalone);
        !           412: 
        !           413:        return SUCCESS;
        !           414: }
        !           415: 
        !           416: int dom_document_standalone_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           417: {
        !           418:        zval value_copy;
        !           419:        xmlDoc *docp;
        !           420:        int standalone;
        !           421: 
        !           422:        docp = (xmlDocPtr) dom_object_get_node(obj);
        !           423: 
        !           424:        if (docp == NULL) {
        !           425:                php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
        !           426:                return FAILURE;
        !           427:        }
        !           428: 
        !           429:        if(Z_REFCOUNT_P(newval) > 1) {
        !           430:                value_copy = *newval;
        !           431:                zval_copy_ctor(&value_copy);
        !           432:                newval = &value_copy;
        !           433:        }
        !           434:        convert_to_long(newval);
        !           435: 
        !           436:        standalone = Z_LVAL_P(newval);
        !           437:     if (standalone > 0) {
        !           438:         docp->standalone = 1;
        !           439:     }
        !           440:     else if (standalone < 0) {
        !           441:         docp->standalone = -1;
        !           442:     }
        !           443:     else {
        !           444:         docp->standalone = 0;
        !           445:     }
        !           446: 
        !           447:        if (newval == &value_copy) {
        !           448:                zval_dtor(newval);
        !           449:        }
        !           450: 
        !           451:        return SUCCESS;
        !           452: }
        !           453: 
        !           454: /* }}} */
        !           455: 
        !           456: /* {{{ version string  
        !           457: readonly=no
        !           458: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-version
        !           459: Since: DOM Level 3
        !           460: */
        !           461: int dom_document_version_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           462: {
        !           463:        xmlDoc *docp;
        !           464:        char *version;
        !           465: 
        !           466:        docp = (xmlDocPtr) dom_object_get_node(obj);
        !           467: 
        !           468:        if (docp == NULL) {
        !           469:                php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
        !           470:                return FAILURE;
        !           471:        }
        !           472: 
        !           473:        version = (char *) docp->version;
        !           474:        ALLOC_ZVAL(*retval);
        !           475: 
        !           476:        if (version != NULL) {
        !           477:                ZVAL_STRING(*retval, version, 1);
        !           478:        } else {
        !           479:                ZVAL_NULL(*retval);
        !           480:        }
        !           481: 
        !           482:        return SUCCESS;
        !           483: }
        !           484: 
        !           485: int dom_document_version_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           486: {
        !           487:        zval value_copy;
        !           488:        xmlDoc *docp;
        !           489: 
        !           490:        docp = (xmlDocPtr) dom_object_get_node(obj);
        !           491: 
        !           492:        if (docp == NULL) {
        !           493:                php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
        !           494:                return FAILURE;
        !           495:        }
        !           496: 
        !           497:        if (docp->version != NULL) {
        !           498:                xmlFree((xmlChar *) docp->version );
        !           499:        }
        !           500: 
        !           501:        if (newval->type != IS_STRING) {
        !           502:                if(Z_REFCOUNT_P(newval) > 1) {
        !           503:                        value_copy = *newval;
        !           504:                        zval_copy_ctor(&value_copy);
        !           505:                        newval = &value_copy;
        !           506:                }
        !           507:                convert_to_string(newval);
        !           508:        }
        !           509: 
        !           510:        docp->version = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
        !           511: 
        !           512:        if (newval == &value_copy) {
        !           513:                zval_dtor(newval);
        !           514:        }
        !           515: 
        !           516:        return SUCCESS;
        !           517: }
        !           518: 
        !           519: /* }}} */
        !           520: 
        !           521: /* {{{ strictErrorChecking     boolean 
        !           522: readonly=no 
        !           523: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-strictErrorChecking
        !           524: Since: DOM Level 3
        !           525: */
        !           526: int dom_document_strict_error_checking_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           527: {
        !           528:        dom_doc_propsptr doc_prop;
        !           529: 
        !           530:        ALLOC_ZVAL(*retval);
        !           531:        if (obj->document) {
        !           532:                doc_prop = dom_get_doc_props(obj->document);
        !           533:                ZVAL_BOOL(*retval, doc_prop->stricterror);
        !           534:        } else {
        !           535:                ZVAL_FALSE(*retval);
        !           536:        }
        !           537:        return SUCCESS;
        !           538: }
        !           539: 
        !           540: int dom_document_strict_error_checking_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           541: {
        !           542:        zval value_copy;
        !           543:        dom_doc_propsptr doc_prop;
        !           544: 
        !           545:        if(Z_REFCOUNT_P(newval) > 1) {
        !           546:                value_copy = *newval;
        !           547:                zval_copy_ctor(&value_copy);
        !           548:                newval = &value_copy;
        !           549:        }
        !           550:        convert_to_boolean(newval);
        !           551: 
        !           552:        if (obj->document) {
        !           553:                doc_prop = dom_get_doc_props(obj->document);
        !           554:                doc_prop->stricterror = Z_LVAL_P(newval);
        !           555:        }
        !           556: 
        !           557:        if (newval == &value_copy) {
        !           558:                zval_dtor(newval);
        !           559:        }
        !           560: 
        !           561:        return SUCCESS;
        !           562: }
        !           563: 
        !           564: /* }}} */
        !           565: 
        !           566: /* {{{ formatOutput    boolean 
        !           567: readonly=no
        !           568: */
        !           569: int dom_document_format_output_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           570: {
        !           571:        dom_doc_propsptr doc_prop;
        !           572: 
        !           573:        ALLOC_ZVAL(*retval);
        !           574:        if (obj->document) {
        !           575:                doc_prop = dom_get_doc_props(obj->document);
        !           576:                ZVAL_BOOL(*retval, doc_prop->formatoutput);
        !           577:        } else {
        !           578:                ZVAL_FALSE(*retval);
        !           579:        }
        !           580:        return SUCCESS;
        !           581: }
        !           582: 
        !           583: int dom_document_format_output_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           584: {
        !           585:        zval value_copy;
        !           586:        dom_doc_propsptr doc_prop;
        !           587: 
        !           588:        if(Z_REFCOUNT_P(newval) > 1) {
        !           589:                value_copy = *newval;
        !           590:                zval_copy_ctor(&value_copy);
        !           591:                newval = &value_copy;
        !           592:        }
        !           593:        convert_to_boolean(newval);
        !           594: 
        !           595:        if (obj->document) {
        !           596:                doc_prop = dom_get_doc_props(obj->document);
        !           597:                doc_prop->formatoutput = Z_LVAL_P(newval);
        !           598:        }
        !           599: 
        !           600:        if (newval == &value_copy) {
        !           601:                zval_dtor(newval);
        !           602:        }
        !           603: 
        !           604:        return SUCCESS;
        !           605: }
        !           606: /* }}} */
        !           607: 
        !           608: /* {{{ validateOnParse boolean 
        !           609: readonly=no
        !           610: */
        !           611: int    dom_document_validate_on_parse_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           612: {
        !           613:        dom_doc_propsptr doc_prop;
        !           614: 
        !           615:        ALLOC_ZVAL(*retval);
        !           616:        if (obj->document) {
        !           617:                doc_prop = dom_get_doc_props(obj->document);
        !           618:                ZVAL_BOOL(*retval, doc_prop->validateonparse);
        !           619:        } else {
        !           620:                ZVAL_FALSE(*retval);
        !           621:        }
        !           622:        return SUCCESS;
        !           623: }
        !           624: 
        !           625: int dom_document_validate_on_parse_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           626: {
        !           627:        zval value_copy;
        !           628:        dom_doc_propsptr doc_prop;
        !           629: 
        !           630:        if(Z_REFCOUNT_P(newval) > 1) {
        !           631:                value_copy = *newval;
        !           632:                zval_copy_ctor(&value_copy);
        !           633:                newval = &value_copy;
        !           634:        }
        !           635:        convert_to_boolean(newval);
        !           636: 
        !           637:        if (obj->document) {
        !           638:                doc_prop = dom_get_doc_props(obj->document);
        !           639:                doc_prop->validateonparse = Z_LVAL_P(newval);
        !           640:        }
        !           641: 
        !           642:        if (newval == &value_copy) {
        !           643:                zval_dtor(newval);
        !           644:        }
        !           645: 
        !           646:        return SUCCESS;
        !           647: }
        !           648: /* }}} */
        !           649: 
        !           650: /* {{{ resolveExternals        boolean 
        !           651: readonly=no
        !           652: */
        !           653: int dom_document_resolve_externals_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           654: {
        !           655:        dom_doc_propsptr doc_prop;
        !           656: 
        !           657:        ALLOC_ZVAL(*retval);
        !           658:        if (obj->document) {
        !           659:                doc_prop = dom_get_doc_props(obj->document);
        !           660:                ZVAL_BOOL(*retval, doc_prop->resolveexternals);
        !           661:        } else {
        !           662:                ZVAL_FALSE(*retval);
        !           663:        }
        !           664:        return SUCCESS;
        !           665: }
        !           666: 
        !           667: int dom_document_resolve_externals_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           668: {
        !           669:        zval value_copy;
        !           670:        dom_doc_propsptr doc_prop;
        !           671: 
        !           672:        if(Z_REFCOUNT_P(newval) > 1) {
        !           673:                value_copy = *newval;
        !           674:                zval_copy_ctor(&value_copy);
        !           675:                newval = &value_copy;
        !           676:        }
        !           677:        convert_to_boolean(newval);
        !           678: 
        !           679:        if (obj->document) {
        !           680:                doc_prop = dom_get_doc_props(obj->document);
        !           681:                doc_prop->resolveexternals = Z_LVAL_P(newval);
        !           682:        }
        !           683: 
        !           684:        if (newval == &value_copy) {
        !           685:                zval_dtor(newval);
        !           686:        }
        !           687: 
        !           688:        return SUCCESS;
        !           689: }
        !           690: /* }}} */
        !           691: 
        !           692: /* {{{ preserveWhiteSpace      boolean 
        !           693: readonly=no
        !           694: */
        !           695: int dom_document_preserve_whitespace_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           696: {
        !           697:        dom_doc_propsptr doc_prop;
        !           698: 
        !           699:        ALLOC_ZVAL(*retval);
        !           700:        if (obj->document) {
        !           701:                doc_prop = dom_get_doc_props(obj->document);
        !           702:                ZVAL_BOOL(*retval, doc_prop->preservewhitespace);
        !           703:        } else {
        !           704:                ZVAL_FALSE(*retval);
        !           705:        }
        !           706:        return SUCCESS;
        !           707: }
        !           708: 
        !           709: int dom_document_preserve_whitespace_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           710: {
        !           711:        zval value_copy;
        !           712:        dom_doc_propsptr doc_prop;
        !           713: 
        !           714:        if(Z_REFCOUNT_P(newval) > 1) {
        !           715:                value_copy = *newval;
        !           716:                zval_copy_ctor(&value_copy);
        !           717:                newval = &value_copy;
        !           718:        }
        !           719:        convert_to_boolean(newval);
        !           720: 
        !           721:        if (obj->document) {
        !           722:                doc_prop = dom_get_doc_props(obj->document);
        !           723:                doc_prop->preservewhitespace = Z_LVAL_P(newval);
        !           724:        }
        !           725: 
        !           726:        if (newval == &value_copy) {
        !           727:                zval_dtor(newval);
        !           728:        }
        !           729: 
        !           730:        return SUCCESS;
        !           731: }
        !           732: /* }}} */
        !           733: 
        !           734: /* {{{ recover boolean 
        !           735: readonly=no
        !           736: */
        !           737: int dom_document_recover_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           738: {
        !           739:        dom_doc_propsptr doc_prop;
        !           740: 
        !           741:        ALLOC_ZVAL(*retval);
        !           742:        if (obj->document) {
        !           743:                doc_prop = dom_get_doc_props(obj->document);
        !           744:                ZVAL_BOOL(*retval, doc_prop->recover);
        !           745:        } else {
        !           746:                ZVAL_FALSE(*retval);
        !           747:        }
        !           748:        return SUCCESS;
        !           749: }
        !           750: 
        !           751: int dom_document_recover_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           752: {
        !           753:        zval value_copy;
        !           754:        dom_doc_propsptr doc_prop;
        !           755: 
        !           756:        if(Z_REFCOUNT_P(newval) > 1) {
        !           757:                value_copy = *newval;
        !           758:                zval_copy_ctor(&value_copy);
        !           759:                newval = &value_copy;
        !           760:        }
        !           761:        convert_to_boolean(newval);
        !           762: 
        !           763:        if (obj->document) {
        !           764:                doc_prop = dom_get_doc_props(obj->document);
        !           765:                doc_prop->recover = Z_LVAL_P(newval);
        !           766:        }
        !           767: 
        !           768:        if (newval == &value_copy) {
        !           769:                zval_dtor(newval);
        !           770:        }
        !           771: 
        !           772:        return SUCCESS;
        !           773: }
        !           774: /* }}} */
        !           775: 
        !           776: /* {{{ substituteEntities      boolean 
        !           777: readonly=no
        !           778: */
        !           779: int dom_document_substitue_entities_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           780: {
        !           781:        dom_doc_propsptr doc_prop;
        !           782: 
        !           783:        ALLOC_ZVAL(*retval);
        !           784:        if (obj->document) {
        !           785:                doc_prop = dom_get_doc_props(obj->document);
        !           786:                ZVAL_BOOL(*retval, doc_prop->substituteentities);
        !           787:        } else {
        !           788:                ZVAL_FALSE(*retval);
        !           789:        }
        !           790:        return SUCCESS;
        !           791: }
        !           792: 
        !           793: int dom_document_substitue_entities_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           794: {
        !           795:        zval value_copy;
        !           796:        dom_doc_propsptr doc_prop;
        !           797: 
        !           798:        if(Z_REFCOUNT_P(newval) > 1) {
        !           799:                value_copy = *newval;
        !           800:                zval_copy_ctor(&value_copy);
        !           801:                newval = &value_copy;
        !           802:        }
        !           803:        convert_to_boolean(newval);
        !           804: 
        !           805:        if (obj->document) {
        !           806:                doc_prop = dom_get_doc_props(obj->document);
        !           807:                doc_prop->substituteentities = Z_LVAL_P(newval);
        !           808:        }
        !           809: 
        !           810:        if (newval == &value_copy) {
        !           811:                zval_dtor(newval);
        !           812:        }
        !           813: 
        !           814:        return SUCCESS;
        !           815: }
        !           816: /* }}} */
        !           817: 
        !           818: /* {{{ documentURI     string  
        !           819: readonly=no 
        !           820: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-documentURI
        !           821: Since: DOM Level 3
        !           822: */
        !           823: int dom_document_document_uri_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           824: {
        !           825:        xmlDoc *docp;
        !           826:        char *url;
        !           827: 
        !           828:        docp = (xmlDocPtr) dom_object_get_node(obj);
        !           829: 
        !           830:        if (docp == NULL) {
        !           831:                php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
        !           832:                return FAILURE;
        !           833:        }
        !           834: 
        !           835:        ALLOC_ZVAL(*retval);
        !           836:        url = (char *) docp->URL;
        !           837:        if (url != NULL) {
        !           838:                ZVAL_STRING(*retval, url, 1);
        !           839:        } else {
        !           840:                ZVAL_NULL(*retval);
        !           841:        }
        !           842: 
        !           843:        return SUCCESS;
        !           844: }
        !           845: 
        !           846: int dom_document_document_uri_write(dom_object *obj, zval *newval TSRMLS_DC)
        !           847: {
        !           848:        zval value_copy;
        !           849:        xmlDoc *docp;
        !           850: 
        !           851:        docp = (xmlDocPtr) dom_object_get_node(obj);
        !           852: 
        !           853:        if (docp == NULL) {
        !           854:                php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
        !           855:                return FAILURE;
        !           856:        }
        !           857: 
        !           858:        if (docp->URL != NULL) {
        !           859:                xmlFree((xmlChar *) docp->URL);
        !           860:        }
        !           861: 
        !           862:        if (newval->type != IS_STRING) {
        !           863:                if(Z_REFCOUNT_P(newval) > 1) {
        !           864:                        value_copy = *newval;
        !           865:                        zval_copy_ctor(&value_copy);
        !           866:                        newval = &value_copy;
        !           867:                }
        !           868:                convert_to_string(newval);
        !           869:        }
        !           870: 
        !           871:        docp->URL = xmlStrdup((const xmlChar *) Z_STRVAL_P(newval));
        !           872: 
        !           873:        if (newval == &value_copy) {
        !           874:                zval_dtor(newval);
        !           875:        }
        !           876: 
        !           877:        return SUCCESS;
        !           878: }
        !           879: 
        !           880: /* }}} */
        !           881: 
        !           882: /* {{{ config  DOMConfiguration        
        !           883: readonly=yes 
        !           884: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-config
        !           885: Since: DOM Level 3
        !           886: */
        !           887: int dom_document_config_read(dom_object *obj, zval **retval TSRMLS_DC)
        !           888: {
        !           889:        ALLOC_ZVAL(*retval);
        !           890:        ZVAL_NULL(*retval);
        !           891:        return SUCCESS;
        !           892: }
        !           893: 
        !           894: /* }}} */
        !           895: 
        !           896: /* {{{ proto DOMElement dom_document_create_element(string tagName [, string value]);
        !           897: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-2141741547
        !           898: Since: 
        !           899: */
        !           900: PHP_FUNCTION(dom_document_create_element)
        !           901: {
        !           902:        zval *id, *rv = NULL;
        !           903:        xmlNode *node;
        !           904:        xmlDocPtr docp;
        !           905:        dom_object *intern;
        !           906:        int ret, name_len, value_len;
        !           907:        char *name, *value = NULL;
        !           908: 
        !           909:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s", &id, dom_document_class_entry, &name, &name_len, &value, &value_len) == FAILURE) {
        !           910:                return;
        !           911:        }
        !           912: 
        !           913:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !           914: 
        !           915:        if (xmlValidateName((xmlChar *) name, 0) != 0) {
        !           916:                php_dom_throw_error(INVALID_CHARACTER_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
        !           917:                RETURN_FALSE;
        !           918:        }
        !           919: 
        !           920:        node = xmlNewDocNode(docp, NULL, name, value);
        !           921:        if (!node) {
        !           922:                RETURN_FALSE;
        !           923:        }
        !           924: 
        !           925:        DOM_RET_OBJ(rv, node, &ret, intern);
        !           926: }
        !           927: /* }}} end dom_document_create_element */
        !           928: 
        !           929: /* {{{ proto DOMDocumentFragment dom_document_create_document_fragment();
        !           930: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-35CB04B5
        !           931: Since: 
        !           932: */
        !           933: PHP_FUNCTION(dom_document_create_document_fragment)
        !           934: {
        !           935:        zval *id, *rv = NULL;
        !           936:        xmlNode *node;
        !           937:        xmlDocPtr docp;
        !           938:        dom_object *intern;
        !           939:        int ret;
        !           940: 
        !           941:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &id, dom_document_class_entry) == FAILURE) {
        !           942:                return;
        !           943:        }
        !           944: 
        !           945:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !           946: 
        !           947:        node =  xmlNewDocFragment(docp);
        !           948:        if (!node) {
        !           949:                RETURN_FALSE;
        !           950:        }
        !           951: 
        !           952:        DOM_RET_OBJ(rv, node, &ret, intern);
        !           953: }
        !           954: /* }}} end dom_document_create_document_fragment */
        !           955: 
        !           956: /* {{{ proto DOMText dom_document_create_text_node(string data);
        !           957: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1975348127
        !           958: Since: 
        !           959: */
        !           960: PHP_FUNCTION(dom_document_create_text_node)
        !           961: {
        !           962:        zval *id, *rv = NULL;
        !           963:        xmlNode *node;
        !           964:        xmlDocPtr docp;
        !           965:        int ret, value_len;
        !           966:        dom_object *intern;
        !           967:        char *value;
        !           968: 
        !           969:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &value, &value_len) == FAILURE) {
        !           970:                return;
        !           971:        }
        !           972: 
        !           973:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !           974: 
        !           975:        node = xmlNewDocText(docp, (xmlChar *) value);
        !           976:        if (!node) {
        !           977:                RETURN_FALSE;
        !           978:        }
        !           979: 
        !           980:        DOM_RET_OBJ(rv, node, &ret, intern);
        !           981: }
        !           982: /* }}} end dom_document_create_text_node */
        !           983: 
        !           984: /* {{{ proto DOMComment dom_document_create_comment(string data);
        !           985: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1334481328
        !           986: Since: 
        !           987: */
        !           988: PHP_FUNCTION(dom_document_create_comment)
        !           989: {
        !           990:        zval *id, *rv = NULL;
        !           991:        xmlNode *node;
        !           992:        xmlDocPtr docp;
        !           993:        int ret, value_len;
        !           994:        dom_object *intern;
        !           995:        char *value;
        !           996: 
        !           997:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &value, &value_len) == FAILURE) {
        !           998:                return;
        !           999:        }
        !          1000: 
        !          1001:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1002: 
        !          1003:        node = xmlNewDocComment(docp, (xmlChar *) value);
        !          1004:        if (!node) {
        !          1005:                RETURN_FALSE;
        !          1006:        }
        !          1007: 
        !          1008:        DOM_RET_OBJ(rv, node, &ret, intern);
        !          1009: }
        !          1010: /* }}} end dom_document_create_comment */
        !          1011: 
        !          1012: /* {{{ proto DOMCdataSection dom_document_create_cdatasection(string data);
        !          1013: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D26C0AF8
        !          1014: Since: 
        !          1015: */
        !          1016: PHP_FUNCTION(dom_document_create_cdatasection)
        !          1017: {
        !          1018:        zval *id, *rv = NULL;
        !          1019:        xmlNode *node;
        !          1020:        xmlDocPtr docp;
        !          1021:        int ret, value_len;
        !          1022:        dom_object *intern;
        !          1023:        char *value;
        !          1024: 
        !          1025:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &value, &value_len) == FAILURE) {
        !          1026:                return;
        !          1027:        }
        !          1028: 
        !          1029:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1030: 
        !          1031:        node = xmlNewCDataBlock(docp, (xmlChar *) value, value_len);
        !          1032:        if (!node) {
        !          1033:                RETURN_FALSE;
        !          1034:        }
        !          1035: 
        !          1036:        DOM_RET_OBJ(rv, node, &ret, intern);
        !          1037: }
        !          1038: /* }}} end dom_document_create_cdatasection */
        !          1039: 
        !          1040: /* {{{ proto DOMProcessingInstruction dom_document_create_processing_instruction(string target, string data);
        !          1041: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-135944439
        !          1042: Since: 
        !          1043: */
        !          1044: PHP_FUNCTION(dom_document_create_processing_instruction)
        !          1045: {
        !          1046:        zval *id, *rv = NULL;
        !          1047:        xmlNode *node;
        !          1048:        xmlDocPtr docp;
        !          1049:        int ret, value_len, name_len = 0;
        !          1050:        dom_object *intern;
        !          1051:        char *name, *value = NULL;
        !          1052: 
        !          1053:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s", &id, dom_document_class_entry, &name, &name_len, &value, &value_len) == FAILURE) {
        !          1054:                return;
        !          1055:        }
        !          1056: 
        !          1057:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1058: 
        !          1059:        if (xmlValidateName((xmlChar *) name, 0) != 0) {
        !          1060:                php_dom_throw_error(INVALID_CHARACTER_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
        !          1061:                RETURN_FALSE;
        !          1062:        }
        !          1063: 
        !          1064:        node = xmlNewPI((xmlChar *) name, (xmlChar *) value);
        !          1065:        if (!node) {
        !          1066:                RETURN_FALSE;
        !          1067:        }
        !          1068: 
        !          1069:        node->doc = docp;
        !          1070: 
        !          1071:        DOM_RET_OBJ(rv, node, &ret, intern);
        !          1072: }
        !          1073: /* }}} end dom_document_create_processing_instruction */
        !          1074: 
        !          1075: /* {{{ proto DOMAttr dom_document_create_attribute(string name);
        !          1076: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1084891198
        !          1077: Since: 
        !          1078: */
        !          1079: PHP_FUNCTION(dom_document_create_attribute)
        !          1080: {
        !          1081:        zval *id, *rv = NULL;
        !          1082:        xmlAttrPtr node;
        !          1083:        xmlDocPtr docp;
        !          1084:        int ret, name_len;
        !          1085:        dom_object *intern;
        !          1086:        char *name;
        !          1087: 
        !          1088:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &name, &name_len) == FAILURE) {
        !          1089:                return;
        !          1090:        }
        !          1091: 
        !          1092:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1093: 
        !          1094:        if (xmlValidateName((xmlChar *) name, 0) != 0) {
        !          1095:                php_dom_throw_error(INVALID_CHARACTER_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
        !          1096:                RETURN_FALSE;
        !          1097:        }
        !          1098: 
        !          1099:        node = xmlNewDocProp(docp, (xmlChar *) name, NULL);
        !          1100:        if (!node) {
        !          1101:                RETURN_FALSE;
        !          1102:        }
        !          1103: 
        !          1104:        DOM_RET_OBJ(rv, (xmlNodePtr) node, &ret, intern);
        !          1105: 
        !          1106: }
        !          1107: /* }}} end dom_document_create_attribute */
        !          1108: 
        !          1109: /* {{{ proto DOMEntityReference dom_document_create_entity_reference(string name);
        !          1110: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-392B75AE
        !          1111: Since: 
        !          1112: */
        !          1113: PHP_FUNCTION(dom_document_create_entity_reference)
        !          1114: {
        !          1115:        zval *id, *rv = NULL;
        !          1116:        xmlNode *node;
        !          1117:        xmlDocPtr docp = NULL;
        !          1118:        dom_object *intern;
        !          1119:        int ret, name_len;
        !          1120:        char *name;
        !          1121: 
        !          1122:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &name, &name_len) == FAILURE) {
        !          1123:                return;
        !          1124:        }
        !          1125: 
        !          1126:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1127: 
        !          1128:        if (xmlValidateName((xmlChar *) name, 0) != 0) {
        !          1129:                php_dom_throw_error(INVALID_CHARACTER_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
        !          1130:                RETURN_FALSE;
        !          1131:        }
        !          1132: 
        !          1133:        node = xmlNewReference(docp, name);
        !          1134:        if (!node) {
        !          1135:                RETURN_FALSE;
        !          1136:        }
        !          1137: 
        !          1138:        DOM_RET_OBJ(rv, (xmlNodePtr) node, &ret, intern);
        !          1139: }
        !          1140: /* }}} end dom_document_create_entity_reference */
        !          1141: 
        !          1142: /* {{{ proto DOMNodeList dom_document_get_elements_by_tag_name(string tagname);
        !          1143: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-A6C9094
        !          1144: Since: 
        !          1145: */
        !          1146: PHP_FUNCTION(dom_document_get_elements_by_tag_name)
        !          1147: {
        !          1148:        zval *id;
        !          1149:        xmlDocPtr docp;
        !          1150:        int name_len;
        !          1151:        dom_object *intern, *namednode;
        !          1152:        char *name;
        !          1153:        xmlChar *local;
        !          1154: 
        !          1155:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &name, &name_len) == FAILURE) {
        !          1156:                return;
        !          1157:        }
        !          1158: 
        !          1159:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1160: 
        !          1161:        php_dom_create_interator(return_value, DOM_NODELIST TSRMLS_CC);
        !          1162:        namednode = (dom_object *)zend_objects_get_address(return_value TSRMLS_CC);
        !          1163:        local = xmlCharStrndup(name, name_len);
        !          1164:        dom_namednode_iter(intern, 0, namednode, NULL, local, NULL TSRMLS_CC);
        !          1165: }
        !          1166: /* }}} end dom_document_get_elements_by_tag_name */
        !          1167: 
        !          1168: /* {{{ proto DOMNode dom_document_import_node(DOMNode importedNode, boolean deep);
        !          1169: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Core-Document-importNode
        !          1170: Since: DOM Level 2
        !          1171: */
        !          1172: PHP_FUNCTION(dom_document_import_node)
        !          1173: {
        !          1174:        zval *rv = NULL;
        !          1175:        zval *id, *node;
        !          1176:        xmlDocPtr docp;
        !          1177:        xmlNodePtr nodep, retnodep;
        !          1178:        dom_object *intern, *nodeobj;
        !          1179:        int ret; 
        !          1180:        long recursive = 0;
        !          1181: 
        !          1182:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO|l", &id, dom_document_class_entry, &node, dom_node_class_entry, &recursive) == FAILURE) {
        !          1183:                return;
        !          1184:        }
        !          1185: 
        !          1186:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1187: 
        !          1188:        DOM_GET_OBJ(nodep, node, xmlNodePtr, nodeobj);
        !          1189: 
        !          1190:        if (nodep->type == XML_HTML_DOCUMENT_NODE || nodep->type == XML_DOCUMENT_NODE 
        !          1191:                || nodep->type == XML_DOCUMENT_TYPE_NODE) {
        !          1192:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot import: Node Type Not Supported");
        !          1193:                RETURN_FALSE;
        !          1194:        }
        !          1195: 
        !          1196:        if (nodep->doc == docp) {
        !          1197:                retnodep = nodep;
        !          1198:        } else {
        !          1199:                if ((recursive == 0) && (nodep->type == XML_ELEMENT_NODE)) {
        !          1200:                        recursive = 2;
        !          1201:                }
        !          1202:                retnodep = xmlDocCopyNode(nodep, docp, recursive);
        !          1203:                if (!retnodep) {
        !          1204:                        RETURN_FALSE;
        !          1205:                }
        !          1206: 
        !          1207:                if ((retnodep->type == XML_ATTRIBUTE_NODE) && (nodep->ns != NULL)) {
        !          1208:                        xmlNsPtr nsptr = NULL;
        !          1209:                        xmlNodePtr root = xmlDocGetRootElement(docp);
        !          1210: 
        !          1211:                        nsptr = xmlSearchNsByHref (nodep->doc, root, nodep->ns->href);
        !          1212:                        if (nsptr == NULL) {
        !          1213:                                int errorcode;
        !          1214:                                nsptr = dom_get_ns(root, nodep->ns->href, &errorcode, nodep->ns->prefix);
        !          1215:                        }
        !          1216:                        xmlSetNs(retnodep, nsptr);
        !          1217:                }
        !          1218:        }
        !          1219: 
        !          1220:        DOM_RET_OBJ(rv, (xmlNodePtr) retnodep, &ret, intern);
        !          1221: }
        !          1222: /* }}} end dom_document_import_node */
        !          1223: 
        !          1224: /* {{{ proto DOMElement dom_document_create_element_ns(string namespaceURI, string qualifiedName [,string value]);
        !          1225: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-DocCrElNS
        !          1226: Since: DOM Level 2
        !          1227: */
        !          1228: PHP_FUNCTION(dom_document_create_element_ns)
        !          1229: {
        !          1230:        zval *id, *rv = NULL;
        !          1231:        xmlDocPtr docp;
        !          1232:        xmlNodePtr nodep = NULL;
        !          1233:        xmlNsPtr nsptr = NULL;
        !          1234:        int ret, uri_len = 0, name_len = 0, value_len = 0;
        !          1235:        char *uri, *name, *value = NULL;
        !          1236:        char *localname = NULL, *prefix = NULL;
        !          1237:        int errorcode;
        !          1238:        dom_object *intern;
        !          1239: 
        !          1240:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os!s|s", &id, dom_document_class_entry, &uri, &uri_len, &name, &name_len, &value, &value_len) == FAILURE) {
        !          1241:                return;
        !          1242:        }
        !          1243: 
        !          1244:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1245: 
        !          1246:        errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
        !          1247: 
        !          1248:        if (errorcode == 0) {
        !          1249:                if (xmlValidateName((xmlChar *) localname, 0) == 0) {
        !          1250:                        nodep = xmlNewDocNode (docp, NULL, localname, value);
        !          1251:                        if (nodep != NULL && uri != NULL) {
        !          1252:                                nsptr = xmlSearchNsByHref (nodep->doc, nodep, uri);
        !          1253:                                if (nsptr == NULL) {
        !          1254:                                        nsptr = dom_get_ns(nodep, uri, &errorcode, prefix);
        !          1255:                                }
        !          1256:                                xmlSetNs(nodep, nsptr);
        !          1257:                        }
        !          1258:                } else {
        !          1259:                        errorcode = INVALID_CHARACTER_ERR;
        !          1260:                }
        !          1261:        }
        !          1262: 
        !          1263:        xmlFree(localname);
        !          1264:        if (prefix != NULL) {
        !          1265:                xmlFree(prefix);
        !          1266:        }
        !          1267: 
        !          1268:        if (errorcode != 0) {
        !          1269:                if (nodep != NULL) {
        !          1270:                        xmlFreeNode(nodep);
        !          1271:                }
        !          1272:                php_dom_throw_error(errorcode, dom_get_strict_error(intern->document) TSRMLS_CC);
        !          1273:                RETURN_FALSE;
        !          1274:        }
        !          1275: 
        !          1276:        if (nodep == NULL) {
        !          1277:                RETURN_FALSE;
        !          1278:        }
        !          1279: 
        !          1280:        
        !          1281:        nodep->ns = nsptr;
        !          1282: 
        !          1283:        DOM_RET_OBJ(rv, nodep, &ret, intern);
        !          1284: }
        !          1285: /* }}} end dom_document_create_element_ns */
        !          1286: 
        !          1287: /* {{{ proto DOMAttr dom_document_create_attribute_ns(string namespaceURI, string qualifiedName);
        !          1288: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-DocCrAttrNS
        !          1289: Since: DOM Level 2
        !          1290: */
        !          1291: PHP_FUNCTION(dom_document_create_attribute_ns)
        !          1292: {
        !          1293:        zval *id, *rv = NULL;
        !          1294:        xmlDocPtr docp;
        !          1295:        xmlNodePtr nodep = NULL, root;
        !          1296:        xmlNsPtr nsptr;
        !          1297:        int ret, uri_len = 0, name_len = 0;
        !          1298:        char *uri, *name;
        !          1299:        char *localname = NULL, *prefix = NULL;
        !          1300:        dom_object *intern;
        !          1301:        int errorcode;
        !          1302: 
        !          1303:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os!s", &id, dom_document_class_entry, &uri, &uri_len, &name, &name_len) == FAILURE) {
        !          1304:                return;
        !          1305:        }
        !          1306: 
        !          1307:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1308: 
        !          1309:        root = xmlDocGetRootElement(docp);
        !          1310:        if (root != NULL) {
        !          1311:                errorcode = dom_check_qname(name, &localname, &prefix, uri_len, name_len);
        !          1312:                if (errorcode == 0) {
        !          1313:                        if (xmlValidateName((xmlChar *) localname, 0) == 0) {
        !          1314:                                nodep = (xmlNodePtr) xmlNewDocProp(docp, localname, NULL);
        !          1315:                                if (nodep != NULL && uri_len > 0) {
        !          1316:                                        nsptr = xmlSearchNsByHref (nodep->doc, root, uri);
        !          1317:                                        if (nsptr == NULL) {
        !          1318:                                                nsptr = dom_get_ns(root, uri, &errorcode, prefix);
        !          1319:                                        }
        !          1320:                                        xmlSetNs(nodep, nsptr);
        !          1321:                                }
        !          1322:                        } else {
        !          1323:                                errorcode = INVALID_CHARACTER_ERR;
        !          1324:                        }
        !          1325:                }
        !          1326:        } else {
        !          1327:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Document Missing Root Element");
        !          1328:                RETURN_FALSE;
        !          1329:        }
        !          1330: 
        !          1331:        xmlFree(localname);
        !          1332:        if (prefix != NULL) {
        !          1333:                xmlFree(prefix);
        !          1334:        }
        !          1335: 
        !          1336:        if (errorcode != 0) {
        !          1337:                if (nodep != NULL) {
        !          1338:                        xmlFreeProp((xmlAttrPtr) nodep);
        !          1339:                }
        !          1340:                php_dom_throw_error(errorcode, dom_get_strict_error(intern->document) TSRMLS_CC);
        !          1341:                RETURN_FALSE;
        !          1342:        }
        !          1343: 
        !          1344:        if (nodep == NULL) {
        !          1345:                RETURN_FALSE;
        !          1346:        }
        !          1347: 
        !          1348:        DOM_RET_OBJ(rv, nodep, &ret, intern);
        !          1349: }
        !          1350: /* }}} end dom_document_create_attribute_ns */
        !          1351: 
        !          1352: /* {{{ proto DOMNodeList dom_document_get_elements_by_tag_name_ns(string namespaceURI, string localName);
        !          1353: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getElBTNNS
        !          1354: Since: DOM Level 2
        !          1355: */
        !          1356: PHP_FUNCTION(dom_document_get_elements_by_tag_name_ns)
        !          1357: {
        !          1358:        zval *id;
        !          1359:        xmlDocPtr docp;
        !          1360:        int uri_len, name_len;
        !          1361:        dom_object *intern, *namednode;
        !          1362:        char *uri, *name;
        !          1363:        xmlChar *local, *nsuri;
        !          1364: 
        !          1365:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oss", &id, dom_document_class_entry, &uri, &uri_len, &name, &name_len) == FAILURE) {
        !          1366:                return;
        !          1367:        }
        !          1368: 
        !          1369:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1370: 
        !          1371:        php_dom_create_interator(return_value, DOM_NODELIST TSRMLS_CC);
        !          1372:        namednode = (dom_object *)zend_objects_get_address(return_value TSRMLS_CC);
        !          1373:        local = xmlCharStrndup(name, name_len);
        !          1374:        nsuri = xmlCharStrndup(uri, uri_len);
        !          1375:        dom_namednode_iter(intern, 0, namednode, NULL, local, nsuri TSRMLS_CC);
        !          1376: }
        !          1377: /* }}} end dom_document_get_elements_by_tag_name_ns */
        !          1378: 
        !          1379: /* {{{ proto DOMElement dom_document_get_element_by_id(string elementId);
        !          1380: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getElBId
        !          1381: Since: DOM Level 2
        !          1382: */
        !          1383: PHP_FUNCTION(dom_document_get_element_by_id)
        !          1384: {
        !          1385:        zval *id, *rv = NULL;
        !          1386:        xmlDocPtr docp;
        !          1387:        xmlAttrPtr  attrp;
        !          1388:        int ret, idname_len;
        !          1389:        dom_object *intern;
        !          1390:        char *idname;
        !          1391: 
        !          1392:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &idname, &idname_len) == FAILURE) {
        !          1393:                return;
        !          1394:        }
        !          1395: 
        !          1396:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1397: 
        !          1398:        attrp = xmlGetID(docp, (xmlChar *) idname);
        !          1399: 
        !          1400:        if (attrp && attrp->parent) {
        !          1401:                DOM_RET_OBJ(rv, (xmlNodePtr) attrp->parent, &ret, intern);
        !          1402:        } else {
        !          1403:                RETVAL_NULL();
        !          1404:        }
        !          1405: 
        !          1406: }
        !          1407: /* }}} end dom_document_get_element_by_id */
        !          1408: 
        !          1409: /* {{{ proto DOMNode dom_document_adopt_node(DOMNode source);
        !          1410: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-adoptNode
        !          1411: Since: DOM Level 3
        !          1412: */
        !          1413: PHP_FUNCTION(dom_document_adopt_node)
        !          1414: {
        !          1415:  DOM_NOT_IMPLEMENTED();
        !          1416: }
        !          1417: /* }}} end dom_document_adopt_node */
        !          1418: 
        !          1419: /* {{{ proto void dom_document_normalize_document();
        !          1420: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-normalizeDocument
        !          1421: Since: DOM Level 3
        !          1422: */
        !          1423: PHP_FUNCTION(dom_document_normalize_document)
        !          1424: {
        !          1425:        zval *id;
        !          1426:        xmlDocPtr docp;
        !          1427:        dom_object *intern;
        !          1428: 
        !          1429:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &id, dom_document_class_entry) == FAILURE) {
        !          1430:                return;
        !          1431:        }
        !          1432: 
        !          1433:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1434: 
        !          1435:        dom_normalize((xmlNodePtr) docp TSRMLS_CC);
        !          1436: }
        !          1437: /* }}} end dom_document_normalize_document */
        !          1438: 
        !          1439: /* {{{ proto DOMNode dom_document_rename_node(node n, string namespaceURI, string qualifiedName);
        !          1440: URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-renameNode
        !          1441: Since: DOM Level 3
        !          1442: */
        !          1443: PHP_FUNCTION(dom_document_rename_node)
        !          1444: {
        !          1445:  DOM_NOT_IMPLEMENTED();
        !          1446: }
        !          1447: /* }}} end dom_document_rename_node */
        !          1448: 
        !          1449: /* {{{ proto void DOMDocument::__construct([string version], [string encoding]); */
        !          1450: PHP_METHOD(domdocument, __construct)
        !          1451: {
        !          1452: 
        !          1453:        zval *id;
        !          1454:        xmlDoc *docp = NULL, *olddoc;
        !          1455:        dom_object *intern;
        !          1456:        char *encoding, *version = NULL;
        !          1457:        int encoding_len = 0, version_len = 0, refcount;
        !          1458:        zend_error_handling error_handling;
        !          1459: 
        !          1460:        zend_replace_error_handling(EH_THROW, dom_domexception_class_entry, &error_handling TSRMLS_CC);
        !          1461:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|ss", &id, dom_document_class_entry, &version, &version_len, &encoding, &encoding_len) == FAILURE) {
        !          1462:                zend_restore_error_handling(&error_handling TSRMLS_CC);
        !          1463:                return;
        !          1464:        }
        !          1465: 
        !          1466:        zend_restore_error_handling(&error_handling TSRMLS_CC);
        !          1467:        docp = xmlNewDoc(version);
        !          1468: 
        !          1469:        if (!docp) {
        !          1470:                php_dom_throw_error(INVALID_STATE_ERR, 1 TSRMLS_CC);
        !          1471:                RETURN_FALSE;
        !          1472:        }
        !          1473: 
        !          1474:        if (encoding_len > 0) {
        !          1475:                docp->encoding = (const xmlChar*)xmlStrdup(encoding);
        !          1476:        }
        !          1477: 
        !          1478:        intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
        !          1479:        if (intern != NULL) {
        !          1480:                olddoc = (xmlDocPtr) dom_object_get_node(intern);
        !          1481:                if (olddoc != NULL) {
        !          1482:                        php_libxml_decrement_node_ptr((php_libxml_node_object *) intern TSRMLS_CC);
        !          1483:                        refcount = php_libxml_decrement_doc_ref((php_libxml_node_object *)intern TSRMLS_CC);
        !          1484:                        if (refcount != 0) {
        !          1485:                                olddoc->_private = NULL;
        !          1486:                        }
        !          1487:                }
        !          1488:                intern->document = NULL;
        !          1489:                if (php_libxml_increment_doc_ref((php_libxml_node_object *)intern, docp TSRMLS_CC) == -1) {
        !          1490:                        RETURN_FALSE;
        !          1491:                }
        !          1492:                php_libxml_increment_node_ptr((php_libxml_node_object *)intern, (xmlNodePtr)docp, (void *)intern TSRMLS_CC);
        !          1493:        }
        !          1494: }
        !          1495: /* }}} end DOMDocument::__construct */
        !          1496: 
        !          1497: char *_dom_get_valid_file_path(char *source, char *resolved_path, int resolved_path_len  TSRMLS_DC) /* {{{ */
        !          1498: {
        !          1499:        xmlURI *uri;
        !          1500:        xmlChar *escsource;
        !          1501:        char *file_dest;
        !          1502:        int isFileUri = 0;
        !          1503: 
        !          1504:        uri = xmlCreateURI();
        !          1505:        escsource = xmlURIEscapeStr(source, ":");
        !          1506:        xmlParseURIReference(uri, escsource);
        !          1507:        xmlFree(escsource);
        !          1508: 
        !          1509:        if (uri->scheme != NULL) {
        !          1510:                /* absolute file uris - libxml only supports localhost or empty host */
        !          1511:                if (strncasecmp(source, "file:///",8) == 0) {
        !          1512:                        isFileUri = 1;
        !          1513: #ifdef PHP_WIN32
        !          1514:                        source += 8;
        !          1515: #else
        !          1516:                        source += 7;
        !          1517: #endif
        !          1518:                } else if (strncasecmp(source, "file://localhost/",17) == 0) {
        !          1519:                        isFileUri = 1;
        !          1520: #ifdef PHP_WIN32
        !          1521:                        source += 17;
        !          1522: #else
        !          1523:                        source += 16;
        !          1524: #endif
        !          1525:                }
        !          1526:        }
        !          1527: 
        !          1528:        file_dest = source;
        !          1529: 
        !          1530:        if ((uri->scheme == NULL || isFileUri)) {
        !          1531:                /* XXX possible buffer overflow if VCWD_REALPATH does not know size of resolved_path */
        !          1532:                if (!VCWD_REALPATH(source, resolved_path) && !expand_filepath(source, resolved_path TSRMLS_CC)) {
        !          1533:                        xmlFreeURI(uri);
        !          1534:                        return NULL;
        !          1535:                }
        !          1536:                file_dest = resolved_path;
        !          1537:        }
        !          1538: 
        !          1539:        xmlFreeURI(uri);
        !          1540: 
        !          1541:        return file_dest;
        !          1542: }
        !          1543: /* }}} */
        !          1544: 
        !          1545: static xmlDocPtr dom_document_parser(zval *id, int mode, char *source, int source_len, int options TSRMLS_DC) /* {{{ */
        !          1546: {
        !          1547:     xmlDocPtr ret;
        !          1548:     xmlParserCtxtPtr ctxt = NULL;
        !          1549:        dom_doc_propsptr doc_props;
        !          1550:        dom_object *intern;
        !          1551:        php_libxml_ref_obj *document = NULL;
        !          1552:        int validate, recover, resolve_externals, keep_blanks, substitute_ent;
        !          1553:        int resolved_path_len;
        !          1554:        int old_error_reporting = 0;
        !          1555:        char *directory=NULL, resolved_path[MAXPATHLEN];
        !          1556: 
        !          1557:        if (id != NULL) {
        !          1558:                intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
        !          1559:                document = intern->document;
        !          1560:        }
        !          1561: 
        !          1562:        doc_props = dom_get_doc_props(document);
        !          1563:        validate = doc_props->validateonparse;
        !          1564:        resolve_externals = doc_props->resolveexternals;
        !          1565:        keep_blanks = doc_props->preservewhitespace;
        !          1566:        substitute_ent = doc_props->substituteentities;
        !          1567:        recover = doc_props->recover;
        !          1568: 
        !          1569:        if (document == NULL) {
        !          1570:                efree(doc_props);
        !          1571:        }
        !          1572: 
        !          1573:        xmlInitParser();
        !          1574: 
        !          1575:        if (mode == DOM_LOAD_FILE) {
        !          1576:                char *file_dest = _dom_get_valid_file_path(source, resolved_path, MAXPATHLEN  TSRMLS_CC);
        !          1577:                if (file_dest) {
        !          1578:                        ctxt = xmlCreateFileParserCtxt(file_dest);
        !          1579:                }
        !          1580:                
        !          1581:        } else {
        !          1582:                ctxt = xmlCreateMemoryParserCtxt(source, source_len);
        !          1583:        }
        !          1584: 
        !          1585:        if (ctxt == NULL) {
        !          1586:                return(NULL);
        !          1587:        }
        !          1588: 
        !          1589:        /* If loading from memory, we need to set the base directory for the document */
        !          1590:        if (mode != DOM_LOAD_FILE) {
        !          1591: #if HAVE_GETCWD
        !          1592:                directory = VCWD_GETCWD(resolved_path, MAXPATHLEN);
        !          1593: #elif HAVE_GETWD
        !          1594:                directory = VCWD_GETWD(resolved_path);
        !          1595: #endif
        !          1596:                if (directory) {
        !          1597:                        if(ctxt->directory != NULL) {
        !          1598:                                xmlFree((char *) ctxt->directory);
        !          1599:                        }
        !          1600:                        resolved_path_len = strlen(resolved_path);
        !          1601:                        if (resolved_path[resolved_path_len - 1] != DEFAULT_SLASH) {
        !          1602:                                resolved_path[resolved_path_len] = DEFAULT_SLASH;
        !          1603:                                resolved_path[++resolved_path_len] = '\0';
        !          1604:                        }
        !          1605:                        ctxt->directory = (char *) xmlCanonicPath((const xmlChar *) resolved_path);
        !          1606:                }
        !          1607:        }
        !          1608: 
        !          1609:        ctxt->vctxt.error = php_libxml_ctx_error;
        !          1610:        ctxt->vctxt.warning = php_libxml_ctx_warning;
        !          1611: 
        !          1612:        if (ctxt->sax != NULL) {
        !          1613:                ctxt->sax->error = php_libxml_ctx_error;
        !          1614:                ctxt->sax->warning = php_libxml_ctx_warning;
        !          1615:        }
        !          1616: 
        !          1617:        if (validate && ! (options & XML_PARSE_DTDVALID)) {
        !          1618:                options |= XML_PARSE_DTDVALID;
        !          1619:        }
        !          1620:        if (resolve_externals && ! (options & XML_PARSE_DTDATTR)) {
        !          1621:                options |= XML_PARSE_DTDATTR;
        !          1622:        }
        !          1623:        if (substitute_ent && ! (options & XML_PARSE_NOENT)) {
        !          1624:                options |= XML_PARSE_NOENT;
        !          1625:        }
        !          1626:        if (keep_blanks == 0 && ! (options & XML_PARSE_NOBLANKS)) {
        !          1627:                options |= XML_PARSE_NOBLANKS;
        !          1628:        }
        !          1629: 
        !          1630:        xmlCtxtUseOptions(ctxt, options);
        !          1631: 
        !          1632:        ctxt->recovery = recover;
        !          1633:        if (recover) {
        !          1634:                old_error_reporting = EG(error_reporting);
        !          1635:                EG(error_reporting) = old_error_reporting | E_WARNING;
        !          1636:        }
        !          1637: 
        !          1638:        xmlParseDocument(ctxt);
        !          1639: 
        !          1640:        if (ctxt->wellFormed || recover) {
        !          1641:                ret = ctxt->myDoc;
        !          1642:                if (ctxt->recovery) {
        !          1643:                        EG(error_reporting) = old_error_reporting;
        !          1644:                }
        !          1645:                /* If loading from memory, set the base reference uri for the document */
        !          1646:                if (ret && ret->URL == NULL && ctxt->directory != NULL) {
        !          1647:                        ret->URL = xmlStrdup(ctxt->directory);
        !          1648:                }
        !          1649:        } else {
        !          1650:                ret = NULL;
        !          1651:                xmlFreeDoc(ctxt->myDoc);
        !          1652:                ctxt->myDoc = NULL;
        !          1653:        }
        !          1654: 
        !          1655:        xmlFreeParserCtxt(ctxt);
        !          1656: 
        !          1657:        return(ret);
        !          1658: }
        !          1659: /* }}} */
        !          1660: 
        !          1661: /* {{{ static void dom_parse_document(INTERNAL_FUNCTION_PARAMETERS, int mode) */
        !          1662: static void dom_parse_document(INTERNAL_FUNCTION_PARAMETERS, int mode) {
        !          1663:        zval *id, *rv = NULL;
        !          1664:        xmlDoc *docp = NULL, *newdoc;
        !          1665:        dom_doc_propsptr doc_prop;
        !          1666:        dom_object *intern;
        !          1667:        char *source;
        !          1668:        int source_len, refcount, ret;
        !          1669:        long options = 0;
        !          1670: 
        !          1671:        id = getThis();
        !          1672:        if (id != NULL && ! instanceof_function(Z_OBJCE_P(id), dom_document_class_entry TSRMLS_CC)) {
        !          1673:                id = NULL;
        !          1674:        }
        !          1675: 
        !          1676:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &source, &source_len, &options) == FAILURE) {
        !          1677:                return;
        !          1678:        }
        !          1679: 
        !          1680:        if (!source_len) {
        !          1681:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string supplied as input");
        !          1682:                RETURN_FALSE;
        !          1683:        }
        !          1684: 
        !          1685:        newdoc = dom_document_parser(id, mode, source, source_len, options TSRMLS_CC);
        !          1686: 
        !          1687:        if (!newdoc)
        !          1688:                RETURN_FALSE;
        !          1689: 
        !          1690:        if (id != NULL) {
        !          1691:                intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
        !          1692:                if (intern != NULL) {
        !          1693:                        docp = (xmlDocPtr) dom_object_get_node(intern);
        !          1694:                        doc_prop = NULL;
        !          1695:                        if (docp != NULL) {
        !          1696:                                php_libxml_decrement_node_ptr((php_libxml_node_object *) intern TSRMLS_CC);
        !          1697:                                doc_prop = intern->document->doc_props;
        !          1698:                                intern->document->doc_props = NULL;
        !          1699:                                refcount = php_libxml_decrement_doc_ref((php_libxml_node_object *)intern TSRMLS_CC);
        !          1700:                                if (refcount != 0) {
        !          1701:                                        docp->_private = NULL;
        !          1702:                                }
        !          1703:                        }
        !          1704:                        intern->document = NULL;
        !          1705:                        if (php_libxml_increment_doc_ref((php_libxml_node_object *)intern, newdoc TSRMLS_CC) == -1) {
        !          1706:                                RETURN_FALSE;
        !          1707:                        }
        !          1708:                        intern->document->doc_props = doc_prop;
        !          1709:                }
        !          1710: 
        !          1711:                php_libxml_increment_node_ptr((php_libxml_node_object *)intern, (xmlNodePtr)newdoc, (void *)intern TSRMLS_CC);
        !          1712: 
        !          1713:                RETURN_TRUE;
        !          1714:        } else {
        !          1715:                DOM_RET_OBJ(rv, (xmlNodePtr) newdoc, &ret, NULL);
        !          1716:        }
        !          1717: }
        !          1718: /* }}} end dom_parser_document */
        !          1719: 
        !          1720: /* {{{ proto DOMNode dom_document_load(string source [, int options]);
        !          1721: URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-load
        !          1722: Since: DOM Level 3
        !          1723: */
        !          1724: PHP_METHOD(domdocument, load)
        !          1725: {
        !          1726:        dom_parse_document(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE);
        !          1727: }
        !          1728: /* }}} end dom_document_load */
        !          1729: 
        !          1730: /* {{{ proto DOMNode dom_document_loadxml(string source [, int options]);
        !          1731: URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-loadXML
        !          1732: Since: DOM Level 3
        !          1733: */
        !          1734: PHP_METHOD(domdocument, loadXML)
        !          1735: {
        !          1736:        dom_parse_document(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING);
        !          1737: }
        !          1738: /* }}} end dom_document_loadxml */
        !          1739: 
        !          1740: /* {{{ proto int dom_document_save(string file);
        !          1741: Convenience method to save to file
        !          1742: */
        !          1743: PHP_FUNCTION(dom_document_save)
        !          1744: {
        !          1745:        zval *id;
        !          1746:        xmlDoc *docp;
        !          1747:        int file_len = 0, bytes, format, saveempty = 0;
        !          1748:        dom_object *intern;
        !          1749:        dom_doc_propsptr doc_props;
        !          1750:        char *file;
        !          1751:        long options = 0;
        !          1752: 
        !          1753:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|l", &id, dom_document_class_entry, &file, &file_len, &options) == FAILURE) {
        !          1754:                return;
        !          1755:        }
        !          1756: 
        !          1757:        if (file_len == 0) {
        !          1758:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Filename");
        !          1759:                RETURN_FALSE;
        !          1760:        }
        !          1761: 
        !          1762:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1763: 
        !          1764:        /* encoding handled by property on doc */
        !          1765: 
        !          1766:        doc_props = dom_get_doc_props(intern->document);
        !          1767:        format = doc_props->formatoutput;
        !          1768:        if (options & LIBXML_SAVE_NOEMPTYTAG) {
        !          1769:                saveempty = xmlSaveNoEmptyTags;
        !          1770:                xmlSaveNoEmptyTags = 1;
        !          1771:        }
        !          1772:        bytes = xmlSaveFormatFileEnc(file, docp, NULL, format);
        !          1773:        if (options & LIBXML_SAVE_NOEMPTYTAG) {
        !          1774:                xmlSaveNoEmptyTags = saveempty;
        !          1775:        }
        !          1776:        if (bytes == -1) {
        !          1777:                RETURN_FALSE;
        !          1778:        }
        !          1779:        RETURN_LONG(bytes);
        !          1780: }
        !          1781: /* }}} end dom_document_save */
        !          1782: 
        !          1783: /* {{{ proto string dom_document_savexml([node n]);
        !          1784: URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-saveXML
        !          1785: Since: DOM Level 3
        !          1786: */
        !          1787: PHP_FUNCTION(dom_document_savexml)
        !          1788: {
        !          1789:        zval *id, *nodep = NULL;
        !          1790:        xmlDoc *docp;
        !          1791:        xmlNode *node;
        !          1792:        xmlBufferPtr buf;
        !          1793:        xmlChar *mem;
        !          1794:        dom_object *intern, *nodeobj;
        !          1795:        dom_doc_propsptr doc_props;
        !          1796:        int size, format, saveempty = 0;
        !          1797:        long options = 0;
        !          1798: 
        !          1799:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|O!l", &id, dom_document_class_entry, &nodep, dom_node_class_entry, &options) == FAILURE) {
        !          1800:                return;
        !          1801:        }
        !          1802: 
        !          1803:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1804: 
        !          1805:        doc_props = dom_get_doc_props(intern->document);
        !          1806:        format = doc_props->formatoutput;
        !          1807: 
        !          1808:        if (nodep != NULL) {
        !          1809:                /* Dump contents of Node */
        !          1810:                DOM_GET_OBJ(node, nodep, xmlNodePtr, nodeobj);
        !          1811:                if (node->doc != docp) {
        !          1812:                        php_dom_throw_error(WRONG_DOCUMENT_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
        !          1813:                        RETURN_FALSE;
        !          1814:                }
        !          1815:                buf = xmlBufferCreate();
        !          1816:                if (!buf) {
        !          1817:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not fetch buffer");
        !          1818:                        RETURN_FALSE;
        !          1819:                }
        !          1820:                if (options & LIBXML_SAVE_NOEMPTYTAG) {
        !          1821:                        saveempty = xmlSaveNoEmptyTags;
        !          1822:                        xmlSaveNoEmptyTags = 1;
        !          1823:                }
        !          1824:                xmlNodeDump(buf, docp, node, 0, format);
        !          1825:                if (options & LIBXML_SAVE_NOEMPTYTAG) {
        !          1826:                        xmlSaveNoEmptyTags = saveempty;
        !          1827:                }
        !          1828:                mem = (xmlChar*) xmlBufferContent(buf);
        !          1829:                if (!mem) {
        !          1830:                        xmlBufferFree(buf);
        !          1831:                        RETURN_FALSE;
        !          1832:                }
        !          1833:                RETVAL_STRING(mem, 1);
        !          1834:                xmlBufferFree(buf);
        !          1835:        } else {
        !          1836:                if (options & LIBXML_SAVE_NOEMPTYTAG) {
        !          1837:                        saveempty = xmlSaveNoEmptyTags;
        !          1838:                        xmlSaveNoEmptyTags = 1;
        !          1839:                }
        !          1840:                /* Encoding is handled from the encoding property set on the document */
        !          1841:                xmlDocDumpFormatMemory(docp, &mem, &size, format);
        !          1842:                if (options & LIBXML_SAVE_NOEMPTYTAG) {
        !          1843:                        xmlSaveNoEmptyTags = saveempty;
        !          1844:                }
        !          1845:                if (!size) {
        !          1846:                        RETURN_FALSE;
        !          1847:                }
        !          1848:                RETVAL_STRINGL(mem, size, 1);
        !          1849:                xmlFree(mem);
        !          1850:        }
        !          1851: }
        !          1852: /* }}} end dom_document_savexml */
        !          1853: 
        !          1854: static xmlNodePtr php_dom_free_xinclude_node(xmlNodePtr cur TSRMLS_DC) /* {{{ */
        !          1855: {
        !          1856:        xmlNodePtr xincnode;
        !          1857: 
        !          1858:        xincnode = cur;
        !          1859:        cur = cur->next;
        !          1860:        xmlUnlinkNode(xincnode);
        !          1861:        php_libxml_node_free_resource(xincnode TSRMLS_CC);
        !          1862: 
        !          1863:        return cur;
        !          1864: }
        !          1865: /* }}} */
        !          1866: 
        !          1867: static void php_dom_remove_xinclude_nodes(xmlNodePtr cur TSRMLS_DC) /* {{{ */
        !          1868: {
        !          1869:        while(cur) {
        !          1870:                if (cur->type == XML_XINCLUDE_START) {
        !          1871:                        cur = php_dom_free_xinclude_node(cur TSRMLS_CC);
        !          1872: 
        !          1873:                        /* XML_XINCLUDE_END node will be a sibling of XML_XINCLUDE_START */
        !          1874:                        while(cur && cur->type != XML_XINCLUDE_END) {
        !          1875:                                /* remove xinclude processing nodes from recursive xincludes */
        !          1876:                                if (cur->type == XML_ELEMENT_NODE) {
        !          1877:                                           php_dom_remove_xinclude_nodes(cur->children TSRMLS_CC);
        !          1878:                                }
        !          1879:                                cur = cur->next;
        !          1880:                        }
        !          1881: 
        !          1882:                        if (cur && cur->type == XML_XINCLUDE_END) {
        !          1883:                                cur = php_dom_free_xinclude_node(cur TSRMLS_CC);
        !          1884:                        }
        !          1885:                } else {
        !          1886:                        if (cur->type == XML_ELEMENT_NODE) {
        !          1887:                                php_dom_remove_xinclude_nodes(cur->children TSRMLS_CC);
        !          1888:                        }
        !          1889:                        cur = cur->next;
        !          1890:                }
        !          1891:        }
        !          1892: }
        !          1893: /* }}} */
        !          1894: 
        !          1895: /* {{{ proto int dom_document_xinclude([int options])
        !          1896:    Substitutues xincludes in a DomDocument */
        !          1897: PHP_FUNCTION(dom_document_xinclude)
        !          1898: {
        !          1899:        zval *id;
        !          1900:        xmlDoc *docp;
        !          1901:        xmlNodePtr root;
        !          1902:        long flags = 0; 
        !          1903:        int err;
        !          1904:        dom_object *intern;
        !          1905: 
        !          1906:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &id, dom_document_class_entry, &flags) == FAILURE) {
        !          1907:                return;
        !          1908:        }
        !          1909: 
        !          1910:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1911: 
        !          1912:        err = xmlXIncludeProcessFlags(docp, flags);
        !          1913: 
        !          1914:        /* XML_XINCLUDE_START and XML_XINCLUDE_END nodes need to be removed as these
        !          1915:        are added via xmlXIncludeProcess to mark beginning and ending of xincluded document 
        !          1916:        but are not wanted in resulting document - must be done even if err as it could fail after
        !          1917:        having processed some xincludes */
        !          1918:        root = (xmlNodePtr) docp->children;
        !          1919:        while(root && root->type != XML_ELEMENT_NODE && root->type != XML_XINCLUDE_START) {
        !          1920:                root = root->next;
        !          1921:        }
        !          1922:        if (root) {
        !          1923:                php_dom_remove_xinclude_nodes(root TSRMLS_CC);
        !          1924:        }
        !          1925: 
        !          1926:        if (err) {
        !          1927:                RETVAL_LONG(err);
        !          1928:        } else {
        !          1929:                RETVAL_FALSE;
        !          1930:        }
        !          1931:     
        !          1932: }
        !          1933: /* }}} */
        !          1934: 
        !          1935: /* {{{ proto boolean dom_document_validate();
        !          1936: Since: DOM extended
        !          1937: */
        !          1938: PHP_FUNCTION(dom_document_validate)
        !          1939: {
        !          1940:        zval *id;
        !          1941:        xmlDoc *docp;
        !          1942:        dom_object *intern;
        !          1943:        xmlValidCtxt *cvp;
        !          1944: 
        !          1945:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &id, dom_document_class_entry) == FAILURE) {
        !          1946:                return;
        !          1947:        }
        !          1948: 
        !          1949:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1950: 
        !          1951:        cvp = xmlNewValidCtxt();
        !          1952:        
        !          1953:        cvp->userData = NULL;
        !          1954:        cvp->error    = (xmlValidityErrorFunc) php_libxml_error_handler;
        !          1955:        cvp->warning  = (xmlValidityErrorFunc) php_libxml_error_handler;
        !          1956:        
        !          1957:        if (xmlValidateDocument(cvp, docp)) {
        !          1958:                RETVAL_TRUE;
        !          1959:        } else {
        !          1960:                RETVAL_FALSE;
        !          1961:        }
        !          1962:        
        !          1963:        xmlFreeValidCtxt(cvp);
        !          1964:        
        !          1965: }
        !          1966: /* }}} */
        !          1967: 
        !          1968: #if defined(LIBXML_SCHEMAS_ENABLED)
        !          1969: static void _dom_document_schema_validate(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */
        !          1970: {
        !          1971:        zval *id;
        !          1972:        xmlDoc *docp;
        !          1973:        dom_object *intern;
        !          1974:        char *source = NULL, *valid_file = NULL;
        !          1975:        int source_len = 0;
        !          1976:        xmlSchemaParserCtxtPtr  parser;
        !          1977:        xmlSchemaPtr            sptr;
        !          1978:        xmlSchemaValidCtxtPtr   vptr;
        !          1979:        int                     is_valid;
        !          1980:        char resolved_path[MAXPATHLEN + 1];
        !          1981: 
        !          1982:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &source, &source_len) == FAILURE) {
        !          1983:                return;
        !          1984:        }
        !          1985: 
        !          1986:        if (source_len == 0) {
        !          1987:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Schema source");
        !          1988:                RETURN_FALSE;
        !          1989:        }
        !          1990: 
        !          1991:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          1992: 
        !          1993:        switch (type) {
        !          1994:        case DOM_LOAD_FILE:
        !          1995:                valid_file = _dom_get_valid_file_path(source, resolved_path, MAXPATHLEN  TSRMLS_CC);
        !          1996:                if (!valid_file) {
        !          1997:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Schema file source");
        !          1998:                        RETURN_FALSE;
        !          1999:                }
        !          2000:                parser = xmlSchemaNewParserCtxt(valid_file);
        !          2001:                break;
        !          2002:        case DOM_LOAD_STRING:
        !          2003:                parser = xmlSchemaNewMemParserCtxt(source, source_len);
        !          2004:                /* If loading from memory, we need to set the base directory for the document 
        !          2005:                   but it is not apparent how to do that for schema's */
        !          2006:                break;
        !          2007:        default:
        !          2008:                return;
        !          2009:        }
        !          2010: 
        !          2011:        xmlSchemaSetParserErrors(parser,
        !          2012:                (xmlSchemaValidityErrorFunc) php_libxml_error_handler,
        !          2013:                (xmlSchemaValidityWarningFunc) php_libxml_error_handler,
        !          2014:                parser);
        !          2015:        sptr = xmlSchemaParse(parser);
        !          2016:        xmlSchemaFreeParserCtxt(parser);
        !          2017:        if (!sptr) {
        !          2018:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Schema");
        !          2019:                RETURN_FALSE;
        !          2020:        }
        !          2021: 
        !          2022:        docp = (xmlDocPtr) dom_object_get_node(intern);
        !          2023: 
        !          2024:        vptr = xmlSchemaNewValidCtxt(sptr);
        !          2025:        if (!vptr) {
        !          2026:                xmlSchemaFree(sptr);
        !          2027:                php_error(E_ERROR, "Invalid Schema Validation Context");
        !          2028:                RETURN_FALSE;
        !          2029:        }
        !          2030: 
        !          2031:        xmlSchemaSetValidErrors(vptr, php_libxml_error_handler, php_libxml_error_handler, vptr);
        !          2032:        is_valid = xmlSchemaValidateDoc(vptr, docp);
        !          2033:        xmlSchemaFree(sptr);
        !          2034:        xmlSchemaFreeValidCtxt(vptr);
        !          2035: 
        !          2036:        if (is_valid == 0) {
        !          2037:                RETURN_TRUE;
        !          2038:        } else {
        !          2039:                RETURN_FALSE;
        !          2040:        }
        !          2041: }
        !          2042: /* }}} */
        !          2043: 
        !          2044: /* {{{ proto boolean dom_document_schema_validate_file(string filename); */
        !          2045: PHP_FUNCTION(dom_document_schema_validate_file)
        !          2046: {
        !          2047:        _dom_document_schema_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE);
        !          2048: }
        !          2049: /* }}} end dom_document_schema_validate_file */
        !          2050: 
        !          2051: /* {{{ proto boolean dom_document_schema_validate(string source); */
        !          2052: PHP_FUNCTION(dom_document_schema_validate_xml)
        !          2053: {
        !          2054:        _dom_document_schema_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING);
        !          2055: }
        !          2056: /* }}} end dom_document_schema_validate */
        !          2057: 
        !          2058: static void _dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */
        !          2059: {
        !          2060:        zval *id;
        !          2061:        xmlDoc *docp;
        !          2062:        dom_object *intern;
        !          2063:        char *source = NULL, *valid_file = NULL;
        !          2064:        int source_len = 0;
        !          2065:        xmlRelaxNGParserCtxtPtr parser;
        !          2066:        xmlRelaxNGPtr           sptr;
        !          2067:        xmlRelaxNGValidCtxtPtr  vptr;
        !          2068:        int                     is_valid;
        !          2069:        char resolved_path[MAXPATHLEN + 1];
        !          2070: 
        !          2071:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &source, &source_len) == FAILURE) {
        !          2072:                return;
        !          2073:        }
        !          2074: 
        !          2075:        if (source_len == 0) {
        !          2076:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Schema source");
        !          2077:                RETURN_FALSE;
        !          2078:        }
        !          2079: 
        !          2080:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          2081: 
        !          2082:        switch (type) {
        !          2083:        case DOM_LOAD_FILE:
        !          2084:                valid_file = _dom_get_valid_file_path(source, resolved_path, MAXPATHLEN  TSRMLS_CC);
        !          2085:                if (!valid_file) {
        !          2086:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid RelaxNG file source");
        !          2087:                        RETURN_FALSE;
        !          2088:                }
        !          2089:                parser = xmlRelaxNGNewParserCtxt(valid_file);
        !          2090:                break;
        !          2091:        case DOM_LOAD_STRING:
        !          2092:                parser = xmlRelaxNGNewMemParserCtxt(source, source_len);
        !          2093:                /* If loading from memory, we need to set the base directory for the document 
        !          2094:                   but it is not apparent how to do that for schema's */
        !          2095:                break;
        !          2096:        default:
        !          2097:                return;
        !          2098:        }
        !          2099: 
        !          2100:        xmlRelaxNGSetParserErrors(parser,
        !          2101:                (xmlRelaxNGValidityErrorFunc) php_libxml_error_handler,
        !          2102:                (xmlRelaxNGValidityWarningFunc) php_libxml_error_handler,
        !          2103:                parser);
        !          2104:        sptr = xmlRelaxNGParse(parser);
        !          2105:        xmlRelaxNGFreeParserCtxt(parser);
        !          2106:        if (!sptr) {
        !          2107:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid RelaxNG");
        !          2108:                RETURN_FALSE;
        !          2109:        }
        !          2110: 
        !          2111:        docp = (xmlDocPtr) dom_object_get_node(intern);
        !          2112: 
        !          2113:        vptr = xmlRelaxNGNewValidCtxt(sptr);
        !          2114:        if (!vptr) {
        !          2115:                xmlRelaxNGFree(sptr);
        !          2116:                php_error(E_ERROR, "Invalid RelaxNG Validation Context");
        !          2117:                RETURN_FALSE;
        !          2118:        }
        !          2119: 
        !          2120:        xmlRelaxNGSetValidErrors(vptr, php_libxml_error_handler, php_libxml_error_handler, vptr);
        !          2121:        is_valid = xmlRelaxNGValidateDoc(vptr, docp);
        !          2122:        xmlRelaxNGFree(sptr);
        !          2123:        xmlRelaxNGFreeValidCtxt(vptr);
        !          2124: 
        !          2125:        if (is_valid == 0) {
        !          2126:                RETURN_TRUE;
        !          2127:        } else {
        !          2128:                RETURN_FALSE;
        !          2129:        }
        !          2130: }
        !          2131: /* }}} */
        !          2132: 
        !          2133: /* {{{ proto boolean dom_document_relaxNG_validate_file(string filename); */
        !          2134: PHP_FUNCTION(dom_document_relaxNG_validate_file)
        !          2135: {
        !          2136:        _dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE);
        !          2137: }
        !          2138: /* }}} end dom_document_relaxNG_validate_file */
        !          2139: 
        !          2140: /* {{{ proto boolean dom_document_relaxNG_validate_xml(string source); */
        !          2141: PHP_FUNCTION(dom_document_relaxNG_validate_xml)
        !          2142: {
        !          2143:        _dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING);
        !          2144: }
        !          2145: /* }}} end dom_document_relaxNG_validate_xml */
        !          2146: 
        !          2147: #endif
        !          2148: 
        !          2149: #if defined(LIBXML_HTML_ENABLED)
        !          2150: 
        !          2151: static void dom_load_html(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */
        !          2152: {
        !          2153:        zval *id, *rv = NULL;
        !          2154:        xmlDoc *docp = NULL, *newdoc;
        !          2155:        dom_object *intern;
        !          2156:        dom_doc_propsptr doc_prop;
        !          2157:        char *source;
        !          2158:        int source_len, refcount, ret;
        !          2159:        htmlParserCtxtPtr ctxt;
        !          2160:        
        !          2161:        id = getThis();
        !          2162: 
        !          2163:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &source, &source_len) == FAILURE) {
        !          2164:                return;
        !          2165:        }
        !          2166: 
        !          2167:        if (!source_len) {
        !          2168:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string supplied as input");
        !          2169:                RETURN_FALSE;
        !          2170:        }
        !          2171: 
        !          2172:        if (mode == DOM_LOAD_FILE) {
        !          2173:                ctxt = htmlCreateFileParserCtxt(source, NULL);
        !          2174:        } else {
        !          2175:                source_len = xmlStrlen(source);
        !          2176:                ctxt = htmlCreateMemoryParserCtxt(source, source_len);
        !          2177:        }
        !          2178: 
        !          2179:        if (!ctxt) {
        !          2180:                RETURN_FALSE;
        !          2181:        }
        !          2182: 
        !          2183:        ctxt->vctxt.error = php_libxml_ctx_error;
        !          2184:        ctxt->vctxt.warning = php_libxml_ctx_warning;
        !          2185:        if (ctxt->sax != NULL) {
        !          2186:                ctxt->sax->error = php_libxml_ctx_error;
        !          2187:                ctxt->sax->warning = php_libxml_ctx_warning;
        !          2188:        }
        !          2189:        htmlParseDocument(ctxt);
        !          2190:        newdoc = ctxt->myDoc;
        !          2191:        htmlFreeParserCtxt(ctxt);
        !          2192:        
        !          2193:        if (!newdoc)
        !          2194:                RETURN_FALSE;
        !          2195: 
        !          2196:        if (id != NULL && instanceof_function(Z_OBJCE_P(id), dom_document_class_entry TSRMLS_CC)) {
        !          2197:                intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
        !          2198:                if (intern != NULL) {
        !          2199:                        docp = (xmlDocPtr) dom_object_get_node(intern);
        !          2200:                        doc_prop = NULL;
        !          2201:                        if (docp != NULL) {
        !          2202:                                php_libxml_decrement_node_ptr((php_libxml_node_object *) intern TSRMLS_CC);
        !          2203:                                doc_prop = intern->document->doc_props;
        !          2204:                                intern->document->doc_props = NULL;
        !          2205:                                refcount = php_libxml_decrement_doc_ref((php_libxml_node_object *)intern TSRMLS_CC);
        !          2206:                                if (refcount != 0) {
        !          2207:                                        docp->_private = NULL;
        !          2208:                                }
        !          2209:                        }
        !          2210:                        intern->document = NULL;
        !          2211:                        if (php_libxml_increment_doc_ref((php_libxml_node_object *)intern, newdoc TSRMLS_CC) == -1) {
        !          2212:                                RETURN_FALSE;
        !          2213:                        }
        !          2214:                        intern->document->doc_props = doc_prop;
        !          2215:                }
        !          2216: 
        !          2217:                php_libxml_increment_node_ptr((php_libxml_node_object *)intern, (xmlNodePtr)newdoc, (void *)intern TSRMLS_CC);
        !          2218: 
        !          2219:                RETURN_TRUE;
        !          2220:        } else {
        !          2221:                DOM_RET_OBJ(rv, (xmlNodePtr) newdoc, &ret, NULL);
        !          2222:        }
        !          2223: }
        !          2224: /* }}} */
        !          2225: 
        !          2226: /* {{{ proto DOMNode dom_document_load_html_file(string source);
        !          2227: Since: DOM extended
        !          2228: */
        !          2229: PHP_METHOD(domdocument, loadHTMLFile)
        !          2230: {
        !          2231:        dom_load_html(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE);
        !          2232: }
        !          2233: /* }}} end dom_document_load_html_file */
        !          2234: 
        !          2235: /* {{{ proto DOMNode dom_document_load_html(string source);
        !          2236: Since: DOM extended
        !          2237: */
        !          2238: PHP_METHOD(domdocument, loadHTML)
        !          2239: {
        !          2240:        dom_load_html(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING);
        !          2241: }
        !          2242: /* }}} end dom_document_load_html */
        !          2243: 
        !          2244: /* {{{ proto int dom_document_save_html_file(string file);
        !          2245: Convenience method to save to file as html
        !          2246: */
        !          2247: PHP_FUNCTION(dom_document_save_html_file)
        !          2248: {
        !          2249:        zval *id;
        !          2250:        xmlDoc *docp;
        !          2251:        int file_len, bytes, format;
        !          2252:        dom_object *intern;
        !          2253:        dom_doc_propsptr doc_props;
        !          2254:        char *file;
        !          2255:        const char *encoding;
        !          2256: 
        !          2257:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_document_class_entry, &file, &file_len) == FAILURE) {
        !          2258:                return;
        !          2259:        }
        !          2260: 
        !          2261:        if (file_len == 0) {
        !          2262:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid Filename");
        !          2263:                RETURN_FALSE;
        !          2264:        }
        !          2265: 
        !          2266:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          2267: 
        !          2268: 
        !          2269:        encoding = (const char *) htmlGetMetaEncoding(docp);
        !          2270: 
        !          2271:        doc_props = dom_get_doc_props(intern->document);
        !          2272:        format = doc_props->formatoutput;
        !          2273:        bytes = htmlSaveFileFormat(file, docp, encoding, format);
        !          2274: 
        !          2275:        if (bytes == -1) {
        !          2276:                RETURN_FALSE;
        !          2277:        }
        !          2278:        RETURN_LONG(bytes);
        !          2279: }
        !          2280: /* }}} end dom_document_save_html_file */
        !          2281: 
        !          2282: /* {{{ proto string dom_document_save_html();
        !          2283: Convenience method to output as html
        !          2284: */
        !          2285: PHP_FUNCTION(dom_document_save_html)
        !          2286: {
        !          2287:        zval *id, *nodep = NULL;
        !          2288:        xmlDoc *docp;
        !          2289:        xmlNode *node;
        !          2290:        xmlBufferPtr buf;
        !          2291:        dom_object *intern, *nodeobj;
        !          2292:        xmlChar *mem = NULL;
        !          2293:        int size, format;
        !          2294:        dom_doc_propsptr doc_props;
        !          2295: 
        !          2296:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
        !          2297:                "O|O!", &id, dom_document_class_entry, &nodep, dom_node_class_entry)
        !          2298:                == FAILURE) {
        !          2299:                return;
        !          2300:        }
        !          2301: 
        !          2302:        DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          2303: 
        !          2304:        doc_props = dom_get_doc_props(intern->document);
        !          2305:        format = doc_props->formatoutput;
        !          2306: 
        !          2307:        if (nodep != NULL) {
        !          2308:                /* Dump contents of Node */
        !          2309:                DOM_GET_OBJ(node, nodep, xmlNodePtr, nodeobj);
        !          2310:                if (node->doc != docp) {
        !          2311:                        php_dom_throw_error(WRONG_DOCUMENT_ERR, dom_get_strict_error(intern->document) TSRMLS_CC);
        !          2312:                        RETURN_FALSE;
        !          2313:                }
        !          2314:                
        !          2315:                buf = xmlBufferCreate();
        !          2316:                if (!buf) {
        !          2317:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not fetch buffer");
        !          2318:                        RETURN_FALSE;
        !          2319:                }
        !          2320:                
        !          2321:                size = htmlNodeDump(buf, docp, node);
        !          2322:                if (size >= 0) {
        !          2323:                        mem = (xmlChar*) xmlBufferContent(buf);
        !          2324:                        if (!mem) {
        !          2325:                                RETVAL_FALSE;
        !          2326:                        } else {
        !          2327:                                RETVAL_STRINGL((const char*) mem, size, 1);
        !          2328:                        }
        !          2329:                } else {
        !          2330:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error dumping HTML node");
        !          2331:                        RETVAL_FALSE;
        !          2332:                }
        !          2333:                xmlBufferFree(buf);
        !          2334:        } else {
        !          2335: #if LIBXML_VERSION >= 20623
        !          2336:                htmlDocDumpMemoryFormat(docp, &mem, &size, format);
        !          2337: #else
        !          2338:                htmlDocDumpMemory(docp, &mem, &size);
        !          2339: #endif
        !          2340:                if (!size) {
        !          2341:                        RETVAL_FALSE;
        !          2342:                } else {
        !          2343:                        RETVAL_STRINGL((const char*) mem, size, 1);
        !          2344:                }
        !          2345:                if (mem)
        !          2346:                        xmlFree(mem);
        !          2347:        }
        !          2348: 
        !          2349: }
        !          2350: /* }}} end dom_document_save_html */
        !          2351: 
        !          2352: #endif  /* defined(LIBXML_HTML_ENABLED) */
        !          2353: 
        !          2354: /* {{{ proto boolean DOMDocument::registerNodeClass(string baseclass, string extendedclass);
        !          2355:    Register extended class used to create base node type */
        !          2356: PHP_METHOD(domdocument, registerNodeClass)
        !          2357: {
        !          2358:        zval *id;
        !          2359:        xmlDoc *docp;
        !          2360:        char *baseclass = NULL, *extendedclass = NULL;
        !          2361:        int baseclass_len = 0, extendedclass_len = 0;
        !          2362:        zend_class_entry *basece = NULL, *ce = NULL;
        !          2363:        dom_object *intern;
        !          2364: 
        !          2365:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oss!", &id, dom_document_class_entry, &baseclass, &baseclass_len, &extendedclass, &extendedclass_len) == FAILURE) {
        !          2366:                return;
        !          2367:        }
        !          2368: 
        !          2369:        if (baseclass_len) {
        !          2370:                zend_class_entry **pce;
        !          2371:                if (zend_lookup_class(baseclass, baseclass_len, &pce TSRMLS_CC) == FAILURE) {
        !          2372:                        php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s does not exist", baseclass);
        !          2373:                        return;
        !          2374:                }
        !          2375:                basece = *pce;
        !          2376:        }
        !          2377: 
        !          2378:        if (basece == NULL || ! instanceof_function(basece, dom_node_class_entry TSRMLS_CC)) {
        !          2379:                php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s is not derived from DOMNode.", baseclass);
        !          2380:                return;
        !          2381:        }
        !          2382: 
        !          2383:        if (extendedclass_len) {
        !          2384:                zend_class_entry **pce;
        !          2385:                if (zend_lookup_class(extendedclass, extendedclass_len, &pce TSRMLS_CC) == FAILURE) {
        !          2386:                        php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s does not exist", extendedclass);
        !          2387:                }
        !          2388:                ce = *pce;
        !          2389:        }
        !          2390: 
        !          2391:        if (ce == NULL || instanceof_function(ce, basece TSRMLS_CC)) {
        !          2392: 
        !          2393:                DOM_GET_OBJ(docp, id, xmlDocPtr, intern);
        !          2394: 
        !          2395:                if (dom_set_doc_classmap(intern->document, basece, ce TSRMLS_CC) == FAILURE) {
        !          2396:                        php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s could not be registered.", extendedclass);
        !          2397:                }
        !          2398:                RETURN_TRUE;
        !          2399:        } else {
        !          2400:                php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s is not derived from %s.", extendedclass, baseclass);
        !          2401:        }
        !          2402: 
        !          2403:        RETURN_FALSE;
        !          2404: }
        !          2405: /* }}} */
        !          2406: 
        !          2407: #endif  /* HAVE_LIBXML && HAVE_DOM */
        !          2408: 
        !          2409: /*
        !          2410:  * Local variables:
        !          2411:  * tab-width: 4
        !          2412:  * c-basic-offset: 4
        !          2413:  * End:
        !          2414:  * vim600: noet sw=4 ts=4 fdm=marker
        !          2415:  * vim<600: noet sw=4 ts=4
        !          2416:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>