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_INI_BEGIN
  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_RINIT_FUNCTION
  10. PHP_RSHUTDOWN_FUNCTION
  11. PHP_MINFO_FUNCTION

   1 /*
   2   +----------------------------------------------------------------------+
   3   | PHP Version 5                                                        |
   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 #if ZEND_MODULE_API_NO >= 20050617
  51         STANDARD_MODULE_HEADER_EX, NULL,
  52         xsl_deps,
  53 #elif ZEND_MODULE_API_NO >= 20010901
  54         STANDARD_MODULE_HEADER,
  55 #endif
  56         "xsl",
  57         xsl_functions,
  58         PHP_MINIT(xsl),
  59         PHP_MSHUTDOWN(xsl),
  60         PHP_RINIT(xsl),         /* Replace with NULL if there's nothing to do at request start */
  61         PHP_RSHUTDOWN(xsl),     /* Replace with NULL if there's nothing to do at request end */
  62         PHP_MINFO(xsl),
  63 #if ZEND_MODULE_API_NO >= 20010901
  64         "0.1", /* Replace with version number for your extension */
  65 #endif
  66         STANDARD_MODULE_PROPERTIES
  67 };
  68 /* }}} */
  69 
  70 #ifdef COMPILE_DL_XSL
  71 ZEND_GET_MODULE(xsl)
  72 #endif
  73 
  74 /* {{{ xsl_objects_free_storage */
  75 void xsl_objects_free_storage(void *object TSRMLS_DC)
  76 {
  77         xsl_object *intern = (xsl_object *)object;
  78 
  79         zend_object_std_dtor(&intern->std TSRMLS_CC);
  80 
  81         zend_hash_destroy(intern->parameter);
  82         FREE_HASHTABLE(intern->parameter);
  83         
  84         zend_hash_destroy(intern->registered_phpfunctions);
  85         FREE_HASHTABLE(intern->registered_phpfunctions);
  86         
  87         if (intern->node_list) {
  88                 zend_hash_destroy(intern->node_list);
  89                 FREE_HASHTABLE(intern->node_list);
  90         }
  91 
  92         if (intern->doc) {
  93                 php_libxml_decrement_doc_ref(intern->doc TSRMLS_CC);
  94                 efree(intern->doc);
  95         }
  96 
  97         if (intern->ptr) {
  98                 /* free wrapper */
  99                 if (((xsltStylesheetPtr) intern->ptr)->_private != NULL) {
 100                         ((xsltStylesheetPtr) intern->ptr)->_private = NULL;   
 101                 }
 102 
 103                 xsltFreeStylesheet((xsltStylesheetPtr) intern->ptr);
 104                 intern->ptr = NULL;
 105         }
 106         if (intern->profiling) {
 107                 efree(intern->profiling);
 108         }
 109         efree(object);
 110 }
 111 /* }}} */
 112 
 113 /* {{{ xsl_objects_new */
 114 zend_object_value xsl_objects_new(zend_class_entry *class_type TSRMLS_DC)
 115 {
 116         zend_object_value retval;
 117         xsl_object *intern;
 118 
 119         intern = emalloc(sizeof(xsl_object));
 120         intern->ptr = NULL;
 121         intern->prop_handler = NULL;
 122         intern->parameter = NULL;
 123         intern->hasKeys = 0;
 124         intern->registerPhpFunctions = 0;
 125         intern->registered_phpfunctions = NULL;
 126         intern->node_list = NULL;
 127         intern->doc = NULL;
 128         intern->profiling = NULL;
 129         intern->securityPrefs = XSL_SECPREF_DEFAULT;
 130         intern->securityPrefsSet = 0;
 131 
 132         zend_object_std_init(&intern->std, class_type TSRMLS_CC);
 133         object_properties_init(&intern->std, class_type);
 134         ALLOC_HASHTABLE(intern->parameter);
 135         zend_hash_init(intern->parameter, 0, NULL, ZVAL_PTR_DTOR, 0);
 136         ALLOC_HASHTABLE(intern->registered_phpfunctions);
 137         zend_hash_init(intern->registered_phpfunctions, 0, NULL, ZVAL_PTR_DTOR, 0);
 138         retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) xsl_objects_free_storage, NULL TSRMLS_CC);
 139         intern->handle = retval.handle;
 140         retval.handlers = &xsl_object_handlers;
 141         return retval;
 142 }
 143 /* }}} */
 144 
 145 PHP_INI_BEGIN()
 146 /* Default is not allowing any write operations. 
 147    XSL_SECPREF_CREATE_DIRECTORY | XSL_SECPREF_WRITE_NETWORK | XSL_SECPREF_WRITE_FILE == 44 
 148 */
 149 PHP_INI_ENTRY("xsl.security_prefs", "44", PHP_INI_ALL, NULL)
 150 PHP_INI_END()
 151 
 152 /* {{{ PHP_MINIT_FUNCTION
 153  */
 154 PHP_MINIT_FUNCTION(xsl)
 155 {
 156         
 157         zend_class_entry ce;
 158         
 159         memcpy(&xsl_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
 160         xsl_object_handlers.clone_obj = NULL;
 161 
 162         REGISTER_XSL_CLASS(ce, "XSLTProcessor", NULL, php_xsl_xsltprocessor_class_functions, xsl_xsltprocessor_class_entry);
 163 #if HAVE_XSL_EXSLT
 164         exsltRegisterAll();
 165 #endif
 166  
 167         xsltRegisterExtModuleFunction ((const xmlChar *) "functionString",
 168                                    (const xmlChar *) "http://php.net/xsl",
 169                                    xsl_ext_function_string_php);
 170         xsltRegisterExtModuleFunction ((const xmlChar *) "function",
 171                                    (const xmlChar *) "http://php.net/xsl",
 172                                    xsl_ext_function_object_php);
 173 
 174         REGISTER_LONG_CONSTANT("XSL_CLONE_AUTO",      0,     CONST_CS | CONST_PERSISTENT);
 175         REGISTER_LONG_CONSTANT("XSL_CLONE_NEVER",    -1,     CONST_CS | CONST_PERSISTENT);
 176         REGISTER_LONG_CONSTANT("XSL_CLONE_ALWAYS",    1,     CONST_CS | CONST_PERSISTENT);
 177 
 178         REGISTER_LONG_CONSTANT("XSL_SECPREF_NONE",             XSL_SECPREF_NONE,             CONST_CS | CONST_PERSISTENT);
 179         REGISTER_LONG_CONSTANT("XSL_SECPREF_READ_FILE",        XSL_SECPREF_READ_FILE,        CONST_CS | CONST_PERSISTENT);
 180         REGISTER_LONG_CONSTANT("XSL_SECPREF_WRITE_FILE",       XSL_SECPREF_WRITE_FILE,       CONST_CS | CONST_PERSISTENT);
 181         REGISTER_LONG_CONSTANT("XSL_SECPREF_CREATE_DIRECTORY", XSL_SECPREF_CREATE_DIRECTORY, CONST_CS | CONST_PERSISTENT);
 182         REGISTER_LONG_CONSTANT("XSL_SECPREF_READ_NETWORK",     XSL_SECPREF_READ_NETWORK,     CONST_CS | CONST_PERSISTENT);
 183         REGISTER_LONG_CONSTANT("XSL_SECPREF_WRITE_NETWORK",    XSL_SECPREF_WRITE_NETWORK,    CONST_CS | CONST_PERSISTENT);
 184         REGISTER_LONG_CONSTANT("XSL_SECPREF_DEFAULT",          XSL_SECPREF_DEFAULT,          CONST_CS | CONST_PERSISTENT);
 185 
 186         REGISTER_LONG_CONSTANT("LIBXSLT_VERSION",           LIBXSLT_VERSION,            CONST_CS | CONST_PERSISTENT);
 187         REGISTER_STRING_CONSTANT("LIBXSLT_DOTTED_VERSION",  LIBXSLT_DOTTED_VERSION,     CONST_CS | CONST_PERSISTENT);
 188 
 189 #if HAVE_XSL_EXSLT
 190         REGISTER_LONG_CONSTANT("LIBEXSLT_VERSION",           LIBEXSLT_VERSION,            CONST_CS | CONST_PERSISTENT);
 191         REGISTER_STRING_CONSTANT("LIBEXSLT_DOTTED_VERSION",  LIBEXSLT_DOTTED_VERSION,     CONST_CS | CONST_PERSISTENT);
 192 #endif
 193 
 194     REGISTER_INI_ENTRIES();
 195 
 196         return SUCCESS;
 197 }
 198 /* }}} */
 199 
 200 /* {{{ xsl_object_get_data */
 201 zval *xsl_object_get_data(void *obj)
 202 {
 203         zval *dom_wrapper;
 204         dom_wrapper = ((xsltStylesheetPtr) obj)->_private;
 205         return dom_wrapper;
 206 }
 207 /* }}} */
 208 
 209 /* {{{ xsl_object_set_data */
 210 static void xsl_object_set_data(void *obj, zval *wrapper TSRMLS_DC)
 211 {
 212         ((xsltStylesheetPtr) obj)->_private = wrapper;
 213 }
 214 /* }}} */
 215 
 216 /* {{{ php_xsl_set_object */
 217 void php_xsl_set_object(zval *wrapper, void *obj TSRMLS_DC)
 218 {
 219         xsl_object *object;
 220 
 221         object = (xsl_object *)zend_objects_get_address(wrapper TSRMLS_CC);
 222         object->ptr = obj;
 223         xsl_object_set_data(obj, wrapper TSRMLS_CC);
 224 }
 225 /* }}} */
 226 
 227 /* {{{ php_xsl_create_object */
 228 zval *php_xsl_create_object(xsltStylesheetPtr obj, int *found, zval *wrapper_in, zval *return_value  TSRMLS_DC)
 229 {
 230         zval *wrapper;
 231         zend_class_entry *ce;
 232 
 233         *found = 0;
 234 
 235         if (!obj) {
 236                 if(!wrapper_in) {
 237                         ALLOC_ZVAL(wrapper);
 238                 } else {
 239                         wrapper = wrapper_in;
 240                 }
 241                 ZVAL_NULL(wrapper);
 242                 return wrapper;
 243         }
 244 
 245         if ((wrapper = (zval *) xsl_object_get_data((void *) obj))) {
 246                 zval_add_ref(&wrapper);
 247                 *found = 1;
 248                 return wrapper;
 249         }
 250 
 251         if(!wrapper_in) {
 252                 wrapper = return_value;
 253         } else {
 254                 wrapper = wrapper_in;
 255         }
 256 
 257         
 258         ce = xsl_xsltprocessor_class_entry;
 259 
 260         if(!wrapper_in) {
 261                 object_init_ex(wrapper, ce);
 262         }
 263         php_xsl_set_object(wrapper, (void *) obj TSRMLS_CC);
 264         return (wrapper);
 265 }
 266 /* }}} */
 267 
 268 /* {{{ PHP_MSHUTDOWN_FUNCTION
 269  */
 270 PHP_MSHUTDOWN_FUNCTION(xsl)
 271 {
 272         xsltUnregisterExtModuleFunction ((const xmlChar *) "functionString",
 273                                    (const xmlChar *) "http://php.net/xsl");
 274         xsltUnregisterExtModuleFunction ((const xmlChar *) "function",
 275                                    (const xmlChar *) "http://php.net/xsl");
 276 
 277         xsltCleanupGlobals();
 278 
 279         UNREGISTER_INI_ENTRIES();
 280 
 281         return SUCCESS;
 282 }
 283 /* }}} */
 284 
 285 /* {{{ PHP_RINIT_FUNCTION
 286  */
 287 PHP_RINIT_FUNCTION(xsl)
 288 {
 289         xsltSetGenericErrorFunc(NULL, php_libxml_error_handler);
 290         return SUCCESS;
 291 }
 292 /* }}} */
 293 
 294 /* {{{ PHP_RSHUTDOWN_FUNCTION
 295  */
 296 PHP_RSHUTDOWN_FUNCTION(xsl)
 297 {
 298         xsltSetGenericErrorFunc(NULL, NULL);
 299         return SUCCESS;
 300 }
 301 /* }}} */
 302 
 303 /* {{{ PHP_MINFO_FUNCTION
 304  */
 305 PHP_MINFO_FUNCTION(xsl)
 306 {
 307         php_info_print_table_start();
 308         {
 309                 char buffer[128];
 310                 int major, minor, subminor;
 311 
 312                 php_info_print_table_row(2, "XSL", "enabled");
 313                 major = xsltLibxsltVersion/10000;
 314                 minor = (xsltLibxsltVersion - major * 10000) / 100;
 315                 subminor = (xsltLibxsltVersion - major * 10000 - minor * 100);
 316                 snprintf(buffer, 128, "%d.%d.%d", major, minor, subminor);
 317                 php_info_print_table_row(2, "libxslt Version", buffer);
 318                 major = xsltLibxmlVersion/10000;
 319                 minor = (xsltLibxmlVersion - major * 10000) / 100;
 320                 subminor = (xsltLibxmlVersion - major * 10000 - minor * 100);
 321                 snprintf(buffer, 128, "%d.%d.%d", major, minor, subminor);
 322                 php_info_print_table_row(2, "libxslt compiled against libxml Version", buffer);
 323         }
 324 #if HAVE_XSL_EXSLT
 325         php_info_print_table_row(2, "EXSLT", "enabled");
 326         php_info_print_table_row(2, "libexslt Version", LIBEXSLT_DOTTED_VERSION);
 327 #endif
 328         php_info_print_table_end();
 329 }
 330 /* }}} */
 331 
 332 /*
 333  * Local variables:
 334  * tab-width: 4
 335  * c-basic-offset: 4
 336  * End:
 337  * vim600: noet sw=4 ts=4 fdm=marker
 338  * vim<600: noet sw=4 ts=4
 339  */

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