Browse Source
Initial import, contains PHP specific extensions, takes care of converting C++ QDom objects to PHP objects.
Initial import, contains PHP specific extensions, takes care of converting C++ QDom objects to PHP objects.
This version has only one function: qdom_tree() which returns a tree of a string containing an XML document.PHP-4.0.5
2 changed files with 361 additions and 0 deletions
@ -0,0 +1,275 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP version 4.0 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 2.02 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available at through the world-wide-web at | |
|||
| http://www.php.net/license/2_02.txt. | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: | |
|||
| | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
/* You should tweak config.m4 so this symbol (or some else suitable) |
|||
gets defined. |
|||
*/ |
|||
#include "php.h" |
|||
#include "php_ini.h" |
|||
#include "qtdom.h" |
|||
#include "qtdom_qt.h" |
|||
|
|||
#if HAVE_QTDOM |
|||
|
|||
#warning blah |
|||
|
|||
static zend_function_entry qdomdoc_class_functions[] = { |
|||
{NULL, NULL, NULL} |
|||
}; |
|||
|
|||
static zend_function_entry qdomnode_class_functions[] = { |
|||
{NULL, NULL, NULL} |
|||
}; |
|||
|
|||
/* If you declare any globals in php_qtdom.h uncomment this: |
|||
ZEND_DECLARE_MODULE_GLOBALS(qtdom) |
|||
*/ |
|||
|
|||
/* True global resources - no need for thread safety here */ |
|||
static int le_qtdom; |
|||
|
|||
/* Every user visible function must have an entry in qtdom_functions[]. |
|||
*/ |
|||
function_entry qtdom_functions[] = { |
|||
PHP_FE(qdom_tree, NULL) |
|||
{NULL, NULL, NULL} /* Must be the last line in qtdom_functions[] */ |
|||
}; |
|||
|
|||
zend_module_entry qtdom_module_entry = { |
|||
"qtdom", |
|||
qtdom_functions, |
|||
PHP_MINIT(qtdom), |
|||
PHP_MSHUTDOWN(qtdom), |
|||
PHP_RINIT(qtdom), /* Replace with NULL if there's nothing to do at request start */ |
|||
PHP_RSHUTDOWN(qtdom), /* Replace with NULL if there's nothing to do at request end */ |
|||
PHP_MINFO(qtdom), |
|||
STANDARD_MODULE_PROPERTIES |
|||
}; |
|||
|
|||
#ifdef COMPILE_DL_QTDOM |
|||
ZEND_GET_MODULE(qtdom) |
|||
#endif |
|||
|
|||
/* Remove comments and fill if you need to have entries in php.ini |
|||
PHP_INI_BEGIN() |
|||
PHP_INI_END() |
|||
*/ |
|||
|
|||
PHP_MINIT_FUNCTION(qtdom) |
|||
{ |
|||
/* Remove comments if you have entries in php.ini |
|||
REGISTER_INI_ENTRIES(); |
|||
*/ |
|||
zend_class_entry qdomdoc_class_entry; |
|||
zend_class_entry qdomnode_class_entry; |
|||
|
|||
INIT_CLASS_ENTRY(qdomdoc_class_entry, "QDomDocument", qdomdoc_class_functions); |
|||
INIT_CLASS_ENTRY(qdomnode_class_entry, "QDomNode", qdomnode_class_functions); |
|||
|
|||
qdomdoc_class_entry_ptr = zend_register_internal_class(&qdomdoc_class_entry); |
|||
qdomnode_class_entry_ptr = zend_register_internal_class(&qdomnode_class_entry); |
|||
|
|||
return SUCCESS; |
|||
} |
|||
|
|||
PHP_MSHUTDOWN_FUNCTION(qtdom) |
|||
{ |
|||
/* Remove comments if you have entries in php.ini |
|||
UNREGISTER_INI_ENTRIES(); |
|||
*/ |
|||
return SUCCESS; |
|||
} |
|||
|
|||
/* Remove if there's nothing to do at request start */ |
|||
PHP_RINIT_FUNCTION(qtdom) |
|||
{ |
|||
return SUCCESS; |
|||
} |
|||
|
|||
/* Remove if there's nothing to do at request end */ |
|||
PHP_RSHUTDOWN_FUNCTION(qtdom) |
|||
{ |
|||
return SUCCESS; |
|||
} |
|||
|
|||
PHP_MINFO_FUNCTION(qtdom) |
|||
{ |
|||
php_info_print_table_start(); |
|||
php_info_print_table_header(2, "qtdom support", "enabled"); |
|||
php_info_print_table_end(); |
|||
|
|||
/* Remove comments if you have entries in php.ini |
|||
DISPLAY_INI_ENTRIES(); |
|||
*/ |
|||
} |
|||
|
|||
/* Remove the following function when you have succesfully modified config.m4 |
|||
so that your module can be compiled into PHP, it exists only for testing |
|||
purposes. */ |
|||
|
|||
/* Helper function for creating the attributes, returns the number of attributes found |
|||
or -1 if an error occured */ |
|||
|
|||
int qdom_find_attributes( zval **children, struct qdom_attribute *attr ) |
|||
{ |
|||
zval *child; |
|||
struct qdom_node *node; |
|||
int count; |
|||
int i; |
|||
count = 0; |
|||
|
|||
MAKE_STD_ZVAL(*children); |
|||
if (array_init(*children) == FAILURE) |
|||
return -1; |
|||
for ( i = 0; i < attr->Count; ++i ) |
|||
{ |
|||
node = qdom_do_attribute_at( attr, i ); |
|||
|
|||
MAKE_STD_ZVAL(child); |
|||
object_init_ex(child, qdomnode_class_entry_ptr); |
|||
zend_hash_next_index_insert((*children)->value.ht, &child, sizeof(zval *), NULL); |
|||
add_property_stringl(child, "name", (char *) node->Name, strlen(node->Name), 1); |
|||
add_property_long(child, "type", node->Type); |
|||
add_property_stringl(child, "content", (char *) node->Content, strlen(node->Content), 1); |
|||
|
|||
qdom_do_node_free( node ); |
|||
++count; |
|||
} |
|||
|
|||
return count; |
|||
} |
|||
|
|||
/* Helper function for recursively going trough the QDomNode tree and creating |
|||
the same in PHP objects. Returns the number of children or -1 if an error |
|||
occured. */ |
|||
|
|||
int qdom_find_children( zval **children, struct qdom_node *orig_node ) |
|||
{ |
|||
zval *child; |
|||
struct qdom_node *node, *tmp_node, *child_node; |
|||
int count; |
|||
|
|||
zval *n_children, *a_children; |
|||
count = 0; |
|||
|
|||
node = qdom_do_copy_node( orig_node ); |
|||
tmp_node = node; |
|||
/* node = orig_node; */ |
|||
|
|||
MAKE_STD_ZVAL(*children); |
|||
if (array_init(*children) == FAILURE) |
|||
return -1; |
|||
while( node ) |
|||
{ |
|||
int num_childs, num_attrs; |
|||
|
|||
MAKE_STD_ZVAL(child); |
|||
object_init_ex(child, qdomnode_class_entry_ptr); |
|||
zend_hash_next_index_insert((*children)->value.ht, &child, sizeof(zval *), NULL); |
|||
add_property_stringl(child, "name", (char *) node->Name, strlen(node->Name), 1); |
|||
add_property_long(child, "type", node->Type); |
|||
if ( node->Type == 2 || node->Type == 3 || node->Type == 4 ) |
|||
add_property_stringl(child, "content", (char *) node->Content, strlen(node->Content), 1); |
|||
|
|||
num_attrs = qdom_do_node_attribute_count( node ); |
|||
if ( num_attrs > 0 ) |
|||
{ |
|||
struct qdom_attribute *attr = qdom_do_node_attributes( node ); |
|||
if ( qdom_find_attributes( &a_children, attr ) > 0 ) |
|||
{ |
|||
zend_hash_update(child->value.obj.properties, |
|||
"attributes", sizeof("attributes"), |
|||
(void *) &a_children, sizeof(zval *), |
|||
NULL); |
|||
} |
|||
qdom_do_attributes_free( attr ); |
|||
/* add_property_long(child, "attributes", num_attrs ); */ |
|||
} |
|||
|
|||
num_childs = qdom_do_node_children_count( node ); |
|||
if ( num_childs > 0 ) |
|||
{ |
|||
child_node = qdom_do_copy_node( node ); |
|||
child_node = qdom_do_first_child( child_node ); |
|||
if ( qdom_find_children( &n_children, child_node ) > 0 ) |
|||
{ |
|||
zend_hash_update(child->value.obj.properties, |
|||
"children", sizeof("children"), |
|||
(void *) &n_children, sizeof(zval *), |
|||
NULL); |
|||
} |
|||
qdom_do_node_free( child_node ); |
|||
} |
|||
|
|||
node = qdom_do_next_node( node ); |
|||
++count; |
|||
} |
|||
qdom_do_node_free( tmp_node ); |
|||
return count; |
|||
} |
|||
|
|||
/* {{{ proto string qdom_tree( string ) |
|||
creates a tree of an xml string */ |
|||
PHP_FUNCTION(qdom_tree) |
|||
{ |
|||
zval *arg; |
|||
char qt_ver1[200]; |
|||
char *qt_ver = qt_ver1; |
|||
char *qdom_type_name; |
|||
struct qdom_doc *doc; |
|||
struct qdom_node *node; |
|||
zval *children; |
|||
|
|||
if (ZEND_NUM_ARGS() != 1 || getParameters(ht, 1, &arg) == FAILURE) { |
|||
WRONG_PARAM_COUNT; |
|||
} |
|||
convert_to_string(arg); |
|||
|
|||
qdom_do_version( &qt_ver ); |
|||
|
|||
object_init_ex(return_value, qdomdoc_class_entry_ptr); |
|||
add_property_stringl(return_value, "version", (char *) qt_ver, strlen(qt_ver), 1); |
|||
|
|||
doc = qdom_do_init( arg->value.str.val ); |
|||
|
|||
qdom_do_doc_type( doc, &qdom_type_name ); |
|||
|
|||
if ( qdom_type_name ) |
|||
add_property_stringl(return_value, "doctype", (char *) qdom_type_name, strlen(qdom_type_name), 1); |
|||
|
|||
node = doc->Children; |
|||
if ( qdom_find_children( &children, node ) > 0 ) |
|||
{ |
|||
add_property_long(return_value, "type", node->Type); |
|||
zend_hash_update(return_value->value.obj.properties, "children", sizeof("children"), (void *) &children, sizeof(zval *), NULL); |
|||
} |
|||
|
|||
qdom_do_free( doc ); |
|||
} |
|||
/* }}} */ |
|||
|
|||
#endif /* HAVE_QTDOM */ |
|||
|
|||
|
|||
/* |
|||
* Local variables: |
|||
* tab-width: 4 |
|||
* c-basic-offset: 4 |
|||
* End: |
|||
*/ |
|||
@ -0,0 +1,86 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP version 4.0 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 2.02 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available at through the world-wide-web at | |
|||
| http://www.php.net/license/2_02.txt. | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: | |
|||
| | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
#ifndef PHP_QTDOM_H |
|||
#define PHP_QTDOM_H |
|||
|
|||
/* You should tweak config.m4 so this symbol (or some else suitable) |
|||
gets defined. |
|||
*/ |
|||
#if HAVE_QTDOM |
|||
|
|||
extern zend_module_entry qtdom_module_entry; |
|||
#define phpext_qtdom_ptr &qtdom_module_entry |
|||
|
|||
#ifdef PHP_WIN32 |
|||
#define PHP_QTDOM_API __declspec(dllexport) |
|||
#else |
|||
#define PHP_QTDOM_API |
|||
#endif |
|||
|
|||
static zend_class_entry *qdomdoc_class_entry_ptr; |
|||
static zend_class_entry *qdomnode_class_entry_ptr; |
|||
|
|||
PHP_MINIT_FUNCTION(qtdom); |
|||
PHP_MSHUTDOWN_FUNCTION(qtdom); |
|||
PHP_RINIT_FUNCTION(qtdom); |
|||
PHP_RSHUTDOWN_FUNCTION(qtdom); |
|||
PHP_MINFO_FUNCTION(qtdom); |
|||
|
|||
PHP_FUNCTION(qdom_tree); |
|||
|
|||
/* |
|||
Declare any global variables you may need between the BEGIN |
|||
and END macros here: |
|||
|
|||
ZEND_BEGIN_MODULE_GLOBALS(qtdom) |
|||
int global_variable; |
|||
ZEND_END_MODULE_GLOBALS(qtdom) |
|||
*/ |
|||
|
|||
/* In every function that needs to use variables in php_qtdom_globals, |
|||
do call QTDOMLS_FETCH(); after declaring other variables used by |
|||
that function, and always refer to them as QTDOMG(variable). |
|||
You are encouraged to rename these macros something shorter, see |
|||
examples in any other php module directory. |
|||
*/ |
|||
|
|||
#ifdef ZTS |
|||
#define QTDOMG(v) (qtdom_globals->v) |
|||
#define QTDOMLS_FETCH() php_qtdom_globals *qtdom_globals = ts_resource(qtdom_globals_id) |
|||
#else |
|||
#define QTDOMG(v) (qtdom_globals.v) |
|||
#define QTDOMLS_FETCH() |
|||
#endif |
|||
|
|||
#else |
|||
|
|||
#define phpext_qtdom_ptr NULL |
|||
|
|||
#endif |
|||
|
|||
#endif /* PHP_QTDOM_H */ |
|||
|
|||
|
|||
/* |
|||
* Local variables: |
|||
* tab-width: 4 |
|||
* c-basic-offset: 4 |
|||
* End: |
|||
*/ |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue