From: Sterling Hughes Date: Sun, 18 May 2003 20:33:26 +0000 (+0000) Subject: add very basic code for the simplexml extension. The following works :: X-Git-Tag: RELEASE_1_0_2~760 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=94925b1c33e52c325d7643af27dd6ff200373408;p=php add very basic code for the simplexml extension. The following works :: person.xml -- Sterling Hughes person.php -- name->last . ', ' . $p->name->first; ?> Still needs lots of work. --- diff --git a/ext/simplexml/CREDITS b/ext/simplexml/CREDITS new file mode 100644 index 0000000000..4f03ea1e13 --- /dev/null +++ b/ext/simplexml/CREDITS @@ -0,0 +1 @@ +simplexml \ No newline at end of file diff --git a/ext/simplexml/EXPERIMENTAL b/ext/simplexml/EXPERIMENTAL new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ext/simplexml/config.m4 b/ext/simplexml/config.m4 new file mode 100644 index 0000000000..21eeac8d9c --- /dev/null +++ b/ext/simplexml/config.m4 @@ -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 index 0000000000..ebe165a8f5 --- /dev/null +++ b/ext/simplexml/php_simplexml.h @@ -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 | + +----------------------------------------------------------------------+ +*/ + +/* $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 +#include +#include +#include +#include +#include +#include +#include +#include + +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 index 0000000000..4a018ac3bd --- /dev/null +++ b/ext/simplexml/simplexml.c @@ -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 | + +----------------------------------------------------------------------+ +*/ + +/* $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 index 0000000000..7b53bf1cb7 --- /dev/null +++ b/ext/simplexml/tests/001.phpt @@ -0,0 +1,24 @@ +--TEST-- +Check for simplexml presence +--SKIPIF-- + +--POST-- +--GET-- +--INI-- +--FILE-- + +--EXPECT-- +simplexml extension is available