]> granicus.if.org Git - php/commitdiff
Initial import, contains PHP specific extensions, takes care of converting C++ QDom...
authorJan Borsodi <amos@php.net>
Wed, 15 Nov 2000 18:59:59 +0000 (18:59 +0000)
committerJan Borsodi <amos@php.net>
Wed, 15 Nov 2000 18:59:59 +0000 (18:59 +0000)
This version has only one function: qdom_tree() which returns a tree of a string containing an XML document.

ext/qtdom/qtdom.c [new file with mode: 0644]
ext/qtdom/qtdom.h [new file with mode: 0644]

diff --git a/ext/qtdom/qtdom.c b/ext/qtdom/qtdom.c
new file mode 100644 (file)
index 0000000..26a8d99
--- /dev/null
@@ -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 (file)
index 0000000..32fc2c9
--- /dev/null
@@ -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:
+ */