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