php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
php_xmlreader.c
Go to the documentation of this file.
1/*
2 +----------------------------------------------------------------------+
3 | Copyright (c) The PHP Group |
4 +----------------------------------------------------------------------+
5 | This source file is subject to version 3.01 of the PHP license, |
6 | that is bundled with this package in the file LICENSE, and is |
7 | available through the world-wide-web at the following url: |
8 | https://www.php.net/license/3_01.txt |
9 | If you did not receive a copy of the PHP license and are unable to |
10 | obtain it through the world-wide-web, please send a note to |
11 | license@php.net so we can mail you a copy immediately. |
12 +----------------------------------------------------------------------+
13 | Author: Rob Richards <rrichards@php.net> |
14 +----------------------------------------------------------------------+
15*/
16
17#ifdef HAVE_CONFIG_H
18#include <config.h>
19#endif
20
21
22#include "php.h"
23#include "php_ini.h"
24#include "ext/standard/info.h"
25#include "zend_observer.h"
26#include "php_xmlreader.h"
27#ifdef HAVE_DOM
28#include "ext/dom/xml_common.h"
29#include "ext/dom/dom_ce.h"
30#endif
31#include <libxml/xmlreader.h>
32#include <libxml/uri.h>
34
36
37static zend_object_handlers xmlreader_object_handlers;
38
39static HashTable xmlreader_prop_handlers;
40
41static zend_internal_function xmlreader_open_fn;
42static zend_internal_function xmlreader_xml_fn;
43
44typedef int (*xmlreader_read_int_t)(xmlTextReaderPtr reader);
45typedef unsigned char *(*xmlreader_read_char_t)(xmlTextReaderPtr reader);
46typedef const unsigned char *(*xmlreader_read_const_char_t)(xmlTextReaderPtr reader);
47
48typedef unsigned char *(*xmlreader_read_one_char_t)(xmlTextReaderPtr reader, const unsigned char *);
49
55
56#define XMLREADER_LOAD_STRING 0
57#define XMLREADER_LOAD_FILE 1
58
59static void xmlreader_register_prop_handler(HashTable *prop_handler, const char *name, size_t name_len, const xmlreader_prop_handler *hnd)
60{
61 zend_string *str = zend_string_init_interned(name, name_len, true);
62 zend_hash_add_new_ptr(prop_handler, str, (void *) hnd);
63 zend_string_release_ex(str, true);
64}
65
66#define XMLREADER_REGISTER_PROP_HANDLER(prop_handler, name, prop_read_int_func, prop_read_char_func, prop_type) do { \
67 static const xmlreader_prop_handler hnd = {.read_int_func = prop_read_int_func, .read_char_func = prop_read_char_func, .type = prop_type}; \
68 xmlreader_register_prop_handler(prop_handler, "" name, sizeof("" name) - 1, &hnd); \
69 } while (0)
70
71/* {{{ xmlreader_property_reader */
72static int xmlreader_property_reader(xmlreader_object *obj, xmlreader_prop_handler *hnd, zval *rv)
73{
74 const xmlChar *retchar = NULL;
75 int retint = 0;
76
77 if (obj->ptr != NULL) {
78 if (hnd->read_char_func) {
79 retchar = hnd->read_char_func(obj->ptr);
80 } else {
81 if (hnd->read_int_func) {
82 retint = hnd->read_int_func(obj->ptr);
83 if (retint == -1) {
84 zend_throw_error(NULL, "Failed to read property because no XML data has been read yet");
85 return FAILURE;
86 }
87 }
88 }
89 }
90
91 switch (hnd->type) {
92 case IS_STRING:
93 if (retchar) {
94 ZVAL_STRING(rv, (char *) retchar);
95 } else {
97 }
98 break;
99 case _IS_BOOL:
100 ZVAL_BOOL(rv, retint);
101 break;
102 case IS_LONG:
103 ZVAL_LONG(rv, retint);
104 break;
106 }
107
108 return SUCCESS;
109}
110/* }}} */
111
112/* {{{ xmlreader_get_property_ptr_ptr */
114{
115 zval *retval = NULL;
116
117 xmlreader_prop_handler *hnd = zend_hash_find_ptr(&xmlreader_prop_handlers, name);
118 if (hnd == NULL) {
119 retval = zend_std_get_property_ptr_ptr(object, name, type, cache_slot);
120 } else if (cache_slot) {
121 cache_slot[0] = cache_slot[1] = cache_slot[2] = NULL;
122 }
123
124 return retval;
125}
126/* }}} */
127
128static int xmlreader_has_property(zend_object *object, zend_string *name, int type, void **cache_slot)
129{
130 xmlreader_object *obj = php_xmlreader_fetch_object(object);
131 xmlreader_prop_handler *hnd = zend_hash_find_ptr(&xmlreader_prop_handlers, name);
132
133 if (hnd != NULL) {
134 if (type == ZEND_PROPERTY_EXISTS) {
135 return 1;
136 }
137
138 zval rv;
139 if (xmlreader_property_reader(obj, hnd, &rv) == FAILURE) {
140 return 0;
141 }
142
143 bool result;
144
147 } else if (type == ZEND_PROPERTY_ISSET) {
148 result = (Z_TYPE(rv) != IS_NULL);
149 } else {
151 }
152
154
155 return result;
156 }
157
158 return zend_std_has_property(object, name, type, cache_slot);
159}
160
161
162/* {{{ xmlreader_read_property */
163zval *xmlreader_read_property(zend_object *object, zend_string *name, int type, void **cache_slot, zval *rv)
164{
165 zval *retval = NULL;
166 xmlreader_object *obj = php_xmlreader_fetch_object(object);
167 xmlreader_prop_handler *hnd = zend_hash_find_ptr(&xmlreader_prop_handlers, name);
168
169 if (hnd != NULL) {
170 if (xmlreader_property_reader(obj, hnd, rv) == FAILURE) {
171 retval = &EG(uninitialized_zval);
172 } else {
173 retval = rv;
174 }
175 } else {
176 retval = zend_std_read_property(object, name, type, cache_slot, rv);
177 }
178
179 return retval;
180}
181/* }}} */
182
183/* {{{ xmlreader_write_property */
185{
186 xmlreader_prop_handler *hnd = zend_hash_find_ptr(&xmlreader_prop_handlers, name);
187
188 if (hnd != NULL) {
190 } else {
191 value = zend_std_write_property(object, name, value, cache_slot);
192 }
193
194 return value;
195}
196/* }}} */
197
198void xmlreader_unset_property(zend_object *object, zend_string *name, void **cache_slot)
199{
200 xmlreader_prop_handler *hnd = zend_hash_find_ptr(&xmlreader_prop_handlers, name);
201
202 if (hnd != NULL) {
203 zend_throw_error(NULL, "Cannot unset %s::$%s", ZSTR_VAL(object->ce->name), ZSTR_VAL(name));
204 return;
205 }
206
207 zend_std_unset_property(object, name, cache_slot);
208}
209
210/* {{{ */
211static zend_function *xmlreader_get_method(zend_object **obj, zend_string *name, const zval *key)
212{
213 zend_function *method = zend_std_get_method(obj, name, key);
214 if (method && (method->common.fn_flags & ZEND_ACC_STATIC) && method->common.type == ZEND_INTERNAL_FUNCTION) {
215 /* There are only two static internal methods and they both have overrides. */
216 if (ZSTR_LEN(name) == sizeof("xml") - 1) {
217 return (zend_function *) &xmlreader_xml_fn;
218 } else if (ZSTR_LEN(name) == sizeof("open") - 1) {
219 return (zend_function *) &xmlreader_open_fn;
220 }
221 }
222 return method;
223}
224/* }}} */
225
226static HashTable* xmlreader_get_debug_info(zend_object *object, int *is_temp)
227{
228 *is_temp = 1;
229
230 xmlreader_object *obj = php_xmlreader_fetch_object(object);
231 HashTable *std_props = zend_std_get_properties(object);
232 HashTable *debug_info = zend_array_dup(std_props);
233
234 zend_string *string_key;
236 ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&xmlreader_prop_handlers, string_key, entry) {
237 ZEND_ASSERT(string_key != NULL);
238
239 zval value;
240 if (xmlreader_property_reader(obj, entry, &value) == SUCCESS) {
241 zend_hash_update(debug_info, string_key, &value);
242 }
244
245 return debug_info;
246}
247
248/* {{{ _xmlreader_get_valid_file_path */
249/* _xmlreader_get_valid_file_path and _xmlreader_get_relaxNG should be made a
250 common function in libxml extension as code is common to a few xml extensions */
251char *_xmlreader_get_valid_file_path(char *source, char *resolved_path, int resolved_path_len ) {
252 xmlURI *uri;
253 xmlChar *escsource;
254 char *file_dest;
255 int isFileUri = 0;
256
257 uri = xmlCreateURI();
258 if (uri == NULL) {
259 return NULL;
260 }
261 escsource = xmlURIEscapeStr((xmlChar *)source, (xmlChar *)":");
262 xmlParseURIReference(uri, (const char *)escsource);
263 xmlFree(escsource);
264
265 if (uri->scheme != NULL) {
266 /* absolute file uris - libxml only supports localhost or empty host */
267 if (strncasecmp(source, "file:///",8) == 0) {
268 isFileUri = 1;
269#ifdef PHP_WIN32
270 source += 8;
271#else
272 source += 7;
273#endif
274 } else if (strncasecmp(source, "file://localhost/",17) == 0) {
275 isFileUri = 1;
276#ifdef PHP_WIN32
277 source += 17;
278#else
279 source += 16;
280#endif
281 }
282 }
283
284 file_dest = source;
285
286 if ((uri->scheme == NULL || isFileUri)) {
287 if (!VCWD_REALPATH(source, resolved_path) && !expand_filepath(source, resolved_path)) {
288 xmlFreeURI(uri);
289 return NULL;
290 }
291 file_dest = resolved_path;
292 }
293
294 xmlFreeURI(uri);
295
296 return file_dest;
297}
298/* }}} */
299
300#ifdef LIBXML_SCHEMAS_ENABLED
301/* {{{ _xmlreader_get_relaxNG */
302static xmlRelaxNGPtr _xmlreader_get_relaxNG(char *source, size_t source_len, size_t type,
303 xmlRelaxNGValidityErrorFunc error_func,
304 xmlRelaxNGValidityWarningFunc warn_func)
305{
306 char *valid_file = NULL;
307 xmlRelaxNGParserCtxtPtr parser = NULL;
308 xmlRelaxNGPtr sptr;
309 char resolved_path[MAXPATHLEN + 1];
310
311 switch (type) {
313 valid_file = _xmlreader_get_valid_file_path(source, resolved_path, MAXPATHLEN );
314 if (!valid_file) {
315 return NULL;
316 }
317 parser = xmlRelaxNGNewParserCtxt(valid_file);
318 break;
320 parser = xmlRelaxNGNewMemParserCtxt(source, source_len);
321 /* If loading from memory, we need to set the base directory for the document
322 but it is not apparent how to do that for schema's */
323 break;
324 default:
325 return NULL;
326 }
327
328 if (parser == NULL) {
329 return NULL;
330 }
331
332 PHP_LIBXML_SANITIZE_GLOBALS(parse);
333 if (error_func || warn_func) {
334 xmlRelaxNGSetParserErrors(parser,
335 (xmlRelaxNGValidityErrorFunc) error_func,
336 (xmlRelaxNGValidityWarningFunc) warn_func,
337 parser);
338 }
339 sptr = xmlRelaxNGParse(parser);
340 xmlRelaxNGFreeParserCtxt(parser);
341 PHP_LIBXML_RESTORE_GLOBALS(parse);
342
343 return sptr;
344}
345/* }}} */
346#endif
347
348static const zend_module_dep xmlreader_deps[] = {
349#ifdef HAVE_DOM
350 ZEND_MOD_REQUIRED("dom")
351#endif
352 ZEND_MOD_REQUIRED("libxml")
354};
355
356/* {{{ xmlreader_module_entry */
359 xmlreader_deps,
360 "xmlreader",
361 NULL,
362 PHP_MINIT(xmlreader),
363 PHP_MSHUTDOWN(xmlreader),
364 NULL,
365 NULL,
366 PHP_MINFO(xmlreader),
369};
370/* }}} */
371
372#ifdef COMPILE_DL_XMLREADER
373ZEND_GET_MODULE(xmlreader)
374#endif
375
376/* {{{ xmlreader_free_resources */
377static void xmlreader_free_resources(xmlreader_object *intern) {
378 if (intern->input) {
379 xmlFreeParserInputBuffer(intern->input);
380 intern->input = NULL;
381 }
382
383 if (intern->ptr) {
384 xmlFreeTextReader(intern->ptr);
385 intern->ptr = NULL;
386 }
387#ifdef LIBXML_SCHEMAS_ENABLED
388 if (intern->schema) {
389 xmlRelaxNGFree((xmlRelaxNGPtr) intern->schema);
390 intern->schema = NULL;
391 }
392#endif
393}
394/* }}} */
395
396/* {{{ xmlreader_objects_free_storage */
398{
399 xmlreader_object *intern = php_xmlreader_fetch_object(object);
400
401 zend_object_std_dtor(&intern->std);
402
403 xmlreader_free_resources(intern);
404}
405/* }}} */
406
407/* {{{ xmlreader_objects_new */
409{
410 xmlreader_object *intern;
411
412 intern = zend_object_alloc(sizeof(xmlreader_object), class_type);
413 zend_object_std_init(&intern->std, class_type);
414 object_properties_init(&intern->std, class_type);
415
416 return &intern->std;
417}
418/* }}} */
419
420/* {{{ php_xmlreader_string_arg */
421static void php_xmlreader_string_arg(INTERNAL_FUNCTION_PARAMETERS, xmlreader_read_one_char_t internal_function) {
422 zval *id;
423 size_t name_len = 0;
424 char *retchar = NULL;
425 xmlreader_object *intern;
426 char *name;
427
428 if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
430 }
431
432 if (!name_len) {
435 }
436
437 id = ZEND_THIS;
438
439 intern = Z_XMLREADER_P(id);
440 if (intern->ptr) {
441 retchar = (char *)internal_function(intern->ptr, (const unsigned char *)name);
442 }
443 if (retchar) {
444 RETVAL_STRING(retchar);
445 xmlFree(retchar);
446 return;
447 } else {
448 RETVAL_NULL();
449 }
450}
451/* }}} */
452
453/* {{{ php_xmlreader_no_arg */
454static void php_xmlreader_no_arg(INTERNAL_FUNCTION_PARAMETERS, xmlreader_read_int_t internal_function) {
455 zval *id;
456 int retval;
457 xmlreader_object *intern;
458
461 }
462
463 id = ZEND_THIS;
464
465 intern = Z_XMLREADER_P(id);
466 if (intern->ptr) {
467 retval = internal_function(intern->ptr);
468 if (retval == 1) {
470 }
471 }
472
474}
475/* }}} */
476
477/* {{{ php_xmlreader_no_arg_string */
478static void php_xmlreader_no_arg_string(INTERNAL_FUNCTION_PARAMETERS, xmlreader_read_char_t internal_function) {
479 zval *id;
480 char *retchar = NULL;
481 xmlreader_object *intern;
482
485 }
486
487 id = ZEND_THIS;
488
489 intern = Z_XMLREADER_P(id);
490 if (intern->ptr) {
491 retchar = (char *)internal_function(intern->ptr);
492 }
493 if (retchar) {
494 RETVAL_STRING(retchar);
495 xmlFree(retchar);
496 return;
497 } else {
499 }
500}
501/* }}} */
502
503/* {{{ php_xmlreader_set_relaxng_schema */
504static void php_xmlreader_set_relaxng_schema(INTERNAL_FUNCTION_PARAMETERS, int type) {
505#ifdef LIBXML_SCHEMAS_ENABLED
506 zval *id;
507 size_t source_len = 0;
508 int retval = -1;
509 xmlreader_object *intern;
510 xmlRelaxNGPtr schema = NULL;
511 char *source;
512
513 if (zend_parse_parameters(ZEND_NUM_ARGS(), "p!", &source, &source_len) == FAILURE) {
515 }
516
517 if (source != NULL && !source_len) {
520 }
521
522 id = ZEND_THIS;
523
524 intern = Z_XMLREADER_P(id);
525 if (intern->ptr) {
526 if (source) {
527 schema = _xmlreader_get_relaxNG(source, source_len, type, NULL, NULL);
528 if (schema) {
529 retval = xmlTextReaderRelaxNGSetSchema(intern->ptr, schema);
530 }
531 } else {
532 /* unset the associated relaxNG context and schema if one exists */
533 retval = xmlTextReaderRelaxNGSetSchema(intern->ptr, NULL);
534 }
535
536 if (retval == 0) {
537 if (intern->schema) {
538 xmlRelaxNGFree((xmlRelaxNGPtr) intern->schema);
539 }
540
541 intern->schema = schema;
542
544 } else {
545 php_error_docref(NULL, E_WARNING, "Schema contains errors");
547 }
548 } else {
549 zend_throw_error(NULL, "Schema must be set prior to reading");
551 }
552#else
553 php_error_docref(NULL, E_WARNING, "No schema support built into libxml");
555#endif
556}
557/* }}} */
558
559/* {{{ Closes xmlreader - current frees resources until xmlTextReaderClose is fixed in libxml */
561{
562 zval *id;
563 xmlreader_object *intern;
564
567 }
568
569 id = ZEND_THIS;
570 intern = Z_XMLREADER_P(id);
571 /* libxml is segfaulting in versions up to 2.6.8 using xmlTextReaderClose so for
572 now we will free the whole reader when close is called as it would get rebuilt on
573 a new load anyways */
574 xmlreader_free_resources(intern);
575
577}
578/* }}} */
579
580/* {{{ Get value of an attribute from current element */
581PHP_METHOD(XMLReader, getAttribute)
582{
583 php_xmlreader_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextReaderGetAttribute);
584}
585/* }}} */
586
587/* {{{ Get value of an attribute at index from current element */
588PHP_METHOD(XMLReader, getAttributeNo)
589{
590 zval *id;
591 zend_long attr_pos;
592 char *retchar = NULL;
593 xmlreader_object *intern;
594
595 if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &attr_pos) == FAILURE) {
597 }
598
599 id = ZEND_THIS;
600
601 intern = Z_XMLREADER_P(id);
602 if (intern->ptr) {
603 retchar = (char *)xmlTextReaderGetAttributeNo(intern->ptr, attr_pos);
604 }
605 if (retchar) {
606 RETVAL_STRING(retchar);
607 xmlFree(retchar);
608 }
609}
610/* }}} */
611
612/* {{{ Get value of a attribute via name and namespace from current element */
613PHP_METHOD(XMLReader, getAttributeNs)
614{
615 zval *id;
616 size_t name_len = 0, ns_uri_len = 0;
617 xmlreader_object *intern;
618 char *name, *ns_uri, *retchar = NULL;
619
620 if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &name, &name_len, &ns_uri, &ns_uri_len) == FAILURE) {
622 }
623
624 if (name_len == 0) {
627 }
628
629 if (ns_uri_len == 0) {
632 }
633
634 id = ZEND_THIS;
635
636 intern = Z_XMLREADER_P(id);
637 if (intern->ptr) {
638 retchar = (char *)xmlTextReaderGetAttributeNs(intern->ptr, (xmlChar *)name, (xmlChar *)ns_uri);
639 }
640 if (retchar) {
641 RETVAL_STRING(retchar);
642 xmlFree(retchar);
643 }
644}
645/* }}} */
646
647/* {{{ Indicates whether given property (one of the parser option constants) is set or not on parser */
648PHP_METHOD(XMLReader, getParserProperty)
649{
650 zval *id;
652 xmlreader_object *intern;
653
656 }
657
658 id = ZEND_THIS;
659
660 intern = Z_XMLREADER_P(id);
661 if (!intern || !intern->ptr) {
662 zend_throw_error(NULL, "Cannot access parser properties before loading data");
664 }
665
666 int retval = xmlTextReaderGetParserProp(intern->ptr,property);
667 if (retval == -1) {
668 zend_argument_value_error(1, "must be a valid parser property");
670 }
671
673}
674/* }}} */
675
676/* {{{ Returns boolean indicating if parsed document is valid or not.
677Must set XMLREADER_LOADDTD or XMLREADER_VALIDATE parser option prior to the first call to read
678or this method will always return FALSE */
680{
681 php_xmlreader_no_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextReaderIsValid);
682}
683/* }}} */
684
685/* {{{ Return namespaceURI for associated prefix on current node */
686PHP_METHOD(XMLReader, lookupNamespace)
687{
688 php_xmlreader_string_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextReaderLookupNamespace);
689}
690/* }}} */
691
692/* {{{ Positions reader at specified attribute - Returns TRUE on success and FALSE on failure */
693PHP_METHOD(XMLReader, moveToAttribute)
694{
695 zval *id;
696 size_t name_len = 0;
697 int retval;
698 xmlreader_object *intern;
699 char *name;
700
701 if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
703 }
704
705 if (name_len == 0) {
708 }
709
710 id = ZEND_THIS;
711
712 intern = Z_XMLREADER_P(id);
713 if (intern->ptr) {
714 retval = xmlTextReaderMoveToAttribute(intern->ptr, (xmlChar *)name);
715 if (retval == 1) {
717 }
718 }
719
721}
722/* }}} */
723
724/* {{{ Positions reader at attribute at specified index.
725Returns TRUE on success and FALSE on failure */
726PHP_METHOD(XMLReader, moveToAttributeNo)
727{
728 zval *id;
729 zend_long attr_pos;
730 int retval;
731 xmlreader_object *intern;
732
733 if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &attr_pos) == FAILURE) {
735 }
736
737 id = ZEND_THIS;
738
739 intern = Z_XMLREADER_P(id);
740 if (intern->ptr) {
741 retval = xmlTextReaderMoveToAttributeNo(intern->ptr, attr_pos);
742 if (retval == 1) {
744 }
745 }
746
748}
749/* }}} */
750
751/* {{{ Positions reader at attribute spcified by name and namespaceURI.
752Returns TRUE on success and FALSE on failure */
753PHP_METHOD(XMLReader, moveToAttributeNs)
754{
755 zval *id;
756 size_t name_len=0, ns_uri_len=0;
757 int retval;
758 xmlreader_object *intern;
759 char *name, *ns_uri;
760
761 if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &name, &name_len, &ns_uri, &ns_uri_len) == FAILURE) {
763 }
764
765 if (name_len == 0) {
768 }
769
770 if (ns_uri_len == 0) {
773 }
774
775 id = ZEND_THIS;
776
777 intern = Z_XMLREADER_P(id);
778 if (intern->ptr) {
779 retval = xmlTextReaderMoveToAttributeNs(intern->ptr, (xmlChar *)name, (xmlChar *)ns_uri);
780 if (retval == 1) {
782 }
783 }
784
786}
787/* }}} */
788
789/* {{{ Moves the position of the current instance to the node that contains the current Attribute node. */
790PHP_METHOD(XMLReader, moveToElement)
791{
792 php_xmlreader_no_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextReaderMoveToElement);
793}
794/* }}} */
795
796/* {{{ Moves the position of the current instance to the first attribute associated with the current node. */
797PHP_METHOD(XMLReader, moveToFirstAttribute)
798{
799 php_xmlreader_no_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextReaderMoveToFirstAttribute);
800}
801/* }}} */
802
803/* {{{ Moves the position of the current instance to the next attribute associated with the current node. */
804PHP_METHOD(XMLReader, moveToNextAttribute)
805{
806 php_xmlreader_no_arg(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextReaderMoveToNextAttribute);
807}
808/* }}} */
809
810/* {{{ Moves the position of the current instance to the next node in the stream. */
812{
813 zval *id;
814 int retval;
815 xmlreader_object *intern;
816
819 }
820
821 id = ZEND_THIS;
822 intern = Z_XMLREADER_P(id);
823 if (!intern->ptr) {
824 zend_throw_error(NULL, "Data must be loaded before reading");
826 }
827
828 retval = xmlTextReaderRead(intern->ptr);
829 if (retval == -1) {
831 } else {
833 }
834}
835/* }}} */
836
837/* {{{ Moves the position of the current instance to the next node in the stream. */
839{
840 zval *id;
841 int retval;
842 size_t name_len=0;
843 xmlreader_object *intern;
844 char *name = NULL;
845
846 if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s!", &name, &name_len) == FAILURE) {
848 }
849
850 id = ZEND_THIS;
851 intern = Z_XMLREADER_P(id);
852 if (intern->ptr) {
853 retval = xmlTextReaderNext(intern->ptr);
854 while (name != NULL && retval == 1) {
855 if (xmlStrEqual(xmlTextReaderConstLocalName(intern->ptr), (xmlChar *)name)) {
857 }
858 retval = xmlTextReaderNext(intern->ptr);
859 }
860 if (retval == -1) {
862 } else {
864 }
865 }
866
867 zend_throw_error(NULL, "Data must be loaded before reading");
868}
869/* }}} */
870
871static bool xmlreader_valid_encoding(const char *encoding)
872{
873 if (!encoding) {
874 return true;
875 }
876
877 /* Normally we could use xmlTextReaderConstEncoding() afterwards but libxml2 < 2.12.0 has a bug of course
878 * where it returns NULL for some valid encodings instead. */
879 xmlCharEncodingHandlerPtr handler = xmlFindCharEncodingHandler(encoding);
880 if (!handler) {
881 return false;
882 }
883 xmlCharEncCloseFunc(handler);
884 return true;
885}
886
887/* {{{ Sets the URI that the XMLReader will parse. */
888static void xml_reader_from_uri(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *instance_ce, bool use_exceptions)
889{
890 zval *id;
891 size_t source_len = 0, encoding_len = 0;
892 zend_long options = 0;
893 xmlreader_object *intern = NULL;
894 char *source, *valid_file = NULL;
895 char *encoding = NULL;
896 char resolved_path[MAXPATHLEN + 1];
897 xmlTextReaderPtr reader = NULL;
898
899 if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|p!l", &source, &source_len, &encoding, &encoding_len, &options) == FAILURE) {
901 }
902
903 id = getThis();
904 if (id != NULL) {
905 ZEND_ASSERT(instanceof_function(Z_OBJCE_P(id), xmlreader_class_entry));
906 intern = Z_XMLREADER_P(id);
907 xmlreader_free_resources(intern);
908 }
909
910 if (!source_len) {
913 }
914
915 if (!xmlreader_valid_encoding(encoding)) {
916 zend_argument_value_error(2, "must be a valid character encoding");
918 }
919
920 valid_file = _xmlreader_get_valid_file_path(source, resolved_path, MAXPATHLEN );
921
922 if (valid_file) {
923 PHP_LIBXML_SANITIZE_GLOBALS(reader_for_file);
924 reader = xmlReaderForFile(valid_file, encoding, options);
925 PHP_LIBXML_RESTORE_GLOBALS(reader_for_file);
926 }
927
928 if (reader == NULL) {
929 if (use_exceptions) {
930 zend_throw_error(NULL, "Unable to open source data");
932 } else {
933 php_error_docref(NULL, E_WARNING, "Unable to open source data");
935 }
936 }
937
938 if (id == NULL) {
940 xmlFreeTextReader(reader);
942 }
943 intern = Z_XMLREADER_P(return_value);
944 intern->ptr = reader;
945 return;
946 }
947
948 intern->ptr = reader;
949
951
952}
953
955{
956 xml_reader_from_uri(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlreader_class_entry, false);
957}
958
960{
961 xml_reader_from_uri(INTERNAL_FUNCTION_PARAM_PASSTHRU, Z_CE_P(ZEND_THIS), true);
962}
963/* }}} */
964
965static int xml_reader_stream_read(void *context, char *buffer, int len)
966{
967 zend_resource *resource = context;
968 if (EXPECTED(resource->ptr)) {
969 php_stream *stream = resource->ptr;
970 return php_stream_read(stream, buffer, len);
971 }
972 return -1;
973}
974
975static int xml_reader_stream_close(void *context)
976{
977 zend_resource *resource = context;
978 /* Don't close it as others may still use it! We don't own the resource!
979 * Just delete our reference (and clean up if we're the last one). */
980 zend_list_delete(resource);
981 return 0;
982}
983
985{
986 zval *stream_zv;
987 php_stream *stream;
988 char *document_uri = NULL;
989 char *encoding_name = NULL;
990 size_t document_uri_len, encoding_name_len;
991 zend_long flags = 0;
992
994 Z_PARAM_RESOURCE(stream_zv);
996 Z_PARAM_PATH_OR_NULL(encoding_name, encoding_name_len)
998 Z_PARAM_PATH_OR_NULL(document_uri, document_uri_len)
1000
1001 php_stream_from_res(stream, Z_RES_P(stream_zv));
1002
1003 if (!xmlreader_valid_encoding(encoding_name)) {
1004 zend_argument_value_error(2, "must be a valid character encoding");
1005 RETURN_THROWS();
1006 }
1007
1008 PHP_LIBXML_SANITIZE_GLOBALS(reader_for_stream);
1009 xmlTextReaderPtr reader = xmlReaderForIO(
1010 xml_reader_stream_read,
1011 xml_reader_stream_close,
1012 stream->res,
1013 document_uri,
1014 encoding_name,
1015 flags
1016 );
1017 PHP_LIBXML_RESTORE_GLOBALS(reader_for_stream);
1018
1019 if (UNEXPECTED(reader == NULL)) {
1020 zend_throw_error(NULL, "Could not construct libxml reader");
1021 RETURN_THROWS();
1022 }
1023
1024 /* When the reader is closed (even in error paths) the reference is destroyed. */
1025 Z_ADDREF_P(stream_zv);
1026
1029 intern->ptr = reader;
1030 } else {
1031 xmlFreeTextReader(reader);
1032 }
1033}
1034
1035/* Not Yet Implemented in libxml - functions exist just not coded
1036PHP_METHOD(XMLReader, resetState)
1037{
1038
1039}
1040*/
1041
1042/* {{{ Reads the contents of the current node, including child nodes and markup. */
1043PHP_METHOD(XMLReader, readInnerXml)
1044{
1045 php_xmlreader_no_arg_string(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextReaderReadInnerXml);
1046}
1047/* }}} */
1048
1049/* {{{ Reads the contents of the current node, including child nodes and markup. */
1050PHP_METHOD(XMLReader, readOuterXml)
1051{
1052 php_xmlreader_no_arg_string(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextReaderReadOuterXml);
1053}
1054/* }}} */
1055
1056/* {{{ Reads the contents of an element or a text node as a string. */
1058{
1059 php_xmlreader_no_arg_string(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlTextReaderReadString);
1060}
1061/* }}} */
1062
1063/* {{{ Use W3C XSD schema to validate the document as it is processed. Activation is only possible before the first Read(). */
1065{
1066#ifdef LIBXML_SCHEMAS_ENABLED
1067 zval *id;
1068 size_t source_len = 0;
1069 int retval = -1;
1070 xmlreader_object *intern;
1071 char *source;
1072
1073 if (zend_parse_parameters(ZEND_NUM_ARGS(), "p!", &source, &source_len) == FAILURE) {
1074 RETURN_THROWS();
1075 }
1076
1077 if (source != NULL && !source_len) {
1079 RETURN_THROWS();
1080 }
1081
1082 id = ZEND_THIS;
1083
1084 intern = Z_XMLREADER_P(id);
1085 if (intern && intern->ptr) {
1086 PHP_LIBXML_SANITIZE_GLOBALS(schema);
1087 retval = xmlTextReaderSchemaValidate(intern->ptr, source);
1088 PHP_LIBXML_RESTORE_GLOBALS(schema);
1089
1090 if (retval == 0) {
1092 } else {
1093 php_error_docref(NULL, E_WARNING, "Schema contains errors");
1095 }
1096 } else {
1097 zend_throw_error(NULL, "Schema must be set prior to reading");
1098 RETURN_THROWS();
1099 }
1100#else
1101 php_error_docref(NULL, E_WARNING, "No schema support built into libxml");
1103#endif
1104}
1105/* }}} */
1106
1107/* {{{ Sets parser property (one of the parser option constants).
1108Properties must be set after open() or XML() and before the first read() is called */
1109PHP_METHOD(XMLReader, setParserProperty)
1110{
1111 zval *id;
1113 bool value;
1114 xmlreader_object *intern;
1115
1117 RETURN_THROWS();
1118 }
1119
1120 id = ZEND_THIS;
1121
1122 intern = Z_XMLREADER_P(id);
1123 if (!intern || !intern->ptr) {
1124 zend_throw_error(NULL, "Cannot access parser properties before loading data");
1125 RETURN_THROWS();
1126 }
1127
1128 int retval = xmlTextReaderSetParserProp(intern->ptr,property, value);
1129 if (retval == -1) {
1130 zend_argument_value_error(1, "must be a valid parser property");
1131 RETURN_THROWS();
1132 }
1133
1135}
1136/* }}} */
1137
1138/* {{{ Sets the string that the XMLReader will parse. */
1139PHP_METHOD(XMLReader, setRelaxNGSchema)
1140{
1141 php_xmlreader_set_relaxng_schema(INTERNAL_FUNCTION_PARAM_PASSTHRU, XMLREADER_LOAD_FILE);
1142}
1143/* }}} */
1144
1145/* {{{ Sets the string that the XMLReader will parse. */
1146PHP_METHOD(XMLReader, setRelaxNGSchemaSource)
1147{
1148 php_xmlreader_set_relaxng_schema(INTERNAL_FUNCTION_PARAM_PASSTHRU, XMLREADER_LOAD_STRING);
1149}
1150/* }}} */
1151
1152/* TODO
1153XMLPUBFUN int XMLCALL
1154 xmlTextReaderSetSchema (xmlTextReaderPtr reader,
1155 xmlSchemaPtr schema);
1156*/
1157
1158/* {{{ Sets the string that the XMLReader will parse. */
1159static void xml_reader_from_string(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *instance_ce, bool throw)
1160{
1161 zval *id;
1162 size_t source_len = 0, encoding_len = 0;
1163 zend_long options = 0;
1164 xmlreader_object *intern = NULL;
1165 char *source, *uri = NULL, *encoding = NULL;
1166 int resolved_path_len, ret = 0;
1167 char *directory=NULL, resolved_path[MAXPATHLEN + 1];
1168 xmlParserInputBufferPtr inputbfr;
1169 xmlTextReaderPtr reader;
1170
1171 if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|p!l", &source, &source_len, &encoding, &encoding_len, &options) == FAILURE) {
1172 RETURN_THROWS();
1173 }
1174
1175 id = getThis();
1176 if (id != NULL) {
1177 ZEND_ASSERT(instanceof_function(Z_OBJCE_P(id), xmlreader_class_entry));
1178 intern = Z_XMLREADER_P(id);
1179 xmlreader_free_resources(intern);
1180 }
1181
1182 if (!source_len) {
1184 RETURN_THROWS();
1185 }
1186
1187 if (!xmlreader_valid_encoding(encoding)) {
1188 zend_argument_value_error(2, "must be a valid character encoding");
1189 RETURN_THROWS();
1190 }
1191
1192 inputbfr = xmlParserInputBufferCreateMem(source, source_len, XML_CHAR_ENCODING_NONE);
1193
1194 if (inputbfr != NULL) {
1195/* Get the URI of the current script so that we can set the base directory in libxml */
1196#ifdef HAVE_GETCWD
1197 directory = VCWD_GETCWD(resolved_path, MAXPATHLEN);
1198#elif defined(HAVE_GETWD)
1199 directory = VCWD_GETWD(resolved_path);
1200#endif
1201 if (directory) {
1202 resolved_path_len = strlen(resolved_path);
1203 if (resolved_path[resolved_path_len - 1] != DEFAULT_SLASH) {
1204 resolved_path[resolved_path_len] = DEFAULT_SLASH;
1205 resolved_path[++resolved_path_len] = '\0';
1206 }
1207 uri = (char *) xmlCanonicPath((const xmlChar *) resolved_path);
1208 }
1209 PHP_LIBXML_SANITIZE_GLOBALS(text_reader);
1210 reader = xmlNewTextReader(inputbfr, uri);
1211
1212 if (reader != NULL) {
1213 ret = xmlTextReaderSetup(reader, NULL, uri, encoding, options);
1214 if (ret == 0) {
1215 if (id == NULL) {
1217 xmlFree(uri);
1218 xmlFreeParserInputBuffer(inputbfr);
1219 xmlFreeTextReader(reader);
1220 RETURN_THROWS();
1221 }
1222 intern = Z_XMLREADER_P(return_value);
1223 } else {
1225 }
1226 intern->input = inputbfr;
1227 intern->ptr = reader;
1228
1229 if (uri) {
1230 xmlFree(uri);
1231 }
1232
1233 PHP_LIBXML_RESTORE_GLOBALS(text_reader);
1234 return;
1235 }
1236 }
1237 PHP_LIBXML_RESTORE_GLOBALS(text_reader);
1238 }
1239
1240 if (uri) {
1241 xmlFree(uri);
1242 }
1243
1244 if (inputbfr) {
1245 xmlFreeParserInputBuffer(inputbfr);
1246 }
1247
1248 if (throw) {
1249 zend_throw_error(NULL, "Unable to load source data");
1250 RETURN_THROWS();
1251 } else {
1252 php_error_docref(NULL, E_WARNING, "Unable to load source data");
1254 }
1255}
1256/* }}} */
1257
1259{
1260 xml_reader_from_string(INTERNAL_FUNCTION_PARAM_PASSTHRU, xmlreader_class_entry, false);
1261}
1262
1264{
1265 xml_reader_from_string(INTERNAL_FUNCTION_PARAM_PASSTHRU, Z_CE_P(ZEND_THIS), true);
1266}
1267
1268/* {{{ Moves the position of the current instance to the next node in the stream. */
1270{
1271#ifdef HAVE_DOM
1272 zval *id, *basenode = NULL;
1273 xmlreader_object *intern;
1274 xmlNode *node, *nodec;
1275 xmlDocPtr docp = NULL;
1276 php_libxml_node_object *domobj = NULL;
1277
1278 id = ZEND_THIS;
1279 if (zend_parse_parameters(ZEND_NUM_ARGS(), "|O!", &basenode, dom_node_class_entry) == FAILURE) {
1280 RETURN_THROWS();
1281 }
1282
1283 if (basenode != NULL) {
1284 /* Note: cannot use NODE_GET_OBJ here because of the wrong return type */
1285 domobj = Z_LIBXML_NODE_P(basenode);
1286 if (UNEXPECTED(domobj->node == NULL)) {
1287 php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(Z_OBJCE_P(basenode)->name));
1289 }
1290 node = domobj->node->node;
1291 docp = node->doc;
1292 }
1293
1294 intern = Z_XMLREADER_P(id);
1295
1296 if (intern->ptr) {
1297 node = xmlTextReaderExpand(intern->ptr);
1298
1299 if (node == NULL) {
1300 php_error_docref(NULL, E_WARNING, "An Error Occurred while expanding");
1302 } else {
1303 nodec = xmlDocCopyNode(node, docp, 1);
1304 if (nodec == NULL) {
1305 php_error_docref(NULL, E_NOTICE, "Cannot expand this node type");
1307 } else {
1308 DOM_RET_OBJ(nodec, (dom_object *)domobj);
1309 }
1310 }
1311 } else {
1312 zend_throw_error(NULL, "Data must be loaded before expanding");
1313 RETURN_THROWS();
1314 }
1315#else
1316 zval *dummy;
1317 if (zend_parse_parameters(ZEND_NUM_ARGS(), "|z!", &dummy) == FAILURE) {
1318 RETURN_THROWS();
1319 }
1320
1321 zend_throw_error(NULL, "XMLReader::expand() requires the DOM extension to be enabled");
1322 RETURN_THROWS();
1323#endif
1324}
1325/* }}} */
1326
1327static zend_result (*prev_zend_post_startup_cb)(void);
1328static zend_result xmlreader_fixup_temporaries(void) {
1330 ++xmlreader_open_fn.T;
1331 ++xmlreader_xml_fn.T;
1332 }
1333#ifndef ZTS
1334 ZEND_MAP_PTR(xmlreader_open_fn.run_time_cache) = ZEND_MAP_PTR(((zend_internal_function *)zend_hash_str_find_ptr(&xmlreader_class_entry->function_table, "open", sizeof("open")-1))->run_time_cache);
1335 ZEND_MAP_PTR(xmlreader_xml_fn.run_time_cache) = ZEND_MAP_PTR(((zend_internal_function *)zend_hash_str_find_ptr(&xmlreader_class_entry->function_table, "xml", sizeof("xml")-1))->run_time_cache);
1336#endif
1337 if (prev_zend_post_startup_cb) {
1338 return prev_zend_post_startup_cb();
1339 }
1340 return SUCCESS;
1341}
1342
1343/* {{{ PHP_MINIT_FUNCTION */
1345{
1346
1347 memcpy(&xmlreader_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
1348 xmlreader_object_handlers.offset = XtOffsetOf(xmlreader_object, std);
1349 xmlreader_object_handlers.free_obj = xmlreader_objects_free_storage;
1350 xmlreader_object_handlers.has_property = xmlreader_has_property;
1351 xmlreader_object_handlers.read_property = xmlreader_read_property;
1352 xmlreader_object_handlers.write_property = xmlreader_write_property;
1353 xmlreader_object_handlers.unset_property = xmlreader_unset_property;
1354 xmlreader_object_handlers.get_property_ptr_ptr = xmlreader_get_property_ptr_ptr;
1355 xmlreader_object_handlers.get_method = xmlreader_get_method;
1356 xmlreader_object_handlers.clone_obj = NULL;
1357 xmlreader_object_handlers.get_debug_info = xmlreader_get_debug_info;
1358
1359 xmlreader_class_entry = register_class_XMLReader();
1361 xmlreader_class_entry->default_object_handlers = &xmlreader_object_handlers;
1362
1363 memcpy(&xmlreader_open_fn, zend_hash_str_find_ptr(&xmlreader_class_entry->function_table, "open", sizeof("open")-1), sizeof(zend_internal_function));
1364 xmlreader_open_fn.fn_flags &= ~ZEND_ACC_STATIC;
1365 memcpy(&xmlreader_xml_fn, zend_hash_str_find_ptr(&xmlreader_class_entry->function_table, "xml", sizeof("xml")-1), sizeof(zend_internal_function));
1366 xmlreader_xml_fn.fn_flags &= ~ZEND_ACC_STATIC;
1367
1368 prev_zend_post_startup_cb = zend_post_startup_cb;
1369 zend_post_startup_cb = xmlreader_fixup_temporaries;
1370
1371 /* Note: update the size upon adding properties. */
1372 zend_hash_init(&xmlreader_prop_handlers, 14, NULL, NULL, true);
1373 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "attributeCount", xmlTextReaderAttributeCount, NULL, IS_LONG);
1374 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "baseURI", NULL, xmlTextReaderConstBaseUri, IS_STRING);
1375 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "depth", xmlTextReaderDepth, NULL, IS_LONG);
1376 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "hasAttributes", xmlTextReaderHasAttributes, NULL, _IS_BOOL);
1377 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "hasValue", xmlTextReaderHasValue, NULL, _IS_BOOL);
1378 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "isDefault", xmlTextReaderIsDefault, NULL, _IS_BOOL);
1379 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "isEmptyElement", xmlTextReaderIsEmptyElement, NULL, _IS_BOOL);
1380 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "localName", NULL, xmlTextReaderConstLocalName, IS_STRING);
1381 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "name", NULL, xmlTextReaderConstName, IS_STRING);
1382 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "namespaceURI", NULL, xmlTextReaderConstNamespaceUri, IS_STRING);
1383 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "nodeType", xmlTextReaderNodeType, NULL, IS_LONG);
1384 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "prefix", NULL, xmlTextReaderConstPrefix, IS_STRING);
1385 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "value", NULL, xmlTextReaderConstValue, IS_STRING);
1386 XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "xmlLang", NULL, xmlTextReaderConstXmlLang, IS_STRING);
1387
1388 return SUCCESS;
1389}
1390/* }}} */
1391
1392/* {{{ PHP_MSHUTDOWN_FUNCTION */
1394{
1395 zend_hash_destroy(&xmlreader_prop_handlers);
1396 return SUCCESS;
1397}
1398/* }}} */
1399
1400/* {{{ PHP_MINFO_FUNCTION */
1402{
1404 {
1405 php_info_print_table_row(2, "XMLReader", "enabled");
1406 }
1408}
1409/* }}} */
size_t len
Definition apprentice.c:174
PHP_DOM_EXPORT zend_class_entry * dom_node_class_entry
zend_ffi_type * type
Definition ffi.c:3812
memcpy(ptr1, ptr2, size)
PHPAPI char * expand_filepath(const char *filepath, char *real_path)
#define NULL
Definition gdcache.h:45
#define SUCCESS
Definition hash_sha3.c:261
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
Definition main.c:1173
#define next(ls)
Definition minilua.c:2661
php_info_print_table_start()
Definition info.c:1064
php_info_print_table_row(2, "PDO Driver for Firebird", "enabled")
php_info_print_table_end()
Definition info.c:1074
#define PHP_MSHUTDOWN_FUNCTION
Definition php.h:401
#define PHP_MINFO
Definition php.h:396
#define PHP_MINIT_FUNCTION
Definition php.h:400
#define PHP_MSHUTDOWN
Definition php.h:393
#define PHP_MINFO_FUNCTION
Definition php.h:404
#define PHP_MINIT
Definition php.h:392
#define PHP_METHOD
Definition php.h:365
bool use_exceptions
Definition php_intl.h:53
PHP_JSON_API size_t int options
Definition php_json.h:102
unsigned char key[REFLECTION_KEY_LEN]
xmlCharEncodingHandlerPtr encoding
Definition php_soap.h:170
struct _php_stream php_stream
Definition php_streams.h:96
#define php_stream_read(stream, buf, count)
#define php_stream_from_res(xstr, res)
char * _xmlreader_get_valid_file_path(char *source, char *resolved_path, int resolved_path_len)
zend_module_entry xmlreader_module_entry
zend_class_entry * xmlreader_class_entry
void xmlreader_unset_property(zend_object *object, zend_string *name, void **cache_slot)
void xmlreader_objects_free_storage(zend_object *object)
const unsigned char *(* xmlreader_read_const_char_t)(xmlTextReaderPtr reader)
#define XMLREADER_REGISTER_PROP_HANDLER(prop_handler, name, prop_read_int_func, prop_read_char_func, prop_type)
unsigned char *(* xmlreader_read_char_t)(xmlTextReaderPtr reader)
zval * xmlreader_read_property(zend_object *object, zend_string *name, int type, void **cache_slot, zval *rv)
#define XMLREADER_LOAD_STRING
zend_object * xmlreader_objects_new(zend_class_entry *class_type)
zval * xmlreader_get_property_ptr_ptr(zend_object *object, zend_string *name, int type, void **cache_slot)
struct _xmlreader_prop_handler xmlreader_prop_handler
int(* xmlreader_read_int_t)(xmlTextReaderPtr reader)
zval * xmlreader_write_property(zend_object *object, zend_string *name, zval *value, void **cache_slot)
#define XMLREADER_LOAD_FILE
unsigned char *(* xmlreader_read_one_char_t)(xmlTextReaderPtr reader, const unsigned char *)
struct _xmlreader_object xmlreader_object
#define PHP_XMLREADER_VERSION
#define Z_XMLREADER_P(zv)
zval rv
Definition session.c:1024
zend_resource * res
xmlParserInputBufferPtr input
xmlTextReaderPtr ptr
xmlreader_read_const_char_t read_char_func
xmlreader_read_int_t read_int_func
Definition file.h:177
Definition dce.c:49
struct _zend_function::@236135173067030250234125302313220025134003177336 common
uint32_t fn_flags
#define close(a)
struct _dom_object dom_object
#define DOM_RET_OBJ(obj, domobject)
Definition xml_common.h:76
ZEND_API zend_result(* zend_post_startup_cb)(void)
Definition zend.c:95
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
Definition zend.c:1772
#define INTERNAL_FUNCTION_PARAMETERS
Definition zend.h:49
#define INTERNAL_FUNCTION_PARAM_PASSTHRU
Definition zend.h:50
ZEND_API zend_result object_init_with_constructor(zval *arg, zend_class_entry *class_type, uint32_t param_count, zval *params, HashTable *named_params)
Definition zend_API.c:1855
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
Definition zend_API.c:1300
ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type)
Definition zend_API.c:1688
ZEND_API ZEND_COLD void zend_argument_must_not_be_empty_error(uint32_t arg_num)
Definition zend_API.c:443
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
Definition zend_API.c:433
#define ZEND_NUM_ARGS()
Definition zend_API.h:530
#define Z_PARAM_PATH_OR_NULL(dest, dest_len)
Definition zend_API.h:2029
#define ZEND_PARSE_PARAMETERS_END()
Definition zend_API.h:1641
#define RETURN_FALSE
Definition zend_API.h:1058
#define RETVAL_STRING(s)
Definition zend_API.h:1017
#define Z_PARAM_RESOURCE(dest)
Definition zend_API.h:2056
#define ZVAL_STRING(z, s)
Definition zend_API.h:956
#define Z_PARAM_OPTIONAL
Definition zend_API.h:1667
#define ZEND_GET_MODULE(name)
Definition zend_API.h:241
#define zend_parse_parameters_none()
Definition zend_API.h:353
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
Definition zend_API.h:1620
#define RETVAL_EMPTY_STRING()
Definition zend_API.h:1021
#define Z_PARAM_LONG(dest)
Definition zend_API.h:1896
#define RETVAL_NULL()
Definition zend_API.h:1010
#define RETURN_BOOL(b)
Definition zend_API.h:1035
#define RETURN_THROWS()
Definition zend_API.h:1060
#define RETVAL_TRUE
Definition zend_API.h:1033
#define ZEND_THIS
Definition zend_API.h:523
#define getThis()
Definition zend_API.h:526
#define RETURN_TRUE
Definition zend_API.h:1059
#define ZVAL_EMPTY_STRING(z)
Definition zend_API.h:961
struct _zval_struct zval
strlen(string $string)
zend_string_release_ex(func->internal_function.function_name, 0)
#define ZEND_INTERNAL_FUNCTION
#define ZEND_ACC_STATIC
struct _zend_internal_function zend_internal_function
#define strncasecmp(s1, s2, n)
#define E_NOTICE
Definition zend_errors.h:26
#define E_WARNING
Definition zend_errors.h:24
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error_ex(const char *class_name, const char *prop_name)
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
union _zend_function zend_function
#define EG(v)
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
Definition zend_hash.c:1727
ZEND_API HashTable *ZEND_FASTCALL zend_array_dup(HashTable *source)
Definition zend_hash.c:2438
ZEND_API zval *ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData)
Definition zend_hash.c:997
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
Definition zend_hash.h:108
#define ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(ht, _key, _ptr)
Definition zend_hash.h:1433
#define ZEND_HASH_FOREACH_END()
Definition zend_hash.h:1086
ZEND_API zend_result ZEND_FASTCALL zend_list_delete(zend_resource *res)
Definition zend_list.c:46
int32_t zend_long
Definition zend_long.h:42
struct _zend_string zend_string
#define ZEND_MAP_PTR(ptr)
#define ZEND_MOD_END
struct _zend_module_dep zend_module_dep
struct _zend_module_entry zend_module_entry
#define STANDARD_MODULE_PROPERTIES
#define ZEND_MOD_REQUIRED(name)
#define STANDARD_MODULE_HEADER_EX
ZEND_API zval * zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *name, int type, void **cache_slot)
ZEND_API zend_function * zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key)
ZEND_API HashTable * zend_std_get_properties(zend_object *zobj)
ZEND_API int zend_std_has_property(zend_object *zobj, zend_string *name, int has_set_exists, void **cache_slot)
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API zval * zend_std_write_property(zend_object *zobj, zend_string *name, zval *value, void **cache_slot)
ZEND_API void zend_std_unset_property(zend_object *zobj, zend_string *name, void **cache_slot)
ZEND_API zval * zend_std_read_property(zend_object *zobj, zend_string *name, int type, void **cache_slot, zval *rv)
#define ZEND_PROPERTY_ISSET
#define ZEND_PROPERTY_NOT_EMPTY
#define ZEND_PROPERTY_EXISTS
ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
ZEND_API void zend_object_std_dtor(zend_object *object)
#define ZEND_OBSERVER_ENABLED
ZEND_API bool ZEND_FASTCALL zend_is_true(const zval *op)
#define EXPECTED(condition)
#define XtOffsetOf(s_type, field)
#define ZEND_ASSERT(c)
#define ZEND_UNREACHABLE()
#define EMPTY_SWITCH_DEFAULT_CASE()
#define UNEXPECTED(condition)
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
ZEND_API zend_string_init_interned_func_t zend_string_init_interned
Definition zend_string.c:31
#define ZSTR_VAL(zstr)
Definition zend_string.h:68
#define ZSTR_LEN(zstr)
Definition zend_string.h:69
#define ZVAL_LONG(z, l)
#define IS_STRING
Definition zend_types.h:606
struct _zend_resource zend_resource
Definition zend_types.h:99
struct _zend_array HashTable
Definition zend_types.h:386
#define Z_ADDREF_P(pz)
#define IS_NULL
Definition zend_types.h:601
#define Z_OBJCE_P(zval_p)
@ FAILURE
Definition zend_types.h:61
#define IS_LONG
Definition zend_types.h:604
#define _IS_BOOL
Definition zend_types.h:629
ZEND_RESULT_CODE zend_result
Definition zend_types.h:64
#define Z_CE_P(zval_p)
#define Z_RES_P(zval_p)
struct _zend_object_handlers zend_object_handlers
Definition zend_types.h:88
#define Z_TYPE(zval)
Definition zend_types.h:659
#define ZVAL_BOOL(z, b)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)
#define DEFAULT_SLASH
#define VCWD_GETWD(buf)
#define VCWD_GETCWD(buff, size)
#define MAXPATHLEN
#define VCWD_REALPATH(path, real_path)
zval retval
zval * return_value
zend_string * name
fbc internal_function handler(call, ret)
bool result
object
zval * ret
value
property