root/ext/xsl/php_xsl.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ZEND_GET_MODULE
  2. xsl_objects_new
  3. PHP_MINIT_FUNCTION
  4. xsl_object_get_data
  5. xsl_object_set_data
  6. php_xsl_set_object
  7. php_xsl_create_object
  8. PHP_MSHUTDOWN_FUNCTION
  9. PHP_MINFO_FUNCTION

   1 /*
   2   +----------------------------------------------------------------------+
   3   | PHP Version 7                                                        |
   4   +----------------------------------------------------------------------+
   5   | Copyright (c) 1997-2016 The PHP Group                                |
   6   +----------------------------------------------------------------------+
   7   | This source file is subject to version 3.01 of the PHP license,      |
   8   | that is bundled with this package in the file LICENSE, and is        |
   9   | available through the world-wide-web at the following url:           |
  10   | http://www.php.net/license/3_01.txt                                  |
  11   | If you did not receive a copy of the PHP license and are unable to   |
  12   | obtain it through the world-wide-web, please send a note to          |
  13   | license@php.net so we can mail you a copy immediately.               |
  14   +----------------------------------------------------------------------+
  15   | Author: Christian Stocker <chregu@php.net>                           |
  16   +----------------------------------------------------------------------+
  17 */
  18 
  19 /* $Id$ */
  20 
  21 #ifdef HAVE_CONFIG_H
  22 #include "config.h"
  23 #endif
  24 
  25 #include "php.h"
  26 #include "php_ini.h"
  27 #include "ext/standard/info.h"
  28 #include "php_xsl.h"
  29 
  30 zend_class_entry *xsl_xsltprocessor_class_entry;
  31 static zend_object_handlers xsl_object_handlers;
  32 
  33 /* {{{ xsl_functions[]
  34  *
  35  * Every user visible function must have an entry in xsl_functions[].
  36  */
  37 const zend_function_entry xsl_functions[] = {
  38         PHP_FE_END
  39 };
  40 /* }}} */
  41 
  42 static const zend_module_dep xsl_deps[] = {
  43         ZEND_MOD_REQUIRED("libxml")
  44         ZEND_MOD_END
  45 };
  46 
  47 /* {{{ xsl_module_entry
  48  */
  49 zend_module_entry xsl_module_entry = {
  50         STANDARD_MODULE_HEADER_EX, NULL,
  51         xsl_deps,
  52         "xsl",
  53         xsl_functions,
  54         PHP_MINIT(xsl),
  55         PHP_MSHUTDOWN(xsl),
  56         NULL,
  57         NULL,
  58         PHP_MINFO(xsl),
  59         PHP_XSL_VERSION,
  60         STANDARD_MODULE_PROPERTIES
  61 };
  62 /* }}} */
  63 
  64 #ifdef COMPILE_DL_XSL
  65 ZEND_GET_MODULE(xsl)
  66 #endif
  67 
  68 /* {{{ xsl_objects_free_storage */
  69 void xsl_objects_free_storage(zend_object *object)
  70 {
  71         xsl_object *intern = php_xsl_fetch_object(object);
  72 
  73         zend_object_std_dtor(&intern->std);
  74 
  75         zend_hash_destroy(intern->parameter);
  76         FREE_HASHTABLE(intern->parameter);
  77 
  78         zend_hash_destroy(intern->registered_phpfunctions);
  79         FREE_HASHTABLE(intern->registered_phpfunctions);
  80 
  81         if (intern->node_list) {
  82                 zend_hash_destroy(intern->node_list);
  83                 FREE_HASHTABLE(intern->node_list);
  84         }
  85 
  86         if (intern->doc) {
  87                 php_libxml_decrement_doc_ref(intern->doc);
  88                 efree(intern->doc);
  89         }
  90 
  91         if (intern->ptr) {
  92                 /* free wrapper */
  93                 if (((xsltStylesheetPtr) intern->ptr)->_private != NULL) {
  94                         ((xsltStylesheetPtr) intern->ptr)->_private = NULL;
  95                 }
  96 
  97                 xsltFreeStylesheet((xsltStylesheetPtr) intern->ptr);
  98                 intern->ptr = NULL;
  99         }
 100         if (intern->profiling) {
 101                 efree(intern->profiling);
 102         }
 103 }
 104 /* }}} */
 105 
 106 /* {{{ xsl_objects_new */
 107 zend_object *xsl_objects_new(zend_class_entry *class_type)
 108 {
 109         xsl_object *intern;
 110 
 111         intern = ecalloc(1, sizeof(xsl_object) + zend_object_properties_size(class_type));
 112         intern->securityPrefs = XSL_SECPREF_DEFAULT;
 113 
 114         zend_object_std_init(&intern->std, class_type);
 115         object_properties_init(&intern->std, class_type);
 116         ALLOC_HASHTABLE(intern->parameter);
 117         zend_hash_init(intern->parameter, 0, NULL, ZVAL_PTR_DTOR, 0);
 118         ALLOC_HASHTABLE(intern->registered_phpfunctions);
 119         zend_hash_init(intern->registered_phpfunctions, 0, NULL, ZVAL_PTR_DTOR, 0);
 120 
 121         intern->std.handlers = &xsl_object_handlers;
 122         return &intern->std;
 123 }
 124 /* }}} */
 125 
 126 /* {{{ PHP_MINIT_FUNCTION
 127  */
 128 PHP_MINIT_FUNCTION(xsl)
 129 {
 130 
 131         zend_class_entry ce;
 132 
 133         memcpy(&xsl_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
 134         xsl_object_handlers.offset = XtOffsetOf(xsl_object, std);
 135         xsl_object_handlers.clone_obj = NULL;
 136         xsl_object_handlers.free_obj = xsl_objects_free_storage;
 137 
 138         REGISTER_XSL_CLASS(ce, "XSLTProcessor", NULL, php_xsl_xsltprocessor_class_functions, xsl_xsltprocessor_class_entry);
 139 #if HAVE_XSL_EXSLT
 140         exsltRegisterAll();
 141 #endif
 142 
 143         xsltRegisterExtModuleFunction ((const xmlChar *) "functionString",
 144                                    (const xmlChar *) "http://php.net/xsl",
 145                                    xsl_ext_function_string_php);
 146         xsltRegisterExtModuleFunction ((const xmlChar *) "function",
 147                                    (const xmlChar *) "http://php.net/xsl",
 148                                    xsl_ext_function_object_php);
 149         xsltSetGenericErrorFunc(NULL, php_libxml_error_handler);
 150 
 151         REGISTER_LONG_CONSTANT("XSL_CLONE_AUTO",      0,     CONST_CS | CONST_PERSISTENT);
 152         REGISTER_LONG_CONSTANT("XSL_CLONE_NEVER",    -1,     CONST_CS | CONST_PERSISTENT);
 153         REGISTER_LONG_CONSTANT("XSL_CLONE_ALWAYS",    1,     CONST_CS | CONST_PERSISTENT);
 154 
 155         REGISTER_LONG_CONSTANT("XSL_SECPREF_NONE",             XSL_SECPREF_NONE,             CONST_CS | CONST_PERSISTENT);
 156         REGISTER_LONG_CONSTANT("XSL_SECPREF_READ_FILE",        XSL_SECPREF_READ_FILE,        CONST_CS | CONST_PERSISTENT);
 157         REGISTER_LONG_CONSTANT("XSL_SECPREF_WRITE_FILE",       XSL_SECPREF_WRITE_FILE,       CONST_CS | CONST_PERSISTENT);
 158         REGISTER_LONG_CONSTANT("XSL_SECPREF_CREATE_DIRECTORY", XSL_SECPREF_CREATE_DIRECTORY, CONST_CS | CONST_PERSISTENT);
 159         REGISTER_LONG_CONSTANT("XSL_SECPREF_READ_NETWORK",     XSL_SECPREF_READ_NETWORK,     CONST_CS | CONST_PERSISTENT);
 160         REGISTER_LONG_CONSTANT("XSL_SECPREF_WRITE_NETWORK",    XSL_SECPREF_WRITE_NETWORK,    CONST_CS | CONST_PERSISTENT);
 161         REGISTER_LONG_CONSTANT("XSL_SECPREF_DEFAULT",          XSL_SECPREF_DEFAULT,          CONST_CS | CONST_PERSISTENT);
 162 
 163         REGISTER_LONG_CONSTANT("LIBXSLT_VERSION",           LIBXSLT_VERSION,            CONST_CS | CONST_PERSISTENT);
 164         REGISTER_STRING_CONSTANT("LIBXSLT_DOTTED_VERSION",  LIBXSLT_DOTTED_VERSION,     CONST_CS | CONST_PERSISTENT);
 165 
 166 #if HAVE_XSL_EXSLT
 167         REGISTER_LONG_CONSTANT("LIBEXSLT_VERSION",           LIBEXSLT_VERSION,            CONST_CS | CONST_PERSISTENT);
 168         REGISTER_STRING_CONSTANT("LIBEXSLT_DOTTED_VERSION",  LIBEXSLT_DOTTED_VERSION,     CONST_CS | CONST_PERSISTENT);
 169 #endif
 170 
 171         return SUCCESS;
 172 }
 173 /* }}} */
 174 
 175 /* {{{ xsl_object_get_data */
 176 zval *xsl_object_get_data(void *obj)
 177 {
 178         zval *dom_wrapper;
 179         dom_wrapper = ((xsltStylesheetPtr) obj)->_private;
 180         return dom_wrapper;
 181 }
 182 /* }}} */
 183 
 184 /* {{{ xsl_object_set_data */
 185 static void xsl_object_set_data(void *obj, zval *wrapper)
 186 {
 187         ((xsltStylesheetPtr) obj)->_private = wrapper;
 188 }
 189 /* }}} */
 190 
 191 /* {{{ php_xsl_set_object */
 192 void php_xsl_set_object(zval *wrapper, void *obj)
 193 {
 194         xsl_object *object;
 195 
 196         object = Z_XSL_P(wrapper);
 197         object->ptr = obj;
 198         xsl_object_set_data(obj, wrapper);
 199 }
 200 /* }}} */
 201 
 202 /* {{{ php_xsl_create_object */
 203 void php_xsl_create_object(xsltStylesheetPtr obj, zval *wrapper_in, zval *return_value )
 204 {
 205         zval *wrapper;
 206         zend_class_entry *ce;
 207 
 208         if (!obj) {
 209                 wrapper = wrapper_in;
 210                 ZVAL_NULL(wrapper);
 211                 return;
 212         }
 213 
 214         if ((wrapper = xsl_object_get_data((void *) obj))) {
 215                 ZVAL_COPY(wrapper, wrapper_in);
 216                 return;
 217         }
 218 
 219         if (!wrapper_in) {
 220                 wrapper = return_value;
 221         } else {
 222                 wrapper = wrapper_in;
 223         }
 224 
 225 
 226         ce = xsl_xsltprocessor_class_entry;
 227 
 228         if (!wrapper_in) {
 229                 object_init_ex(wrapper, ce);
 230         }
 231         php_xsl_set_object(wrapper, (void *) obj);
 232 
 233         return;
 234 }
 235 /* }}} */
 236 
 237 /* {{{ PHP_MSHUTDOWN_FUNCTION
 238  */
 239 PHP_MSHUTDOWN_FUNCTION(xsl)
 240 {
 241         xsltUnregisterExtModuleFunction ((const xmlChar *) "functionString",
 242                                    (const xmlChar *) "http://php.net/xsl");
 243         xsltUnregisterExtModuleFunction ((const xmlChar *) "function",
 244                                    (const xmlChar *) "http://php.net/xsl");
 245         xsltSetGenericErrorFunc(NULL, NULL);
 246         xsltCleanupGlobals();
 247 
 248         return SUCCESS;
 249 }
 250 /* }}} */
 251 
 252 /* {{{ PHP_MINFO_FUNCTION
 253  */
 254 PHP_MINFO_FUNCTION(xsl)
 255 {
 256         php_info_print_table_start();
 257         {
 258                 char buffer[128];
 259                 int major, minor, subminor;
 260 
 261                 php_info_print_table_row(2, "XSL", "enabled");
 262                 major = xsltLibxsltVersion/10000;
 263                 minor = (xsltLibxsltVersion - major * 10000) / 100;
 264                 subminor = (xsltLibxsltVersion - major * 10000 - minor * 100);
 265                 snprintf(buffer, 128, "%d.%d.%d", major, minor, subminor);
 266                 php_info_print_table_row(2, "libxslt Version", buffer);
 267                 major = xsltLibxmlVersion/10000;
 268                 minor = (xsltLibxmlVersion - major * 10000) / 100;
 269                 subminor = (xsltLibxmlVersion - major * 10000 - minor * 100);
 270                 snprintf(buffer, 128, "%d.%d.%d", major, minor, subminor);
 271                 php_info_print_table_row(2, "libxslt compiled against libxml Version", buffer);
 272         }
 273 #if HAVE_XSL_EXSLT
 274         php_info_print_table_row(2, "EXSLT", "enabled");
 275         php_info_print_table_row(2, "libexslt Version", LIBEXSLT_DOTTED_VERSION);
 276 #endif
 277         php_info_print_table_end();
 278 }
 279 /* }}} */
 280 
 281 /*
 282  * Local variables:
 283  * tab-width: 4
 284  * c-basic-offset: 4
 285  * End:
 286  * vim600: noet sw=4 ts=4 fdm=marker
 287  * vim<600: noet sw=4 ts=4
 288  */

/* [<][>][^][v][top][bottom][index][help] */