root/ext/xmlwriter/php_xmlwriter.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. xmlwriter_free_resource_ptr
  2. xmlwriter_object_free_storage
  3. xmlwriter_object_new
  4. _xmlwriter_get_valid_file_path
  5. php_xmlwriter_streams_IO_open_write_wrapper
  6. php_xmlwriter_streams_IO_write
  7. php_xmlwriter_streams_IO_close
  8. ZEND_GET_MODULE
  9. php_xmlwriter_string_arg
  10. php_xmlwriter_end
  11. PHP_FUNCTION
  12. PHP_FUNCTION
  13. PHP_FUNCTION
  14. PHP_FUNCTION
  15. PHP_FUNCTION
  16. PHP_FUNCTION
  17. PHP_FUNCTION
  18. PHP_FUNCTION
  19. PHP_FUNCTION
  20. PHP_FUNCTION
  21. PHP_FUNCTION
  22. PHP_FUNCTION
  23. PHP_FUNCTION
  24. PHP_FUNCTION
  25. PHP_FUNCTION
  26. PHP_FUNCTION
  27. PHP_FUNCTION
  28. PHP_FUNCTION
  29. PHP_FUNCTION
  30. PHP_FUNCTION
  31. PHP_FUNCTION
  32. PHP_FUNCTION
  33. PHP_FUNCTION
  34. PHP_FUNCTION
  35. PHP_FUNCTION
  36. PHP_FUNCTION
  37. PHP_FUNCTION
  38. PHP_FUNCTION
  39. PHP_FUNCTION
  40. PHP_FUNCTION
  41. PHP_FUNCTION
  42. PHP_FUNCTION
  43. PHP_FUNCTION
  44. PHP_FUNCTION
  45. PHP_FUNCTION
  46. PHP_FUNCTION
  47. PHP_FUNCTION
  48. PHP_FUNCTION
  49. PHP_FUNCTION
  50. PHP_FUNCTION
  51. php_xmlwriter_flush
  52. PHP_FUNCTION
  53. PHP_FUNCTION
  54. PHP_MINIT_FUNCTION
  55. PHP_MSHUTDOWN_FUNCTION
  56. PHP_MINFO_FUNCTION

   1 /*
   2   +----------------------------------------------------------------------+
   3   | PHP Version 5                                                        |
   4   +----------------------------------------------------------------------+
   5   | Copyright (c) 1997-2016 The PHP Group                                |
   6   +----------------------------------------------------------------------+
   7   | This source file is subject to version 3.01 of the PHP license,      |
   8   | that is bundled with this package in the file LICENSE, and is        |
   9   | available through the world-wide-web at the following url:           |
  10   | http://www.php.net/license/3_01.txt.                                 |
  11   | If you did not receive a copy of the PHP license and are unable to   |
  12   | obtain it through the world-wide-web, please send a note to          |
  13   | license@php.net so we can mail you a copy immediately.               |
  14   +----------------------------------------------------------------------+
  15   | Author: Rob Richards <rrichards@php.net>                             |
  16   |         Pierre-A. Joye <pajoye@php.net>                              |
  17   +----------------------------------------------------------------------+
  18 */
  19 
  20 /* $Id$ */
  21 
  22 #ifdef HAVE_CONFIG_H
  23 #include "config.h"
  24 #endif
  25 
  26 
  27 #include "php.h"
  28 #include "php_ini.h"
  29 #include "ext/standard/info.h"
  30 #include "php_xmlwriter.h"
  31 #include "ext/standard/php_string.h"
  32 
  33 #if LIBXML_VERSION >= 20605
  34 static PHP_FUNCTION(xmlwriter_set_indent);
  35 static PHP_FUNCTION(xmlwriter_set_indent_string);
  36 #endif
  37 static PHP_FUNCTION(xmlwriter_start_attribute);
  38 static PHP_FUNCTION(xmlwriter_end_attribute);
  39 static PHP_FUNCTION(xmlwriter_write_attribute);
  40 #if LIBXML_VERSION > 20617
  41 static PHP_FUNCTION(xmlwriter_start_attribute_ns);
  42 static PHP_FUNCTION(xmlwriter_write_attribute_ns);
  43 #endif
  44 static PHP_FUNCTION(xmlwriter_start_element);
  45 static PHP_FUNCTION(xmlwriter_end_element);
  46 static PHP_FUNCTION(xmlwriter_full_end_element);
  47 static PHP_FUNCTION(xmlwriter_start_element_ns);
  48 static PHP_FUNCTION(xmlwriter_write_element);
  49 static PHP_FUNCTION(xmlwriter_write_element_ns);
  50 static PHP_FUNCTION(xmlwriter_start_pi);
  51 static PHP_FUNCTION(xmlwriter_end_pi);
  52 static PHP_FUNCTION(xmlwriter_write_pi);
  53 static PHP_FUNCTION(xmlwriter_start_cdata);
  54 static PHP_FUNCTION(xmlwriter_end_cdata);
  55 static PHP_FUNCTION(xmlwriter_write_cdata);
  56 static PHP_FUNCTION(xmlwriter_text);
  57 static PHP_FUNCTION(xmlwriter_write_raw);
  58 static PHP_FUNCTION(xmlwriter_start_document);
  59 static PHP_FUNCTION(xmlwriter_end_document);
  60 #if LIBXML_VERSION >= 20607
  61 static PHP_FUNCTION(xmlwriter_start_comment);
  62 static PHP_FUNCTION(xmlwriter_end_comment);
  63 #endif
  64 static PHP_FUNCTION(xmlwriter_write_comment);
  65 static PHP_FUNCTION(xmlwriter_start_dtd);
  66 static PHP_FUNCTION(xmlwriter_end_dtd);
  67 static PHP_FUNCTION(xmlwriter_write_dtd);
  68 static PHP_FUNCTION(xmlwriter_start_dtd_element);
  69 static PHP_FUNCTION(xmlwriter_end_dtd_element);
  70 static PHP_FUNCTION(xmlwriter_write_dtd_element);
  71 #if LIBXML_VERSION > 20608
  72 static PHP_FUNCTION(xmlwriter_start_dtd_attlist);
  73 static PHP_FUNCTION(xmlwriter_end_dtd_attlist);
  74 static PHP_FUNCTION(xmlwriter_write_dtd_attlist);
  75 static PHP_FUNCTION(xmlwriter_start_dtd_entity);
  76 static PHP_FUNCTION(xmlwriter_end_dtd_entity);
  77 static PHP_FUNCTION(xmlwriter_write_dtd_entity);
  78 #endif
  79 static PHP_FUNCTION(xmlwriter_open_uri);
  80 static PHP_FUNCTION(xmlwriter_open_memory);
  81 static PHP_FUNCTION(xmlwriter_output_memory);
  82 static PHP_FUNCTION(xmlwriter_flush);
  83 
  84 static zend_class_entry *xmlwriter_class_entry_ce;
  85 
  86 static void xmlwriter_free_resource_ptr(xmlwriter_object *intern TSRMLS_DC);
  87 static void xmlwriter_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC);
  88 
  89 typedef int (*xmlwriter_read_one_char_t)(xmlTextWriterPtr writer, const xmlChar *content);
  90 typedef int (*xmlwriter_read_int_t)(xmlTextWriterPtr writer);
  91 
  92 /* {{{ xmlwriter_object_free_storage */
  93 static void xmlwriter_free_resource_ptr(xmlwriter_object *intern TSRMLS_DC) 
  94 {
  95         if (intern) {
  96                 if (intern->ptr) {
  97                         xmlFreeTextWriter(intern->ptr);
  98                         intern->ptr = NULL;
  99                 }
 100                 if (intern->output) {
 101                         xmlBufferFree(intern->output);
 102                         intern->output = NULL;
 103                 }
 104                 efree(intern);
 105         }
 106 }
 107 /* }}} */
 108 
 109 #ifdef ZEND_ENGINE_2
 110 /* {{{ XMLWRITER_FROM_OBJECT */
 111 #define XMLWRITER_FROM_OBJECT(intern, object) \
 112         { \
 113                 ze_xmlwriter_object *obj = (ze_xmlwriter_object*) zend_object_store_get_object(object TSRMLS_CC); \
 114                 intern = obj->xmlwriter_ptr; \
 115                 if (!intern) { \
 116                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or uninitialized XMLWriter object"); \
 117                         RETURN_FALSE; \
 118                 } \
 119         }
 120 /* }}} */
 121 
 122 static zend_object_handlers xmlwriter_object_handlers;
 123 
 124 /* {{{ xmlwriter_object_free_storage */
 125 static void xmlwriter_object_free_storage(void *object TSRMLS_DC)
 126 {
 127         ze_xmlwriter_object * intern = (ze_xmlwriter_object *) object;
 128         if (!intern) {
 129                 return;
 130         }
 131         if (intern->xmlwriter_ptr) {
 132                 xmlwriter_free_resource_ptr(intern->xmlwriter_ptr TSRMLS_CC);
 133         }
 134         intern->xmlwriter_ptr = NULL;
 135         zend_object_std_dtor(&intern->zo TSRMLS_CC);
 136         
 137         efree(intern);
 138 }
 139 /* }}} */
 140 
 141 
 142 /* {{{ xmlwriter_object_new */
 143 static zend_object_value xmlwriter_object_new(zend_class_entry *class_type TSRMLS_DC)
 144 {
 145         ze_xmlwriter_object *intern;
 146         zend_object_value retval;
 147 
 148         intern = emalloc(sizeof(ze_xmlwriter_object));
 149         memset(&intern->zo, 0, sizeof(zend_object));
 150         intern->xmlwriter_ptr = NULL;
 151         
 152         zend_object_std_init(&intern->zo, class_type TSRMLS_CC);
 153         object_properties_init(&intern->zo, class_type);
 154 
 155         retval.handle = zend_objects_store_put(intern,
 156                                                 NULL,
 157                                                 (zend_objects_free_object_storage_t) xmlwriter_object_free_storage,
 158                                                 NULL TSRMLS_CC);
 159         
 160         retval.handlers = (zend_object_handlers *) & xmlwriter_object_handlers;
 161         
 162         return retval;
 163 }
 164 /* }}} */
 165 #endif
 166 
 167 #define XMLW_NAME_CHK(__err) \
 168         if (xmlValidateName((xmlChar *) name, 0) != 0) {        \
 169                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", __err);       \
 170                 RETURN_FALSE;   \
 171         }       \
 172         
 173 /* {{{ arginfo */
 174 ZEND_BEGIN_ARG_INFO(arginfo_xmlwriter_void, 0)
 175 ZEND_END_ARG_INFO()
 176 
 177 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_resource, 0, 0, 1)
 178         ZEND_ARG_INFO(0, xmlwriter)
 179 ZEND_END_ARG_INFO()
 180 
 181 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_open_uri, 0, 0, 1)
 182         ZEND_ARG_INFO(0, uri)
 183 ZEND_END_ARG_INFO()
 184 
 185 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_set_indent, 0, 0, 2)
 186         ZEND_ARG_INFO(0, xmlwriter)
 187         ZEND_ARG_INFO(0, indent)
 188 ZEND_END_ARG_INFO()
 189 
 190 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_set_indent, 0, 0, 1)
 191         ZEND_ARG_INFO(0, indent)
 192 ZEND_END_ARG_INFO()
 193 
 194 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_set_indent_string, 0, 0, 2)
 195         ZEND_ARG_INFO(0, xmlwriter)
 196         ZEND_ARG_INFO(0, indentString)
 197 ZEND_END_ARG_INFO()
 198 
 199 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_set_indent_string, 0, 0, 1)
 200         ZEND_ARG_INFO(0, indentString)
 201 ZEND_END_ARG_INFO()
 202 
 203 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_attribute, 0, 0, 2)
 204         ZEND_ARG_INFO(0, xmlwriter)
 205         ZEND_ARG_INFO(0, name)
 206 ZEND_END_ARG_INFO()
 207 
 208 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_attribute, 0, 0, 1)
 209         ZEND_ARG_INFO(0, name)
 210 ZEND_END_ARG_INFO()
 211 
 212 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_attribute_ns, 0, 0, 4)
 213         ZEND_ARG_INFO(0, xmlwriter)
 214         ZEND_ARG_INFO(0, prefix)
 215         ZEND_ARG_INFO(0, name)
 216         ZEND_ARG_INFO(0, uri)
 217 ZEND_END_ARG_INFO()
 218 
 219 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_attribute_ns, 0, 0, 3)
 220         ZEND_ARG_INFO(0, prefix)
 221         ZEND_ARG_INFO(0, name)
 222         ZEND_ARG_INFO(0, uri)
 223 ZEND_END_ARG_INFO()
 224 
 225 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_attribute_ns, 0, 0, 5)
 226         ZEND_ARG_INFO(0, xmlwriter)
 227         ZEND_ARG_INFO(0, prefix)
 228         ZEND_ARG_INFO(0, name)
 229         ZEND_ARG_INFO(0, uri)
 230         ZEND_ARG_INFO(0, content)
 231 ZEND_END_ARG_INFO()
 232 
 233 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_attribute_ns, 0, 0, 4)
 234         ZEND_ARG_INFO(0, prefix)
 235         ZEND_ARG_INFO(0, name)
 236         ZEND_ARG_INFO(0, uri)
 237         ZEND_ARG_INFO(0, content)
 238 ZEND_END_ARG_INFO()
 239 
 240 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_attribute, 0, 0, 3)
 241         ZEND_ARG_INFO(0, xmlwriter)
 242         ZEND_ARG_INFO(0, name)
 243         ZEND_ARG_INFO(0, value)
 244 ZEND_END_ARG_INFO()
 245 
 246 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_attribute, 0, 0, 2)
 247         ZEND_ARG_INFO(0, name)
 248         ZEND_ARG_INFO(0, value)
 249 ZEND_END_ARG_INFO()
 250 
 251 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_element, 0, 0, 2)
 252         ZEND_ARG_INFO(0, xmlwriter)
 253         ZEND_ARG_INFO(0, name)
 254 ZEND_END_ARG_INFO()
 255 
 256 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_element, 0, 0, 1)
 257         ZEND_ARG_INFO(0, name)
 258 ZEND_END_ARG_INFO()
 259 
 260 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_element_ns, 0, 0, 4)
 261         ZEND_ARG_INFO(0, xmlwriter)
 262         ZEND_ARG_INFO(0, prefix)
 263         ZEND_ARG_INFO(0, name)
 264         ZEND_ARG_INFO(0, uri)
 265 ZEND_END_ARG_INFO()
 266 
 267 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_element_ns, 0, 0, 3)
 268         ZEND_ARG_INFO(0, prefix)
 269         ZEND_ARG_INFO(0, name)
 270         ZEND_ARG_INFO(0, uri)
 271 ZEND_END_ARG_INFO()
 272 
 273 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_element, 0, 0, 2)
 274         ZEND_ARG_INFO(0, xmlwriter)
 275         ZEND_ARG_INFO(0, name)
 276         ZEND_ARG_INFO(0, content)
 277 ZEND_END_ARG_INFO()
 278 
 279 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_element, 0, 0, 1)
 280         ZEND_ARG_INFO(0, name)
 281         ZEND_ARG_INFO(0, content)
 282 ZEND_END_ARG_INFO()
 283 
 284 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_element_ns, 0, 0, 4)
 285         ZEND_ARG_INFO(0, xmlwriter)
 286         ZEND_ARG_INFO(0, prefix)
 287         ZEND_ARG_INFO(0, name)
 288         ZEND_ARG_INFO(0, uri)
 289         ZEND_ARG_INFO(0, content)
 290 ZEND_END_ARG_INFO()
 291 
 292 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_element_ns, 0, 0, 3)
 293         ZEND_ARG_INFO(0, prefix)
 294         ZEND_ARG_INFO(0, name)
 295         ZEND_ARG_INFO(0, uri)
 296         ZEND_ARG_INFO(0, content)
 297 ZEND_END_ARG_INFO()
 298 
 299 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_pi, 0, 0, 2)
 300         ZEND_ARG_INFO(0, xmlwriter)
 301         ZEND_ARG_INFO(0, target)
 302 ZEND_END_ARG_INFO()
 303 
 304 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_pi, 0, 0, 1)
 305         ZEND_ARG_INFO(0, target)
 306 ZEND_END_ARG_INFO()
 307 
 308 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_pi, 0, 0, 3)
 309         ZEND_ARG_INFO(0, xmlwriter)
 310         ZEND_ARG_INFO(0, target)
 311         ZEND_ARG_INFO(0, content)
 312 ZEND_END_ARG_INFO()
 313 
 314 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_pi, 0, 0, 2)
 315         ZEND_ARG_INFO(0, target)
 316         ZEND_ARG_INFO(0, content)
 317 ZEND_END_ARG_INFO()
 318 
 319 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_cdata, 0, 0, 2)
 320         ZEND_ARG_INFO(0, xmlwriter)
 321         ZEND_ARG_INFO(0, content)
 322 ZEND_END_ARG_INFO()
 323 
 324 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_cdata, 0, 0, 1)
 325         ZEND_ARG_INFO(0, content)
 326 ZEND_END_ARG_INFO()
 327 
 328 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_text, 0, 0, 2)
 329         ZEND_ARG_INFO(0, xmlwriter)
 330         ZEND_ARG_INFO(0, content)
 331 ZEND_END_ARG_INFO()
 332 
 333 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_text, 0, 0, 1)
 334         ZEND_ARG_INFO(0, content)
 335 ZEND_END_ARG_INFO()
 336 
 337 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_raw, 0, 0, 2)
 338         ZEND_ARG_INFO(0, xmlwriter)
 339         ZEND_ARG_INFO(0, content)
 340 ZEND_END_ARG_INFO()
 341 
 342 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_raw, 0, 0, 1)
 343         ZEND_ARG_INFO(0, content)
 344 ZEND_END_ARG_INFO()
 345 
 346 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_document, 0, 0, 1)
 347         ZEND_ARG_INFO(0, xmlwriter)
 348         ZEND_ARG_INFO(0, version)
 349         ZEND_ARG_INFO(0, encoding)
 350         ZEND_ARG_INFO(0, standalone)
 351 ZEND_END_ARG_INFO()
 352 
 353 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_document, 0, 0, 0)
 354         ZEND_ARG_INFO(0, version)
 355         ZEND_ARG_INFO(0, encoding)
 356         ZEND_ARG_INFO(0, standalone)
 357 ZEND_END_ARG_INFO()
 358 
 359 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_comment, 0, 0, 2)
 360         ZEND_ARG_INFO(0, xmlwriter)
 361         ZEND_ARG_INFO(0, content)
 362 ZEND_END_ARG_INFO()
 363 
 364 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_comment, 0, 0, 1)
 365         ZEND_ARG_INFO(0, content)
 366 ZEND_END_ARG_INFO()
 367 
 368 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_dtd, 0, 0, 2)
 369         ZEND_ARG_INFO(0, xmlwriter)
 370         ZEND_ARG_INFO(0, qualifiedName)
 371         ZEND_ARG_INFO(0, publicId)
 372         ZEND_ARG_INFO(0, systemId)
 373 ZEND_END_ARG_INFO()
 374 
 375 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_dtd, 0, 0, 1)
 376         ZEND_ARG_INFO(0, qualifiedName)
 377         ZEND_ARG_INFO(0, publicId)
 378         ZEND_ARG_INFO(0, systemId)
 379 ZEND_END_ARG_INFO()
 380 
 381 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_dtd, 0, 0, 2)
 382         ZEND_ARG_INFO(0, xmlwriter)
 383         ZEND_ARG_INFO(0, name)
 384         ZEND_ARG_INFO(0, publicId)
 385         ZEND_ARG_INFO(0, systemId)
 386         ZEND_ARG_INFO(0, subset)
 387 ZEND_END_ARG_INFO()
 388 
 389 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_dtd, 0, 0, 1)
 390         ZEND_ARG_INFO(0, name)
 391         ZEND_ARG_INFO(0, publicId)
 392         ZEND_ARG_INFO(0, systemId)
 393         ZEND_ARG_INFO(0, subset)
 394 ZEND_END_ARG_INFO()
 395 
 396 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_dtd_element, 0, 0, 2)
 397         ZEND_ARG_INFO(0, xmlwriter)
 398         ZEND_ARG_INFO(0, qualifiedName)
 399 ZEND_END_ARG_INFO()
 400 
 401 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_dtd_element, 0, 0, 1)
 402         ZEND_ARG_INFO(0, qualifiedName)
 403 ZEND_END_ARG_INFO()
 404 
 405 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_dtd_element, 0, 0, 3)
 406         ZEND_ARG_INFO(0, xmlwriter)
 407         ZEND_ARG_INFO(0, name)
 408         ZEND_ARG_INFO(0, content)
 409 ZEND_END_ARG_INFO()
 410 
 411 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_dtd_element, 0, 0, 2)
 412         ZEND_ARG_INFO(0, name)
 413         ZEND_ARG_INFO(0, content)
 414 ZEND_END_ARG_INFO()
 415 
 416 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_dtd_attlist, 0, 0, 2)
 417         ZEND_ARG_INFO(0, xmlwriter)
 418         ZEND_ARG_INFO(0, name)
 419 ZEND_END_ARG_INFO()
 420 
 421 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_dtd_attlist, 0, 0, 1)
 422         ZEND_ARG_INFO(0, name)
 423 ZEND_END_ARG_INFO()
 424 
 425 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_dtd_attlist, 0, 0, 3)
 426         ZEND_ARG_INFO(0, xmlwriter)
 427         ZEND_ARG_INFO(0, name)
 428         ZEND_ARG_INFO(0, content)
 429 ZEND_END_ARG_INFO()
 430 
 431 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_dtd_attlist, 0, 0, 2)
 432         ZEND_ARG_INFO(0, name)
 433         ZEND_ARG_INFO(0, content)
 434 ZEND_END_ARG_INFO()
 435 
 436 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_start_dtd_entity, 0, 0, 3)
 437         ZEND_ARG_INFO(0, xmlwriter)
 438         ZEND_ARG_INFO(0, name)
 439         ZEND_ARG_INFO(0, isparam)
 440 ZEND_END_ARG_INFO()
 441 
 442 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_start_dtd_entity, 0, 0, 2)
 443         ZEND_ARG_INFO(0, name)
 444         ZEND_ARG_INFO(0, isparam)
 445 ZEND_END_ARG_INFO()
 446 
 447 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_write_dtd_entity, 0, 0, 3)
 448         ZEND_ARG_INFO(0, xmlwriter)
 449         ZEND_ARG_INFO(0, name)
 450         ZEND_ARG_INFO(0, content)
 451 ZEND_END_ARG_INFO()
 452 
 453 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_write_dtd_entity, 0, 0, 2)
 454         ZEND_ARG_INFO(0, name)
 455         ZEND_ARG_INFO(0, content)
 456 ZEND_END_ARG_INFO()
 457 
 458 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_output_memory, 0, 0, 1)
 459         ZEND_ARG_INFO(0, xmlwriter)
 460         ZEND_ARG_INFO(0, flush)
 461 ZEND_END_ARG_INFO()
 462 
 463 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_output_memory, 0, 0, 0)
 464         ZEND_ARG_INFO(0, flush)
 465 ZEND_END_ARG_INFO()
 466 
 467 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_flush, 0, 0, 1)
 468         ZEND_ARG_INFO(0, xmlwriter)
 469         ZEND_ARG_INFO(0, empty)
 470 ZEND_END_ARG_INFO()
 471 
 472 ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlwriter_method_flush, 0, 0, 0)
 473         ZEND_ARG_INFO(0, empty)
 474 ZEND_END_ARG_INFO()
 475 /* }}} */
 476 
 477 /* {{{ xmlwriter_functions */
 478 static const zend_function_entry xmlwriter_functions[] = {
 479         PHP_FE(xmlwriter_open_uri,                      arginfo_xmlwriter_open_uri)
 480         PHP_FE(xmlwriter_open_memory,           arginfo_xmlwriter_void)
 481 #if LIBXML_VERSION >= 20605
 482         PHP_FE(xmlwriter_set_indent,            arginfo_xmlwriter_set_indent)
 483         PHP_FE(xmlwriter_set_indent_string, arginfo_xmlwriter_set_indent_string)
 484 #endif
 485 #if LIBXML_VERSION >= 20607
 486         PHP_FE(xmlwriter_start_comment,         arginfo_xmlwriter_resource)
 487         PHP_FE(xmlwriter_end_comment,           arginfo_xmlwriter_resource)
 488 #endif
 489         PHP_FE(xmlwriter_start_attribute,       arginfo_xmlwriter_start_attribute)
 490         PHP_FE(xmlwriter_end_attribute,         arginfo_xmlwriter_resource)
 491         PHP_FE(xmlwriter_write_attribute,       arginfo_xmlwriter_write_attribute)
 492 #if LIBXML_VERSION > 20617
 493         PHP_FE(xmlwriter_start_attribute_ns,arginfo_xmlwriter_start_attribute_ns)
 494         PHP_FE(xmlwriter_write_attribute_ns,arginfo_xmlwriter_write_attribute_ns)
 495 #endif
 496         PHP_FE(xmlwriter_start_element,         arginfo_xmlwriter_start_element)
 497         PHP_FE(xmlwriter_end_element,           arginfo_xmlwriter_resource)
 498         PHP_FE(xmlwriter_full_end_element,      arginfo_xmlwriter_resource)
 499         PHP_FE(xmlwriter_start_element_ns,      arginfo_xmlwriter_start_element_ns)
 500         PHP_FE(xmlwriter_write_element,         arginfo_xmlwriter_write_element)
 501         PHP_FE(xmlwriter_write_element_ns,      arginfo_xmlwriter_write_element_ns)
 502         PHP_FE(xmlwriter_start_pi,                      arginfo_xmlwriter_start_pi)
 503         PHP_FE(xmlwriter_end_pi,                        arginfo_xmlwriter_resource)
 504         PHP_FE(xmlwriter_write_pi,                      arginfo_xmlwriter_write_pi)
 505         PHP_FE(xmlwriter_start_cdata,           arginfo_xmlwriter_resource)
 506         PHP_FE(xmlwriter_end_cdata,                     arginfo_xmlwriter_resource)
 507         PHP_FE(xmlwriter_write_cdata,           arginfo_xmlwriter_write_cdata)
 508         PHP_FE(xmlwriter_text,                          arginfo_xmlwriter_text)
 509         PHP_FE(xmlwriter_write_raw,                     arginfo_xmlwriter_write_raw)
 510         PHP_FE(xmlwriter_start_document,        arginfo_xmlwriter_start_document)
 511         PHP_FE(xmlwriter_end_document,          arginfo_xmlwriter_resource)
 512         PHP_FE(xmlwriter_write_comment,         arginfo_xmlwriter_write_comment)
 513         PHP_FE(xmlwriter_start_dtd,                     arginfo_xmlwriter_start_dtd)
 514         PHP_FE(xmlwriter_end_dtd,                       arginfo_xmlwriter_resource)
 515         PHP_FE(xmlwriter_write_dtd,                     arginfo_xmlwriter_write_dtd)
 516         PHP_FE(xmlwriter_start_dtd_element,     arginfo_xmlwriter_start_dtd_element)
 517         PHP_FE(xmlwriter_end_dtd_element,       arginfo_xmlwriter_resource)
 518         PHP_FE(xmlwriter_write_dtd_element,     arginfo_xmlwriter_write_dtd_element)
 519 #if LIBXML_VERSION > 20608
 520         PHP_FE(xmlwriter_start_dtd_attlist,     arginfo_xmlwriter_start_dtd_attlist)
 521         PHP_FE(xmlwriter_end_dtd_attlist,       arginfo_xmlwriter_resource)
 522         PHP_FE(xmlwriter_write_dtd_attlist,     arginfo_xmlwriter_write_dtd_attlist)
 523         PHP_FE(xmlwriter_start_dtd_entity,      arginfo_xmlwriter_start_dtd_entity)
 524         PHP_FE(xmlwriter_end_dtd_entity,        arginfo_xmlwriter_resource)
 525         PHP_FE(xmlwriter_write_dtd_entity,      arginfo_xmlwriter_write_dtd_entity)
 526 #endif
 527         PHP_FE(xmlwriter_output_memory,         arginfo_xmlwriter_output_memory)
 528         PHP_FE(xmlwriter_flush,                         arginfo_xmlwriter_flush)
 529         PHP_FE_END
 530 };
 531 /* }}} */
 532 
 533 #ifdef ZEND_ENGINE_2
 534 /* {{{ xmlwriter_class_functions */
 535 static const zend_function_entry xmlwriter_class_functions[] = {
 536         PHP_ME_MAPPING(openUri,         xmlwriter_open_uri,             arginfo_xmlwriter_open_uri, 0)
 537         PHP_ME_MAPPING(openMemory,      xmlwriter_open_memory,  arginfo_xmlwriter_void, 0)
 538 #if LIBXML_VERSION >= 20605
 539         PHP_ME_MAPPING(setIndent,       xmlwriter_set_indent,   arginfo_xmlwriter_method_set_indent, 0)
 540         PHP_ME_MAPPING(setIndentString, xmlwriter_set_indent_string, arginfo_xmlwriter_method_set_indent_string, 0)
 541 #endif
 542 #if LIBXML_VERSION >= 20607
 543         PHP_ME_MAPPING(startComment,    xmlwriter_start_comment,        arginfo_xmlwriter_void, 0)
 544         PHP_ME_MAPPING(endComment,              xmlwriter_end_comment,          arginfo_xmlwriter_void, 0)
 545 #endif
 546         PHP_ME_MAPPING(startAttribute,  xmlwriter_start_attribute,      arginfo_xmlwriter_method_start_attribute, 0)
 547         PHP_ME_MAPPING(endAttribute,    xmlwriter_end_attribute,        arginfo_xmlwriter_void, 0)
 548         PHP_ME_MAPPING(writeAttribute,  xmlwriter_write_attribute,      arginfo_xmlwriter_method_write_attribute, 0)
 549 #if LIBXML_VERSION > 20617
 550         PHP_ME_MAPPING(startAttributeNs,        xmlwriter_start_attribute_ns,arginfo_xmlwriter_method_start_attribute_ns, 0)
 551         PHP_ME_MAPPING(writeAttributeNs,        xmlwriter_write_attribute_ns,arginfo_xmlwriter_method_write_attribute_ns, 0)
 552 #endif
 553         PHP_ME_MAPPING(startElement,    xmlwriter_start_element,        arginfo_xmlwriter_method_start_element, 0)
 554         PHP_ME_MAPPING(endElement,              xmlwriter_end_element,          arginfo_xmlwriter_void, 0)
 555         PHP_ME_MAPPING(fullEndElement,  xmlwriter_full_end_element,     arginfo_xmlwriter_void, 0)
 556         PHP_ME_MAPPING(startElementNs,  xmlwriter_start_element_ns,     arginfo_xmlwriter_method_start_element_ns, 0)
 557         PHP_ME_MAPPING(writeElement,    xmlwriter_write_element,        arginfo_xmlwriter_method_write_element, 0)
 558         PHP_ME_MAPPING(writeElementNs,  xmlwriter_write_element_ns,     arginfo_xmlwriter_method_write_element_ns, 0)
 559         PHP_ME_MAPPING(startPi,                 xmlwriter_start_pi,                     arginfo_xmlwriter_method_start_pi, 0)
 560         PHP_ME_MAPPING(endPi,                   xmlwriter_end_pi,                       arginfo_xmlwriter_void, 0)
 561         PHP_ME_MAPPING(writePi,                 xmlwriter_write_pi,                     arginfo_xmlwriter_method_write_pi, 0)
 562         PHP_ME_MAPPING(startCdata,              xmlwriter_start_cdata,          arginfo_xmlwriter_void, 0)
 563         PHP_ME_MAPPING(endCdata,                xmlwriter_end_cdata,            arginfo_xmlwriter_void, 0)
 564         PHP_ME_MAPPING(writeCdata,              xmlwriter_write_cdata,          arginfo_xmlwriter_method_write_cdata, 0)
 565         PHP_ME_MAPPING(text,                    xmlwriter_text,                         arginfo_xmlwriter_method_text, 0)
 566         PHP_ME_MAPPING(writeRaw,                xmlwriter_write_raw,            arginfo_xmlwriter_method_write_raw, 0)
 567         PHP_ME_MAPPING(startDocument,   xmlwriter_start_document,       arginfo_xmlwriter_method_start_document, 0)
 568         PHP_ME_MAPPING(endDocument,             xmlwriter_end_document,         arginfo_xmlwriter_void, 0)
 569         PHP_ME_MAPPING(writeComment,    xmlwriter_write_comment,        arginfo_xmlwriter_method_write_comment, 0)
 570         PHP_ME_MAPPING(startDtd,                xmlwriter_start_dtd,            arginfo_xmlwriter_method_start_dtd, 0)
 571         PHP_ME_MAPPING(endDtd,                  xmlwriter_end_dtd,                      arginfo_xmlwriter_void, 0)
 572         PHP_ME_MAPPING(writeDtd,                xmlwriter_write_dtd,            arginfo_xmlwriter_method_write_dtd, 0)
 573         PHP_ME_MAPPING(startDtdElement, xmlwriter_start_dtd_element,arginfo_xmlwriter_method_start_dtd_element, 0)
 574         PHP_ME_MAPPING(endDtdElement,   xmlwriter_end_dtd_element,      arginfo_xmlwriter_void, 0)
 575         PHP_ME_MAPPING(writeDtdElement, xmlwriter_write_dtd_element,    arginfo_xmlwriter_method_write_dtd_element, 0)
 576 #if LIBXML_VERSION > 20608
 577         PHP_ME_MAPPING(startDtdAttlist, xmlwriter_start_dtd_attlist,    arginfo_xmlwriter_method_start_dtd_attlist, 0)
 578         PHP_ME_MAPPING(endDtdAttlist,   xmlwriter_end_dtd_attlist,      arginfo_xmlwriter_void, 0)
 579         PHP_ME_MAPPING(writeDtdAttlist, xmlwriter_write_dtd_attlist,    arginfo_xmlwriter_method_write_dtd_attlist, 0)
 580         PHP_ME_MAPPING(startDtdEntity,  xmlwriter_start_dtd_entity,     arginfo_xmlwriter_method_start_dtd_entity, 0)
 581         PHP_ME_MAPPING(endDtdEntity,    xmlwriter_end_dtd_entity,       arginfo_xmlwriter_void, 0)
 582         PHP_ME_MAPPING(writeDtdEntity,  xmlwriter_write_dtd_entity,     arginfo_xmlwriter_method_write_dtd_entity, 0)
 583 #endif
 584         PHP_ME_MAPPING(outputMemory,    xmlwriter_output_memory,        arginfo_xmlwriter_method_output_memory, 0)
 585         PHP_ME_MAPPING(flush,                   xmlwriter_flush,                        arginfo_xmlwriter_method_flush, 0)
 586         {NULL, NULL, NULL}
 587 };
 588 /* }}} */
 589 #endif
 590 
 591 /* {{{ function prototypes */
 592 static PHP_MINIT_FUNCTION(xmlwriter);
 593 static PHP_MSHUTDOWN_FUNCTION(xmlwriter);
 594 static PHP_MINFO_FUNCTION(xmlwriter);
 595 
 596 static int le_xmlwriter;
 597 /* }}} */
 598 
 599 /* _xmlwriter_get_valid_file_path should be made a 
 600         common function in libxml extension as code is common to a few xml extensions */
 601 /* {{{ _xmlwriter_get_valid_file_path */
 602 static char *_xmlwriter_get_valid_file_path(char *source, char *resolved_path, int resolved_path_len  TSRMLS_DC) {
 603         xmlURI *uri;
 604         xmlChar *escsource;
 605         char *file_dest;
 606         int isFileUri = 0;
 607 
 608         uri = xmlCreateURI();
 609         escsource = xmlURIEscapeStr((xmlChar *)source, (xmlChar *) ":");
 610         xmlParseURIReference(uri, (char *)escsource);
 611         xmlFree(escsource);
 612 
 613         if (uri->scheme != NULL) {
 614                 /* absolute file uris - libxml only supports localhost or empty host */
 615                 if (strncasecmp(source, "file:///", 8) == 0) {
 616                         if (source[sizeof("file:///") - 1] == '\0') {
 617                                 xmlFreeURI(uri);
 618                                 return NULL;
 619                         }
 620                         isFileUri = 1;
 621 #ifdef PHP_WIN32
 622                         source += 8;
 623 #else
 624                         source += 7;
 625 #endif
 626                 } else if (strncasecmp(source, "file://localhost/",17) == 0) {
 627                         if (source[sizeof("file://localhost/") - 1] == '\0') {
 628                                 xmlFreeURI(uri);
 629                                 return NULL;
 630                         }
 631 
 632                         isFileUri = 1;
 633 #ifdef PHP_WIN32
 634                         source += 17;
 635 #else
 636                         source += 16;
 637 #endif
 638                 }
 639         }
 640 
 641         if ((uri->scheme == NULL || isFileUri)) {
 642                 char file_dirname[MAXPATHLEN];
 643                 size_t dir_len;
 644 
 645                 if (!VCWD_REALPATH(source, resolved_path) && !expand_filepath(source, resolved_path TSRMLS_CC)) {
 646                         xmlFreeURI(uri);
 647                         return NULL;
 648                 }
 649 
 650                 memcpy(file_dirname, source, strlen(source));
 651                 dir_len = php_dirname(file_dirname, strlen(source));
 652 
 653                 if (dir_len > 0) {
 654                         struct stat buf;
 655                         if (php_sys_stat(file_dirname, &buf) != 0) {
 656                                 xmlFreeURI(uri);
 657                                 return NULL;
 658                         }
 659                 }
 660 
 661                 file_dest = resolved_path;
 662         } else {
 663                 file_dest = source;
 664         }
 665 
 666         xmlFreeURI(uri);
 667 
 668         return file_dest;
 669 }
 670 /* }}} */
 671 
 672 #ifndef ZEND_ENGINE_2
 673 /* Channel libxml file io layer through the PHP streams subsystem.
 674  * This allows use of ftps:// and https:// urls */
 675 
 676 /* {{{ php_xmlwriter_streams_IO_open_write_wrapper */
 677 static void *php_xmlwriter_streams_IO_open_write_wrapper(const char *filename TSRMLS_DC)
 678 {
 679         php_stream_wrapper *wrapper = NULL;
 680         void *ret_val = NULL;
 681 
 682         ret_val = php_stream_open_wrapper_ex((char *)filename, "wb", REPORT_ERRORS, NULL, NULL);
 683         return ret_val;
 684 }
 685 /* }}} */
 686 
 687 /* {{{ php_xmlwriter_streams_IO_write */
 688 static int php_xmlwriter_streams_IO_write(void *context, const char *buffer, int len)
 689 {
 690         TSRMLS_FETCH();
 691         return php_stream_write((php_stream*)context, buffer, len);
 692 }
 693 /* }}} */
 694 
 695 /* {{{ php_xmlwriter_streams_IO_close */
 696 static int php_xmlwriter_streams_IO_close(void *context)
 697 {
 698         TSRMLS_FETCH();
 699         return php_stream_close((php_stream*)context);
 700 }
 701 /* }}} */
 702 #endif
 703 
 704 /* {{{ xmlwriter_module_entry
 705  */
 706 zend_module_entry xmlwriter_module_entry = {
 707         STANDARD_MODULE_HEADER,
 708         "xmlwriter",
 709         xmlwriter_functions,
 710         PHP_MINIT(xmlwriter),
 711         PHP_MSHUTDOWN(xmlwriter),
 712         NULL,
 713         NULL,
 714         PHP_MINFO(xmlwriter),
 715         "0.1",
 716         STANDARD_MODULE_PROPERTIES
 717 };
 718 /* }}} */
 719 
 720 #ifdef COMPILE_DL_XMLWRITER
 721 ZEND_GET_MODULE(xmlwriter)
 722 #endif
 723 
 724 /* {{{ xmlwriter_objects_clone 
 725 static void xmlwriter_objects_clone(void *object, void **object_clone TSRMLS_DC)
 726 {
 727         TODO
 728 }
 729 }}} */
 730 
 731 /* {{{ xmlwriter_dtor */
 732 static void xmlwriter_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
 733         xmlwriter_object *intern;
 734 
 735         intern = (xmlwriter_object *) rsrc->ptr;
 736         xmlwriter_free_resource_ptr(intern TSRMLS_CC);
 737 }
 738 /* }}} */
 739 
 740 static void php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAMETERS, xmlwriter_read_one_char_t internal_function, char *err_string)
 741 {
 742         zval *pind;
 743         xmlwriter_object *intern;
 744         xmlTextWriterPtr ptr;
 745         char *name;
 746         int name_len, retval;
 747 
 748 #ifdef ZEND_ENGINE_2
 749         zval *this = getThis();
 750         
 751         if (this) {
 752                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
 753                         return;
 754                 }
 755                 XMLWRITER_FROM_OBJECT(intern, this);
 756         } else
 757 #endif
 758         {
 759                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &pind, &name, &name_len) == FAILURE) {
 760                         return;
 761                 }
 762         
 763                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
 764         }
 765 
 766         if (err_string != NULL) {
 767                 XMLW_NAME_CHK(err_string);
 768         }
 769 
 770         ptr = intern->ptr;
 771 
 772         if (ptr) {
 773                 retval = internal_function(ptr, (xmlChar *) name);
 774                 if (retval != -1) {
 775                         RETURN_TRUE;
 776                 }
 777         }
 778         
 779         RETURN_FALSE;
 780 }
 781 
 782 static void php_xmlwriter_end(INTERNAL_FUNCTION_PARAMETERS, xmlwriter_read_int_t internal_function)
 783 {
 784         zval *pind;
 785         xmlwriter_object *intern;
 786         xmlTextWriterPtr ptr;
 787         int retval;
 788 #ifdef ZEND_ENGINE_2
 789         zval *this = getThis();
 790         
 791         if (this) {
 792                 XMLWRITER_FROM_OBJECT(intern, this);
 793                 if (zend_parse_parameters_none() == FAILURE) {
 794                         return;
 795                 }
 796         } else 
 797 #endif
 798         {
 799                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
 800                         return;
 801                 }
 802                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
 803         }
 804 
 805         ptr = intern->ptr;
 806 
 807         if (ptr) {
 808                 retval = internal_function(ptr);
 809                 if (retval != -1) {
 810                         RETURN_TRUE;
 811                 }
 812         }
 813         
 814         RETURN_FALSE;
 815 }
 816 
 817 #if LIBXML_VERSION >= 20605
 818 /* {{{ proto bool xmlwriter_set_indent(resource xmlwriter, bool indent)
 819 Toggle indentation on/off - returns FALSE on error */
 820 static PHP_FUNCTION(xmlwriter_set_indent)
 821 {
 822         zval *pind;
 823         xmlwriter_object *intern;
 824         xmlTextWriterPtr ptr;
 825         int retval;
 826         zend_bool indent;
 827 
 828 #ifdef ZEND_ENGINE_2
 829         zval *this = getThis();
 830         
 831         if (this) {
 832                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &indent) == FAILURE) {
 833                         return;
 834                 }
 835                 XMLWRITER_FROM_OBJECT(intern, this);
 836         } else
 837 #endif
 838         {
 839                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rb", &pind, &indent) == FAILURE) {
 840                         return;
 841                 }
 842                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
 843         }
 844 
 845 
 846         ptr = intern->ptr;
 847         if (ptr) {
 848                 retval = xmlTextWriterSetIndent(ptr, indent);
 849                 if (retval == 0) {
 850                         RETURN_TRUE;
 851                 }
 852         }
 853         
 854         RETURN_FALSE;
 855 }
 856 /* }}} */
 857 
 858 /* {{{ proto bool xmlwriter_set_indent_string(resource xmlwriter, string indentString)
 859 Set string used for indenting - returns FALSE on error */
 860 static PHP_FUNCTION(xmlwriter_set_indent_string)
 861 {
 862         php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterSetIndentString, NULL);
 863 }
 864 /* }}} */
 865 
 866 #endif
 867 
 868 /* {{{ proto bool xmlwriter_start_attribute(resource xmlwriter, string name)
 869 Create start attribute - returns FALSE on error */
 870 static PHP_FUNCTION(xmlwriter_start_attribute)
 871 {
 872         php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterStartAttribute, "Invalid Attribute Name");
 873 }
 874 /* }}} */
 875 
 876 /* {{{ proto bool xmlwriter_end_attribute(resource xmlwriter)
 877 End attribute - returns FALSE on error */
 878 static PHP_FUNCTION(xmlwriter_end_attribute)
 879 {
 880         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndAttribute);
 881 }
 882 /* }}} */
 883 
 884 #if LIBXML_VERSION > 20617
 885 /* {{{ proto bool xmlwriter_start_attribute_ns(resource xmlwriter, string prefix, string name, string uri)
 886 Create start namespaced attribute - returns FALSE on error */
 887 static PHP_FUNCTION(xmlwriter_start_attribute_ns)
 888 {
 889         zval *pind;
 890         xmlwriter_object *intern;
 891         xmlTextWriterPtr ptr;
 892         char *name, *prefix, *uri;
 893         int name_len, prefix_len, uri_len, retval;
 894 #ifdef ZEND_ENGINE_2
 895         zval *this = getThis();
 896         
 897         if (this) {
 898                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss!", 
 899                         &prefix, &prefix_len, &name, &name_len, &uri, &uri_len) == FAILURE) {
 900                         return;
 901                 }
 902                 XMLWRITER_FROM_OBJECT(intern, this);
 903         } else
 904 #endif
 905         {
 906                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsss!", &pind, 
 907                         &prefix, &prefix_len, &name, &name_len, &uri, &uri_len) == FAILURE) {
 908                         return;
 909                 }
 910                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
 911         }
 912 
 913         XMLW_NAME_CHK("Invalid Attribute Name");
 914 
 915         ptr = intern->ptr;
 916 
 917         if (ptr) {
 918                 retval = xmlTextWriterStartAttributeNS(ptr, (xmlChar *)prefix, (xmlChar *)name, (xmlChar *)uri);
 919                 if (retval != -1) {
 920                         RETURN_TRUE;
 921                 }
 922         }
 923         
 924         RETURN_FALSE;
 925 }
 926 /* }}} */
 927 #endif
 928 
 929 /* {{{ proto bool xmlwriter_write_attribute(resource xmlwriter, string name, string content)
 930 Write full attribute - returns FALSE on error */
 931 static PHP_FUNCTION(xmlwriter_write_attribute)
 932 {
 933         zval *pind;
 934         xmlwriter_object *intern;
 935         xmlTextWriterPtr ptr;
 936         char *name, *content;
 937         int name_len, content_len, retval;
 938 
 939 #ifdef ZEND_ENGINE_2
 940         zval *this = getThis();
 941         
 942         if (this) {
 943                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", 
 944                         &name, &name_len, &content, &content_len) == FAILURE) {
 945                         return;
 946                 }
 947                 XMLWRITER_FROM_OBJECT(intern, this);
 948         } else
 949 #endif
 950         {
 951                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &pind, 
 952                         &name, &name_len, &content, &content_len) == FAILURE) {
 953                         return;
 954                 }
 955                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
 956         }
 957 
 958         XMLW_NAME_CHK("Invalid Attribute Name");
 959 
 960         ptr = intern->ptr;
 961 
 962         if (ptr) {
 963                 retval = xmlTextWriterWriteAttribute(ptr, (xmlChar *)name, (xmlChar *)content);
 964                 if (retval != -1) {
 965                         RETURN_TRUE;
 966                 }
 967         }
 968         
 969         RETURN_FALSE;
 970 }
 971 /* }}} */
 972 
 973 #if LIBXML_VERSION > 20617
 974 /* {{{ proto bool xmlwriter_write_attribute_ns(resource xmlwriter, string prefix, string name, string uri, string content)
 975 Write full namespaced attribute - returns FALSE on error */
 976 static PHP_FUNCTION(xmlwriter_write_attribute_ns)
 977 {
 978         zval *pind;
 979         xmlwriter_object *intern;
 980         xmlTextWriterPtr ptr;
 981         char *name, *prefix, *uri, *content;
 982         int name_len, prefix_len, uri_len, content_len, retval;
 983 
 984 #ifdef ZEND_ENGINE_2
 985         zval *this = getThis();
 986         
 987         if (this) {
 988                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss!s", 
 989                         &prefix, &prefix_len, &name, &name_len, &uri, &uri_len, &content, &content_len) == FAILURE) {
 990                         return;
 991                 }
 992                 XMLWRITER_FROM_OBJECT(intern, this);
 993         } else
 994 #endif
 995         {
 996                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsss!s", &pind, 
 997                         &prefix, &prefix_len, &name, &name_len, &uri, &uri_len, &content, &content_len) == FAILURE) {
 998                         return;
 999                 }
