1 /*
2 +----------------------------------------------------------------------+
3 | PHP Version 7 |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 1997-2018 The PHP Group |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
15 | Authors: Christian Stocker <chregu@php.net> |
16 | Rob Richards <rrichards@php.net> |
17 +----------------------------------------------------------------------+
18 */
19
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include "php.h"
25 #if HAVE_LIBXML && HAVE_DOM
26 #include "php_dom.h"
27
28 /* {{{ arginfo */
29 ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_get_named_item, 0, 0, 1)
30 ZEND_ARG_INFO(0, name)
31 ZEND_END_ARG_INFO();
32
33 ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_set_named_item, 0, 0, 1)
34 ZEND_ARG_OBJ_INFO(0, arg, DOMNode, 0)
35 ZEND_END_ARG_INFO();
36
37 ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_remove_named_item, 0, 0, 0)
38 ZEND_ARG_INFO(0, name)
39 ZEND_END_ARG_INFO();
40
41 ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_item, 0, 0, 0)
42 ZEND_ARG_INFO(0, index)
43 ZEND_END_ARG_INFO();
44
45 ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_get_named_item_ns, 0, 0, 0)
46 ZEND_ARG_INFO(0, namespaceURI)
47 ZEND_ARG_INFO(0, localName)
48 ZEND_END_ARG_INFO();
49
50 ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_set_named_item_ns, 0, 0, 0)
51 ZEND_ARG_OBJ_INFO(0, arg, DOMNode, 0)
52 ZEND_END_ARG_INFO();
53
54 ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_remove_named_item_ns, 0, 0, 0)
55 ZEND_ARG_INFO(0, namespaceURI)
56 ZEND_ARG_INFO(0, localName)
57 ZEND_END_ARG_INFO();
58
59 ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_count, 0, 0, 0)
60 ZEND_END_ARG_INFO();
61 /* }}} */
62
63 /*
64 * class DOMNamedNodeMap
65 *
66 * URL: https://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1780488922
67 * Since:
68 */
69
70 const zend_function_entry php_dom_namednodemap_class_functions[] = { /* {{{ */
71 PHP_FALIAS(getNamedItem, dom_namednodemap_get_named_item, arginfo_dom_namednodemap_get_named_item)
72 PHP_FALIAS(setNamedItem, dom_namednodemap_set_named_item, arginfo_dom_namednodemap_set_named_item)
73 PHP_FALIAS(removeNamedItem, dom_namednodemap_remove_named_item, arginfo_dom_namednodemap_remove_named_item)
74 PHP_FALIAS(item, dom_namednodemap_item, arginfo_dom_namednodemap_item)
75 PHP_FALIAS(getNamedItemNS, dom_namednodemap_get_named_item_ns, arginfo_dom_namednodemap_get_named_item_ns)
76 PHP_FALIAS(setNamedItemNS, dom_namednodemap_set_named_item_ns, arginfo_dom_namednodemap_set_named_item_ns)
77 PHP_FALIAS(removeNamedItemNS, dom_namednodemap_remove_named_item_ns, arginfo_dom_namednodemap_remove_named_item_ns)
78 PHP_FALIAS(count, dom_namednodemap_count, arginfo_dom_namednodemap_count)
79 PHP_FE_END
80 };
81 /* }}} */
82
83 /* {{{ length int
84 readonly=yes
85 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D0FB19E
86 Since:
87 */
dom_namednodemap_length_read(dom_object * obj,zval * retval)88 int dom_namednodemap_length_read(dom_object *obj, zval *retval)
89 {
90 dom_nnodemap_object *objmap;
91 xmlAttrPtr curnode;
92 xmlNodePtr nodep;
93 int count = 0;
94
95 objmap = (dom_nnodemap_object *)obj->ptr;
96
97 if (objmap != NULL) {
98 if ((objmap->nodetype == XML_NOTATION_NODE) ||
99 objmap->nodetype == XML_ENTITY_NODE) {
100 if (objmap->ht) {
101 count = xmlHashSize(objmap->ht);
102 }
103 } else {
104 nodep = dom_object_get_node(objmap->baseobj);
105 if (nodep) {
106 curnode = nodep->properties;
107 if (curnode) {
108 count++;
109 while (curnode->next != NULL) {
110 count++;
111 curnode = curnode->next;
112 }
113 }
114 }
115 }
116 }
117
118 ZVAL_LONG(retval, count);
119 return SUCCESS;
120 }
121
122 /* }}} */
123
124 /* {{{ proto DOMNode dom_namednodemap_get_named_item(string name);
125 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1074577549
126 Since:
127 */
PHP_FUNCTION(dom_namednodemap_get_named_item)128 PHP_FUNCTION(dom_namednodemap_get_named_item)
129 {
130 zval *id;
131 int ret;
132 size_t namedlen=0;
133 dom_object *intern;
134 xmlNodePtr itemnode = NULL;
135 char *named;
136
137 dom_nnodemap_object *objmap;
138 xmlNodePtr nodep;
139 xmlNotation *notep = NULL;
140
141 if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &id, dom_namednodemap_class_entry, &named, &namedlen) == FAILURE) {
142 return;
143 }
144
145 intern = Z_DOMOBJ_P(id);
146
147 objmap = (dom_nnodemap_object *)intern->ptr;
148
149 if (objmap != NULL) {
150 if ((objmap->nodetype == XML_NOTATION_NODE) ||
151 objmap->nodetype == XML_ENTITY_NODE) {
152 if (objmap->ht) {
153 if (objmap->nodetype == XML_ENTITY_NODE) {
154 itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, (xmlChar *) named);
155 } else {
156 notep = (xmlNotation *)xmlHashLookup(objmap->ht, (xmlChar *) named);
157 if (notep) {
158 itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID);
159 }
160 }
161 }
162 } else {
163 nodep = dom_object_get_node(objmap->baseobj);
164 if (nodep) {
165 itemnode = (xmlNodePtr)xmlHasProp(nodep, (xmlChar *) named);
166 }
167 }
168 }
169
170 if (itemnode) {
171 DOM_RET_OBJ(itemnode, &ret, objmap->baseobj);
172 return;
173 } else {
174 RETVAL_NULL();
175 }
176 }
177 /* }}} end dom_namednodemap_get_named_item */
178
179 /* {{{ proto DOMNode dom_namednodemap_set_named_item(DOMNode arg);
180 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1025163788
181 Since:
182 */
PHP_FUNCTION(dom_namednodemap_set_named_item)183 PHP_FUNCTION(dom_namednodemap_set_named_item)
184 {
185 DOM_NOT_IMPLEMENTED();
186 }
187 /* }}} end dom_namednodemap_set_named_item */
188
189 /* {{{ proto DOMNode dom_namednodemap_remove_named_item(string name);
190 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D58B193
191 Since:
192 */
PHP_FUNCTION(dom_namednodemap_remove_named_item)193 PHP_FUNCTION(dom_namednodemap_remove_named_item)
194 {
195 DOM_NOT_IMPLEMENTED();
196 }
197 /* }}} end dom_namednodemap_remove_named_item */
198
199 /* {{{ proto DOMNode dom_namednodemap_item(int index);
200 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-349467F9
201 Since:
202 */
PHP_FUNCTION(dom_namednodemap_item)203 PHP_FUNCTION(dom_namednodemap_item)
204 {
205 zval *id;
206 zend_long index;
207 int ret;
208 dom_object *intern;
209 xmlNodePtr itemnode = NULL;
210
211 dom_nnodemap_object *objmap;
212 xmlNodePtr nodep, curnode;
213 int count;
214
215 if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ol", &id, dom_namednodemap_class_entry, &index) == FAILURE) {
216 return;
217 }
218 if (index >= 0) {
219 if (ZEND_LONG_INT_OVFL(index)) {
220 php_error_docref(NULL, E_WARNING, "Invalid index");
221 RETURN_NULL();
222 }
223
224 intern = Z_DOMOBJ_P(id);
225
226 objmap = (dom_nnodemap_object *)intern->ptr;
227
228 if (objmap != NULL) {
229 if ((objmap->nodetype == XML_NOTATION_NODE) ||
230 objmap->nodetype == XML_ENTITY_NODE) {
231 if (objmap->ht) {
232 if (objmap->nodetype == XML_ENTITY_NODE) {
233 itemnode = php_dom_libxml_hash_iter(objmap->ht, index);
234 } else {
235 itemnode = php_dom_libxml_notation_iter(objmap->ht, index);
236 }
237 }
238 } else {
239 nodep = dom_object_get_node(objmap->baseobj);
240 if (nodep) {
241 curnode = (xmlNodePtr)nodep->properties;
242 count = 0;
243 while (count < index && curnode != NULL) {
244 count++;
245 curnode = (xmlNodePtr)curnode->next;
246 }
247 itemnode = curnode;
248 }
249 }
250 }
251
252 if (itemnode) {
253 DOM_RET_OBJ(itemnode, &ret, objmap->baseobj);
254 return;
255 }
256 }
257
258 RETVAL_NULL();
259 }
260 /* }}} end dom_namednodemap_item */
261
262 /* {{{ proto DOMNode dom_namednodemap_get_named_item_ns(string namespaceURI, string localName);
263 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getNamedItemNS
264 Since: DOM Level 2
265 */
PHP_FUNCTION(dom_namednodemap_get_named_item_ns)266 PHP_FUNCTION(dom_namednodemap_get_named_item_ns)
267 {
268 zval *id;
269 int ret;
270 size_t namedlen=0, urilen=0;
271 dom_object *intern;
272 xmlNodePtr itemnode = NULL;
273 char *uri, *named;
274
275 dom_nnodemap_object *objmap;
276 xmlNodePtr nodep;
277 xmlNotation *notep = NULL;
278
279 if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os!s", &id, dom_namednodemap_class_entry, &uri, &urilen, &named, &namedlen) == FAILURE) {
280 return;
281 }
282
283 intern = Z_DOMOBJ_P(id);
284
285 objmap = (dom_nnodemap_object *)intern->ptr;
286
287 if (objmap != NULL) {
288 if ((objmap->nodetype == XML_NOTATION_NODE) ||
289 objmap->nodetype == XML_ENTITY_NODE) {
290 if (objmap->ht) {
291 if (objmap->nodetype == XML_ENTITY_NODE) {
292 itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, (xmlChar *) named);
293 } else {
294 notep = (xmlNotation *)xmlHashLookup(objmap->ht, (xmlChar *) named);
295 if (notep) {
296 itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID);
297 }
298 }
299 }
300 } else {
301 nodep = dom_object_get_node(objmap->baseobj);
302 if (nodep) {
303 itemnode = (xmlNodePtr)xmlHasNsProp(nodep, (xmlChar *) named, (xmlChar *) uri);
304 }
305 }
306 }
307
308 if (itemnode) {
309 DOM_RET_OBJ(itemnode, &ret, objmap->baseobj);
310 return;
311 } else {
312 RETVAL_NULL();
313 }
314 }
315 /* }}} end dom_namednodemap_get_named_item_ns */
316
317 /* {{{ proto DOMNode dom_namednodemap_set_named_item_ns(DOMNode arg);
318 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-setNamedItemNS
319 Since: DOM Level 2
320 */
PHP_FUNCTION(dom_namednodemap_set_named_item_ns)321 PHP_FUNCTION(dom_namednodemap_set_named_item_ns)
322 {
323 DOM_NOT_IMPLEMENTED();
324 }
325 /* }}} end dom_namednodemap_set_named_item_ns */
326
327 /* {{{ proto DOMNode dom_namednodemap_remove_named_item_ns(string namespaceURI, string localName);
328 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-removeNamedItemNS
329 Since: DOM Level 2
330 */
PHP_FUNCTION(dom_namednodemap_remove_named_item_ns)331 PHP_FUNCTION(dom_namednodemap_remove_named_item_ns)
332 {
333 DOM_NOT_IMPLEMENTED();
334 }
335 /* }}} end dom_namednodemap_remove_named_item_ns */
336
337 /* {{{ proto int|bool dom_namednodemap_count();
338 */
PHP_FUNCTION(dom_namednodemap_count)339 PHP_FUNCTION(dom_namednodemap_count)
340 {
341 zval *id;
342 dom_object *intern;
343
344 if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &id, dom_namednodemap_class_entry) == FAILURE) {
345 return;
346 }
347
348 intern = Z_DOMOBJ_P(id);
349 if(dom_namednodemap_length_read(intern, return_value) == FAILURE) {
350 RETURN_FALSE;
351 }
352 }
353 /* }}} end dom_namednodemap_count */
354
355 #endif
356
357 /*
358 * Local variables:
359 * tab-width: 4
360 * c-basic-offset: 4
361 * End:
362 * vim600: noet sw=4 ts=4 fdm=marker
363 * vim<600: noet sw=4 ts=4
364 */
365