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>