xref: /PHP-7.3/ext/dom/namednodemap.c (revision 8d3f8ca1)
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