From 2fea5bb19cc5349598f5096b49c770e66873c053 Mon Sep 17 00:00:00 2001 From: Jan Borsodi Date: Wed, 15 Nov 2000 18:59:59 +0000 Subject: [PATCH] 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. --- ext/qtdom/qtdom.c | 275 ++++++++++++++++++++++++++++++++++++++++++++++ ext/qtdom/qtdom.h | 86 +++++++++++++++ 2 files changed, 361 insertions(+) create mode 100644 ext/qtdom/qtdom.c create mode 100644 ext/qtdom/qtdom.h diff --git a/ext/qtdom/qtdom.c b/ext/qtdom/qtdom.c new file mode 100644 index 0000000000..26a8d99de3 --- /dev/null +++ b/ext/qtdom/qtdom.c @@ -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: + */ diff --git a/ext/qtdom/qtdom.h b/ext/qtdom/qtdom.h new file mode 100644 index 0000000000..32fc2c9b06 --- /dev/null +++ b/ext/qtdom/qtdom.h @@ -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: + */ -- 2.40.0