1 /*
2    +----------------------------------------------------------------------+
3    | This source file is subject to version 3.01 of the PHP license,      |
4    | that is bundled with this package in the file LICENSE, and is        |
5    | available through the world-wide-web at the following url:           |
6    | http://www.php.net/license/3_01.txt                                  |
7    | If you did not receive a copy of the PHP license and are unable to   |
8    | obtain it through the world-wide-web, please send a note to          |
9    | license@php.net so we can mail you a copy immediately.               |
10    +----------------------------------------------------------------------+
11    | Authors: Mel Dafert (mel@dafert.at)                                  |
12    +----------------------------------------------------------------------+
13 */
14 
15 #ifdef HAVE_CONFIG_H
16 #include "config.h"
17 #endif
18 
19 #include "../intl_cppshims.h"
20 
21 #include <unicode/dtptngen.h>
22 
23 extern "C" {
24 #define USE_DATETIMEPATTERNGENERATOR_POINTER 1
25 #include "datepatterngenerator_class.h"
26 #include "datepatterngenerator_arginfo.h"
27 #include <zend_exceptions.h>
28 #include <assert.h>
29 }
30 
31 using icu::DateTimePatternGenerator;
32 using icu::Locale;
33 
34 zend_class_entry *IntlDatePatternGenerator_ce_ptr;
35 zend_object_handlers IntlDatePatternGenerator_handlers;
36 
IntlDatePatternGenerator_object_clone(zend_object * object)37 static zend_object *IntlDatePatternGenerator_object_clone(zend_object *object)
38 {
39 	intl_error_reset(NULL);
40 
41 	IntlDatePatternGenerator_object *dtpgo_orig = php_intl_datepatterngenerator_fetch_object(object);
42 	intl_error_reset(DTPATTERNGEN_ERROR_P(dtpgo_orig));
43 
44 	zend_object *ret_val = IntlDatePatternGenerator_ce_ptr->create_object(object->ce);
45 	IntlDatePatternGenerator_object *dtpgo_new  = php_intl_datepatterngenerator_fetch_object(ret_val);
46 
47 	zend_objects_clone_members(&dtpgo_new->zo, &dtpgo_orig->zo);
48 
49 	if (dtpgo_orig->dtpg != NULL) {
50 		DateTimePatternGenerator *newDtpg = dtpgo_orig->dtpg->clone();
51 		if (!newDtpg) {
52 			zend_string *err_msg;
53 			intl_errors_set_code(DTPATTERNGEN_ERROR_P(dtpgo_orig),
54 				U_MEMORY_ALLOCATION_ERROR);
55 			intl_errors_set_custom_msg(DTPATTERNGEN_ERROR_P(dtpgo_orig),
56 				"Could not clone IntlDatePatternGenerator", 0);
57 			err_msg = intl_error_get_message(DTPATTERNGEN_ERROR_P(dtpgo_orig));
58 			zend_throw_exception(NULL, ZSTR_VAL(err_msg), 0);
59 			zend_string_free(err_msg);
60 		} else {
61 			dtpgo_new->dtpg = newDtpg;
62 		}
63 	} else {
64 		zend_throw_exception(NULL, "Cannot clone unconstructed IntlDatePatternGenerator", 0);
65 	}
66 
67 	return ret_val;
68 }
69 
70 /*
71  * Initialize internals of IntlDatePatternGenerator_object not specific to zend standard objects.
72  */
IntlDatePatternGenerator_object_init(IntlDatePatternGenerator_object * co)73 static void IntlDatePatternGenerator_object_init(IntlDatePatternGenerator_object *co)
74 {
75 	intl_error_init(DTPATTERNGEN_ERROR_P(co));
76 	co->dtpg = NULL;
77 }
78 
IntlDatePatternGenerator_object_free(zend_object * object)79 static void IntlDatePatternGenerator_object_free(zend_object *object)
80 {
81 	IntlDatePatternGenerator_object* co = php_intl_datepatterngenerator_fetch_object(object);
82 
83 	if (co->dtpg) {
84 		delete co->dtpg;
85 		co->dtpg = NULL;
86 	}
87 	intl_error_reset(DTPATTERNGEN_ERROR_P(co));
88 
89 	zend_object_std_dtor(&co->zo);
90 }
91 
IntlDatePatternGenerator_object_create(zend_class_entry * ce)92 static zend_object *IntlDatePatternGenerator_object_create(zend_class_entry *ce)
93 {
94 	IntlDatePatternGenerator_object *intern =
95 		(IntlDatePatternGenerator_object*) zend_object_alloc(sizeof(IntlDatePatternGenerator_object), ce);
96 
97 	zend_object_std_init(&intern->zo, ce);
98 	object_properties_init(&intern->zo, ce);
99 	IntlDatePatternGenerator_object_init(intern);
100 
101 	return &intern->zo;
102 }
103 
104 /*
105  * 'IntlDatePatternGenerator' class registration structures & functions
106  */
107 
108 /*
109  * Initialize 'IntlDatePatternGenerator' class
110  */
dateformat_register_IntlDatePatternGenerator_class(void)111 void dateformat_register_IntlDatePatternGenerator_class( void )
112 {
113 	/* Create and register 'IntlDatePatternGenerator' class. */
114 	IntlDatePatternGenerator_ce_ptr = register_class_IntlDatePatternGenerator();
115 	IntlDatePatternGenerator_ce_ptr->create_object = IntlDatePatternGenerator_object_create;
116 	IntlDatePatternGenerator_ce_ptr->default_object_handlers = &IntlDatePatternGenerator_handlers;
117 
118 	memcpy(&IntlDatePatternGenerator_handlers, &std_object_handlers,
119 		sizeof IntlDatePatternGenerator_handlers);
120 	IntlDatePatternGenerator_handlers.offset = XtOffsetOf(IntlDatePatternGenerator_object, zo);
121 	IntlDatePatternGenerator_handlers.clone_obj = IntlDatePatternGenerator_object_clone;
122 	IntlDatePatternGenerator_handlers.free_obj = IntlDatePatternGenerator_object_free;
123 }
124