summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Richards <rrichards@php.net>2004-05-07 18:38:21 +0000
committerRob Richards <rrichards@php.net>2004-05-07 18:38:21 +0000
commit0953c573ad262083404256c2c4ab372cbaf73393 (patch)
tree158af10d3b0c845a26843fbeedc6531b96bce215
parent6686b3f7229fa47f5b86d1ba5e9b3b4a7330261d (diff)
downloadphp-git-0953c573ad262083404256c2c4ab372cbaf73393.tar.gz
allow ->open() and ->XML() to be called statically
-rw-r--r--ext/xmlreader/php_xmlreader.c76
1 files changed, 54 insertions, 22 deletions
diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c
index f4b3e32422..6b0d416d30 100644
--- a/ext/xmlreader/php_xmlreader.c
+++ b/ext/xmlreader/php_xmlreader.c
@@ -765,33 +765,47 @@ PHP_METHOD(xmlreader, open)
xmlreader_object *intern;
char *source, *valid_file = NULL;
char resolved_path[MAXPATHLEN + 1];
+ xmlTextReaderPtr reader = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &source, &source_len) == FAILURE) {
return;
}
+ id = getThis();
+ if (id != NULL) {
+ if (! instanceof_function(Z_OBJCE_P(id), xmlreader_class_entry TSRMLS_CC)) {
+ id = NULL;
+ } else {
+ intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC);
+ xmlreader_free_resources(intern);
+ }
+ }
+
if (!source_len) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string supplied as input");
RETURN_FALSE;
}
- id = getThis();
-
- intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC);
-
- xmlreader_free_resources(intern);
-
valid_file = _xmlreader_get_valid_file_path(source, resolved_path, MAXPATHLEN TSRMLS_CC);
if (valid_file) {
- intern->ptr = xmlNewTextReaderFilename(valid_file);
+ reader = xmlNewTextReaderFilename(valid_file);
}
- if (intern->ptr == NULL) {
+ if (reader == NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open source data");
RETURN_FALSE;
}
+ if (id == NULL) {
+ object_init_ex(return_value, xmlreader_class_entry);
+ intern = (xmlreader_object *)zend_objects_get_address(return_value TSRMLS_CC);
+ intern->ptr = reader;
+ return;
+ }
+
+ intern->ptr = reader;
+
RETURN_TRUE;
}
@@ -873,25 +887,30 @@ PHP_METHOD(xmlreader, XML)
char *source, *uri = NULL;
int resolved_path_len;
char *directory=NULL, resolved_path[MAXPATHLEN];
+ xmlParserInputBufferPtr inputbfr;
+ xmlTextReaderPtr reader;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &source, &source_len) == FAILURE) {
return;
}
+ id = getThis();
+ if (id != NULL && ! instanceof_function(Z_OBJCE_P(id), xmlreader_class_entry TSRMLS_CC)) {
+ id = NULL;
+ }
+ if (id != NULL) {
+ intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC);
+ xmlreader_free_resources(intern);
+ }
+
if (!source_len) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string supplied as input");
RETURN_FALSE;
}
- id = getThis();
-
- intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC);
-
- xmlreader_free_resources(intern);
+ inputbfr = xmlParserInputBufferCreateMem(source, source_len, XML_CHAR_ENCODING_NONE);
- intern->input = xmlParserInputBufferCreateMem(source, source_len, XML_CHAR_ENCODING_NONE);
-
- if (intern->input != NULL) {
+ if (inputbfr != NULL) {
/* Get the URI of the current script so that we can set the base directory in libxml */
#if HAVE_GETCWD
directory = VCWD_GETCWD(resolved_path, MAXPATHLEN);
@@ -906,16 +925,29 @@ PHP_METHOD(xmlreader, XML)
}
uri = (char *) xmlCanonicPath((const xmlChar *) resolved_path);
}
- intern->ptr = xmlNewTextReader(intern->input, uri);
+ reader = xmlNewTextReader(inputbfr, uri);
if (uri) {
xmlFree(uri);
}
- if (intern->ptr != NULL) {
- RETURN_TRUE;
+ if (reader != NULL) {
+ if (id == NULL) {
+ object_init_ex(return_value, xmlreader_class_entry);
+ intern = (xmlreader_object *)zend_objects_get_address(return_value TSRMLS_CC);
+ intern->input = inputbfr;
+ intern->ptr = reader;
+ return;
+ } else {
+ intern->input = inputbfr;
+ intern->ptr = reader;
+ RETURN_TRUE;
+
+ }
}
}
- xmlreader_free_resources(intern);
+ if (inputbfr) {
+ xmlFreeParserInputBuffer(inputbfr);
+ }
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to load source data");
RETURN_FALSE;
}
@@ -935,7 +967,7 @@ static zend_function_entry xmlreader_functions[] = {
PHP_ME(xmlreader, moveToElement, NULL, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, moveToFirstAttribute, NULL, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, moveToNextAttribute, NULL, ZEND_ACC_PUBLIC)
- PHP_ME(xmlreader, open, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(xmlreader, open, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
PHP_ME(xmlreader, read, NULL, ZEND_ACC_PUBLIC)
/* Not Yet Implemented though defined in libxml as of 2.6.9dev
PHP_ME(xmlreader, readInnerXml, NULL, ZEND_ACC_PUBLIC)
@@ -946,7 +978,7 @@ static zend_function_entry xmlreader_functions[] = {
PHP_ME(xmlreader, setParserProperty, NULL, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, setRelaxNGSchema, NULL, ZEND_ACC_PUBLIC)
PHP_ME(xmlreader, setRelaxNGSchemaSource, NULL, ZEND_ACC_PUBLIC)
- PHP_ME(xmlreader, XML, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(xmlreader, XML, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
{NULL, NULL, NULL}
};