xref: /PHP-7.2/ext/xsl/php_xsl.c (revision 7a7ec01a)
1 /*
2   +----------------------------------------------------------------------+
3   | PHP Version 7                                                        |
4   +----------------------------------------------------------------------+
5   | Copyright (c) 1997-2018 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
ZEND_GET_MODULE(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 */
xsl_objects_new(zend_class_entry * class_type)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  */
PHP_MINIT_FUNCTION(xsl)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 */
xsl_object_get_data(void * obj)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 */
xsl_object_set_data(void * obj,zval * wrapper)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 */
php_xsl_set_object(zval * wrapper,void * obj)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 */
php_xsl_create_object(xsltStylesheetPtr obj,zval * wrapper_in,zval * return_value)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  */
PHP_MSHUTDOWN_FUNCTION(xsl)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  */
PHP_MINFO_FUNCTION(xsl)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  */
289