8 #include "ext/standard/info.h"
9 #include "Zend/zend_exceptions.h"
10 #include "php_bbcode.h"
12 /* If you declare any globals in php_bbcode.h uncomment this:
13 ZEND_DECLARE_MODULE_GLOBALS(bbcode)
16 typedef struct _bbcode_object
{
21 zend_object_handlers bbcode_handlers
;
25 /* True global resources - no need for thread safety here */
27 zend_class_entry
*bbcode_ce
;
29 /* BBCode exception object */
30 zend_class_entry
*bbcode_exception_ce
;
32 /* Define all constants */
33 #define BBCODE_DEF(GEN) \
35 GEN(TYPE_ARG) /*BBCODE_TYPE_ARG*/\
36 GEN(TYPE_NOARG) /*BBCODE_TYPE_NOARG*/\
37 GEN(TYPE_SINGLE) /*BBCODE_TYPE_SINGLE*/\
38 GEN(TYPE_OPTARG) /*BBCODE_TYPE_OPTARG*/\
39 GEN(TYPE_ROOT) /*BBCODE_TYPE_ROOT*/\
42 GEN(QUOTE_DOUBLE) /*BBCODE_ARG_DOUBLE_QUOTE*/\
43 GEN(QUOTE_SIMPLE) /*BBCODE_ARG_SINGLE_QUOTE*/\
44 GEN(QUOTE_HTML) /*BBCODE_ARG_HTML_QUOTE*/\
45 GEN(QUOTE_ESCAPE) /*BBCODE_ARG_QUOTE_ESCAPING*/\
48 GEN(CORRECT_AUTO) /*BBCODE_AUTO_CORRECT*/\
49 GEN(CORRECT_REOPEN) /*BBCODE_CORRECT_REOPEN_TAGS*/\
50 GEN(CORRECT_NOTREE) /*BBCODE_DISABLE_TREE_BUILD*/\
53 GEN(SMILEY_ON) /*BBCODE_DEFAULT_SMILEYS_ON*/\
54 GEN(SMILEY_CI) /*BBCODE_SMILEYS_CASE_INSENSITIVE*/\
57 GEN(CLOSE_AUTO) /*BBCODE_FLAGS_ONE_OPEN_PER_LEVEL*/\
58 GEN(REMOVE_EMPTY) /*BBCODE_FLAGS_REMOVE_IF_EMPTY*/\
59 GEN(REMOVE_CONTENT) /*BBCODE_FLAGS_CDATA_NOT_ALLOWED*/\
60 GEN(REMOVE_REOPEN) /*BBCODE_FLAGS_DENY_REOPEN_CHILD*/
63 /* Generate enum version */
64 #define BBCODE_GEN_ENUM(NAME) BBCODE_ ## NAME,
66 /* Generate zend const version */
67 #define BBCODE_GEN_CONST(NAME) zend_declare_class_constant_long(bbcode_ce, #NAME, sizeof(#NAME) - 1, BBCODE_ ## NAME TSRMLS_CC);
69 /* All flags enum set */
71 BBCODE_DEF(BBCODE_GEN_ENUM
)
75 * TODO: Set it in an ini ? */
76 #define BBCODE_DEFAULT_FLAG BBCODE_QUOTE_DOUBLE|BBCODE_QUOTE_SIMPLE|BBCODE_QUOTE_ESCAPE|BBCODE_CORRECT_AUTO|BBCODE_CORRECT_REOPEN|BBCODE_SMILEY_ON|BBCODE_CLOSE_AUTO|BBCODE_REMOVE_EMPTY
78 static void bbcode_destroy(bbcode_object
*obj TSRMLS_DC
);
79 static void bbcode_free(bbcode_object
*obj TSRMLS_DC
);
80 static zend_object
*bbcode_clone(zval
*obj TSRMLS_DC
);
81 static zend_object
*bbcode_create(zend_class_entry
*ce TSRMLS_DC
);
83 /* BBCode object destroy call */
84 static void bbcode_destroy(bbcode_object
*obj TSRMLS_DC
) {
85 //zend_objects_destroy_object(&obj->std);
86 zend_objects_destroy_object((zend_object
*)obj
);
88 //zend_object_std_dtor(&obj->std TSRMLS_CC);
97 /* BBCode object free call */
98 static void bbcode_free(bbcode_object
*obj TSRMLS_DC
) {
105 zend_object_std_dtor((zend_object
*)obj
);
108 static zend_object
*bbcode_clone(zval
*obj TSRMLS_DC
) {
110 bbcode_object
*oldobj
= (bbcode_object
*)((char *)obj
- XtOffsetOf(bbcode_object
, std
));
112 bbcode_object
*newobj
= ecalloc(1, sizeof(bbcode_object
) + zend_object_properties_size(Z_OBJCE_P(obj
)));
114 zend_object_std_init(&newobj
->std
, Z_OBJCE_P(obj
) TSRMLS_CC
);
115 object_properties_init(&newobj
->std
, Z_OBJCE_P(obj
) TSRMLS_CC
);
117 memcpy(&newobj
->bbcode_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
118 newobj
->bbcode_handlers
.offset
= XtOffsetOf(bbcode_object
, std
);
119 newobj
->bbcode_handlers
.dtor_obj
= (zend_object_dtor_obj_t
) bbcode_destroy
;
120 newobj
->bbcode_handlers
.free_obj
= (zend_object_free_obj_t
) bbcode_free
;
121 newobj
->bbcode_handlers
.clone_obj
= (zend_object_clone_obj_t
) bbcode_clone
;
123 newobj
->std
.handlers
= &(newobj
->bbcode_handlers
);
125 zend_objects_clone_members(&newobj
->std
, &oldobj
->std
);
128 bbcode_object
*oldobj
= (bbcode_object
*)((char *)obj
- XtOffsetOf(bbcode_object
, std
));
129 zend_object
*newobj_val
= bbcode_create(Z_OBJCE_P(obj
) TSRMLS_CC
);
130 bbcode_object
*newobj
= (bbcode_object
*)((char *)newobj_val
- XtOffsetOf(bbcode_object
, std
));
132 zend_objects_clone_members(&newobj
->std
, &oldobj
->std
);
135 /*XXX: clone flag member*/
136 newobj
->flag
= oldobj
->flag
;
138 /* TODO: clone the members of bbcode_object
139 newobj->buffer = oldobj->buffer;
140 newobj->length = oldobj->length;
143 newobj->buffer = emalloc(oldobj->length);
144 memcpy(newobj->buffer, oldobj->buffer, oldobj->length);
151 static zend_object_value
bbcode_clone(zval
*obj TSRMLS_DC
)
153 bbcode_object
*oldobj
= zend_object_store_get_object(obj TSRMLS_CC
);
154 zend_object_value newobj_val
= array_buffer_create_object(Z_OBJCE_P(obj
) TSRMLS_CC
);
155 bbcode_object
*newobj
= zend_object_store_get_object_by_handle(newobj_val
.handle TSRMLS_CC
);
157 zend_objects_clone_members(&newobj
->std
, &oldobj
->std
);
159 /* TODO: clone the members of bbcode_object
160 newobj->buffer = oldobj->buffer;
161 newobj->length = oldobj->length;
164 newobj->buffer = emalloc(oldobj->length);
165 memcpy(newobj->buffer, oldobj->buffer, oldobj->length);
172 static zend_object
*bbcode_create(zend_class_entry
*ce TSRMLS_DC
) {
173 bbcode_object
*obj
= ecalloc(1, sizeof(bbcode_object
) + zend_object_properties_size(ce
));//emalloc(sizeof(bbcode_object));
175 //memset(obj, 0, sizeof(bbcode_object));
177 zend_object_std_init(&obj
->std
, ce TSRMLS_CC
);
178 object_properties_init(&obj
->std
, ce TSRMLS_CC
);
182 memcpy(&obj
->bbcode_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
183 obj
->bbcode_handlers
.offset
= XtOffsetOf(bbcode_object
, std
);
184 obj
->bbcode_handlers
.dtor_obj
= (zend_object_dtor_obj_t
) bbcode_destroy
;
185 obj
->bbcode_handlers
.free_obj
= (zend_object_free_obj_t
) bbcode_free
;
186 obj
->bbcode_handlers
.clone_obj
= (zend_object_clone_obj_t
) bbcode_clone
;
187 //bbcode_handlers.offset = XtOffsetOf(bbcode_object, std);
188 //bbcode_handlers.dtor_obj = (zend_object_dtor_obj_t) bbcode_destroy;
189 //bbcode_handlers.free_obj = (zend_object_free_obj_t) bbcode_free;
190 //bbcode_handlers.clone_obj = (zend_object_clone_obj_t) bbcode_clone;
193 /*retval.handle = zend_object_store_put(
195 (zend_objects_store_dtor_t) zend_objects_destroy_object,
196 (zend_objects_free_object_storage_t) bbcode_free,
199 retval.handlers = &bbcode_handlers;
203 obj
->std
.handlers
= &(obj
->bbcode_handlers
);
208 static inline bbcode_object
* bbcode_fetch(zend_object
*obj
) {
209 return (bbcode_object
*)((char *)obj
- XtOffsetOf(bbcode_object
, std
));
212 /* {{{ PHP_METHOD(BBCode::__construct) {
214 ZEND_BEGIN_ARG_INFO_EX(bbcode_construct_arginfo
, 0, 0, 1)
215 ZEND_ARG_ARRAY_INFO(0, tag
, 1)
216 ZEND_ARG_ARRAY_INFO(0, smiley
, 1)
217 ZEND_ARG_INFO(0, flag
)
221 PHP_METHOD(BBCode
, __construct
) {
224 zend_long flag
= BBCODE_DEFAULT_FLAG
;
226 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "a|al", &tag
, &smiley
, &flag
) == FAILURE
) {
230 bbcode_object
*obj
= bbcode_fetch(Z_OBJ_P(getThis()));
234 obj
->flag
= (zend_long
) flag
;
237 //obj = zend_object_store_get_object(getThis() TSRMLS_CC);
244 /* {{{ PHP_METHOD(BBCode, __destruct) {
246 PHP_METHOD(BBCode
, __destruct
) {
250 /* {{{ PHP_METHOD(BBCode, __toString) {
252 PHP_METHOD(BBCode
, __toString
) {
257 /* {{{ bbcode_methods[]
259 * Every BBCode visible function must have an entry in bbcode_methods[].
261 const zend_function_entry bbcode_methods
[] = {
262 PHP_ME(BBCode
, __construct
, bbcode_construct_arginfo
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
263 PHP_ME(BBCode
, __destruct
, NULL
, ZEND_ACC_PUBLIC
|ZEND_ACC_DTOR
)
264 PHP_ME(BBCode
, __toString
, NULL
, ZEND_ACC_PUBLIC
)
269 /* {{{ PHP_MINIT_FUNCTION
271 PHP_MINIT_FUNCTION(bbcode
)
273 /* If you have INI entries, uncomment these lines
274 REGISTER_INI_ENTRIES();
277 /* Tmp zend class entry*/
278 zend_class_entry tmp_ce
;
280 /* Init BBCode class entry */
281 INIT_CLASS_ENTRY(tmp_ce
, "BBCode", bbcode_methods
);
283 /* Register BBCode class entry */
284 bbcode_ce
= zend_register_internal_class(&tmp_ce TSRMLS_CC
);
285 bbcode_ce
->create_object
= bbcode_create
;
288 BBCODE_DEF(BBCODE_GEN_CONST
)
290 /* Init BBCodeException class entry */
291 INIT_CLASS_ENTRY(tmp_ce
, "BBCodeException", NULL
);
293 /* Register BBCodeException class entry */
294 bbcode_exception_ce
= zend_register_internal_class_ex(&tmp_ce
, zend_exception_get_default(TSRMLS_C
) TSRMLS_CC
);
300 /* {{{ PHP_MSHUTDOWN_FUNCTION
302 PHP_MSHUTDOWN_FUNCTION(bbcode
)
304 /* uncomment this line if you have INI entries
305 UNREGISTER_INI_ENTRIES();
311 /* {{{ PHP_MINFO_FUNCTION
313 PHP_MINFO_FUNCTION(bbcode
)
315 php_info_print_table_start();
316 php_info_print_table_header(2, PHP_BBCODE_NAME
" support", "enabled");
317 php_info_print_table_row(2, "Extension version", PHP_BBCODE_VERSION
);
318 php_info_print_table_end();
320 /* Remove comments if you have entries in php.ini
321 DISPLAY_INI_ENTRIES();
326 /* {{{ bbcode_module_entry
328 zend_module_entry bbcode_module_entry
= {
329 STANDARD_MODULE_HEADER
,
331 NULL
, /*bbcode_functions,*/
333 PHP_MSHUTDOWN(bbcode
),
338 STANDARD_MODULE_PROPERTIES
342 #ifdef COMPILE_DL_BBCODE
344 ZEND_TSRMLS_CACHE_DEFINE()
346 ZEND_GET_MODULE(bbcode
)
354 * vim600: noet sw=4 ts=4 fdm=marker
355 * vim<600: noet sw=4 ts=4