Annotation of embedaddon/php/ext/dom/document.c, revision 1.1.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>