]> granicus.if.org Git - php/commitdiff
add very basic code for the simplexml extension. The following works ::
authorSterling Hughes <sterling@php.net>
Sun, 18 May 2003 20:33:26 +0000 (20:33 +0000)
committerSterling Hughes <sterling@php.net>
Sun, 18 May 2003 20:33:26 +0000 (20:33 +0000)
person.xml
--
<person>
 <name>
  <first>Sterling</first>
  <last>Hughes</last>
 </name>
</person>

person.php
--
<?php
$p = simplexml_load_file('person.xml');
echo $p->name->last . ', ' . $p->name->first;
?>

Still needs lots of work.

ext/simplexml/CREDITS [new file with mode: 0644]
ext/simplexml/EXPERIMENTAL [new file with mode: 0644]
ext/simplexml/config.m4 [new file with mode: 0644]
ext/simplexml/php_simplexml.h [new file with mode: 0644]
ext/simplexml/simplexml.c [new file with mode: 0644]
ext/simplexml/tests/001.phpt [new file with mode: 0644]

diff --git a/ext/simplexml/CREDITS b/ext/simplexml/CREDITS
new file mode 100644 (file)
index 0000000..4f03ea1
--- /dev/null
@@ -0,0 +1 @@
+simplexml
\ No newline at end of file
diff --git a/ext/simplexml/EXPERIMENTAL b/ext/simplexml/EXPERIMENTAL
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ext/simplexml/config.m4 b/ext/simplexml/config.m4
new file mode 100644 (file)
index 0000000..21eeac8
--- /dev/null
@@ -0,0 +1,9 @@
+dnl $Id$
+dnl config.m4 for extension simplexml
+
+PHP_ARG_WITH(simplexml, for simplexml support,
+[  --with-simplexml             Include simplexml support])
+
+if test "$PHP_SIMPLEXML" != "no"; then
+  PHP_NEW_EXTENSION(simplexml, simplexml.c, $ext_shared)
+fi
diff --git a/ext/simplexml/php_simplexml.h b/ext/simplexml/php_simplexml.h
new file mode 100644 (file)
index 0000000..ebe165a
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 4                                                        |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 1997-2003 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.               |
+  +----------------------------------------------------------------------+
+  | Author: Sterling Hughes <sterling@php.net>                           |
+  +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_SIMPLEXML_H
+#define PHP_SIMPLEXML_H
+
+extern zend_module_entry simplexml_module_entry;
+#define phpext_simplexml_ptr &simplexml_module_entry
+
+#ifdef PHP_WIN32
+#define PHP_SIMPLEXML_API __declspec(dllexport)
+#else
+#define PHP_SIMPLEXML_API
+#endif
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
+#include <libxml/parser.h>
+#include <libxml/parserInternals.h>
+#include <libxml/tree.h>
+#include <libxml/uri.h>
+#include <libxml/xmlerror.h>
+#include <libxml/xinclude.h>
+#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
+#include <libxml/xpointer.h>
+
+PHP_MINIT_FUNCTION(simplexml);
+PHP_MSHUTDOWN_FUNCTION(simplexml);
+PHP_RINIT_FUNCTION(simplexml);
+PHP_RSHUTDOWN_FUNCTION(simplexml);
+PHP_MINFO_FUNCTION(simplexml);
+
+typedef struct {
+       zend_object zo;
+       xmlDocPtr document;
+       xmlNodePtr node;
+} php_sxe_object;
+
+
+#ifdef ZTS
+#define SIMPLEXML_G(v) TSRMG(simplexml_globals_id, zend_simplexml_globals *, v)
+#else
+#define SIMPLEXML_G(v) (simplexml_globals.v)
+#endif
+
+#endif
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ * vim600: fdm=marker
+ * vim: noet sw=4 ts=4
+ */
diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c
new file mode 100644 (file)
index 0000000..4a018ac
--- /dev/null
@@ -0,0 +1,371 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 4                                                        |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 1997-2003 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.               |
+  +----------------------------------------------------------------------+
+  | Author: Sterling Hughes <sterling@php.net>                           |
+  +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_simplexml.h"
+
+
+zend_class_entry *sxe_class_entry;
+
+static php_sxe_object *php_sxe_object_new(TSRMLS_D);
+static zend_object_value php_sxe_register_object(php_sxe_object * TSRMLS_DC);
+
+/* {{{ php_sxe_fetch_object()
+ */
+static inline php_sxe_object *
+php_sxe_fetch_object(zval *object TSRMLS_DC)
+{
+       return (php_sxe_object *) zend_object_store_get_object(object TSRMLS_CC);
+}
+/* }}} */
+
+/* {{{ sxe_property_read()
+ */
+static zval *
+sxe_property_read(zval *object, zval *member TSRMLS_DC)
+{
+       zval           *return_value;
+       php_sxe_object *sxe;
+       char           *name;
+       char           *content;
+       xmlNodePtr      node;
+
+       MAKE_STD_ZVAL(return_value);
+       ZVAL_NULL(return_value);
+       
+       name = Z_STRVAL_P(member);
+
+       sxe = php_sxe_fetch_object(object TSRMLS_CC);
+       
+       if (sxe->node == NULL) {
+               sxe->node = node = xmlDocGetRootElement(sxe->document)->xmlChildrenNode;
+       } else {
+               node = sxe->node->xmlChildrenNode;
+       }
+
+       while (node) {
+               if (!xmlStrcmp(node->name, name)) {
+                       break;
+               }
+
+               node = node->next;
+       }
+
+       if (node) {
+               if ((content = xmlNodeListGetString(sxe->document, node->xmlChildrenNode, 1)) == NULL) {
+                       php_sxe_object *subnode;
+
+                       subnode = php_sxe_object_new(TSRMLS_C);
+                       subnode->document = sxe->document;
+                       subnode->node = node;
+
+                       return_value->type = IS_OBJECT;
+                       return_value->value.obj = php_sxe_register_object(subnode TSRMLS_CC);
+               } else {
+                       RETVAL_STRING(content, 1);
+                       xmlFree(content);
+               }
+       } else {
+               content = xmlGetProp(sxe->node, (const xmlChar *) name);
+               if (content != NULL) {
+                       RETVAL_STRING(content, 1);
+                       xmlFree(content);
+               }
+       }
+               
+       return return_value;
+}
+/* }}} */
+
+/* {{{ sxe_property_write()
+ */
+static void
+sxe_property_write(zval *object, zval *member, zval *value TSRMLS_DC)
+{
+}
+/* }}} */
+
+/* {{{ sxe_property_exists()
+ */
+static int
+sxe_property_exists(zval *object, zval *member, int check_empty TSRMLS_DC)
+{
+       
+}
+/* }}} */
+
+/* {{{ sxe_property_delete()
+ */
+static void
+sxe_property_delete(zval *object, zval *member TSRMLS_DC)
+{
+}
+/* }}} */
+
+/* {{{ sxe_objects_compare()
+ */
+static int
+sxe_objects_compare(zval *object1, zval *object2 TSRMLS_DC)
+{
+}
+/* }}} */
+
+/* {{{ sxe_constructor_get()
+ */
+static union _zend_function *
+sxe_constructor_get(zval *object TSRMLS_DC)
+{
+       return NULL;
+}
+/* }}} */
+
+/* {{{ sxe_method_get()
+ */
+static union _zend_function *
+sxe_method_get(zval *object, char *name, int len TSRMLS_DC)
+{
+       zend_internal_function *f;
+
+       f = emalloc(sizeof(zend_internal_function));
+       f->type = ZEND_OVERLOADED_FUNCTION;
+       f->arg_types = NULL;
+       f->scope = sxe_class_entry;
+       f->fn_flags = 0;
+       f->function_name = estrndup(name, len);
+
+       return (union _zend_function *) f;
+}
+/* }}} */
+
+/* {{{ sxe_call_method()
+ */
+static int
+sxe_call_method(char *method, INTERNAL_FUNCTION_PARAMETERS)
+{
+       RETURN_NULL();
+       return 1;
+}
+/* }}} */
+
+/* {{{ sxe_class_entry_get()
+ */
+static zend_class_entry *
+sxe_class_entry_get(zval *object TSRMLS_DC)
+{
+       return sxe_class_entry;
+}
+/* }}} */
+
+
+static zend_object_handlers sxe_object_handlers[] = {
+       ZEND_OBJECTS_STORE_HANDLERS,
+       sxe_property_read,
+       sxe_property_write,
+       NULL,
+       NULL,
+       NULL,
+       NULL,
+       sxe_property_exists,
+       sxe_property_delete,
+       NULL,
+       sxe_method_get,
+       sxe_call_method,
+       sxe_constructor_get,
+       sxe_class_entry_get,
+       NULL,
+       sxe_objects_compare
+};
+
+/* {{{ sxe_object_clone()
+ */
+static void
+sxe_object_clone(void *object, void **clone TSRMLS_DC)
+{
+       
+}
+/* }}} */
+
+/* {{{ sxe_object_dtor()
+ */
+static void
+sxe_object_dtor(void *object, zend_object_handle handle TSRMLS_DC)
+{
+       zend_objects_destroy_object(object, handle TSRMLS_CC);
+}
+/* }}} */
+
+/* {{{ php_sxe_object_new() 
+ */
+static php_sxe_object *
+php_sxe_object_new(TSRMLS_D)
+{
+       php_sxe_object *intern;
+
+       intern = emalloc(sizeof(php_sxe_object));
+       intern->zo.ce = sxe_class_entry;
+       intern->zo.in_get = 0;
+       intern->zo.in_set = 0;
+
+       ALLOC_HASHTABLE(intern->zo.properties);
+       zend_hash_init(intern->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
+
+       return intern;
+}
+/* }}} */
+
+/* {{{ php_sxe_register_object
+ */
+static zend_object_value
+php_sxe_register_object(php_sxe_object *intern TSRMLS_DC)
+{
+       zend_object_value rv;
+
+       rv.handle = zend_objects_store_put(intern, sxe_object_dtor, sxe_object_clone);
+       rv.handlers = (zend_object_handlers *) &sxe_object_handlers;
+
+       return rv;
+}
+/* }}} */
+
+/* {{{ sxe_object_new()
+ */
+static zend_object_value
+sxe_object_new(zend_class_entry *ce TSRMLS_DC)
+{
+       php_sxe_object    *intern;
+       zend_object_value  rv;
+
+       intern = php_sxe_object_new(TSRMLS_C);
+       return php_sxe_register_object(intern TSRMLS_CC);
+}
+/* }}} */
+
+/* {{{ proto simplemxml_element simplexml_load_file(string filename)
+   Load a filename and return a simplexml_element object to allow for processing */
+PHP_FUNCTION(simplexml_load_file)
+{
+       php_sxe_object *sxe;
+       char           *filename;
+       int             filename_len;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
+               return;
+       }
+
+       sxe = php_sxe_object_new(TSRMLS_C);
+       sxe->document = xmlParseFile(filename);
+       if (sxe->document == NULL) {
+               RETURN_FALSE;
+       }
+
+       return_value->type = IS_OBJECT;
+       return_value->value.obj = php_sxe_register_object(sxe TSRMLS_CC);
+}
+/* }}} */
+
+
+function_entry simplexml_functions[] = {
+       PHP_FE(simplexml_load_file, NULL)
+       {NULL, NULL, NULL}
+};
+
+
+zend_module_entry simplexml_module_entry = {
+       STANDARD_MODULE_HEADER,
+       "simplexml",
+       simplexml_functions,
+       PHP_MINIT(simplexml),
+       PHP_MSHUTDOWN(simplexml),
+       PHP_RINIT(simplexml),   
+       PHP_RSHUTDOWN(simplexml),
+       PHP_MINFO(simplexml),
+       "0.1",
+       STANDARD_MODULE_PROPERTIES
+};
+
+#ifdef COMPILE_DL_SIMPLEXML
+ZEND_GET_MODULE(simplexml)
+#endif
+
+/* {{{ PHP_MINIT_FUNCTION(simplexml)
+ */
+PHP_MINIT_FUNCTION(simplexml)
+{
+       zend_class_entry sxe;
+       zend_internal_function sxe_constructor;
+
+       INIT_CLASS_ENTRY(sxe, "simplexml_element", NULL);
+       sxe.create_object = sxe_object_new;
+       sxe_class_entry = zend_register_internal_class(&sxe TSRMLS_CC);
+
+       return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MSHUTDOWN_FUNCTION(simplexml)
+ */
+PHP_MSHUTDOWN_FUNCTION(simplexml)
+{
+       return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_RINIT_FUNCTION(simplexml)
+ */
+PHP_RINIT_FUNCTION(simplexml)
+{
+       return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_RSHUTDOWN_FUNCTION(simplexml)
+ */
+PHP_RSHUTDOWN_FUNCTION(simplexml)
+{
+       return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MINFO_FUNCTION(simplexml)
+ */
+PHP_MINFO_FUNCTION(simplexml)
+{
+       php_info_print_table_start();
+       php_info_print_table_header(2, "Simplexml support", "enabled");
+       php_info_print_table_end();
+
+}
+/* }}} */
+
+/**
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: t
+ * End:
+ * vim600: fdm=marker
+ * vim: noet sw=4 ts=4
+ */
diff --git a/ext/simplexml/tests/001.phpt b/ext/simplexml/tests/001.phpt
new file mode 100644 (file)
index 0000000..7b53bf1
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+Check for simplexml presence
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip"; ?>
+--POST--
+--GET--
+--INI--
+--FILE--
+<?php 
+echo "simplexml extension is available";
+/*
+       you can add regression tests for your extension here
+
+  the output of your test code has to be equal to the
+  text in the --EXPECT-- section below for the tests
+  to pass, differences between the output and the
+  expected text are interpreted as failure
+
+       see php4/README.TESTING for further information on
+  writing regression tests
+*/
+?>
+--EXPECT--
+simplexml extension is available