1000                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1001         }
1002 
1003         XMLW_NAME_CHK("Invalid Attribute Name");
1004 
1005         ptr = intern->ptr;
1006 
1007         if (ptr) {
1008                 retval = xmlTextWriterWriteAttributeNS(ptr, (xmlChar *)prefix, (xmlChar *)name, (xmlChar *)uri, (xmlChar *)content);
1009                 if (retval != -1) {
1010                         RETURN_TRUE;
1011                 }
1012         }
1013         
1014         RETURN_FALSE;
1015 }
1016 /* }}} */
1017 #endif
1018 
1019 /* {{{ proto bool xmlwriter_start_element(resource xmlwriter, string name)
1020 Create start element tag - returns FALSE on error */
1021 static PHP_FUNCTION(xmlwriter_start_element)
1022 {
1023         php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterStartElement, "Invalid Element Name");
1024 }
1025 /* }}} */
1026 
1027 /* {{{ proto bool xmlwriter_start_element_ns(resource xmlwriter, string prefix, string name, string uri)
1028 Create start namespaced element tag - returns FALSE on error */
1029 static PHP_FUNCTION(xmlwriter_start_element_ns)
1030 {
1031         zval *pind;
1032         xmlwriter_object *intern;
1033         xmlTextWriterPtr ptr;
1034         char *name, *prefix, *uri;
1035         int name_len, prefix_len, uri_len, retval;
1036 #ifdef ZEND_ENGINE_2
1037         zval *this = getThis();
1038         
1039         if (this) {
1040                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s!ss!",
1041                         &prefix, &prefix_len, &name, &name_len, &uri, &uri_len) == FAILURE) {
1042                         return;
1043                 }
1044                 XMLWRITER_FROM_OBJECT(intern, this);
1045         } else
1046 #endif
1047         {
1048                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs!ss!", &pind, 
1049                         &prefix, &prefix_len, &name, &name_len, &uri, &uri_len) == FAILURE) {
1050                         return;
1051                 }
1052                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1053         }
1054 
1055         XMLW_NAME_CHK("Invalid Element Name");
1056 
1057         ptr = intern->ptr;
1058 
1059         if (ptr) {
1060                 retval = xmlTextWriterStartElementNS(ptr, (xmlChar *)prefix, (xmlChar *)name, (xmlChar *)uri);
1061                 if (retval != -1) {
1062                         RETURN_TRUE;
1063                 }
1064                 
1065         }
1066         
1067         RETURN_FALSE;
1068 }
1069 /* }}} */
1070 
1071 /* {{{ proto bool xmlwriter_end_element(resource xmlwriter)
1072 End current element - returns FALSE on error */
1073 static PHP_FUNCTION(xmlwriter_end_element)
1074 {
1075         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndElement);
1076 }
1077 /* }}} */
1078 
1079 /* {{{ proto bool xmlwriter_full_end_element(resource xmlwriter)
1080 End current element - returns FALSE on error */
1081 static PHP_FUNCTION(xmlwriter_full_end_element)
1082 {
1083         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterFullEndElement);
1084 }
1085 /* }}} */
1086 
1087 /* {{{ proto bool xmlwriter_write_element(resource xmlwriter, string name[, string content])
1088 Write full element tag - returns FALSE on error */
1089 static PHP_FUNCTION(xmlwriter_write_element)
1090 {
1091         zval *pind;
1092         xmlwriter_object *intern;
1093         xmlTextWriterPtr ptr;
1094         char *name, *content = NULL;
1095         int name_len, content_len, retval;
1096 
1097 #ifdef ZEND_ENGINE_2
1098         zval *this = getThis();
1099         
1100         if (this) {
1101                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!",
1102                         &name, &name_len, &content, &content_len) == FAILURE) {
1103                         return;
1104                 }
1105                 XMLWRITER_FROM_OBJECT(intern, this);
1106         } else
1107 #endif
1108         {
1109                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s!", &pind, 
1110                         &name, &name_len, &content, &content_len) == FAILURE) {
1111                         return;
1112                 }
1113                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1114         }
1115 
1116         XMLW_NAME_CHK("Invalid Element Name");
1117 
1118         ptr = intern->ptr;
1119 
1120         if (ptr) {
1121                 if (!content) {
1122                         retval = xmlTextWriterStartElement(ptr, (xmlChar *)name);
1123             if (retval == -1) {
1124                 RETURN_FALSE;
1125             }
1126                         xmlTextWriterEndElement(ptr);
1127             if (retval == -1) {
1128                 RETURN_FALSE;
1129             }
1130                 } else {
1131                         retval = xmlTextWriterWriteElement(ptr, (xmlChar *)name, (xmlChar *)content);
1132                 }
1133                 if (retval != -1) {
1134                         RETURN_TRUE;
1135                 }
1136         }
1137         
1138         RETURN_FALSE;
1139 }
1140 /* }}} */
1141 
1142 /* {{{ proto bool xmlwriter_write_element_ns(resource xmlwriter, string prefix, string name, string uri[, string content])
1143 Write full namesapced element tag - returns FALSE on error */
1144 static PHP_FUNCTION(xmlwriter_write_element_ns)
1145 {
1146         zval *pind;
1147         xmlwriter_object *intern;
1148         xmlTextWriterPtr ptr;
1149         char *name, *prefix, *uri, *content = NULL;
1150         int name_len, prefix_len, uri_len, content_len, retval;
1151 
1152 #ifdef ZEND_ENGINE_2
1153         zval *this = getThis();
1154         
1155         if (this) {
1156                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s!ss!|s!", 
1157                         &prefix, &prefix_len, &name, &name_len, &uri, &uri_len, &content, &content_len) == FAILURE) {
1158                         return;
1159                 }
1160                 XMLWRITER_FROM_OBJECT(intern, this);
1161         } else
1162 #endif
1163         {
1164                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs!ss!|s!", &pind, 
1165                         &prefix, &prefix_len, &name, &name_len, &uri, &uri_len, &content, &content_len) == FAILURE) {
1166                         return;
1167                 }
1168                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1169         }
1170 
1171         XMLW_NAME_CHK("Invalid Element Name");
1172 
1173         ptr = intern->ptr;
1174 
1175         if (ptr) {
1176                 if (!content) {
1177                         retval = xmlTextWriterStartElementNS(ptr,(xmlChar *)prefix, (xmlChar *)name, (xmlChar *)uri);
1178             if (retval == -1) {
1179                 RETURN_FALSE;
1180             }
1181                         retval = xmlTextWriterEndElement(ptr);
1182             if (retval == -1) {
1183                 RETURN_FALSE;
1184             }
1185                 } else {
1186                         retval = xmlTextWriterWriteElementNS(ptr, (xmlChar *)prefix, (xmlChar *)name, (xmlChar *)uri, (xmlChar *)content);
1187                 }
1188                 if (retval != -1) {
1189                         RETURN_TRUE;
1190                 }
1191         }
1192         
1193         RETURN_FALSE;
1194 }
1195 /* }}} */
1196 
1197 /* {{{ proto bool xmlwriter_start_pi(resource xmlwriter, string target)
1198 Create start PI tag - returns FALSE on error */
1199 static PHP_FUNCTION(xmlwriter_start_pi)
1200 {
1201         php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterStartPI, "Invalid PI Target");
1202 }
1203 /* }}} */
1204 
1205 /* {{{ proto bool xmlwriter_end_pi(resource xmlwriter)
1206 End current PI - returns FALSE on error */
1207 static PHP_FUNCTION(xmlwriter_end_pi)
1208 {
1209         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndPI);
1210 }
1211 /* }}} */
1212 
1213 /* {{{ proto bool xmlwriter_write_pi(resource xmlwriter, string target, string content)
1214 Write full PI tag - returns FALSE on error */
1215 static PHP_FUNCTION(xmlwriter_write_pi)
1216 {
1217         zval *pind;
1218         xmlwriter_object *intern;
1219         xmlTextWriterPtr ptr;
1220         char *name, *content;
1221         int name_len, content_len, retval;
1222 
1223 #ifdef ZEND_ENGINE_2
1224         zval *this = getThis();
1225         
1226         if (this) {
1227                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
1228                         &name, &name_len, &content, &content_len) == FAILURE) {
1229                         return;
1230                 }
1231                 XMLWRITER_FROM_OBJECT(intern, this);
1232         } else
1233 #endif
1234         {
1235                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &pind, 
1236                         &name, &name_len, &content, &content_len) == FAILURE) {
1237                         return;
1238                 }
1239                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1240         }
1241 
1242         XMLW_NAME_CHK("Invalid PI Target");
1243 
1244         ptr = intern->ptr;
1245 
1246         if (ptr) {
1247                 retval = xmlTextWriterWritePI(ptr, (xmlChar *)name, (xmlChar *)content);
1248                 if (retval != -1) {
1249                         RETURN_TRUE;
1250                 }
1251         }
1252         
1253         RETURN_FALSE;
1254 }
1255 /* }}} */
1256 
1257 /* {{{ proto bool xmlwriter_start_cdata(resource xmlwriter)
1258 Create start CDATA tag - returns FALSE on error */
1259 static PHP_FUNCTION(xmlwriter_start_cdata)
1260 {
1261         zval *pind;
1262         xmlwriter_object *intern;
1263         xmlTextWriterPtr ptr;
1264         int retval;
1265 #ifdef ZEND_ENGINE_2
1266         zval *this = getThis();
1267         
1268         if (this) {
1269                 XMLWRITER_FROM_OBJECT(intern, this);
1270         } else
1271 #endif
1272         {
1273                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
1274                         return;
1275                 }
1276                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1277         }
1278 
1279         ptr = intern->ptr;
1280 
1281         if (ptr) {
1282                 retval = xmlTextWriterStartCDATA(ptr);
1283                 if (retval != -1) {
1284                         RETURN_TRUE;
1285                 }
1286         }
1287         
1288         RETURN_FALSE;
1289 }
1290 /* }}} */
1291 
1292 /* {{{ proto bool xmlwriter_end_cdata(resource xmlwriter)
1293 End current CDATA - returns FALSE on error */
1294 static PHP_FUNCTION(xmlwriter_end_cdata)
1295 {
1296         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndCDATA);
1297 }
1298 /* }}} */
1299 
1300 /* {{{ proto bool xmlwriter_write_cdata(resource xmlwriter, string content)
1301 Write full CDATA tag - returns FALSE on error */
1302 static PHP_FUNCTION(xmlwriter_write_cdata)
1303 {
1304         php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterWriteCDATA, NULL);
1305 }
1306 /* }}} */
1307 
1308 /* {{{ proto bool xmlwriter_write_raw(resource xmlwriter, string content)
1309 Write text - returns FALSE on error */
1310 static PHP_FUNCTION(xmlwriter_write_raw)
1311 {
1312         php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterWriteRaw, NULL);
1313 }
1314 /* }}} */
1315 
1316 /* {{{ proto bool xmlwriter_text(resource xmlwriter, string content)
1317 Write text - returns FALSE on error */
1318 static PHP_FUNCTION(xmlwriter_text)
1319 {
1320         php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterWriteString, NULL);
1321 }
1322 /* }}} */
1323 
1324 #if LIBXML_VERSION >= 20607
1325 /* {{{ proto bool xmlwriter_start_comment(resource xmlwriter)
1326 Create start comment - returns FALSE on error */
1327 static PHP_FUNCTION(xmlwriter_start_comment)
1328 {
1329         zval *pind;
1330         xmlwriter_object *intern;
1331         xmlTextWriterPtr ptr;
1332         int retval;
1333 #ifdef ZEND_ENGINE_2
1334         zval *this = getThis();
1335         
1336         if (this) {
1337                 XMLWRITER_FROM_OBJECT(intern, this);
1338         } else
1339 #endif
1340         {
1341                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
1342                         return;
1343                 }
1344                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1345         }
1346 
1347         ptr = intern->ptr;
1348 
1349         if (ptr) {
1350                 retval = xmlTextWriterStartComment(ptr);
1351                 if (retval != -1) {
1352                         RETURN_TRUE;
1353                 }
1354         }
1355         
1356         RETURN_FALSE;
1357 }
1358 /* }}} */
1359 
1360 /* {{{ proto bool xmlwriter_end_comment(resource xmlwriter)
1361 Create end comment - returns FALSE on error */
1362 static PHP_FUNCTION(xmlwriter_end_comment)
1363 {
1364         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndComment);
1365 }
1366 /* }}} */
1367 #endif  /* LIBXML_VERSION >= 20607 */
1368 
1369 
1370 /* {{{ proto bool xmlwriter_write_comment(resource xmlwriter, string content)
1371 Write full comment tag - returns FALSE on error */
1372 static PHP_FUNCTION(xmlwriter_write_comment)
1373 {
1374         php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterWriteComment, NULL);
1375 }
1376 /* }}} */
1377 
1378 /* {{{ proto bool xmlwriter_start_document(resource xmlwriter, string version, string encoding, string standalone)
1379 Create document tag - returns FALSE on error */
1380 static PHP_FUNCTION(xmlwriter_start_document)
1381 {
1382         zval *pind;
1383         xmlwriter_object *intern;
1384         xmlTextWriterPtr ptr;
1385         char *version = NULL, *enc = NULL, *alone = NULL;
1386         int version_len, enc_len, alone_len, retval;
1387 
1388 #ifdef ZEND_ENGINE_2
1389         zval *this = getThis();
1390 
1391         if (this) {
1392                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!", &version, &version_len, &enc, &enc_len, &alone, &alone_len) == FAILURE) {
1393                         return;
1394                 }
1395                 XMLWRITER_FROM_OBJECT(intern, this);
1396         } else
1397 #endif
1398         {
1399                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|s!s!s!", &pind, &version, &version_len, &enc, &enc_len, &alone, &alone_len) == FAILURE) {
1400                         return;
1401                 }
1402                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1403         }
1404 
1405         ptr = intern->ptr;
1406 
1407         if (ptr) {
1408                 retval = xmlTextWriterStartDocument(ptr, version, enc, alone);
1409                 if (retval != -1) {
1410                         RETURN_TRUE;
1411                 }
1412         }
1413         
1414         RETURN_FALSE;
1415 }
1416 /* }}} */
1417 
1418 /* {{{ proto bool xmlwriter_end_document(resource xmlwriter)
1419 End current document - returns FALSE on error */
1420 static PHP_FUNCTION(xmlwriter_end_document)
1421 {
1422         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndDocument);
1423 }
1424 /* }}} */
1425 
1426 /* {{{ proto bool xmlwriter_start_dtd(resource xmlwriter, string name, string pubid, string sysid)
1427 Create start DTD tag - returns FALSE on error */
1428 static PHP_FUNCTION(xmlwriter_start_dtd)
1429 {
1430         zval *pind;
1431         xmlwriter_object *intern;
1432         xmlTextWriterPtr ptr;
1433         char *name, *pubid = NULL, *sysid = NULL;
1434         int name_len, pubid_len, sysid_len, retval;
1435 
1436 #ifdef ZEND_ENGINE_2
1437         zval *this = getThis();
1438 
1439         if (this) {
1440                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!s!", &name, &name_len, &pubid, &pubid_len, &sysid, &sysid_len) == FAILURE) {
1441                         return;
1442                 }
1443 
1444                 XMLWRITER_FROM_OBJECT(intern, this);
1445         } else
1446 #endif
1447         {
1448                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s!s!", &pind, &name, &name_len, &pubid, &pubid_len, &sysid, &sysid_len) == FAILURE) {
1449                         return;
1450                 }
1451         
1452                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1453         }
1454         ptr = intern->ptr;
1455 
1456         if (ptr) {
1457                 retval = xmlTextWriterStartDTD(ptr, (xmlChar *)name, (xmlChar *)pubid, (xmlChar *)sysid);
1458                 if (retval != -1) {
1459                         RETURN_TRUE;
1460                 }
1461         }
1462         
1463         RETURN_FALSE;
1464 }
1465 /* }}} */
1466 
1467 /* {{{ proto bool xmlwriter_end_dtd(resource xmlwriter)
1468 End current DTD - returns FALSE on error */
1469 static PHP_FUNCTION(xmlwriter_end_dtd)
1470 {
1471         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndDTD);
1472 }
1473 /* }}} */
1474 
1475 /* {{{ proto bool xmlwriter_write_dtd(resource xmlwriter, string name, string pubid, string sysid, string subset)
1476 Write full DTD tag - returns FALSE on error */
1477 static PHP_FUNCTION(xmlwriter_write_dtd)
1478 {
1479         zval *pind;
1480         xmlwriter_object *intern;
1481         xmlTextWriterPtr ptr;
1482         char *name, *pubid = NULL, *sysid = NULL, *subset = NULL;
1483         int name_len, pubid_len, sysid_len, subset_len, retval;
1484 
1485 #ifdef ZEND_ENGINE_2
1486         zval *this = getThis();
1487 
1488         if (this) {
1489                 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) {
1490                         return;
1491                 }
1492 
1493                 XMLWRITER_FROM_OBJECT(intern, this);
1494         } else
1495 #endif
1496         {
1497                 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) {
1498                         return;
1499                 }
1500         
1501                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1502         }
1503 
1504         ptr = intern->ptr;
1505 
1506         if (ptr) {
1507                 retval = xmlTextWriterWriteDTD(ptr, (xmlChar *)name, (xmlChar *)pubid, (xmlChar *)sysid, (xmlChar *)subset);
1508                 if (retval != -1) {
1509                         RETURN_TRUE;
1510                 }
1511         }
1512         
1513         RETURN_FALSE;
1514 }
1515 /* }}} */
1516 
1517 /* {{{ proto bool xmlwriter_start_dtd_element(resource xmlwriter, string name)
1518 Create start DTD element - returns FALSE on error */
1519 static PHP_FUNCTION(xmlwriter_start_dtd_element)
1520 {
1521         php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterStartDTDElement, "Invalid Element Name");
1522 }
1523 /* }}} */
1524 
1525 /* {{{ proto bool xmlwriter_end_dtd_element(resource xmlwriter)
1526 End current DTD element - returns FALSE on error */
1527 static PHP_FUNCTION(xmlwriter_end_dtd_element)
1528 {
1529         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndDTDElement);
1530 }
1531 /* }}} */
1532 
1533 /* {{{ proto bool xmlwriter_write_dtd_element(resource xmlwriter, string name, string content)
1534 Write full DTD element tag - returns FALSE on error */
1535 static PHP_FUNCTION(xmlwriter_write_dtd_element)
1536 {
1537         zval *pind;
1538         xmlwriter_object *intern;
1539         xmlTextWriterPtr ptr;
1540         char *name, *content;
1541         int name_len, content_len, retval;
1542 
1543 #ifdef ZEND_ENGINE_2
1544         zval *this = getThis();
1545 
1546         if (this) {
1547                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &name, &name_len, &content, &content_len) == FAILURE) {
1548                         return;
1549                 }
1550                 XMLWRITER_FROM_OBJECT(intern, this);
1551         } else
1552 #endif
1553         {
1554                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &pind, 
1555                         &name, &name_len, &content, &content_len) == FAILURE) {
1556                         return;
1557                 }
1558                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1559         }
1560 
1561         XMLW_NAME_CHK("Invalid Element Name");
1562 
1563         ptr = intern->ptr;
1564 
1565         if (ptr) {
1566                 retval = xmlTextWriterWriteDTDElement(ptr, (xmlChar *)name, (xmlChar *)content);
1567                 if (retval != -1) {
1568                         RETURN_TRUE;
1569                 }
1570         }
1571         
1572         RETURN_FALSE;
1573 }
1574 /* }}} */
1575 
1576 #if LIBXML_VERSION > 20608
1577 /* {{{ proto bool xmlwriter_start_dtd_attlist(resource xmlwriter, string name)
1578 Create start DTD AttList - returns FALSE on error */
1579 static PHP_FUNCTION(xmlwriter_start_dtd_attlist)
1580 {
1581         php_xmlwriter_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterStartDTDAttlist, "Invalid Element Name");
1582 }
1583 /* }}} */
1584 
1585 /* {{{ proto bool xmlwriter_end_dtd_attlist(resource xmlwriter)
1586 End current DTD AttList - returns FALSE on error */
1587 static PHP_FUNCTION(xmlwriter_end_dtd_attlist)
1588 {
1589         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndDTDAttlist);
1590 }
1591 /* }}} */
1592 
1593 /* {{{ proto bool xmlwriter_write_dtd_attlist(resource xmlwriter, string name, string content)
1594 Write full DTD AttList tag - returns FALSE on error */
1595 static PHP_FUNCTION(xmlwriter_write_dtd_attlist)
1596 {
1597         zval *pind;
1598         xmlwriter_object *intern;
1599         xmlTextWriterPtr ptr;
1600         char *name, *content;
1601         int name_len, content_len, retval;
1602 
1603         
1604 #ifdef ZEND_ENGINE_2
1605         zval *this = getThis();
1606 
1607         if (this) {
1608                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
1609                         &name, &name_len, &content, &content_len) == FAILURE) {
1610                         return;
1611                 }
1612                 XMLWRITER_FROM_OBJECT(intern, this);
1613         } else
1614 #endif
1615         {
1616                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &pind, 
1617                         &name, &name_len, &content, &content_len) == FAILURE) {
1618                         return;
1619                 }
1620                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1621         }
1622 
1623         XMLW_NAME_CHK("Invalid Element Name");
1624 
1625         ptr = intern->ptr;
1626 
1627         if (ptr) {
1628                 retval = xmlTextWriterWriteDTDAttlist(ptr, (xmlChar *)name, (xmlChar *)content);
1629                 if (retval != -1) {
1630                         RETURN_TRUE;
1631                 }
1632         }
1633         
1634         RETURN_FALSE;
1635 }
1636 /* }}} */
1637 
1638 /* {{{ proto bool xmlwriter_start_dtd_entity(resource xmlwriter, string name, bool isparam)
1639 Create start DTD Entity - returns FALSE on error */
1640 static PHP_FUNCTION(xmlwriter_start_dtd_entity)
1641 {
1642         zval *pind;
1643         xmlwriter_object *intern;
1644         xmlTextWriterPtr ptr;
1645         char *name;
1646         int name_len, retval;
1647         zend_bool isparm;
1648 
1649         
1650 #ifdef ZEND_ENGINE_2
1651         zval *this = getThis();
1652 
1653         if (this) {
1654                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sb", &name, &name_len, &isparm) == FAILURE) {
1655                         return;
1656                 }
1657                 XMLWRITER_FROM_OBJECT(intern, this);
1658         } else
1659 #endif
1660         {
1661                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsb", &pind, &name, &name_len, &isparm) == FAILURE) {
1662                         return;
1663                 }
1664                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1665         }
1666 
1667         XMLW_NAME_CHK("Invalid Attribute Name");
1668 
1669         ptr = intern->ptr;
1670 
1671         if (ptr) {
1672                 retval = xmlTextWriterStartDTDEntity(ptr, isparm, (xmlChar *)name);
1673                 if (retval != -1) {
1674                         RETURN_TRUE;
1675                 }
1676         }
1677         
1678         RETURN_FALSE;
1679 }
1680 /* }}} */
1681 
1682 /* {{{ proto bool xmlwriter_end_dtd_entity(resource xmlwriter)
1683 End current DTD Entity - returns FALSE on error */
1684 static PHP_FUNCTION(xmlwriter_end_dtd_entity)
1685 {
1686         php_xmlwriter_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextWriterEndDTDEntity);
1687 }
1688 /* }}} */
1689 
1690 /* {{{ proto bool xmlwriter_write_dtd_entity(resource xmlwriter, string name, string content [, int pe [, string pubid [, string sysid [, string ndataid]]]])
1691 Write full DTD Entity tag - returns FALSE on error */
1692 static PHP_FUNCTION(xmlwriter_write_dtd_entity)
1693 {
1694         zval *pind;
1695         xmlwriter_object *intern;
1696         xmlTextWriterPtr ptr;
1697         char *name, *content;
1698         int name_len, content_len, retval;
1699         /* Optional parameters */
1700         char *pubid = NULL, *sysid = NULL, *ndataid = NULL;
1701         zend_bool pe = 0;
1702         int pubid_len, sysid_len, ndataid_len;
1703 
1704 #ifdef ZEND_ENGINE_2
1705         zval *this = getThis();
1706 
1707         if (this) {
1708                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|bsss",
1709                         &name, &name_len, &content, &content_len, &pe, &pubid, &pubid_len,
1710                         &sysid, &sysid_len, &ndataid, &ndataid_len) == FAILURE) {
1711                         return;
1712                 }
1713                 XMLWRITER_FROM_OBJECT(intern, this);
1714         } else
1715 #endif
1716         {
1717                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss|bsss", &pind, 
1718                         &name, &name_len, &content, &content_len, &pe, &pubid, &pubid_len,
1719                         &sysid, &sysid_len, &ndataid, &ndataid_len) == FAILURE) {
1720                         return;
1721                 }
1722                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1723         }
1724 
1725         XMLW_NAME_CHK("Invalid Element Name");
1726 
1727         ptr = intern->ptr;
1728 
1729         if (ptr) {
1730                 retval = xmlTextWriterWriteDTDEntity(ptr, pe, (xmlChar *)name, (xmlChar *)pubid, (xmlChar *)sysid, (xmlChar *)ndataid, (xmlChar *)content);
1731                 if (retval != -1) {
1732                         RETURN_TRUE;
1733                 }
1734         }
1735         
1736         RETURN_FALSE;
1737 }
1738 /* }}} */
1739 #endif
1740 
1741 /* {{{ proto resource xmlwriter_open_uri(string source)
1742 Create new xmlwriter using source uri for output */
1743 static PHP_FUNCTION(xmlwriter_open_uri)
1744 {
1745         char *valid_file = NULL;
1746         xmlwriter_object *intern;
1747         xmlTextWriterPtr ptr;
1748         char *source;
1749         char resolved_path[MAXPATHLEN + 1];
1750         int source_len;
1751 
1752 #ifdef ZEND_ENGINE_2
1753         zval *this = getThis();
1754         ze_xmlwriter_object *ze_obj = NULL;
1755 #endif
1756 
1757 #ifndef ZEND_ENGINE_2
1758         xmlOutputBufferPtr out_buffer;
1759         void *ioctx;
1760 #endif
1761 
1762         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &source, &source_len) == FAILURE) {
1763                 return;
1764         }
1765         
1766 #ifdef ZEND_ENGINE_2
1767         if (this) {
1768                 /* We do not use XMLWRITER_FROM_OBJECT, xmlwriter init function here */
1769                 ze_obj = (ze_xmlwriter_object*) zend_object_store_get_object(this TSRMLS_CC); 
1770         }
1771 #endif
1772 
1773         if (source_len == 0) {
1774                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string as source");
1775                 RETURN_FALSE;
1776         }
1777 
1778         valid_file = _xmlwriter_get_valid_file_path(source, resolved_path, MAXPATHLEN TSRMLS_CC);
1779         if (!valid_file) {
1780                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to resolve file path");
1781                 RETURN_FALSE;
1782         }
1783 
1784         /* TODO: Fix either the PHP stream or libxml APIs: it can then detect when a given 
1785                  path is valid and not report out of memory error. Once it is done, remove the
1786                  directory check in _xmlwriter_get_valid_file_path */
1787 #ifndef ZEND_ENGINE_2
1788         ioctx = php_xmlwriter_streams_IO_open_write_wrapper(valid_file TSRMLS_CC);
1789         if (ioctx == NULL) {
1790                 RETURN_FALSE;
1791         }
1792 
1793         out_buffer = xmlOutputBufferCreateIO(php_xmlwriter_streams_IO_write, 
1794                 php_xmlwriter_streams_IO_close, ioctx, NULL);
1795 
1796         if (out_buffer == NULL) {
1797                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create output buffer");
1798                 RETURN_FALSE;
1799         }
1800         ptr = xmlNewTextWriter(out_buffer);
1801 #else
1802         ptr = xmlNewTextWriterFilename(valid_file, 0);
1803 #endif
1804 
1805         if (!ptr) {
1806                 RETURN_FALSE;
1807         }
1808 
1809         intern = emalloc(sizeof(xmlwriter_object));
1810         intern->ptr = ptr;
1811         intern->output = NULL;
1812 #ifndef ZEND_ENGINE_2
1813         intern->uri_output = out_buffer;
1814 #else
1815         if (this) {
1816                 if (ze_obj->xmlwriter_ptr) {
1817                         xmlwriter_free_resource_ptr(ze_obj->xmlwriter_ptr TSRMLS_CC);
1818                 }
1819                 ze_obj->xmlwriter_ptr = intern;
1820                 RETURN_TRUE;
1821         } else
1822 #endif
1823         {
1824                 ZEND_REGISTER_RESOURCE(return_value,intern,le_xmlwriter);
1825         }
1826 }
1827 /* }}} */
1828 
1829 /* {{{ proto resource xmlwriter_open_memory()
1830 Create new xmlwriter using memory for string output */
1831 static PHP_FUNCTION(xmlwriter_open_memory)
1832 {
1833         xmlwriter_object *intern;
1834         xmlTextWriterPtr ptr;
1835         xmlBufferPtr buffer;
1836 
1837 #ifdef ZEND_ENGINE_2
1838         zval *this = getThis();
1839         ze_xmlwriter_object *ze_obj = NULL;
1840 #endif
1841 
1842 #ifdef ZEND_ENGINE_2
1843         if (this) {
1844                 /* We do not use XMLWRITER_FROM_OBJECT, xmlwriter init function here */
1845                 ze_obj = (ze_xmlwriter_object*) zend_object_store_get_object(this TSRMLS_CC); 
1846         }
1847 #endif
1848 
1849         buffer = xmlBufferCreate();
1850 
1851         if (buffer == NULL) {
1852                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create output buffer");
1853                 RETURN_FALSE;
1854         }
1855 
1856         ptr = xmlNewTextWriterMemory(buffer, 0);
1857         if (! ptr) {
1858                 xmlBufferFree(buffer);
1859                 RETURN_FALSE;
1860         }
1861 
1862         intern = emalloc(sizeof(xmlwriter_object));
1863         intern->ptr = ptr;
1864         intern->output = buffer;
1865 #ifndef ZEND_ENGINE_2
1866         intern->uri_output = NULL;
1867 #else
1868         if (this) {
1869                 if (ze_obj->xmlwriter_ptr) {
1870                         xmlwriter_free_resource_ptr(ze_obj->xmlwriter_ptr TSRMLS_CC);
1871                 }
1872                 ze_obj->xmlwriter_ptr = intern;
1873                 RETURN_TRUE;
1874         } else
1875 #endif
1876         {
1877                 ZEND_REGISTER_RESOURCE(return_value,intern,le_xmlwriter);
1878         }
1879 
1880 }
1881 /* }}} */
1882 
1883 /* {{{ php_xmlwriter_flush */
1884 static void php_xmlwriter_flush(INTERNAL_FUNCTION_PARAMETERS, int force_string) {
1885         zval *pind;
1886         xmlwriter_object *intern;
1887         xmlTextWriterPtr ptr;
1888         xmlBufferPtr buffer;
1889         zend_bool empty = 1;
1890         int output_bytes;
1891 
1892 
1893 #ifdef ZEND_ENGINE_2
1894         zval *this = getThis();
1895 
1896         if (this) {
1897                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &empty) == FAILURE) {
1898                         return;
1899                 }
1900                 XMLWRITER_FROM_OBJECT(intern, this);
1901         } else
1902 #endif
1903         {
1904                 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|b", &pind, &empty) == FAILURE) {
1905                         return;
1906                 }
1907 
1908                 ZEND_FETCH_RESOURCE(intern,xmlwriter_object *, &pind, -1, "XMLWriter", le_xmlwriter);
1909         }
1910         ptr = intern->ptr;
1911 
1912         if (ptr) {
1913                 buffer = intern->output;
1914                 if (force_string == 1 && buffer == NULL) {
1915                         RETURN_EMPTY_STRING();
1916                 }
1917                 output_bytes = xmlTextWriterFlush(ptr);
1918                 if (buffer) {
1919                         RETVAL_STRING((char *) buffer->content, 1);
1920                         if (empty) {
1921                                 xmlBufferEmpty(buffer);
1922                         }
1923                 } else {
1924                         RETVAL_LONG(output_bytes);
1925                 }
1926                 return;
1927         }
1928         
1929         RETURN_EMPTY_STRING();
1930 }
1931 /* }}} */
1932 
1933 /* {{{ proto string xmlwriter_output_memory(resource xmlwriter [,bool flush])
1934 Output current buffer as string */
1935 static PHP_FUNCTION(xmlwriter_output_memory)
1936 {
1937         php_xmlwriter_flush(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
1938 }
1939 /* }}} */
1940 
1941 /* {{{ proto mixed xmlwriter_flush(resource xmlwriter [,bool empty])
1942 Output current buffer */
1943 static PHP_FUNCTION(xmlwriter_flush)
1944 {
1945         php_xmlwriter_flush(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
1946 }
1947 /* }}} */
1948 
1949 /* {{{ PHP_MINIT_FUNCTION
1950  */
1951 static PHP_MINIT_FUNCTION(xmlwriter)
1952 {
1953 #ifdef ZEND_ENGINE_2
1954         zend_class_entry ce;
1955 #endif
1956 
1957         le_xmlwriter = zend_register_list_destructors_ex(xmlwriter_dtor, NULL, "xmlwriter", module_number);
1958 
1959 #ifdef ZEND_ENGINE_2
1960         memcpy(&xmlwriter_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
1961         xmlwriter_object_handlers.clone_obj      = NULL;
1962         INIT_CLASS_ENTRY(ce, "XMLWriter", xmlwriter_class_functions);
1963         ce.create_object = xmlwriter_object_new;
1964         xmlwriter_class_entry_ce = zend_register_internal_class(&ce TSRMLS_CC);
1965 #endif
1966         return SUCCESS;
1967 }
1968 /* }}} */
1969 
1970 /* {{{ PHP_MSHUTDOWN_FUNCTION
1971  */
1972 static PHP_MSHUTDOWN_FUNCTION(xmlwriter)
1973 {
1974         return SUCCESS;
1975 }
1976 /* }}} */
1977 
1978 /* {{{ PHP_MINFO_FUNCTION
1979  */
1980 static PHP_MINFO_FUNCTION(xmlwriter)
1981 {
1982         php_info_print_table_start();
1983         {
1984                 php_info_print_table_row(2, "XMLWriter", "enabled");
1985         }
1986         php_info_print_table_end();
1987 }
1988 /* }}} */
1989 
1990 /*
1991  * Local variables:
1992  * tab-width: 4
1993  * c-basic-offset: 4
1994  * End:
1995  * vim600: noet sw=4 ts=4 fdm=marker
1996  * vim<600: noet sw=4 ts=4
1997  */

/* [<][>][^][v][top][bottom][index][help] */