summaryrefslogtreecommitdiff
path: root/ext/xmlwriter
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2013-03-14 05:42:27 +0000
committer <>2013-04-03 16:25:08 +0000
commitc4dd7a1a684490673e25aaf4fabec5df138854c4 (patch)
tree4d57c44caae4480efff02b90b9be86f44bf25409 /ext/xmlwriter
downloadphp2-master.tar.gz
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/xmlwriter')
-rw-r--r--ext/xmlwriter/CREDITS2
-rw-r--r--ext/xmlwriter/TODO5
-rw-r--r--ext/xmlwriter/config.m426
-rw-r--r--ext/xmlwriter/config.w3218
-rw-r--r--ext/xmlwriter/examples/xmlwriter_file.php44
-rw-r--r--ext/xmlwriter/examples/xmlwriter_mem.php39
-rw-r--r--ext/xmlwriter/examples/xmlwriter_mem_ns.php30
-rw-r--r--ext/xmlwriter/examples/xmlwriter_oo.php9
-rw-r--r--ext/xmlwriter/package.xml107
-rw-r--r--ext/xmlwriter/package2.xml94
-rw-r--r--ext/xmlwriter/php_xmlwriter.c1997
-rw-r--r--ext/xmlwriter/php_xmlwriter.h61
-rw-r--r--ext/xmlwriter/tests/001.phpt25
-rw-r--r--ext/xmlwriter/tests/002.phpt22
-rw-r--r--ext/xmlwriter/tests/003.phpt35
-rw-r--r--ext/xmlwriter/tests/004.phpt36
-rw-r--r--ext/xmlwriter/tests/005.phpt33
-rw-r--r--ext/xmlwriter/tests/006.phpt26
-rw-r--r--ext/xmlwriter/tests/007.phpt38
-rw-r--r--ext/xmlwriter/tests/008.phpt40
-rw-r--r--ext/xmlwriter/tests/009.phpt45
-rw-r--r--ext/xmlwriter/tests/010.phpt45
-rw-r--r--ext/xmlwriter/tests/OO_001.phpt26
-rw-r--r--ext/xmlwriter/tests/OO_002.phpt22
-rw-r--r--ext/xmlwriter/tests/OO_003.phpt37
-rw-r--r--ext/xmlwriter/tests/OO_004.phpt37
-rw-r--r--ext/xmlwriter/tests/OO_005.phpt33
-rw-r--r--ext/xmlwriter/tests/OO_006.phpt27
-rw-r--r--ext/xmlwriter/tests/OO_007.phpt39
-rw-r--r--ext/xmlwriter/tests/OO_008.phpt35
-rw-r--r--ext/xmlwriter/tests/OO_009.phpt45
-rw-r--r--ext/xmlwriter/tests/bug39504.phpt36
-rw-r--r--ext/xmlwriter/tests/bug41287.phpt47
-rw-r--r--ext/xmlwriter/tests/bug41326.phpt56
-rw-r--r--ext/xmlwriter/tests/bug48204.phpt17
-rw-r--r--ext/xmlwriter/tests/xmlwriter_open_uri_error_001.phpt16
-rw-r--r--ext/xmlwriter/tests/xmlwriter_open_uri_error_002.phpt16
-rw-r--r--ext/xmlwriter/tests/xmlwriter_open_uri_error_003.phpt16
-rw-r--r--ext/xmlwriter/tests/xmlwriter_open_uri_error_004.phpt16
-rw-r--r--ext/xmlwriter/tests/xmlwriter_open_uri_error_005.phpt16
-rw-r--r--ext/xmlwriter/tests/xmlwriter_set_indent_string_basic_001.phpt24
-rw-r--r--ext/xmlwriter/tests/xmlwriter_set_indent_string_error_001.phpt24
-rw-r--r--ext/xmlwriter/tests/xmlwriter_write_attribute_ns_basic_001.phpt28
-rw-r--r--ext/xmlwriter/tests/xmlwriter_write_attribute_ns_error_001.phpt34
-rw-r--r--ext/xmlwriter/tests/xmlwriter_write_dtd_basic_001.phpt22
-rw-r--r--ext/xmlwriter/tests/xmlwriter_write_dtd_error_001.phpt15
-rw-r--r--ext/xmlwriter/xmlwriter.dsp113
47 files changed, 3574 insertions, 0 deletions
diff --git a/ext/xmlwriter/CREDITS b/ext/xmlwriter/CREDITS
new file mode 100644
index 0000000..e40bc65
--- /dev/null
+++ b/ext/xmlwriter/CREDITS
@@ -0,0 +1,2 @@
+XMLWriter
+Rob Richards, Pierre-Alain Joye
diff --git a/ext/xmlwriter/TODO b/ext/xmlwriter/TODO
new file mode 100644
index 0000000..bfc895d
--- /dev/null
+++ b/ext/xmlwriter/TODO
@@ -0,0 +1,5 @@
+- Fix up config file for PHP 5 to use libxml extension configuration
+- Add tests for Namespace functions/methods
+- Sync with xmlwriter (new dtd func?)
+- Write documentations in docbook
+
diff --git a/ext/xmlwriter/config.m4 b/ext/xmlwriter/config.m4
new file mode 100644
index 0000000..0a5d079
--- /dev/null
+++ b/ext/xmlwriter/config.m4
@@ -0,0 +1,26 @@
+dnl
+dnl $Id$
+dnl
+
+PHP_ARG_ENABLE(xmlwriter, whether to enable XMLWriter support,
+[ --disable-xmlwriter Disable XMLWriter support], yes)
+
+if test -z "$PHP_LIBXML_DIR"; then
+ PHP_ARG_WITH(libxml-dir, libxml2 install dir,
+ [ --with-libxml-dir=DIR XMLWriter: libxml2 install prefix], no, no)
+fi
+
+if test "$PHP_XMLWRITER" != "no"; then
+
+ if test "$PHP_LIBXML" = "no"; then
+ AC_MSG_ERROR([XMLWriter extension requires LIBXML extension, add --enable-libxml])
+ fi
+
+ PHP_SETUP_LIBXML(XMLWRITER_SHARED_LIBADD, [
+ AC_DEFINE(HAVE_XMLWRITER,1,[ ])
+ PHP_NEW_EXTENSION(xmlwriter, php_xmlwriter.c, $ext_shared)
+ PHP_SUBST(XMLWRITER_SHARED_LIBADD)
+ ], [
+ AC_MSG_ERROR([xml2-config not found. Please check your libxml2 installation.])
+ ])
+fi
diff --git a/ext/xmlwriter/config.w32 b/ext/xmlwriter/config.w32
new file mode 100644
index 0000000..31977ef
--- /dev/null
+++ b/ext/xmlwriter/config.w32
@@ -0,0 +1,18 @@
+// $Id$
+// vim:ft=javascript
+
+ARG_ENABLE("xmlwriter", "XMLWriter support", "yes");
+
+if (PHP_XMLWRITER == "yes" && PHP_LIBXML == "yes") {
+ if (CHECK_HEADER_ADD_INCLUDE('libxml/xmlwriter.h', 'CFLAGS_XMLWRITER', PHP_XMLWRITER)) {
+ EXTENSION("xmlwriter", "php_xmlwriter.c");
+ AC_DEFINE("HAVE_XMLWRITER", 1, "XMLWriter support");
+ if (!PHP_XMLWRITER_SHARED) {
+ ADD_FLAG("CFLAGS_XMLWRITER", "/D LIBXML_STATIC");
+ }
+ ADD_EXTENSION_DEP('xmlwriter', 'libxml');
+ } else {
+ WARNING('Could not find xmlwriter.h');
+ }
+}
+
diff --git a/ext/xmlwriter/examples/xmlwriter_file.php b/ext/xmlwriter/examples/xmlwriter_file.php
new file mode 100644
index 0000000..13bb262
--- /dev/null
+++ b/ext/xmlwriter/examples/xmlwriter_file.php
@@ -0,0 +1,44 @@
+<?php
+dl('xmlwriter.so');
+
+$xw = xmlwriter_open_uri('./a.xml');
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+// A first element
+xmlwriter_start_element($xw, 'tag1');
+
+// Attribute 'att1' for element 'tag1'
+xmlwriter_start_attribute($xw, 'att1');
+xmlwriter_text($xw, 'valueofatt1');
+xmlwriter_end_attribute($xw);
+
+xmlwriter_write_comment($xw, 'this is a comment.');
+
+// Start a child element
+xmlwriter_start_element($xw, 'tag11');
+xmlwriter_text($xw, utf8_encode('This is a sample text, ä'));
+xmlwriter_end_element($xw); // tag11
+
+xmlwriter_end_element($xw); // tag1
+
+
+// CDATA
+xmlwriter_start_element($xw, 'testc');
+xmlwriter_write_cdata($xw, "This is a cdata content");
+xmlwriter_end_element($xw); // testctag
+
+xmlwriter_start_element($xw, 'testc');
+xmlwriter_start_cdata($xw);
+xmlwriter_text($xw, "test cdata2");
+xmlwriter_end_cdata($xw);
+xmlwriter_end_element($xw); // testctag
+
+// A processing instruction
+xmlwriter_start_pi($xw, 'php');
+xmlwriter_text($xw, '$foo=2;echo $foo;');
+xmlwriter_end_pi($xw);
+
+xmlwriter_end_document($xw);
diff --git a/ext/xmlwriter/examples/xmlwriter_mem.php b/ext/xmlwriter/examples/xmlwriter_mem.php
new file mode 100644
index 0000000..8f8eef9
--- /dev/null
+++ b/ext/xmlwriter/examples/xmlwriter_mem.php
@@ -0,0 +1,39 @@
+<?php
+dl('xmlwriter.so');
+
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+
+// A first element
+xmlwriter_start_element($xw, 'tag1');
+
+// Attribute 'att1' for element 'tag1'
+xmlwriter_start_attribute($xw, 'att1');
+xmlwriter_text($xw, 'valueofatt1');
+xmlwriter_end_attribute($xw);
+
+xmlwriter_text($xw, utf8_encode('This is a sample text, ä'));
+xmlwriter_end_element($xw); // tag1
+
+
+$res = xmlwriter_start_comment($xw);
+xmlwriter_text($xw, "Demo text comment");
+$res = xmlwriter_end_comment($xw);
+
+xmlwriter_end_document($xw);
+$out = xmlwriter_output_memory($xw, 0);
+
+echo $out;
+
+// flush the xml buffer using optional
+// flust argument, default is 1
+$out = xmlwriter_output_memory($xw, 1);
+echo $out;
+
+
+$out = xmlwriter_output_memory($xw);
+echo $out;
+
diff --git a/ext/xmlwriter/examples/xmlwriter_mem_ns.php b/ext/xmlwriter/examples/xmlwriter_mem_ns.php
new file mode 100644
index 0000000..e4d0131
--- /dev/null
+++ b/ext/xmlwriter/examples/xmlwriter_mem_ns.php
@@ -0,0 +1,30 @@
+<?php
+dl('xmlwriter.so');
+
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, 1);
+$res = xmlwriter_set_indent_string($xw, ' ');
+
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+// A first element
+xmlwriter_start_element_ns($xw,'prefix', 'books', 'uri');
+xmlwriter_start_attribute($xw, 'isbn');
+
+/* Uncomment this line if you have libxml 2.6.17 or CVS version
+ after 2005/02/22
+ earlier versions segfault
+*/
+/*
+xmlwriter_start_attribute_ns($xw, 'prefix', 'isbn', 'uri');
+xmlwriter_end_attribute($xw);
+*/
+xmlwriter_end_attribute($xw);
+
+xmlwriter_text($xw, 'book1');
+xmlwriter_end_element($xw);
+
+xmlwriter_end_document($xw);
+$out = xmlwriter_output_memory($xw, 0);
+
+echo $out;
+
diff --git a/ext/xmlwriter/examples/xmlwriter_oo.php b/ext/xmlwriter/examples/xmlwriter_oo.php
new file mode 100644
index 0000000..01ada93
--- /dev/null
+++ b/ext/xmlwriter/examples/xmlwriter_oo.php
@@ -0,0 +1,9 @@
+<?php
+$xw = new XMLWriter();
+$xw->openUri('test.xml');
+$xw->startDocument("1.0");
+$xw->startElement("book");
+$xw->text("example");
+$xw->endElement();
+$xw->endDocument();
+$xw->flush(0);
diff --git a/ext/xmlwriter/package.xml b/ext/xmlwriter/package.xml
new file mode 100644
index 0000000..01f7ad4
--- /dev/null
+++ b/ext/xmlwriter/package.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE package SYSTEM "../package.dtd">
+<package>
+ <name>xmlwriter</name>
+ <summary>Provides fast, non-cached, forward-only means to write XML data.</summary>
+ <description>This extension wraps the libxml xmlWriter API. Represents a writer that provides a non-cached, forward-only means of generating streams or files containing XML data.
+</description>
+ <license>PHP</license>
+ <maintainers>
+ <maintainer>
+ <user>rrichards</user>
+ <name>Rob Richards</name>
+ <email>rrichards@php.net</email>
+ <role>lead</role>
+ </maintainer>
+ </maintainers>
+ <maintainer>
+ <user>pajoye</user>
+ <name>Pierre-Alain Joye</name>
+ <email>pajoye@php.net</email>
+ <role>developer</role>
+ </maintainer>
+ <release>
+ <version>2.0.2</version>
+ <date>2005-12-01</date>
+ <state>stable</state>
+ <notes>- fix build under 5.0
+- fix crash when XMLWriter is instantiated but not used
+- Switch from BSD-like license to PHP License 3.01
+</notes>
+ </release>
+ <changelog>
+ <release>
+ <version>2.0.0</version>
+ <date>2005-08-07</date>
+ <state>stable</state>
+ <notes>
+ fix tests using UTF-8
+ move to stable state
+ </notes>
+ </release>
+
+ <release>
+ <version>1.1.0</version>
+ <date>2005-05-24</date>
+ <state>beta</state>
+ <notes>
+ Add OO interface (php5 only)
+ Add test cases
+ </notes>
+ </release>
+ <release>
+ <release>
+ <version>2.0.1</version>
+ <date>2005-11-15</date>
+ <state>stable</state>
+ <notes>- Switch from PHP License to BSD-like license
+- Allow recursive calls to __get/__set for different properties (ilia)
+ </notes>
+ </release>
+ <version>1.0</version>
+ <date>2005-05-02</date>
+ <state>stable</state>
+ <notes>
+ Many Bug Fixes
+ Use PHP streams under PHP 4
+ Add xmlwriter_flush function to flush buffer
+ Add support for xmlTextWriterStart/EndComment
+ </notes>
+ </release>
+ <release>
+ <version>0.1</version>
+ <date>2004-07-20</date>
+ <state>alpha</state>
+ <notes>Initial Release </notes>
+ </release>
+ <release>
+ <version>0.2</version>
+ <date>2004-10-08</date>
+ <state>alpha</state>
+ <notes>Fix bug 2482 and other function parameters</notes>
+ </release>
+ </changelog>
+
+ <configureoptions>
+ <configureoption name="with-xmlwriter" default="autodetect" prompt="Include XMLWriter support?"/>
+ </configureoptions>
+ <filelist>
+ <file role="src" name="config.m4"/>
+ <file role="src" name="config.w32"/>
+ <file role="src" name="php_xmlwriter.c"/>
+ <file role="src" name="php_xmlwriter.h"/>
+ <dir name="tests" role="test">
+ <file name="001.phpt"/>
+ <file name="002.phpt"/>
+ <file name="003.phpt"/>
+ <file name="004.phpt"/>
+ <file name="OO_001.phpt"/>
+ <file name="OO_002.phpt"/>
+ <file name="OO_003.phpt"/>
+ <file name="OO_004.phpt"/>
+ </dir>
+ </filelist>
+ <deps>
+ <dep type="php" rel="ge" version="4.3.0" />
+ </deps>
+</package>
diff --git a/ext/xmlwriter/package2.xml b/ext/xmlwriter/package2.xml
new file mode 100644
index 0000000..ec6ef31
--- /dev/null
+++ b/ext/xmlwriter/package2.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0"?>
+<package packagerversion="1.4.0a2" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <name>xmlwriter</name>
+ <channel>pecl.php.net</channel>
+ <summary>Provides fast, non-cached, forward-only means to write XML data.</summary>
+ <description>This extension wraps the libxml xmlWriter API. Represents a writer that provides a non-cached, forward-only means of generating streams or files containing XML data.
+</description>
+ <lead>
+ <name>Rob Richards</name>
+ <user>rrichards</user>
+ <email>rrichards@php.net</email>
+ <active>yes</active>
+ </lead>
+ <developer>
+ <name>Pierre-Alain Joye</name>
+ <user>pajoye</user>
+ <email>pajoye@php.net</email>
+ <active>yes</active>
+ </developer>
+ <date>2005-12-01</date>
+ <version>
+ <release>2.0.2</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license/3_01.txt">PHP</license>
+ <notes>- fix build under 5.0
+- fix crash when XMLWriter is instantiated but not used
+- Switch from BSD-like license to PHP License 3.01
+</notes>
+ <contents>
+ <dir name="/">
+ <file role="src" name="config.m4"/>
+ <file role="src" name="config.w32"/>
+ <file role="src" name="php_xmlwriter.c"/>
+ <file role="src" name="php_xmlwriter.h"/>
+ <dir name="tests" role="test">
+ <file role="test" name="001.phpt"/>
+ <file role="test" name="002.phpt"/>
+ <file role="test" name="003.phpt"/>
+ <file role="test" name="004.phpt"/>
+ <file role="test" name="OO_001.phpt"/>
+ <file role="test" name="OO_002.phpt"/>
+ <file role="test" name="OO_003.phpt"/>
+ <file role="test" name="OO_004.phpt"/>
+ </dir>
+ </dir>
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>4.3.0</min>
+ </php>
+ <pearinstaller>
+ <min>1.4.0a2</min>
+ </pearinstaller>
+ </required>
+ </dependencies>
+ <providesextension>xmlwriter</providesextension>
+ <extsrcrelease />
+ <changelog>
+ <release>
+ <version>
+ <release>2.0.1</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
+ <notes>- Switch from PHP License to BSD-like license
+- Allow recursive calls to __get/__set for different properties (ilia)
+ </notes>
+ </release>
+ <release>
+ <date>2005-08-07</date>
+ <time>01:20:00</time>
+ <version>
+ <release>2.0.0</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>Promote to stable</notes>
+ </release>
+ </changelog>
+</package>
diff --git a/ext/xmlwriter/php_xmlwriter.c b/ext/xmlwriter/php_xmlwriter.c
new file mode 100644
index 0000000..0a1439c
--- /dev/null
+++ b/ext/xmlwriter/php_xmlwriter.c
@@ -0,0 +1,1997 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Rob Richards <rrichards@php.net> |
+ | Pierre-A. Joye <pajoye@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_xmlwriter.h"
+#include "ext/standard/php_string.h"
+
+#if LIBXML_VERSION >= 20605
+static PHP_FUNCTION(xmlwriter_set_indent);
+static PHP_FUNCTION(xmlwriter_set_indent_string);
+#endif
+static PHP_FUNCTION(xmlwriter_start_attribute);
+static PHP_FUNCTION(xmlwriter_end_attribute);
+static PHP_FUNCTION(xmlwriter_write_attribute);
+#if LIBXML_VERSION > 20617
+static PHP_FUNCTION(xmlwriter_start_attribute_ns);
+static PHP_FUNCTION(xmlwriter_write_attribute_ns);
+#endif
+static PHP_FUNCTION(xmlwriter_start_element);
+static PHP_FUNCTION(xmlwriter_end_element);
+static PHP_FUNCTION(xmlwriter_full_end_element);
+static PHP_FUNCTION(xmlwriter_start_element_ns);
+static PHP_FUNCTION(xmlwriter_write_element);
+static PHP_FUNCTION(xmlwriter_write_element_ns);
+static PHP_FUNCTION(xmlwriter_start_pi);
+static PHP_FUNCTION(xmlwriter_end_pi);
+static PHP_FUNCTION(xmlwriter_write_pi);
+static PHP_FUNCTION(xmlwriter_start_cdata);
+static PHP_FUNCTION(xmlwriter_end_cdata);
+static PHP_FUNCTION(xmlwriter_write_cdata);
+static PHP_FUNCTION(xmlwriter_text);
+static PHP_FUNCTION(xmlwriter_write_raw);
+static PHP_FUNCTION(xmlwriter_start_document);
+static PHP_FUNCTION(xmlwriter_end_document);
+#if LIBXML_VERSION >= 20607
+static PHP_FUNCTION(xmlwriter_start_comment);
+static PHP_FUNCTION(xmlwriter_end_comment);
+#endif
+static PHP_FUNCTION(xmlwriter_write_comment);
+static PHP_FUNCTION(xmlwriter_start_dtd);
+static PHP_FUNCTION(xmlwriter_end_dtd);
+static PHP_FUNCTION(xmlwriter_write_dtd);
+static PHP_FUNCTION(xmlwriter_start_dtd_element);
+static PHP_FUNCTION(xmlwriter_end_dtd_element);
+static PHP_FUNCTION(xmlwriter_write_dtd_element);
+#if LIBXML_VERSION > 20608
+static PHP_FUNCTION(xmlwriter_start_dtd_attlist);
+static PHP_FUNCTION(xmlwriter_end_dtd_attlist);
+static PHP_FUNCTION(xmlwriter_write_dtd_attlist);
+static PHP_FUNCTION(xmlwriter_start_dtd_entity);
+static PHP_FUNCTION(xmlwriter_end_dtd_entity);
+static PHP_FUNCTION(xmlwriter_write_dtd_entity);
+#endif
+static PHP_FUNCTION(xmlwriter_open_uri);
+static PHP_FUNCTION(xmlwriter_open_memory);
+static PHP_FUNCTION(xmlwriter_output_memory);
+static PHP_FUNCTION(xmlwriter_flush);
+
+static zend_class_entry *xmlwriter_class_entry_ce;
+
+static void xmlwriter_free_resource_ptr(xmlwriter_object *intern TSRMLS_DC);
+static void xmlwriter_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC);
+
+typedef int (*xmlwriter_read_one_char_t)(xmlTextWriterPtr writer, const xmlChar *content);
+typedef int (*xmlwriter_read_int_t)(xmlTextWriterPtr writer);
+
+/* {{{ xmlwriter_object_free_storage */
+static void xmlwriter_free_resource_ptr(xmlwriter_object *intern TSRMLS_DC)
+{
+ if (intern) {
+ if (intern->ptr) {
+ xmlFreeTextWriter(intern->ptr);
+ intern->ptr = NULL;
+ }
+ if (intern->output) {
+ xmlBufferFree(intern->output);
+ intern->output = NULL;
+ }
+ efree(intern);
+ }
+}
+/* }}} */
+
+#ifdef ZEND_ENGINE_2
+/* {{{ XMLWRITER_FROM_OBJECT */
+#define XMLWRITER_FROM_OBJECT(intern, object) \
+ { \
+ ze_xmlwriter_object *obj = (ze_xmlwriter_object*) zend_object_store_get_object(object TSRMLS_CC); \
+ intern = obj->xmlwriter_ptr; \
+ if (!intern) { \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or unitialized XMLWriter object"); \
+ RETURN_FALSE; \
+ } \
+ }
+/* }}} */
+
+static zend_object_handlers xmlwriter_object_handlers;
+
+/* {{{ xmlwriter_object_free_storage */
+static void xmlwriter_object_free_storage(void *object TSRMLS_DC)
+{
+ ze_xmlwriter_object * intern = (ze_xmlwriter_object *) object;
+ if (!intern) {
+ return;
+ }
+ if (intern->xmlwriter_ptr) {
+ xmlwriter_free_resource_ptr(intern->xmlwriter_ptr TSRMLS_CC);
+ }
+ intern->xmlwriter_ptr = NULL;
+ zend_object_std_dtor(&intern->zo TSRMLS_CC);
+
+ efree(intern);
+}
+/* }}} */
+
+
+/* {{{ xmlwriter_object_new */
+static zend_object_value xmlwriter_object_new(zend_class_entry *class_type TSRMLS_DC)
+{
+ ze_xmlwriter_object *intern;
+ zend_object_value retval;
+
+ intern = emalloc(sizeof(ze_xmlwriter_object));
+ memset(&intern->zo, 0, sizeof(zend_object));
+ intern->xmlwriter_ptr = NULL;
+
+ zend_object_std_init(&intern->zo, class_type TSRMLS_CC);
+ object_properties_init(&intern->zo, class_type);
+
+ retval.handle = zend_objects_store_put(intern,
+ NULL,
+ (zend_objects_free_object_storage_t) xmlwriter_object_free_storage,
+ NULL TSRMLS_CC);
+
+ retval.handlers = (zend_object_handlers *) & xmlwriter_object_handlers;
+
+ return retval;
+}
+/* }}} */
+#endif
+
+#define XMLW_NAME_CHK(__err) \
+ if (xmlValidateName((xmlChar *) name, 0) != 0) { \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", __err); \
+ RETURN_FALSE; \
+ } \
+
+/* {{{ arginfo */
+ZEND_BEGIN_ARG_INFO(arginfo_xmlwriter_void, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_resource, 0, 0, 1)
+ ZEND_ARG_INFO(0, xmlwriter)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_open_uri, 0, 0, 1)
+ ZEND_ARG_INFO(0, uri)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_set_indent, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, indent)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_set_indent, 0, 0, 1)
+ ZEND_ARG_INFO(0, indent)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_set_indent_string, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, indentString)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_set_indent_string, 0, 0, 1)
+ ZEND_ARG_INFO(0, indentString)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_attribute, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, name)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_attribute, 0, 0, 1)
+ ZEND_ARG_INFO(0, name)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_attribute_ns, 0, 0, 4)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, prefix)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, uri)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_attribute_ns, 0, 0, 3)
+ ZEND_ARG_INFO(0, prefix)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, uri)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_attribute_ns, 0, 0, 5)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, prefix)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, uri)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_attribute_ns, 0, 0, 4)
+ ZEND_ARG_INFO(0, prefix)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, uri)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_attribute, 0, 0, 3)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_attribute, 0, 0, 2)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_element, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, name)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_element, 0, 0, 1)
+ ZEND_ARG_INFO(0, name)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_element_ns, 0, 0, 4)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, prefix)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, uri)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_element_ns, 0, 0, 3)
+ ZEND_ARG_INFO(0, prefix)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, uri)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_element, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_element, 0, 0, 1)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_element_ns, 0, 0, 4)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, prefix)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, uri)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_element_ns, 0, 0, 3)
+ ZEND_ARG_INFO(0, prefix)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, uri)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_pi, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, target)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_pi, 0, 0, 1)
+ ZEND_ARG_INFO(0, target)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_pi, 0, 0, 3)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, target)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_pi, 0, 0, 2)
+ ZEND_ARG_INFO(0, target)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_cdata, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_cdata, 0, 0, 1)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_text, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_text, 0, 0, 1)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_raw, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_raw, 0, 0, 1)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_document, 0, 0, 1)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, version)
+ ZEND_ARG_INFO(0, encoding)
+ ZEND_ARG_INFO(0, standalone)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_document, 0, 0, 0)
+ ZEND_ARG_INFO(0, version)
+ ZEND_ARG_INFO(0, encoding)
+ ZEND_ARG_INFO(0, standalone)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_comment, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_comment, 0, 0, 1)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_dtd, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, qualifiedName)
+ ZEND_ARG_INFO(0, publicId)
+ ZEND_ARG_INFO(0, systemId)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_dtd, 0, 0, 1)
+ ZEND_ARG_INFO(0, qualifiedName)
+ ZEND_ARG_INFO(0, publicId)
+ ZEND_ARG_INFO(0, systemId)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_dtd, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, publicId)
+ ZEND_ARG_INFO(0, systemId)
+ ZEND_ARG_INFO(0, subset)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_dtd, 0, 0, 1)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, publicId)
+ ZEND_ARG_INFO(0, systemId)
+ ZEND_ARG_INFO(0, subset)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_dtd_element, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, qualifiedName)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_dtd_element, 0, 0, 1)
+ ZEND_ARG_INFO(0, qualifiedName)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_dtd_element, 0, 0, 3)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_dtd_element, 0, 0, 2)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_dtd_attlist, 0, 0, 2)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, name)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_dtd_attlist, 0, 0, 1)
+ ZEND_ARG_INFO(0, name)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_dtd_attlist, 0, 0, 3)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_dtd_attlist, 0, 0, 2)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_dtd_entity, 0, 0, 3)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, isparam)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_dtd_entity, 0, 0, 2)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, isparam)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_dtd_entity, 0, 0, 3)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_dtd_entity, 0, 0, 2)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, content)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_output_memory, 0, 0, 1)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, flush)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_output_memory, 0, 0, 0)
+ ZEND_ARG_INFO(0, flush)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_flush, 0, 0, 1)
+ ZEND_ARG_INFO(0, xmlwriter)
+ ZEND_ARG_INFO(0, empty)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_flush, 0, 0, 0)
+ ZEND_ARG_INFO(0, empty)
+ZEND_END_ARG_INFO()
+/* }}} */
+
+/* {{{ xmlwriter_functions */
+static const zend_function_entry xmlwriter_functions[] = {
+ PHP_FE(xmlwriter_open_uri, arginfo_xmlwriter_open_uri)
+ PHP_FE(xmlwriter_open_memory, arginfo_xmlwriter_void)
+#if LIBXML_VERSION >= 20605
+ PHP_FE(xmlwriter_set_indent, arginfo_xmlwriter_set_indent)
+ PHP_FE(xmlwriter_set_indent_string, arginfo_xmlwriter_set_indent_string)
+#endif
+#if LIBXML_VERSION >= 20607
+ PHP_FE(xmlwriter_start_comment, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_end_comment, arginfo_xmlwriter_resource)
+#endif
+ PHP_FE(xmlwriter_start_attribute, arginfo_xmlwriter_start_attribute)
+ PHP_FE(xmlwriter_end_attribute, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_write_attribute, arginfo_xmlwriter_write_attribute)
+#if LIBXML_VERSION > 20617
+ PHP_FE(xmlwriter_start_attribute_ns,arginfo_xmlwriter_start_attribute_ns)
+ PHP_FE(xmlwriter_write_attribute_ns,arginfo_xmlwriter_write_attribute_ns)
+#endif
+ PHP_FE(xmlwriter_start_element, arginfo_xmlwriter_start_element)
+ PHP_FE(xmlwriter_end_element, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_full_end_element, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_start_element_ns, arginfo_xmlwriter_start_element_ns)
+ PHP_FE(xmlwriter_write_element, arginfo_xmlwriter_write_element)
+ PHP_FE(xmlwriter_write_element_ns, arginfo_xmlwriter_write_element_ns)
+ PHP_FE(xmlwriter_start_pi, arginfo_xmlwriter_start_pi)
+ PHP_FE(xmlwriter_end_pi, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_write_pi, arginfo_xmlwriter_write_pi)
+ PHP_FE(xmlwriter_start_cdata, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_end_cdata, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_write_cdata, arginfo_xmlwriter_write_cdata)
+ PHP_FE(xmlwriter_text, arginfo_xmlwriter_text)
+ PHP_FE(xmlwriter_write_raw, arginfo_xmlwriter_write_raw)
+ PHP_FE(xmlwriter_start_document, arginfo_xmlwriter_start_document)
+ PHP_FE(xmlwriter_end_document, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_write_comment, arginfo_xmlwriter_write_comment)
+ PHP_FE(xmlwriter_start_dtd, arginfo_xmlwriter_start_dtd)
+ PHP_FE(xmlwriter_end_dtd, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_write_dtd, arginfo_xmlwriter_write_dtd)
+ PHP_FE(xmlwriter_start_dtd_element, arginfo_xmlwriter_start_dtd_element)
+ PHP_FE(xmlwriter_end_dtd_element, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_write_dtd_element, arginfo_xmlwriter_write_dtd_element)
+#if LIBXML_VERSION > 20608
+ PHP_FE(xmlwriter_start_dtd_attlist, arginfo_xmlwriter_start_dtd_attlist)
+ PHP_FE(xmlwriter_end_dtd_attlist, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_write_dtd_attlist, arginfo_xmlwriter_write_dtd_attlist)
+ PHP_FE(xmlwriter_start_dtd_entity, arginfo_xmlwriter_start_dtd_entity)
+ PHP_FE(xmlwriter_end_dtd_entity, arginfo_xmlwriter_resource)
+ PHP_FE(xmlwriter_write_dtd_entity, arginfo_xmlwriter_write_dtd_entity)
+#endif
+ PHP_FE(xmlwriter_output_memory, arginfo_xmlwriter_output_memory)
+ PHP_FE(xmlwriter_flush, arginfo_xmlwriter_flush)
+ PHP_FE_END
+};
+/* }}} */
+
+#ifdef ZEND_ENGINE_2
+/* {{{ xmlwriter_class_functions */
+static const zend_function_entry xmlwriter_class_functions[] = {
+ PHP_ME_MAPPING(openUri, xmlwriter_open_uri, arginfo_xmlwriter_open_uri, 0)
+ PHP_ME_MAPPING(openMemory, xmlwriter_open_memory, arginfo_xmlwriter_void, 0)
+#if LIBXML_VERSION >= 20605
+ PHP_ME_MAPPING(setIndent, xmlwriter_set_indent, arginfo_xmlwriter_method_set_indent, 0)
+ PHP_ME_MAPPING(setIndentString, xmlwriter_set_indent_string, arginfo_xmlwriter_method_set_indent_string, 0)
+#endif
+#if LIBXML_VERSION >= 20607
+ PHP_ME_MAPPING(startComment, xmlwriter_start_comment, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(endComment, xmlwriter_end_comment, arginfo_xmlwriter_void, 0)
+#endif
+ PHP_ME_MAPPING(startAttribute, xmlwriter_start_attribute, arginfo_xmlwriter_method_start_attribute, 0)
+ PHP_ME_MAPPING(endAttribute, xmlwriter_end_attribute, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(writeAttribute, xmlwriter_write_attribute, arginfo_xmlwriter_method_write_attribute, 0)
+#if LIBXML_VERSION > 20617
+ PHP_ME_MAPPING(startAttributeNs, xmlwriter_start_attribute_ns,arginfo_xmlwriter_method_start_attribute_ns, 0)
+ PHP_ME_MAPPING(writeAttributeNs, xmlwriter_write_attribute_ns,arginfo_xmlwriter_method_write_attribute_ns, 0)
+#endif
+ PHP_ME_MAPPING(startElement, xmlwriter_start_element, arginfo_xmlwriter_method_start_element, 0)
+ PHP_ME_MAPPING(endElement, xmlwriter_end_element, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(fullEndElement, xmlwriter_full_end_element, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(startElementNs, xmlwriter_start_element_ns, arginfo_xmlwriter_method_start_element_ns, 0)
+ PHP_ME_MAPPING(writeElement, xmlwriter_write_element, arginfo_xmlwriter_method_write_element, 0)
+ PHP_ME_MAPPING(writeElementNs, xmlwriter_write_element_ns, arginfo_xmlwriter_method_write_element_ns, 0)
+ PHP_ME_MAPPING(startPi, xmlwriter_start_pi, arginfo_xmlwriter_method_start_pi, 0)
+ PHP_ME_MAPPING(endPi, xmlwriter_end_pi, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(writePi, xmlwriter_write_pi, arginfo_xmlwriter_method_write_pi, 0)
+ PHP_ME_MAPPING(startCdata, xmlwriter_start_cdata, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(endCdata, xmlwriter_end_cdata, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(writeCdata, xmlwriter_write_cdata, arginfo_xmlwriter_method_write_cdata, 0)
+ PHP_ME_MAPPING(text, xmlwriter_text, arginfo_xmlwriter_method_text, 0)
+ PHP_ME_MAPPING(writeRaw, xmlwriter_write_raw, arginfo_xmlwriter_method_write_raw, 0)
+ PHP_ME_MAPPING(startDocument, xmlwriter_start_document, arginfo_xmlwriter_method_start_document, 0)
+ PHP_ME_MAPPING(endDocument, xmlwriter_end_document, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(writeComment, xmlwriter_write_comment, arginfo_xmlwriter_method_write_comment, 0)
+ PHP_ME_MAPPING(startDtd, xmlwriter_start_dtd, arginfo_xmlwriter_method_start_dtd, 0)
+ PHP_ME_MAPPING(endDtd, xmlwriter_end_dtd, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(writeDtd, xmlwriter_write_dtd, arginfo_xmlwriter_method_write_dtd, 0)
+ PHP_ME_MAPPING(startDtdElement, xmlwriter_start_dtd_element,arginfo_xmlwriter_method_start_dtd_element, 0)
+ PHP_ME_MAPPING(endDtdElement, xmlwriter_end_dtd_element, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(writeDtdElement, xmlwriter_write_dtd_element, arginfo_xmlwriter_method_write_dtd_element, 0)
+#if LIBXML_VERSION > 20608
+ PHP_ME_MAPPING(startDtdAttlist, xmlwriter_start_dtd_attlist, arginfo_xmlwriter_method_start_dtd_attlist, 0)
+ PHP_ME_MAPPING(endDtdAttlist, xmlwriter_end_dtd_attlist, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(writeDtdAttlist, xmlwriter_write_dtd_attlist, arginfo_xmlwriter_method_write_dtd_attlist, 0)
+ PHP_ME_MAPPING(startDtdEntity, xmlwriter_start_dtd_entity, arginfo_xmlwriter_method_start_dtd_entity, 0)
+ PHP_ME_MAPPING(endDtdEntity, xmlwriter_end_dtd_entity, arginfo_xmlwriter_void, 0)
+ PHP_ME_MAPPING(writeDtdEntity, xmlwriter_write_dtd_entity, arginfo_xmlwriter_method_write_dtd_entity, 0)
+#endif
+ PHP_ME_MAPPING(outputMemory, xmlwriter_output_memory, arginfo_xmlwriter_method_output_memory, 0)
+ PHP_ME_MAPPING(flush, xmlwriter_flush, arginfo_xmlwriter_method_flush, 0)
+ {NULL, NULL, NULL}
+};
+/* }}} */
+#endif
+
+/* {{{ function prototypes */
+static PHP_MINIT_FUNCTION(xmlwriter);
+static PHP_MSHUTDOWN_FUNCTION(xmlwriter);
+static PHP_MINFO_FUNCTION(xmlwriter);
+
+static int le_xmlwriter;
+/* }}} */
+
+/* _xmlwriter_get_valid_file_path should be made a
+ common function in libxml extension as code is common to a few xml extensions */
+/* {{{ _xmlwriter_get_valid_file_path */
+static char *_xmlwriter_get_valid_file_path(char *source, char *resolved_path, int resolved_path_len TSRMLS_DC) {
+ xmlURI *uri;
+ xmlChar *escsource;
+ char *file_dest;
+ int isFileUri = 0;
+
+ uri = xmlCreateURI();
+ escsource = xmlURIEscapeStr((xmlChar *)source, (xmlChar *) ":");
+ xmlParseURIReference(uri, (char *)escsource);
+ xmlFree(escsource);
+
+ if (uri->scheme != NULL) {
+ /* absolute file uris - libxml only supports localhost or empty host */
+ if (strncasecmp(source, "file:///", 8) == 0) {
+ if (source[sizeof("file:///") - 1] == '\0') {
+ xmlFreeURI(uri);
+ return NULL;
+ }
+ isFileUri = 1;
+#ifdef PHP_WIN32
+ source += 8;
+#else
+ source += 7;
+#endif
+ } else if (strncasecmp(source, "file://localhost/",17) == 0) {
+ if (source[sizeof("file://localhost/") - 1] == '\0') {
+ xmlFreeURI(uri);
+ return NULL;
+ }
+
+ isFileUri = 1;
+#ifdef PHP_WIN32
+ source += 17;
+#else
+ source += 16;
+#endif
+ }
+ }
+
+ if ((uri->scheme == NULL || isFileUri)) {
+ char file_dirname[MAXPATHLEN];
+ size_t dir_len;
+
+ if (!VCWD_REALPATH(source, resolved_path) && !expand_filepath(source, resolved_path TSRMLS_CC)) {
+ xmlFreeURI(uri);
+ return NULL;
+ }
+
+ memcpy(file_dirname, source, strlen(source));
+ dir_len = php_dirname(file_dirname, strlen(source));
+
+ if (dir_len > 0) {
+ struct stat buf;
+ if (php_sys_stat(file_dirname, &buf) != 0) {
+ xmlFreeURI(uri);
+ return NULL;
+ }
+ }
+
+ file_dest = resolved_path;
+ } else {
+ file_dest = source;
+ }
+
+ xmlFreeURI(uri);
+
+ return file_dest;
+}
+/* }}} */
+
+#ifndef ZEND_ENGINE_2
+/* Channel libxml file io layer through the PHP streams subsystem.
+ * This allows use of ftps:// and https:// urls */
+
+/* {{{ php_xmlwriter_streams_IO_open_write_wrapper */
+static void *php_xmlwriter_streams_IO_open_write_wrapper(const char *filename TSRMLS_DC)
+{
+ php_stream_wrapper *wrapper = NULL;
+ void *ret_val = NULL;
+
+ ret_val = php_stream_open_wrapper_ex((char *)filename, "wb", REPORT_ERRORS, NULL, NULL);
+ return ret_val;
+}
+/* }}} */
+
+/* {{{ php_xmlwriter_streams_IO_write */
+static int php_xmlwriter_streams_IO_write(void *context, const char *buffer, int len)
+{
+ TSRMLS_FETCH();
+ return php_stream_write((php_stream*)context, buffer, len);
+}
+/* }}} */
+
+/* {{{ php_xmlwriter_streams_IO_close */
+static int php_xmlwriter_streams_IO_close(void *context)
+{
+ TSRMLS_FETCH();
+ return php_stream_close((php_stream*)context);
+}
+/* }}} */
+#endif
+
+/* {{{ xmlwriter_module_entry
+ */
+zend_module_entry xmlwriter_module_entry = {
+ STANDARD_MODULE_HEADER,
+ "xmlwriter",
+ xmlwriter_functions,
+ PHP_MINIT(xmlwriter),
+ PHP_MSHUTDOWN(xmlwriter),
+ NULL,
+ NULL,
+ PHP_MINFO(xmlwriter),
+ "0.1",
+ STANDARD_MODULE_PROPERTIES
+};
+/* }}} */
+
+#ifdef COMPILE_DL_XMLWRITER
+ZEND_GET_MODULE(xmlwriter)
+#endif
+
+/* {{{ xmlwriter_objects_clone
+static void xmlwriter_objects_clone(void *object, void **object_clone TSRMLS_DC)
+{
+ TODO
+}
+}}} */
+
+/* {{{ xmlwriter_dtor */
+static void xmlwriter_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
+ xmlwriter_object *intern;
+
+ intern = (xmlwriter_object *) rsrc->ptr;
+ xmlwriter_free_resource_ptr(intern TSRMLS_CC);
+}
+/* }}} */
+
+static void php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAMETERS, xmlwriter_read_one_char_t internal_function, char *err_string)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name;
+ int name_len, retval;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &pind, &name, &name_len) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ if (err_string != NULL) {
+ XMLW_NAME_CHK(err_string);
+ }
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = internal_function(ptr, (xmlChar *) name);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+
+static void php_xmlwriter_end(INTERNAL_FUNCTION_PARAMETERS, xmlwriter_read_int_t internal_function)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ int retval;
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ XMLWRITER_FROM_OBJECT(intern, this);
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = internal_function(ptr);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+
+#if LIBXML_VERSION >= 20605
+/* {{{ proto bool xmlwriter_set_indent(resource xmlwriter, bool indent)
+Toggle indentation on/off - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_set_indent)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ int retval;
+ zend_bool indent;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &indent) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rb", &pind, &indent) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+
+ ptr = intern->ptr;
+ if (ptr) {
+ retval = xmlTextWriterSetIndent(ptr, indent);
+ if (retval == 0) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_set_indent_string(resource xmlwriter, string indentString)
+Set string used for indenting - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_set_indent_string)
+{
+ php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterSetIndentString, NULL);
+}
+/* }}} */
+
+#endif
+
+/* {{{ proto bool xmlwriter_start_attribute(resource xmlwriter, string name)
+Create start attribute - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_attribute)
+{
+ php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterStartAttribute, "Invalid Attribute Name");
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_end_attribute(resource xmlwriter)
+End attribute - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_end_attribute)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndAttribute);
+}
+/* }}} */
+
+#if LIBXML_VERSION > 20617
+/* {{{ proto bool xmlwriter_start_attribute_ns(resource xmlwriter, string prefix, string name, string uri)
+Create start namespaced attribute - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_attribute_ns)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *prefix, *uri;
+ int name_len, prefix_len, uri_len, retval;
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss!",
+ &prefix, &prefix_len, &name, &name_len, &uri, &uri_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsss!", &pind,
+ &prefix, &prefix_len, &name, &name_len, &uri, &uri_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid Attribute Name");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterStartAttributeNS(ptr, (xmlChar *)prefix, (xmlChar *)name, (xmlChar *)uri);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+#endif
+
+/* {{{ proto bool xmlwriter_write_attribute(resource xmlwriter, string name, string content)
+Write full attribute - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_attribute)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *content;
+ int name_len, content_len, retval;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
+ &name, &name_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &pind,
+ &name, &name_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid Attribute Name");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterWriteAttribute(ptr, (xmlChar *)name, (xmlChar *)content);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+#if LIBXML_VERSION > 20617
+/* {{{ proto bool xmlwriter_write_attribute_ns(resource xmlwriter, string prefix, string name, string uri, string content)
+Write full namespaced attribute - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_attribute_ns)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *prefix, *uri, *content;
+ int name_len, prefix_len, uri_len, content_len, retval;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss!s",
+ &prefix, &prefix_len, &name, &name_len, &uri, &uri_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsss!s", &pind,
+ &prefix, &prefix_len, &name, &name_len, &uri, &uri_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid Attribute Name");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterWriteAttributeNS(ptr, (xmlChar *)prefix, (xmlChar *)name, (xmlChar *)uri, (xmlChar *)content);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+#endif
+
+/* {{{ proto bool xmlwriter_start_element(resource xmlwriter, string name)
+Create start element tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_element)
+{
+ php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterStartElement, "Invalid Element Name");
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_start_element_ns(resource xmlwriter, string prefix, string name, string uri)
+Create start namespaced element tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_element_ns)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *prefix, *uri;
+ int name_len, prefix_len, uri_len, retval;
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s!ss!",
+ &prefix, &prefix_len, &name, &name_len, &uri, &uri_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs!ss!", &pind,
+ &prefix, &prefix_len, &name, &name_len, &uri, &uri_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid Element Name");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterStartElementNS(ptr, (xmlChar *)prefix, (xmlChar *)name, (xmlChar *)uri);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_end_element(resource xmlwriter)
+End current element - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_end_element)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndElement);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_full_end_element(resource xmlwriter)
+End current element - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_full_end_element)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterFullEndElement);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_write_element(resource xmlwriter, string name[, string content])
+Write full element tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_element)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *content = NULL;
+ int name_len, content_len, retval;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!",
+ &name, &name_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s!", &pind,
+ &name, &name_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid Element Name");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ if (!content) {
+ retval = xmlTextWriterStartElement(ptr, (xmlChar *)name);
+ if (retval == -1) {
+ RETURN_FALSE;
+ }
+ xmlTextWriterEndElement(ptr);
+ if (retval == -1) {
+ RETURN_FALSE;
+ }
+ } else {
+ retval = xmlTextWriterWriteElement(ptr, (xmlChar *)name, (xmlChar *)content);
+ }
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_write_element_ns(resource xmlwriter, string prefix, string name, string uri[, string content])
+Write full namesapced element tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_element_ns)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *prefix, *uri, *content = NULL;
+ int name_len, prefix_len, uri_len, content_len, retval;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s!ss!|s!",
+ &prefix, &prefix_len, &name, &name_len, &uri, &uri_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs!ss!|s!", &pind,
+ &prefix, &prefix_len, &name, &name_len, &uri, &uri_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid Element Name");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ if (!content) {
+ retval = xmlTextWriterStartElementNS(ptr,(xmlChar *)prefix, (xmlChar *)name, (xmlChar *)uri);
+ if (retval == -1) {
+ RETURN_FALSE;
+ }
+ retval = xmlTextWriterEndElement(ptr);
+ if (retval == -1) {
+ RETURN_FALSE;
+ }
+ } else {
+ retval = xmlTextWriterWriteElementNS(ptr, (xmlChar *)prefix, (xmlChar *)name, (xmlChar *)uri, (xmlChar *)content);
+ }
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_start_pi(resource xmlwriter, string target)
+Create start PI tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_pi)
+{
+ php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterStartPI, "Invalid PI Target");
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_end_pi(resource xmlwriter)
+End current PI - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_end_pi)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndPI);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_write_pi(resource xmlwriter, string target, string content)
+Write full PI tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_pi)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *content;
+ int name_len, content_len, retval;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
+ &name, &name_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &pind,
+ &name, &name_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid PI Target");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterWritePI(ptr, (xmlChar *)name, (xmlChar *)content);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_start_cdata(resource xmlwriter)
+Create start CDATA tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_cdata)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ int retval;
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterStartCDATA(ptr);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_end_cdata(resource xmlwriter)
+End current CDATA - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_end_cdata)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndCDATA);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_write_cdata(resource xmlwriter, string content)
+Write full CDATA tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_cdata)
+{
+ php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterWriteCDATA, NULL);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_write_raw(resource xmlwriter, string content)
+Write text - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_raw)
+{
+ php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterWriteRaw, NULL);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_text(resource xmlwriter, string content)
+Write text - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_text)
+{
+ php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterWriteString, NULL);
+}
+/* }}} */
+
+#if LIBXML_VERSION >= 20607
+/* {{{ proto bool xmlwriter_start_comment(resource xmlwriter)
+Create start comment - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_comment)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ int retval;
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterStartComment(ptr);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_end_comment(resource xmlwriter)
+Create end comment - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_end_comment)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndComment);
+}
+/* }}} */
+#endif /* LIBXML_VERSION >= 20607 */
+
+
+/* {{{ proto bool xmlwriter_write_comment(resource xmlwriter, string content)
+Write full comment tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_comment)
+{
+ php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterWriteComment, NULL);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_start_document(resource xmlwriter, string version, string encoding, string standalone)
+Create document tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_document)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *version = NULL, *enc = NULL, *alone = NULL;
+ int version_len, enc_len, alone_len, retval;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!", &version, &version_len, &enc, &enc_len, &alone, &alone_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|s!s!s!", &pind, &version, &version_len, &enc, &enc_len, &alone, &alone_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterStartDocument(ptr, version, enc, alone);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_end_document(resource xmlwriter)
+End current document - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_end_document)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndDocument);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_start_dtd(resource xmlwriter, string name, string pubid, string sysid)
+Create start DTD tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_dtd)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *pubid = NULL, *sysid = NULL;
+ int name_len, pubid_len, sysid_len, retval;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!s!", &name, &name_len, &pubid, &pubid_len, &sysid, &sysid_len) == FAILURE) {
+ return;
+ }
+
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s!s!", &pind, &name, &name_len, &pubid, &pubid_len, &sysid, &sysid_len) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterStartDTD(ptr, (xmlChar *)name, (xmlChar *)pubid, (xmlChar *)sysid);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_end_dtd(resource xmlwriter)
+End current DTD - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_end_dtd)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndDTD);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_write_dtd(resource xmlwriter, string name, string pubid, string sysid, string subset)
+Write full DTD tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_dtd)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *pubid = NULL, *sysid = NULL, *subset = NULL;
+ int name_len, pubid_len, sysid_len, subset_len, retval;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!s!s!", &name, &name_len, &pubid, &pubid_len, &sysid, &sysid_len, &subset, &subset_len) == FAILURE) {
+ return;
+ }
+
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s!s!s!", &pind, &name, &name_len, &pubid, &pubid_len, &sysid, &sysid_len, &subset, &subset_len) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterWriteDTD(ptr, (xmlChar *)name, (xmlChar *)pubid, (xmlChar *)sysid, (xmlChar *)subset);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_start_dtd_element(resource xmlwriter, string name)
+Create start DTD element - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_dtd_element)
+{
+ php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterStartDTDElement, "Invalid Element Name");
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_end_dtd_element(resource xmlwriter)
+End current DTD element - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_end_dtd_element)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndDTDElement);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_write_dtd_element(resource xmlwriter, string name, string content)
+Write full DTD element tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_dtd_element)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *content;
+ int name_len, content_len, retval;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &name, &name_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &pind,
+ &name, &name_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid Element Name");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterWriteDTDElement(ptr, (xmlChar *)name, (xmlChar *)content);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+#if LIBXML_VERSION > 20608
+/* {{{ proto bool xmlwriter_start_dtd_attlist(resource xmlwriter, string name)
+Create start DTD AttList - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_dtd_attlist)
+{
+ php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterStartDTDAttlist, "Invalid Element Name");
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_end_dtd_attlist(resource xmlwriter)
+End current DTD AttList - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_end_dtd_attlist)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndDTDAttlist);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_write_dtd_attlist(resource xmlwriter, string name, string content)
+Write full DTD AttList tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_dtd_attlist)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *content;
+ int name_len, content_len, retval;
+
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
+ &name, &name_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &pind,
+ &name, &name_len, &content, &content_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid Element Name");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterWriteDTDAttlist(ptr, (xmlChar *)name, (xmlChar *)content);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_start_dtd_entity(resource xmlwriter, string name, bool isparam)
+Create start DTD Entity - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_start_dtd_entity)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name;
+ int name_len, retval;
+ zend_bool isparm;
+
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sb", &name, &name_len, &isparm) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsb", &pind, &name, &name_len, &isparm) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid Attribute Name");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterStartDTDEntity(ptr, isparm, (xmlChar *)name);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_end_dtd_entity(resource xmlwriter)
+End current DTD Entity - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_end_dtd_entity)
+{
+ php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndDTDEntity);
+}
+/* }}} */
+
+/* {{{ proto bool xmlwriter_write_dtd_entity(resource xmlwriter, string name, string content [, int pe [, string pubid [, string sysid [, string ndataid]]]])
+Write full DTD Entity tag - returns FALSE on error */
+static PHP_FUNCTION(xmlwriter_write_dtd_entity)
+{
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *name, *content;
+ int name_len, content_len, retval;
+ /* Optional parameters */
+ char *pubid = NULL, *sysid = NULL, *ndataid = NULL;
+ zend_bool pe = 0;
+ int pubid_len, sysid_len, ndataid_len;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|bsss",
+ &name, &name_len, &content, &content_len, &pe, &pubid, &pubid_len,
+ &sysid, &sysid_len, &ndataid, &ndataid_len) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss|bsss", &pind,
+ &name, &name_len, &content, &content_len, &pe, &pubid, &pubid_len,
+ &sysid, &sysid_len, &ndataid, &ndataid_len) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+
+ XMLW_NAME_CHK("Invalid Element Name");
+
+ ptr = intern->ptr;
+
+ if (ptr) {
+ retval = xmlTextWriterWriteDTDEntity(ptr, pe, (xmlChar *)name, (xmlChar *)pubid, (xmlChar *)sysid, (xmlChar *)ndataid, (xmlChar *)content);
+ if (retval != -1) {
+ RETURN_TRUE;
+ }
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+#endif
+
+/* {{{ proto resource xmlwriter_open_uri(resource xmlwriter, string source)
+Create new xmlwriter using source uri for output */
+static PHP_FUNCTION(xmlwriter_open_uri)
+{
+ char *valid_file = NULL;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ char *source;
+ char resolved_path[MAXPATHLEN + 1];
+ int source_len;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+ ze_xmlwriter_object *ze_obj = NULL;
+#endif
+
+#ifndef ZEND_ENGINE_2
+ xmlOutputBufferPtr out_buffer;
+ void *ioctx;
+#endif
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &source, &source_len) == FAILURE) {
+ return;
+ }
+
+#ifdef ZEND_ENGINE_2
+ if (this) {
+ /* We do not use XMLWRITER_FROM_OBJECT, xmlwriter init function here */
+ ze_obj = (ze_xmlwriter_object*) zend_object_store_get_object(this TSRMLS_CC);
+ }
+#endif
+
+ if (source_len == 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string as source");
+ RETURN_FALSE;
+ }
+
+ valid_file = _xmlwriter_get_valid_file_path(source, resolved_path, MAXPATHLEN TSRMLS_CC);
+ if (!valid_file) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to resolve file path");
+ RETURN_FALSE;
+ }
+
+ /* TODO: Fix either the PHP stream or libxml APIs: it can then detect when a given
+ path is valid and not report out of memory error. Once it is done, remove the
+ directory check in _xmlwriter_get_valid_file_path */
+#ifndef ZEND_ENGINE_2
+ ioctx = php_xmlwriter_streams_IO_open_write_wrapper(valid_file TSRMLS_CC);
+ if (ioctx == NULL) {
+ RETURN_FALSE;
+ }
+
+ out_buffer = xmlOutputBufferCreateIO(php_xmlwriter_streams_IO_write,
+ php_xmlwriter_streams_IO_close, ioctx, NULL);
+
+ if (out_buffer == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create output buffer");
+ RETURN_FALSE;
+ }
+ ptr = xmlNewTextWriter(out_buffer);
+#else
+ ptr = xmlNewTextWriterFilename(valid_file, 0);
+#endif
+
+ if (!ptr) {
+ RETURN_FALSE;
+ }
+
+ intern = emalloc(sizeof(xmlwriter_object));
+ intern->ptr = ptr;
+ intern->output = NULL;
+#ifndef ZEND_ENGINE_2
+ intern->uri_output = out_buffer;
+#else
+ if (this) {
+ if (ze_obj->xmlwriter_ptr) {
+ xmlwriter_free_resource_ptr(ze_obj->xmlwriter_ptr TSRMLS_CC);
+ }
+ ze_obj->xmlwriter_ptr = intern;
+ RETURN_TRUE;
+ } else
+#endif
+ {
+ ZEND_REGISTER_RESOURCE(return_value,intern,le_xmlwriter);
+ }
+}
+/* }}} */
+
+/* {{{ proto resource xmlwriter_open_memory()
+Create new xmlwriter using memory for string output */
+static PHP_FUNCTION(xmlwriter_open_memory)
+{
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ xmlBufferPtr buffer;
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+ ze_xmlwriter_object *ze_obj = NULL;
+#endif
+
+#ifdef ZEND_ENGINE_2
+ if (this) {
+ /* We do not use XMLWRITER_FROM_OBJECT, xmlwriter init function here */
+ ze_obj = (ze_xmlwriter_object*) zend_object_store_get_object(this TSRMLS_CC);
+ }
+#endif
+
+ buffer = xmlBufferCreate();
+
+ if (buffer == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create output buffer");
+ RETURN_FALSE;
+ }
+
+ ptr = xmlNewTextWriterMemory(buffer, 0);
+ if (! ptr) {
+ xmlBufferFree(buffer);
+ RETURN_FALSE;
+ }
+
+ intern = emalloc(sizeof(xmlwriter_object));
+ intern->ptr = ptr;
+ intern->output = buffer;
+#ifndef ZEND_ENGINE_2
+ intern->uri_output = NULL;
+#else
+ if (this) {
+ if (ze_obj->xmlwriter_ptr) {
+ xmlwriter_free_resource_ptr(ze_obj->xmlwriter_ptr TSRMLS_CC);
+ }
+ ze_obj->xmlwriter_ptr = intern;
+ RETURN_TRUE;
+ } else
+#endif
+ {
+ ZEND_REGISTER_RESOURCE(return_value,intern,le_xmlwriter);
+ }
+
+}
+/* }}} */
+
+/* {{{ php_xmlwriter_flush */
+static void php_xmlwriter_flush(INTERNAL_FUNCTION_PARAMETERS, int force_string) {
+ zval *pind;
+ xmlwriter_object *intern;
+ xmlTextWriterPtr ptr;
+ xmlBufferPtr buffer;
+ zend_bool empty = 1;
+ int output_bytes;
+
+
+#ifdef ZEND_ENGINE_2
+ zval *this = getThis();
+
+ if (this) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &empty) == FAILURE) {
+ return;
+ }
+ XMLWRITER_FROM_OBJECT(intern, this);
+ } else
+#endif
+ {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|b", &pind, &empty) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
+ }
+ ptr = intern->ptr;
+
+ if (ptr) {
+ buffer = intern->output;
+ if (force_string == 1 && buffer == NULL) {
+ RETURN_EMPTY_STRING();
+ }
+ output_bytes = xmlTextWriterFlush(ptr);
+ if (buffer) {
+ RETVAL_STRING((char *) buffer->content, 1);
+ if (empty) {
+ xmlBufferEmpty(buffer);
+ }
+ } else {
+ RETVAL_LONG(output_bytes);
+ }
+ return;
+ }
+
+ RETURN_EMPTY_STRING();
+}
+/* }}} */
+
+/* {{{ proto string xmlwriter_output_memory(resource xmlwriter [,bool flush])
+Output current buffer as string */
+static PHP_FUNCTION(xmlwriter_output_memory)
+{
+ php_xmlwriter_flush(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
+/* {{{ proto mixed xmlwriter_flush(resource xmlwriter [,bool empty])
+Output current buffer */
+static PHP_FUNCTION(xmlwriter_flush)
+{
+ php_xmlwriter_flush(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
+/* {{{ PHP_MINIT_FUNCTION
+ */
+static PHP_MINIT_FUNCTION(xmlwriter)
+{
+#ifdef ZEND_ENGINE_2
+ zend_class_entry ce;
+#endif
+
+ le_xmlwriter = zend_register_list_destructors_ex(xmlwriter_dtor, NULL, "xmlwriter", module_number);
+
+#ifdef ZEND_ENGINE_2
+ memcpy(&xmlwriter_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ xmlwriter_object_handlers.clone_obj = NULL;
+ INIT_CLASS_ENTRY(ce, "XMLWriter", xmlwriter_class_functions);
+ ce.create_object = xmlwriter_object_new;
+ xmlwriter_class_entry_ce = zend_register_internal_class(&ce TSRMLS_CC);
+#endif
+ return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MSHUTDOWN_FUNCTION
+ */
+static PHP_MSHUTDOWN_FUNCTION(xmlwriter)
+{
+ return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MINFO_FUNCTION
+ */
+static PHP_MINFO_FUNCTION(xmlwriter)
+{
+ php_info_print_table_start();
+ {
+ php_info_print_table_row(2, "XMLWriter", "enabled");
+ }
+ php_info_print_table_end();
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/xmlwriter/php_xmlwriter.h b/ext/xmlwriter/php_xmlwriter.h
new file mode 100644
index 0000000..e21a5e3
--- /dev/null
+++ b/ext/xmlwriter/php_xmlwriter.h
@@ -0,0 +1,61 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Rob Richards <rrichards@php.net> |
+ | Pierre-A. Joye <pajoye@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_XMLWRITER_H
+#define PHP_XMLWRITER_H
+
+extern zend_module_entry xmlwriter_module_entry;
+#define phpext_xmlwriter_ptr &xmlwriter_module_entry
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
+#include <libxml/tree.h>
+#include <libxml/xmlwriter.h>
+#include <libxml/uri.h>
+
+/* Resource struct, not the object :) */
+typedef struct _xmlwriter_object {
+ xmlTextWriterPtr ptr;
+ xmlBufferPtr output;
+#ifndef ZEND_ENGINE_2
+ xmlOutputBufferPtr uri_output;
+#endif
+} xmlwriter_object;
+
+
+/* Extends zend object */
+typedef struct _ze_xmlwriter_object {
+ zend_object zo;
+ xmlwriter_object *xmlwriter_ptr;
+} ze_xmlwriter_object;
+
+#endif /* PHP_XMLWRITER_H */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/xmlwriter/tests/001.phpt b/ext/xmlwriter/tests/001.phpt
new file mode 100644
index 0000000..a9349d2
--- /dev/null
+++ b/ext/xmlwriter/tests/001.phpt
@@ -0,0 +1,25 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, file buffer, flush
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+/* $Id$ */
+
+$doc_dest = '001.xml';
+$xw = xmlwriter_open_uri($doc_dest);
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+xmlwriter_start_element($xw, "tag1");
+xmlwriter_end_document($xw);
+
+// Force to write and empty the buffer
+$output_bytes = xmlwriter_flush($xw, true);
+echo file_get_contents($doc_dest);
+unset($xw);
+unlink('001.xml');
+?>
+===DONE===
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<tag1/>
+===DONE===
diff --git a/ext/xmlwriter/tests/002.phpt b/ext/xmlwriter/tests/002.phpt
new file mode 100644
index 0000000..f2537a4
--- /dev/null
+++ b/ext/xmlwriter/tests/002.phpt
@@ -0,0 +1,22 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, membuffer, flush
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+/* $Id$ */
+
+$doc_dest = '001.xml';
+$xw = xmlwriter_open_memory($doc_dest);
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+xmlwriter_start_element($xw, "tag1");
+xmlwriter_end_document($xw);
+
+// Force to write and empty the buffer
+echo xmlwriter_flush($xw, true);
+?>
+===DONE===
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<tag1/>
+===DONE===
diff --git a/ext/xmlwriter/tests/003.phpt b/ext/xmlwriter/tests/003.phpt
new file mode 100644
index 0000000..5415797
--- /dev/null
+++ b/ext/xmlwriter/tests/003.phpt
@@ -0,0 +1,35 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, membuffer, flush, attribute
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+/* $Id$ */
+
+$doc_dest = '001.xml';
+$xw = xmlwriter_open_memory($doc_dest);
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+xmlwriter_start_element($xw, "tag1");
+
+
+$res = xmlwriter_start_attribute($xw, 'attr1');
+xmlwriter_text($xw, "attr1_value");
+xmlwriter_end_attribute($xw);
+
+xmlwriter_write_attribute($xw, "att2", "att2_value");
+xmlwriter_text($xw, "Test text for tag1");
+$res = xmlwriter_start_element($xw, 'tag2');
+if ($res < 1) {
+ echo "StartElement context validation failed\n";
+ exit();
+}
+xmlwriter_end_document($xw);
+
+// Force to write and empty the buffer
+echo xmlwriter_flush($xw, true);
+?>
+===DONE===
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<tag1 attr1="attr1_value" att2="att2_value">Test text for tag1<tag2/></tag1>
+===DONE===
diff --git a/ext/xmlwriter/tests/004.phpt b/ext/xmlwriter/tests/004.phpt
new file mode 100644
index 0000000..2d3e858
--- /dev/null
+++ b/ext/xmlwriter/tests/004.phpt
@@ -0,0 +1,36 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, file buffer, flush
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+/* $Id$ */
+
+$doc_dest = '001.xml';
+$xw = xmlwriter_open_uri($doc_dest);
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+xmlwriter_start_element($xw, "tag1");
+
+xmlwriter_start_pi($xw, "PHP");
+xmlwriter_text($xw, 'echo $a;');
+xmlwriter_end_pi($xw);
+xmlwriter_end_document($xw);
+
+// Force to write and empty the buffer
+$output_bytes = xmlwriter_flush($xw, true);
+$md5_out = md5_file($doc_dest);
+$md5_res = md5('<?xml version="1.0" encoding="UTF-8"?>
+<tag1><?PHP echo $a;?></tag1>
+');
+unset($xw);
+unlink('001.xml');
+if ($md5_out != $md5_res) {
+ echo "failed: $md5_res != $md5_out\n";
+} else {
+ echo "ok.\n";
+}
+?>
+===DONE===
+--EXPECT--
+ok.
+===DONE===
diff --git a/ext/xmlwriter/tests/005.phpt b/ext/xmlwriter/tests/005.phpt
new file mode 100644
index 0000000..ab933c6
--- /dev/null
+++ b/ext/xmlwriter/tests/005.phpt
@@ -0,0 +1,33 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, comments
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+if (!function_exists("xmlwriter_start_comment")) die("skip: libxml2 2.6.7+ required");
+?>
+--FILE--
+<?php
+/* $Id$ */
+
+$doc_dest = '001.xml';
+$xw = xmlwriter_open_uri($doc_dest);
+xmlwriter_start_document($xw, '1.0', 'UTF-8');
+xmlwriter_start_element($xw, "tag1");
+
+xmlwriter_start_comment($xw);
+xmlwriter_text($xw, 'comment');
+xmlwriter_end_comment($xw);
+xmlwriter_write_comment($xw, "comment #2");
+xmlwriter_end_document($xw);
+
+// Force to write and empty the buffer
+$output_bytes = xmlwriter_flush($xw, true);
+echo file_get_contents($doc_dest);
+unset($xw);
+unlink('001.xml');
+?>
+===DONE===
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<tag1><!--comment--><!--comment #2--></tag1>
+===DONE===
diff --git a/ext/xmlwriter/tests/006.phpt b/ext/xmlwriter/tests/006.phpt
new file mode 100644
index 0000000..48eb299
--- /dev/null
+++ b/ext/xmlwriter/tests/006.phpt
@@ -0,0 +1,26 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, startDTD/writeElementNS
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+?>
+--FILE--
+<?php
+/* $Id$ */
+
+$doc_dest = '001.xml';
+$xw = xmlwriter_open_uri($doc_dest);
+xmlwriter_start_dtd($xw, 'foo', NULL, 'urn:bar');
+xmlwriter_end_dtd($xw);
+xmlwriter_start_element($xw, 'foo');
+xmlwriter_write_element_ns($xw, 'foo', 'bar', 'urn:foo', 'dummy content');
+xmlwriter_end_element($xw);
+
+// Force to write and empty the buffer
+$output_bytes = xmlwriter_flush($xw, true);
+echo file_get_contents($doc_dest);
+unset($xw);
+unlink('001.xml');
+?>
+--EXPECT--
+<!DOCTYPE foo SYSTEM "urn:bar"><foo><foo:bar xmlns:foo="urn:foo">dummy content</foo:bar></foo>
diff --git a/ext/xmlwriter/tests/007.phpt b/ext/xmlwriter/tests/007.phpt
new file mode 100644
index 0000000..47965c7
--- /dev/null
+++ b/ext/xmlwriter/tests/007.phpt
@@ -0,0 +1,38 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, Elements & Attributes
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+if (LIBXML_VERSION < 20629) die("skip: libxml2 2.6.29+ required");
+?>
+--FILE--
+<?php
+/* $Id$ */
+
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, TRUE);
+xmlwriter_set_indent_string($xw, ' ');
+xmlwriter_start_document($xw, '1.0', "UTF-8");
+xmlwriter_start_element($xw, 'root');
+xmlwriter_start_element_ns($xw, 'ns1', 'child1', 'urn:ns1');
+xmlwriter_start_attribute_ns($xw, 'ns1', 'att1', 'urn:ns1');
+xmlwriter_text($xw, 'a&b');
+xmlwriter_end_attribute($xw);
+xmlwriter_write_attribute($xw, 'att2', "double\" single'");
+xmlwriter_start_attribute_ns($xw, 'ns1', 'att2', 'urn:ns1');
+xmlwriter_text($xw, "<>\"'&");
+xmlwriter_end_attribute($xw);
+xmlwriter_write_element($xw, 'chars', "special characters: <>\"'&");
+xmlwriter_end_element($xw);
+xmlwriter_end_document($xw);
+// Force to write and empty the buffer
+$output = xmlwriter_flush($xw, true);
+print $output;
+?>
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<root>
+ <ns1:child1 ns1:att1="a&amp;b" att2="double&quot; single'" ns1:att2="&lt;&gt;&quot;'&amp;" xmlns:ns1="urn:ns1">
+ <chars>special characters: &lt;&gt;&quot;'&amp;</chars>
+ </ns1:child1>
+</root>
diff --git a/ext/xmlwriter/tests/008.phpt b/ext/xmlwriter/tests/008.phpt
new file mode 100644
index 0000000..88768b1
--- /dev/null
+++ b/ext/xmlwriter/tests/008.phpt
@@ -0,0 +1,40 @@
+--TEST--
+XMLWriter: libxml2 XML Writer DTD Element & Attlist
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+?>
+--FILE--
+<?php
+/* $Id$ */
+
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, TRUE);
+xmlwriter_start_document($xw, NULL, "UTF-8");
+xmlwriter_start_dtd_entity($xw, "ent", false);
+xmlwriter_text($xw, "val");
+xmlwriter_end_dtd_entity($xw);
+xmlwriter_write_dtd_entity($xw, "ent2", "val2");
+xmlwriter_write_dtd_element($xw, 'sxe', '(elem1+, elem11, elem22*)');
+xmlwriter_write_dtd_attlist($xw, 'sxe', 'id CDATA #implied');
+xmlwriter_start_dtd_element($xw, 'elem1');
+xmlwriter_text($xw, 'elem2*');
+xmlwriter_end_dtd_element($xw);
+xmlwriter_start_dtd_attlist($xw, 'elem1');
+xmlwriter_text($xw, "attr1 CDATA #required\n");
+xmlwriter_text($xw, 'attr2 CDATA #implied');
+xmlwriter_end_dtd_attlist($xw);
+xmlwriter_end_document($xw);
+// Force to write and empty the buffer
+$output = xmlwriter_flush($xw, true);
+print $output;
+?>
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<!ENTITY ent "val">
+<!ENTITY ent2 "val2">
+<!ELEMENT sxe (elem1+, elem11, elem22*)>
+<!ATTLIST sxe id CDATA #implied>
+<!ELEMENT elem1 elem2*>
+<!ATTLIST elem1 attr1 CDATA #required
+attr2 CDATA #implied>
diff --git a/ext/xmlwriter/tests/009.phpt b/ext/xmlwriter/tests/009.phpt
new file mode 100644
index 0000000..002916f
--- /dev/null
+++ b/ext/xmlwriter/tests/009.phpt
@@ -0,0 +1,45 @@
+--TEST--
+XMLWriter: PI, Comment, CDATA
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+if (!function_exists("xmlwriter_start_comment")) die("skip: libxml2 2.6.7+ required");
+?>
+--FILE--
+<?php
+/* $Id$ */
+/*
+Libxml 2.6.24 and up adds a new line after a processing instruction (PI)
+*/
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, TRUE);
+xmlwriter_start_document($xw, NULL, "UTF-8");
+xmlwriter_start_element($xw, 'root');
+xmlwriter_write_attribute($xw, 'id', 'elem1');
+xmlwriter_start_element($xw, 'elem1');
+xmlwriter_write_attribute($xw, 'attr1', 'first');
+xmlwriter_write_comment($xw, 'start PI');
+xmlwriter_start_element($xw, 'pi');
+xmlwriter_write_pi($xw, 'php', 'echo "hello world"; ');
+xmlwriter_end_element($xw);
+xmlwriter_start_element($xw, 'cdata');
+xmlwriter_start_cdata($xw);
+xmlwriter_text($xw, '<>&"');
+xmlwriter_end_cdata($xw);
+xmlwriter_end_element($xw);
+xmlwriter_end_element($xw);
+xmlwriter_end_element($xw);
+xmlwriter_end_document($xw);
+// Force to write and empty the buffer
+$output = xmlwriter_flush($xw, true);
+print $output;
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="UTF-8"?>
+<root id="elem1">
+ <elem1 attr1="first">
+ <!--start PI-->
+ <pi><?php echo "hello world"; ?>%w</pi>
+ <cdata><![CDATA[<>&"]]></cdata>
+ </elem1>
+</root>
diff --git a/ext/xmlwriter/tests/010.phpt b/ext/xmlwriter/tests/010.phpt
new file mode 100644
index 0000000..9f066a7
--- /dev/null
+++ b/ext/xmlwriter/tests/010.phpt
@@ -0,0 +1,45 @@
+--TEST--
+xmlwriter_start/end_attribute()
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+?>
+--FILE--
+<?php
+
+$file = dirname(__FILE__).'/010.tmp';
+
+$xw = xmlwriter_open_uri($file);
+
+var_dump(xmlwriter_start_element($xw, "tag"));
+var_dump(xmlwriter_start_attribute($xw, "attr"));
+var_dump(xmlwriter_end_attribute($xw));
+var_dump(xmlwriter_start_attribute($xw, "-1"));
+var_dump(xmlwriter_end_attribute($xw));
+var_dump(xmlwriter_start_attribute($xw, "\""));
+var_dump(xmlwriter_end_attribute($xw));
+var_dump(xmlwriter_end_element($xw));
+
+unset($xw);
+
+var_dump(file_get_contents($file));
+
+@unlink($file);
+
+echo "Done\n";
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+bool(true)
+
+Warning: xmlwriter_start_attribute(): Invalid Attribute Name in %s on line %d
+bool(false)
+bool(false)
+
+Warning: xmlwriter_start_attribute(): Invalid Attribute Name in %s on line %d
+bool(false)
+bool(false)
+bool(true)
+string(14) "<tag attr=""/>"
+Done
diff --git a/ext/xmlwriter/tests/OO_001.phpt b/ext/xmlwriter/tests/OO_001.phpt
new file mode 100644
index 0000000..be448b9
--- /dev/null
+++ b/ext/xmlwriter/tests/OO_001.phpt
@@ -0,0 +1,26 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, file buffer, flush
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+/* $Id$ */
+
+$doc_dest = '001.xml';
+$xw = new XMLWriter();
+$xw->openUri($doc_dest);
+$xw->startDocument('1.0', 'UTF-8', 'standalonearg');
+$xw->startElement("tag1");
+$xw->endDocument();
+
+// Force to write and empty the buffer
+$output_bytes = $xw->flush(true);
+echo file_get_contents($doc_dest);
+unset($xw);
+unlink('001.xml');
+?>
+===DONE===
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8" standalone="standalonearg"?>
+<tag1/>
+===DONE===
diff --git a/ext/xmlwriter/tests/OO_002.phpt b/ext/xmlwriter/tests/OO_002.phpt
new file mode 100644
index 0000000..ec605f5
--- /dev/null
+++ b/ext/xmlwriter/tests/OO_002.phpt
@@ -0,0 +1,22 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, membuffer, flush
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+/* $Id$ */
+
+$xw = new XMLWriter();
+$xw->openMemory();
+$xw->startDocument('1.0', 'UTF-8', 'standalone');
+$xw->startElement("tag1");
+$xw->endDocument();
+
+// Force to write and empty the buffer
+echo $xw->flush(true);
+?>
+===DONE===
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8" standalone="standalone"?>
+<tag1/>
+===DONE===
diff --git a/ext/xmlwriter/tests/OO_003.phpt b/ext/xmlwriter/tests/OO_003.phpt
new file mode 100644
index 0000000..7fb4791
--- /dev/null
+++ b/ext/xmlwriter/tests/OO_003.phpt
@@ -0,0 +1,37 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, membuffer, flush, text, attribute
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+/* $Id$ */
+
+$xw = new XMLWriter();
+$xw->openMemory();
+$xw->startDocument('1.0', 'UTF-8');
+$xw->startElement("tag1");
+
+$res = $xw->startAttribute('attr1');
+$xw->text("attr1_value");
+$xw->endAttribute();
+
+$res = $xw->startAttribute('attr2');
+$xw->text("attr2_value");
+$xw->endAttribute();
+
+$xw->text("Test text for tag1");
+$res = $xw->startElement('tag2');
+if ($res < 1) {
+ echo "StartElement context validation failed\n";
+ exit();
+}
+$xw->endDocument();
+
+// Force to write and empty the buffer
+echo $xw->flush(true);
+?>
+===DONE===
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<tag1 attr1="attr1_value" attr2="attr2_value">Test text for tag1<tag2/></tag1>
+===DONE===
diff --git a/ext/xmlwriter/tests/OO_004.phpt b/ext/xmlwriter/tests/OO_004.phpt
new file mode 100644
index 0000000..08b423c
--- /dev/null
+++ b/ext/xmlwriter/tests/OO_004.phpt
@@ -0,0 +1,37 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, file buffer, flush
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+/* $Id$ */
+
+$doc_dest = '001.xml';
+$xw = new XMLWriter();
+$xw->openUri($doc_dest);
+$xw->startDocument('1.0', 'UTF-8');
+$xw->startElement("tag1");
+
+$xw->startPi("PHP");
+$xw->text('echo $a;');
+$xw->endPi();
+$xw->endDocument();
+
+// Force to write and empty the buffer
+$xw->flush(true);
+$md5_out = md5_file($doc_dest);
+$md5_res = md5('<?xml version="1.0" encoding="UTF-8"?>
+<tag1><?PHP echo $a;?></tag1>
+');
+unset($xw);
+unlink('001.xml');
+if ($md5_out != $md5_res) {
+ echo "failed: $md5_res != $md5_out\n";
+} else {
+ echo "ok.\n";
+}
+?>
+===DONE===
+--EXPECT--
+ok.
+===DONE===
diff --git a/ext/xmlwriter/tests/OO_005.phpt b/ext/xmlwriter/tests/OO_005.phpt
new file mode 100644
index 0000000..2c6d2f4
--- /dev/null
+++ b/ext/xmlwriter/tests/OO_005.phpt
@@ -0,0 +1,33 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, comments
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+if (!function_exists("xmlwriter_start_comment")) die("skip: libxml2 2.6.7+ required");
+?>
+--FILE--
+<?php
+/* $Id$ */
+
+$doc_dest = '001.xml';
+$xw = new XMLWriter();
+$xw->openUri($doc_dest);
+$xw->startDocument('1.0', 'UTF-8');
+$xw->startElement("tag1");
+$xw->startComment();
+$xw->text('comment');
+$xw->endComment();
+$xw->writeComment("comment #2");
+$xw->endDocument();
+
+// Force to write and empty the buffer
+$output_bytes = $xw->flush(true);
+echo file_get_contents($doc_dest);
+unset($xw);
+unlink('001.xml');
+?>
+===DONE===
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<tag1><!--comment--><!--comment #2--></tag1>
+===DONE===
diff --git a/ext/xmlwriter/tests/OO_006.phpt b/ext/xmlwriter/tests/OO_006.phpt
new file mode 100644
index 0000000..465a725
--- /dev/null
+++ b/ext/xmlwriter/tests/OO_006.phpt
@@ -0,0 +1,27 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, startDTD/writeElementNS
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+?>
+--FILE--
+<?php
+/* $Id$ */
+
+$doc_dest = '001.xml';
+$xw = new XMLWriter();
+$xw->openUri($doc_dest);
+$xw->startDtd('foo', NULL, 'urn:bar');
+$xw->endDtd();
+$xw->startElement('foo');
+$xw->writeElementNS('foo', 'bar', 'urn:foo', 'dummy content');
+$xw->endElement();
+
+// Force to write and empty the buffer
+$output_bytes = $xw->flush(true);
+echo file_get_contents($doc_dest);
+unset($xw);
+unlink('001.xml');
+?>
+--EXPECT--
+<!DOCTYPE foo SYSTEM "urn:bar"><foo><foo:bar xmlns:foo="urn:foo">dummy content</foo:bar></foo>
diff --git a/ext/xmlwriter/tests/OO_007.phpt b/ext/xmlwriter/tests/OO_007.phpt
new file mode 100644
index 0000000..257a5cd
--- /dev/null
+++ b/ext/xmlwriter/tests/OO_007.phpt
@@ -0,0 +1,39 @@
+--TEST--
+XMLWriter: libxml2 XML Writer, Elements & Attributes
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+if (LIBXML_VERSION < 20629) die("skip: libxml2 2.6.29+ required");
+?>
+--FILE--
+<?php
+/* $Id$ */
+
+$xw = new XMLWriter();
+$xw->openMemory();
+$xw->setIndent(TRUE);
+$xw->setIndentString(' ');
+$xw->startDocument('1.0', "UTF-8");
+$xw->startElement('root');
+$xw->startElementNS('ns1', 'child1', 'urn:ns1');
+$xw->startAttributeNS('ns1', 'att1', 'urn:ns1');
+$xw->text('a&b');
+$xw->endAttribute();
+$xw->writeAttribute('att2', "double\" single'");
+$xw->startAttributeNS('ns1', 'att2', 'urn:ns1');
+$xw->text("<>\"'&");
+$xw->endAttribute();
+$xw->writeElement('chars', "special characters: <>\"'&");
+$xw->endElement();
+$xw->endDocument();
+// Force to write and empty the buffer
+$output = $xw->flush(true);
+print $output;
+?>
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<root>
+ <ns1:child1 ns1:att1="a&amp;b" att2="double&quot; single'" ns1:att2="&lt;&gt;&quot;'&amp;" xmlns:ns1="urn:ns1">
+ <chars>special characters: &lt;&gt;&quot;'&amp;</chars>
+ </ns1:child1>
+</root>
diff --git a/ext/xmlwriter/tests/OO_008.phpt b/ext/xmlwriter/tests/OO_008.phpt
new file mode 100644
index 0000000..fe127ce
--- /dev/null
+++ b/ext/xmlwriter/tests/OO_008.phpt
@@ -0,0 +1,35 @@
+--TEST--
+XMLWriter: libxml2 XML Writer DTD Element & Attlist
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+?>
+--FILE--
+<?php
+/* $Id$ */
+
+$xw = new XMLWriter();
+$xw->openMemory();
+$xw->setIndent(TRUE);
+$xw->startDocument(NULL, "UTF-8");
+$xw->writeDtdElement('sxe', '(elem1+, elem11, elem22*)');
+$xw->writeDtdAttlist('sxe', 'id CDATA #implied');
+$xw->startDtdElement('elem1');
+$xw->text('elem2*');
+$xw->endDtdElement();
+$xw->startDtdAttlist('elem1');
+$xw->text("attr1 CDATA #required\n");
+$xw->text('attr2 CDATA #implied');
+$xw->endDtdAttlist();
+$xw->endDocument();
+// Force to write and empty the buffer
+$output = $xw->flush(true);
+print $output;
+?>
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<!ELEMENT sxe (elem1+, elem11, elem22*)>
+<!ATTLIST sxe id CDATA #implied>
+<!ELEMENT elem1 elem2*>
+<!ATTLIST elem1 attr1 CDATA #required
+attr2 CDATA #implied>
diff --git a/ext/xmlwriter/tests/OO_009.phpt b/ext/xmlwriter/tests/OO_009.phpt
new file mode 100644
index 0000000..c874f3e
--- /dev/null
+++ b/ext/xmlwriter/tests/OO_009.phpt
@@ -0,0 +1,45 @@
+--TEST--
+XMLWriter: PI, Comment, CDATA
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+?>
+--FILE--
+<?php
+/* $Id$ */
+/*
+Libxml 2.6.24 and up adds a new line after a processing instruction (PI)
+*/
+$xw = new XMLWriter();
+$xw->openMemory();
+$xw->setIndent(TRUE);
+$xw->startDocument("1.0", "UTF-8");
+$xw->startElement('root');
+$xw->writeAttribute('id', 'elem1');
+$xw->startElement('elem1');
+$xw->writeAttribute('attr1', 'first');
+$xw->writeComment('start PI');
+$xw->startElement('pi');
+$xw->writePi('php', 'echo "hello world"; ');
+$xw->endElement();
+$xw->startElement('cdata');
+$xw->startCdata();
+$xw->text('<>&"');
+$xw->endCdata();
+$xw->endElement();
+$xw->endElement();
+$xw->endElement();
+$xw->endDocument();
+// Force to write and empty the buffer
+$output = $xw->flush(true);
+print $output;
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="UTF-8"?>
+<root id="elem1">
+ <elem1 attr1="first">
+ <!--start PI-->
+ <pi><?php echo "hello world"; ?>%w</pi>
+ <cdata><![CDATA[<>&"]]></cdata>
+ </elem1>
+</root>
diff --git a/ext/xmlwriter/tests/bug39504.phpt b/ext/xmlwriter/tests/bug39504.phpt
new file mode 100644
index 0000000..af97f81
--- /dev/null
+++ b/ext/xmlwriter/tests/bug39504.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Bug #39504 (xmlwriter_write_dtd_entity() creates Attlist tag, not enity)
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+?>
+--FILE--
+<?php
+
+$xw = xmlwriter_open_memory();
+xmlwriter_start_document($xw, NULL, "UTF-8");
+xmlwriter_start_dtd($xw, "root");
+xmlwriter_write_dtd_entity($xw, "ent2", "val2");
+xmlwriter_end_dtd($xw);
+xmlwriter_start_element($xw, "root");
+xmlwriter_end_document($xw);
+print xmlwriter_flush($xw, true);
+print "\n";
+
+$xw = new XMLWriter();
+$xw->openMemory();
+$xw->startDocument(NULL, "UTF-8");
+$xw->startDtd("root");
+$xw->writeDtdEntity("c", NULL, 0, "-//W3C//TEXT copyright//EN", "http://www.w3.org/xmlspec/copyright.xml");
+$xw->endDtd();
+$xw->startElement("root");
+$xw->endDocument();
+print $xw->flush(true);
+
+?>
+--EXPECTF--
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE root [<!ENTITY ent2 "val2">]><root/>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE root [<!ENTITY c PUBLIC "-//W3C//TEXT copyright//EN" "http://www.w3.org/xmlspec/copyright.xml">]><root/>
diff --git a/ext/xmlwriter/tests/bug41287.phpt b/ext/xmlwriter/tests/bug41287.phpt
new file mode 100644
index 0000000..0612b21
--- /dev/null
+++ b/ext/xmlwriter/tests/bug41287.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Bug #41287 (Namespace functions don't allow xmlns defintion to be optional)
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+?>
+--FILE--
+<?php
+
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, true);
+xmlwriter_start_document($xw);
+xmlwriter_start_element_ns($xw, 'test', 'test', 'urn:x-test:');
+xmlwriter_write_element_ns($xw, 'test', 'foo', null, '');
+xmlwriter_write_element_ns($xw, null, 'bar', 'urn:x-test:', '');
+xmlwriter_write_element_ns($xw, null, 'bar', '', '');
+xmlwriter_end_element($xw);
+xmlwriter_end_document($xw);
+print xmlwriter_flush($xw, true);
+print "\n";
+
+$xw = new XMLWriter();
+$xw->openMemory();
+$xw->setIndent(true);
+$xw->startDocument();
+$xw->startElementNS('test', 'test', 'urn:x-test:');
+$xw->writeElementNS('test', 'foo', null, '');
+$xw->writeElementNS(null, 'bar', 'urn:x-test:', '');
+$xw->writeElementNS(null, 'bar', '', '');
+$xw->endElement();
+$xw->endDocument();
+print $xw->flush(true);
+?>
+--EXPECTF--
+<?xml version="1.0"?>
+<test:test xmlns:test="urn:x-test:">
+ <test:foo></test:foo>
+ <bar xmlns="urn:x-test:"></bar>
+ <bar xmlns=""></bar>
+</test:test>
+
+<?xml version="1.0"?>
+<test:test xmlns:test="urn:x-test:">
+ <test:foo></test:foo>
+ <bar xmlns="urn:x-test:"></bar>
+ <bar xmlns=""></bar>
+</test:test>
diff --git a/ext/xmlwriter/tests/bug41326.phpt b/ext/xmlwriter/tests/bug41326.phpt
new file mode 100644
index 0000000..c69cab1
--- /dev/null
+++ b/ext/xmlwriter/tests/bug41326.phpt
@@ -0,0 +1,56 @@
+--TEST--
+Bug #41287 (Writing empty tags with Xmlwriter::WriteElement[ns])
+--SKIPIF--
+<?php
+if (!extension_loaded("xmlwriter")) die("skip");
+?>
+--FILE--
+<?php
+$xml = new XmlWriter();
+$xml->openMemory();
+$xml->setIndent(true);
+$xml->startDocument();
+$xml->startElement('test');
+$xml->writeElement('foo', null);
+$xml->writeElement('foo2', "");
+$xml->writeElement('foo3');
+$xml->startElement('bar');
+$xml->endElement('bar');
+$xml->endElement();
+$xml->endElement();
+print $xml->flush(true);
+
+print "\n";
+
+$xw = new XMLWriter();
+$xw->openMemory();
+$xw->setIndent(true);
+$xw->startDocument();
+$xw->startElementNS('test', 'test', 'urn:x-test:');
+$xw->writeElementNS('test', 'foo', null, '');
+$xw->writeElementNS(null, 'bar', 'urn:x-test:', '');
+$xw->writeElementNS(null, 'bar', 'urn:x-test:', NULL);
+$xw->writeElementNS(null, 'bar', 'urn:x-test:');
+$xw->writeElementNS(null, 'bar', '', '');
+$xw->endElement();
+$xw->endDocument();
+print $xw->flush(true);
+?>
+--EXPECTF--
+Warning: XMLWriter::endElement() expects exactly 0 parameters, 1 given in %s on line %d
+<?xml version="1.0"?>
+<test>
+ <foo/>
+ <foo2></foo2>
+ <foo3/>
+ <bar/>
+</test>
+
+<?xml version="1.0"?>
+<test:test xmlns:test="urn:x-test:">
+ <test:foo></test:foo>
+ <bar xmlns="urn:x-test:"></bar>
+ <bar xmlns="urn:x-test:"/>
+ <bar xmlns="urn:x-test:"/>
+ <bar xmlns=""></bar>
+</test:test>
diff --git a/ext/xmlwriter/tests/bug48204.phpt b/ext/xmlwriter/tests/bug48204.phpt
new file mode 100644
index 0000000..638512b
--- /dev/null
+++ b/ext/xmlwriter/tests/bug48204.phpt
@@ -0,0 +1,17 @@
+--TEST--
+xmlwriter_open_uri with PHP_MAXPATHLEN + 1
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+$path = str_repeat('a', PHP_MAXPATHLEN + 1);
+var_dump(xmlwriter_open_uri('file:///' . $path));
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+Theo van der Zee
+#Test Fest Utrecht 09-05-2009
+--EXPECTF--
+
+Warning: xmlwriter_open_uri(): Unable to resolve file path in %s on line %d
+bool(false)
diff --git a/ext/xmlwriter/tests/xmlwriter_open_uri_error_001.phpt b/ext/xmlwriter/tests/xmlwriter_open_uri_error_001.phpt
new file mode 100644
index 0000000..fb7602b
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_open_uri_error_001.phpt
@@ -0,0 +1,16 @@
+--TEST--
+xmlwriter_open_uri with empty string as parameter
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+var_dump(xmlwriter_open_uri(''));
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+Theo van der Zee
+#Test Fest Utrecht 09-05-2009
+--EXPECTF--
+
+Warning: xmlwriter_open_uri(): Empty string as source in %s on line %d
+bool(false)
diff --git a/ext/xmlwriter/tests/xmlwriter_open_uri_error_002.phpt b/ext/xmlwriter/tests/xmlwriter_open_uri_error_002.phpt
new file mode 100644
index 0000000..9cd33f7
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_open_uri_error_002.phpt
@@ -0,0 +1,16 @@
+--TEST--
+xmlwriter_open_uri without parameter
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+var_dump(xmlwriter_open_uri());
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+Theo van der Zee
+#Test Fest Utrecht 09-05-2009
+--EXPECTF--
+
+Warning: xmlwriter_open_uri() expects exactly %d parameter, %d given in %s on line %d
+NULL
diff --git a/ext/xmlwriter/tests/xmlwriter_open_uri_error_003.phpt b/ext/xmlwriter/tests/xmlwriter_open_uri_error_003.phpt
new file mode 100644
index 0000000..0e56d89
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_open_uri_error_003.phpt
@@ -0,0 +1,16 @@
+--TEST--
+xmlwriter_open_uri with non existing file
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+var_dump(xmlwriter_open_uri('foo/bar.tmp'));
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+Theo van der Zee
+#Test Fest Utrecht 09-05-2009
+--EXPECTF--
+
+Warning: xmlwriter_open_uri(): Unable to resolve file path in %s on line %d
+bool(false)
diff --git a/ext/xmlwriter/tests/xmlwriter_open_uri_error_004.phpt b/ext/xmlwriter/tests/xmlwriter_open_uri_error_004.phpt
new file mode 100644
index 0000000..6970c0e
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_open_uri_error_004.phpt
@@ -0,0 +1,16 @@
+--TEST--
+xmlwriter_open_uri with file:///
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+var_dump(xmlwriter_open_uri('file:///'));
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+Theo van der Zee
+#Test Fest Utrecht 09-05-2009
+--EXPECTF--
+
+Warning: xmlwriter_open_uri(): Unable to resolve file path in %s on line %d
+bool(false)
diff --git a/ext/xmlwriter/tests/xmlwriter_open_uri_error_005.phpt b/ext/xmlwriter/tests/xmlwriter_open_uri_error_005.phpt
new file mode 100644
index 0000000..9d08716
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_open_uri_error_005.phpt
@@ -0,0 +1,16 @@
+--TEST--
+xmlwriter_open_uri with file://localhost/
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+var_dump(xmlwriter_open_uri('file://localhost/'));
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+Theo van der Zee
+#Test Fest Utrecht 09-05-2009
+--EXPECTF--
+
+Warning: xmlwriter_open_uri(): Unable to resolve file path in %s on line %d
+bool(false)
diff --git a/ext/xmlwriter/tests/xmlwriter_set_indent_string_basic_001.phpt b/ext/xmlwriter/tests/xmlwriter_set_indent_string_basic_001.phpt
new file mode 100644
index 0000000..8c3e7d9
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_set_indent_string_basic_001.phpt
@@ -0,0 +1,24 @@
+--TEST--
+xmlwriter_set_indent_string passing xmlwriter resource
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+$temp_filename = dirname(__FILE__)."/xmlwriter_set_indent_string.tmp";
+ $fp = fopen($temp_filename, "w");
+ fwrite ($fp, "Hi");
+ fclose($fp);
+$resource = xmlwriter_open_uri($temp_filename);
+var_dump(xmlwriter_set_indent_string($resource, ' '));
+?>
+--CLEAN--
+<?php
+$temp_filename = dirname(__FILE__)."/xmlwriter_set_indent_string.tmp";
+unlink($temp_filename);
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+Theo van der Zee
+#Test Fest Utrecht 09-05-2009
+--EXPECT--
+bool(true)
diff --git a/ext/xmlwriter/tests/xmlwriter_set_indent_string_error_001.phpt b/ext/xmlwriter/tests/xmlwriter_set_indent_string_error_001.phpt
new file mode 100644
index 0000000..5bb9ef8
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_set_indent_string_error_001.phpt
@@ -0,0 +1,24 @@
+--TEST--
+xmlwriter_set_indent_string with missing param(s)
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+$temp_filename = dirname(__FILE__)."/xmlwriter_set_indent_string_error.tmp";
+ $fp = fopen($temp_filename, "w");
+ fwrite ($fp, "Hi");
+ fclose($fp);
+$resource = xmlwriter_open_uri($temp_filename);
+var_dump(xmlwriter_set_indent_string($resource));
+?>
+--CLEAN--
+<?php
+$temp_filename = dirname(__FILE__)."/xmlwriter_set_indent_string_error.tmp";
+unlink($temp_filename);
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+--EXPECTF--
+
+Warning: xmlwriter_set_indent_string() expects exactly %d parameters, %d given in %s on line %d
+NULL
diff --git a/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_basic_001.phpt b/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_basic_001.phpt
new file mode 100644
index 0000000..f248049
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_basic_001.phpt
@@ -0,0 +1,28 @@
+--TEST--
+xmlwriter_write_attribute_ns basic function tests
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, TRUE);
+xmlwriter_start_document($xw, NULL, "UTF-8");
+xmlwriter_start_element($xw, 'root');
+xmlwriter_write_attribute_ns($xw, 'prefix', 'id', 'http://www.php.net/uri', 'elem1');
+xmlwriter_start_element($xw, 'elem1');
+xmlwriter_write_attribute($xw, 'attr1', 'first');
+xmlwriter_end_element($xw);
+xmlwriter_full_end_element($xw);
+xmlwriter_end_document($xw);
+
+$output = xmlwriter_flush($xw, true);
+print $output;
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<root prefix:id="elem1" xmlns:prefix="http://www.php.net/uri">
+ <elem1 attr1="first"/>
+</root>
+
diff --git a/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_error_001.phpt b/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_error_001.phpt
new file mode 100644
index 0000000..7f1cd0c
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_error_001.phpt
@@ -0,0 +1,34 @@
+--TEST--
+xmlwriter_write_attribute_ns with missing param
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+$xw = xmlwriter_open_memory();
+xmlwriter_set_indent($xw, TRUE);
+xmlwriter_start_document($xw, NULL, "UTF-8");
+xmlwriter_start_element($xw, 'root');
+xmlwriter_write_attribute_ns($xw, 'prefix', '', 'http://www.php.net/uri');
+xmlwriter_start_element($xw, 'elem1');
+xmlwriter_write_attribute($xw, 'attr1', 'first');
+xmlwriter_end_element($xw);
+xmlwriter_full_end_element($xw);
+xmlwriter_end_document($xw);
+
+$output = xmlwriter_flush($xw, true);
+print $output;
+
+// write attribute_ns without start_element first
+$xw = xmlwriter_open_memory();
+var_dump(xmlwriter_write_attribute_ns($xw, 'prefix', 'id', 'http://www.php.net/uri', 'elem1'));
+print xmlwriter_output_memory($xw);
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+--EXPECTF--
+
+Warning: xmlwriter_write_attribute_ns() expects exactly %d parameters, %d given in %s on line %d
+<?xml version="1.0" encoding="UTF-8"?>
+<root>
+ <elem1 attr1="first"/>
+</root>%wbool(false)
diff --git a/ext/xmlwriter/tests/xmlwriter_write_dtd_basic_001.phpt b/ext/xmlwriter/tests/xmlwriter_write_dtd_basic_001.phpt
new file mode 100644
index 0000000..af3dce6
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_write_dtd_basic_001.phpt
@@ -0,0 +1,22 @@
+--TEST--
+xmlwriter_write_dtd basic function tests
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+
+$xmlwriter = xmlwriter_open_memory();
+var_dump(xmlwriter_write_dtd($xmlwriter, 'bla1', 'bla2', 'bla3', 'bla4'));
+$output = xmlwriter_flush($xmlwriter, true);
+print $output . PHP_EOL;
+
+var_dump(xmlwriter_write_dtd($xmlwriter, '', '', ''));
+$output = xmlwriter_flush($xmlwriter, true);
+print $output;
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+--EXPECT--
+bool(true)
+<!DOCTYPE bla1 PUBLIC "bla2" "bla3" [bla4]>
+bool(false)
diff --git a/ext/xmlwriter/tests/xmlwriter_write_dtd_error_001.phpt b/ext/xmlwriter/tests/xmlwriter_write_dtd_error_001.phpt
new file mode 100644
index 0000000..69a6a7f
--- /dev/null
+++ b/ext/xmlwriter/tests/xmlwriter_write_dtd_error_001.phpt
@@ -0,0 +1,15 @@
+--TEST--
+xmlwriter_write_dtd with missing param(s)
+--SKIPIF--
+<?php if (!extension_loaded("xmlwriter")) print "skip"; ?>
+--FILE--
+<?php
+$xmlwriter = xmlwriter_open_memory();
+var_dump(xmlwriter_write_dtd($xmlwriter));
+?>
+--CREDITS--
+Koen Kuipers koenk82@gmail.com
+--EXPECTF--
+
+Warning: xmlwriter_write_dtd() expects at least %d parameters, %d given in %s on line %d
+NULL
diff --git a/ext/xmlwriter/xmlwriter.dsp b/ext/xmlwriter/xmlwriter.dsp
new file mode 100644
index 0000000..e5eca77
--- /dev/null
+++ b/ext/xmlwriter/xmlwriter.dsp
@@ -0,0 +1,113 @@
+# Microsoft Developer Studio Project File - Name="xmlwriter" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=xmlwriter - Win32 Release_TS
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "xmlwriter.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "xmlwriter.mak" CFG="xmlwriter - Win32 Release_TS"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "xmlwriter - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "xmlwriter - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "xmlwriter - Win32 Release_TS"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release_TS"
+# PROP BASE Intermediate_Dir "Release_TS"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release_TS"
+# PROP Intermediate_Dir "Release_TS"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLWRITER_EXPORTS" /D "COMPILE_DL_XMLWRITER" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D "LIBXML_THREAD_ENABLED" /FR /YX /FD /GZ /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D ZEND_DEBUG=0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLWRITER_EXPORTS" /D "COMPILE_DL_XMLWRITER" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_XMLWRITER=1 /D "LIBXML_STATIC" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"msvcrt" /out:"..\..\Debug_TS/php_xmlwriter.dll" /libpath:"..\..\Debug_TS" /libpath:"..\..\..\bindlib_w32\Release"
+# ADD LINK32 wsock32.lib php4ts.lib libxml2_a.lib iconv.lib resolv.lib kernel32.lib user32.lib gdi32.lib winspool.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_xmlwriter.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" /libpath:"..\..\..\bindlib_w32\Release"
+# SUBTRACT LINK32 /debug
+
+!ELSEIF "$(CFG)" == "xmlwriter - Win32 Debug_TS"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "xmlwriter___Win32_Debug_TS"
+# PROP BASE Intermediate_Dir "xmlwriter___Win32_Debug_TS"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Debug_TS"
+# PROP Intermediate_Dir "Debug_TS"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLWRITER_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLWRITER_EXPORTS" /D "COMPILE_DL_XMLWRITER" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D "LIBXML_STATIC" /FR /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 wsock32.lib php4ts_debug.lib libxml2_a.lib iconv.lib resolv.lib kernel32.lib user32.lib gdi32.lib winspool.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"msvcrt" /out:"..\..\Debug_TS/php_xmlwriter.dll" /libpath:"..\..\Debug_TS" /libpath:"..\..\..\bindlib_w32\Release"
+
+!ENDIF
+
+# Begin Target
+
+# Name "xmlwriter - Win32 Release_TS"
+# Name "xmlwriter - Win32 Debug_TS"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\php_xmlwriter.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\php_xmlwriter.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project