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