1 /*
2  * macros for compatibility
3  */
4 #ifndef PHP_MECAB_COMPAT_H
5 #define PHP_MECAB_COMPAT_H
6 
7 #define PHP_MECAB_FETCH_OBJECT(ptr, type, zv) ptr = (type)zend_object_store_get_object((zv) TSRMLS_CC)
8 
9 #define PHP_MECAB_INTERNAL_RSRC_FROM_PARAMETER() { \
10 	if (object) { \
11 		zmecab = object; \
12 		if (ZEND_NUM_ARGS() != 0) { \
13 			WRONG_PARAM_COUNT; \
14 		} else { \
15 			php_mecab_object *intern; \
16 			PHP_MECAB_FETCH_OBJECT(intern, php_mecab_object *, object); \
17 			xmecab = intern->ptr; \
18 		} \
19 	} else { \
20 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zmecab) == FAILURE) { \
21 			return; \
22 		} \
23 		ZEND_FETCH_RESOURCE(xmecab, php_mecab *, &zmecab, -1, "mecab", le_mecab); \
24 	} \
25 }
26 
27 #define PHP_MECAB_RSRC_FROM_PARAMETER() \
28 	PHP_MECAB_INTERNAL_RSRC_FROM_PARAMETER() \
29 	mecab = xmecab->ptr; \
30 
31 #define PHP_MECAB_INTERNAL_RSRC_FROM_PARAMETER2(name) { \
32 	if (object) { \
33 		z##name = object; \
34 		if (ZEND_NUM_ARGS() != 0) { \
35 			WRONG_PARAM_COUNT; \
36 		} else { \
37 			php_mecab_##name##_object *intern; \
38 			PHP_MECAB_FETCH_OBJECT(intern, php_mecab_##name##_object *, object); \
39 			x##name = intern->ptr; \
40 		} \
41 	} else { \
42 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z##name) == FAILURE) { \
43 			return; \
44 		} \
45 		ZEND_FETCH_RESOURCE(x##name, php_mecab_##name *, &z##name, -1, "mecab_" #name, le_mecab_##name); \
46 	} \
47 }
48 
49 #define PHP_MECAB_RSRC_FROM_PARAMETER2(name) \
50 	PHP_MECAB_INTERNAL_RSRC_FROM_PARAMETER2(name) \
51 	name = x##name->ptr;
52 
53 #define PHP_MECAB_PARSE_PARAMETERS(fmt, ...) { \
54 	if (object) { \
55 		zmecab = object; \
56 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, fmt, __VA_ARGS__) == FAILURE) { \
57 			return; \
58 		} else { \
59 			php_mecab_object *intern; \
60 			PHP_MECAB_FETCH_OBJECT(intern, php_mecab_object *, object); \
61 			xmecab = intern->ptr; \
62 		} \
63 	} else { \
64 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r" fmt, &zmecab, __VA_ARGS__) == FAILURE) { \
65 			return; \
66 		} \
67 		ZEND_FETCH_RESOURCE(xmecab, php_mecab *, &zmecab, -1, "mecab", le_mecab); \
68 	} \
69 	mecab = xmecab->ptr; \
70 }
71 
72 #define PHP_MECAB_PARSE_PARAMETERS2(name, fmt, ...) { \
73 	if (object) { \
74 		z##name = object; \
75 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, fmt, __VA_ARGS__) == FAILURE) { \
76 			return; \
77 		} else { \
78 			php_mecab_##name##_object *intern; \
79 			PHP_MECAB_FETCH_OBJECT(intern, php_mecab_##name##_object *, object); \
80 			x##name = intern->ptr; \
81 		} \
82 	} else { \
83 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r" fmt, &z##name, __VA_ARGS__) == FAILURE) { \
84 			return; \
85 		} \
86 		ZEND_FETCH_RESOURCE(x##name, php_mecab_##name *, &z##name, -1, "mecab_" #name, le_mecab_##name); \
87 	} \
88 	name = x##name->ptr; \
89 }
90 
91 #define PHP_MECAB_RETURN_PROPERTY(name, type, ...) { \
92 	zval *object = getThis(); \
93 	php_mecab_##name *x##name = NULL; \
94 	const mecab_##name##_t *name = NULL; \
95 	if (object) { \
96 		if (ZEND_NUM_ARGS() != 0) { \
97 			WRONG_PARAM_COUNT; \
98 		} else { \
99 			php_mecab_##name##_object *intern; \
100 			intern = (php_mecab_##name##_object *)zend_object_store_get_object(object TSRMLS_CC); \
101 			x##name = intern->ptr; \
102 		} \
103 	} else { \
104 		zval *z##name = NULL; \
105 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z##name) == FAILURE) { \
106 			return; \
107 		} \
108 		ZEND_FETCH_RESOURCE(x##name, php_mecab_##name*, &z##name, -1, "mecab_" #name, le_mecab_##name); \
109 	} \
110 	name = x##name->ptr; \
111 	RETURN_##type(__VA_ARGS__); \
112 }
113 
114 #define PHP_MECAB_FROM_PARAMETER()	PHP_MECAB_RSRC_FROM_PARAMETER()
115 #define PHP_MECAB_NODE_FROM_PARAMETER()	PHP_MECAB_RSRC_FROM_PARAMETER2(node)
116 #define PHP_MECAB_PATH_FROM_PARAMETER()	PHP_MECAB_RSRC_FROM_PARAMETER2(path)
117 
118 #define PHP_MECAB_INTERNAL_FROM_PARAMETER()	PHP_MECAB_INTERNAL_RSRC_FROM_PARAMETER()
119 #define PHP_MECAB_NODE_INTERNAL_FROM_PARAMETER()	PHP_MECAB_INTERNAL_RSRC_FROM_PARAMETER2(node)
120 #define PHP_MECAB_PATH_INTERNAL_FROM_PARAMETER()	PHP_MECAB_INTERNAL_RSRC_FROM_PARAMETER2(path)
121 
122 #define PHP_MECAB_NODE_PARSE_PARAMETERS(fmt, ...)	PHP_MECAB_PARSE_PARAMETERS2(node, fmt, __VA_ARGS__)
123 #define PHP_MECAB_PATH_PARSE_PARAMETERS(fmt, ...)	PHP_MECAB_PARSE_PARAMETERS2(path, fmt, __VA_ARGS__)
124 
125 #define PHP_MECAB_NODE_RETURN_PROPERTY(type, ...) PHP_MECAB_RETURN_PROPERTY(node, type, __VA_ARGS__)
126 #define PHP_MECAB_PATH_RETURN_PROPERTY(type, ...) PHP_MECAB_RETURN_PROPERTY(path, type, __VA_ARGS__)
127 
128 #define PHP_MECAB_REGISTER_CONSTANT(name) \
129 	REGISTER_LONG_CONSTANT(#name, name, CONST_PERSISTENT | CONST_CS)
130 
131 #define PHP_MECAB_REGISTER_NS_CONSTANT(name) \
132 	REGISTER_NS_LONG_CONSTANT("MeCab", #name, MECAB_##name, CONST_PERSISTENT | CONST_CS)
133 
134 #if PHP_API_VERSION < 20100412
135 static inline void
object_properties_init(zend_object * object,zend_class_entry * class_type)136 object_properties_init(zend_object *object, zend_class_entry *class_type)
137 {
138 	zval *tmp = NULL;
139 	zend_hash_copy(object->properties, &class_type->default_properties,
140 	               (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *));
141 }
142 #endif
143 
144 #endif /* PHP_MECAB_COMPAT_H */
145