namednodemap.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  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. #ifdef HAVE_CONFIG_H
  20. #include "config.h"
  21. #endif
  22. #include "php.h"
  23. #if HAVE_LIBXML && HAVE_DOM
  24. #include "php_dom.h"
  25. /* {{{ arginfo */
  26. ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_get_named_item, 0, 0, 1)
  27. ZEND_ARG_INFO(0, name)
  28. ZEND_END_ARG_INFO();
  29. ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_set_named_item, 0, 0, 1)
  30. ZEND_ARG_OBJ_INFO(0, arg, DOMNode, 0)
  31. ZEND_END_ARG_INFO();
  32. ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_remove_named_item, 0, 0, 0)
  33. ZEND_ARG_INFO(0, name)
  34. ZEND_END_ARG_INFO();
  35. ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_item, 0, 0, 0)
  36. ZEND_ARG_INFO(0, index)
  37. ZEND_END_ARG_INFO();
  38. ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_get_named_item_ns, 0, 0, 0)
  39. ZEND_ARG_INFO(0, namespaceURI)
  40. ZEND_ARG_INFO(0, localName)
  41. ZEND_END_ARG_INFO();
  42. ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_set_named_item_ns, 0, 0, 0)
  43. ZEND_ARG_OBJ_INFO(0, arg, DOMNode, 0)
  44. ZEND_END_ARG_INFO();
  45. ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_remove_named_item_ns, 0, 0, 0)
  46. ZEND_ARG_INFO(0, namespaceURI)
  47. ZEND_ARG_INFO(0, localName)
  48. ZEND_END_ARG_INFO();
  49. ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_namednodemap_count, 0, 0, 0)
  50. ZEND_END_ARG_INFO();
  51. /* }}} */
  52. /*
  53. * class DOMNamedNodeMap
  54. *
  55. * URL: https://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1780488922
  56. * Since:
  57. */
  58. const zend_function_entry php_dom_namednodemap_class_functions[] = { /* {{{ */
  59. PHP_FALIAS(getNamedItem, dom_namednodemap_get_named_item, arginfo_dom_namednodemap_get_named_item)
  60. PHP_FALIAS(setNamedItem, dom_namednodemap_set_named_item, arginfo_dom_namednodemap_set_named_item)
  61. PHP_FALIAS(removeNamedItem, dom_namednodemap_remove_named_item, arginfo_dom_namednodemap_remove_named_item)
  62. PHP_FALIAS(item, dom_namednodemap_item, arginfo_dom_namednodemap_item)
  63. PHP_FALIAS(getNamedItemNS, dom_namednodemap_get_named_item_ns, arginfo_dom_namednodemap_get_named_item_ns)
  64. PHP_FALIAS(setNamedItemNS, dom_namednodemap_set_named_item_ns, arginfo_dom_namednodemap_set_named_item_ns)
  65. PHP_FALIAS(removeNamedItemNS, dom_namednodemap_remove_named_item_ns, arginfo_dom_namednodemap_remove_named_item_ns)
  66. PHP_FALIAS(count, dom_namednodemap_count, arginfo_dom_namednodemap_count)
  67. PHP_FE_END
  68. };
  69. /* }}} */
  70. /* {{{ length int
  71. readonly=yes
  72. URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D0FB19E
  73. Since:
  74. */
  75. int dom_namednodemap_length_read(dom_object *obj, zval *retval)
  76. {
  77. dom_nnodemap_object *objmap;
  78. xmlAttrPtr curnode;
  79. xmlNodePtr nodep;
  80. int count = 0;
  81. objmap = (dom_nnodemap_object *)obj->ptr;
  82. if (objmap != NULL) {
  83. if ((objmap->nodetype == XML_NOTATION_NODE) ||
  84. objmap->nodetype == XML_ENTITY_NODE) {
  85. if (objmap->ht) {
  86. count = xmlHashSize(objmap->ht);
  87. }
  88. } else {
  89. nodep = dom_object_get_node(objmap->baseobj);
  90. if (nodep) {
  91. curnode = nodep->properties;
  92. if (curnode) {
  93. count++;
  94. while (curnode->next != NULL) {
  95. count++;
  96. curnode = curnode->next;
  97. }
  98. }
  99. }
  100. }
  101. }
  102. ZVAL_LONG(retval, count);
  103. return SUCCESS;
  104. }
  105. /* }}} */
  106. /* {{{ proto DOMNode dom_namednodemap_get_named_item(string name);
  107. URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1074577549
  108. Since:
  109. */
  110. PHP_FUNCTION(dom_namednodemap_get_named_item)
  111. {
  112. zval *id;
  113. int ret;
  114. size_t namedlen=0;
  115. dom_object *intern;
  116. xmlNodePtr itemnode = NULL;
  117. char *named;
  118. dom_nnodemap_object *objmap;
  119. xmlNodePtr nodep;
  120. xmlNotation *notep = NULL;
  121. if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &id, dom_namednodemap_class_entry, &named, &namedlen) == FAILURE) {
  122. return;
  123. }
  124. intern = Z_DOMOBJ_P(id);
  125. objmap = (dom_nnodemap_object *)intern->ptr;
  126. if (objmap != NULL) {
  127. if ((objmap->nodetype == XML_NOTATION_NODE) ||
  128. objmap->nodetype == XML_ENTITY_NODE) {
  129. if (objmap->ht) {
  130. if (objmap->nodetype == XML_ENTITY_NODE) {
  131. itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, (xmlChar *) named);
  132. } else {
  133. notep = (xmlNotation *)xmlHashLookup(objmap->ht, (xmlChar *) named);
  134. if (notep) {
  135. itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID);
  136. }
  137. }
  138. }
  139. } else {
  140. nodep = dom_object_get_node(objmap->baseobj);
  141. if (nodep) {
  142. itemnode = (xmlNodePtr)xmlHasProp(nodep, (xmlChar *) named);
  143. }
  144. }
  145. }
  146. if (itemnode) {
  147. DOM_RET_OBJ(itemnode, &ret, objmap->baseobj);
  148. return;
  149. } else {
  150. RETVAL_NULL();
  151. }
  152. }
  153. /* }}} end dom_namednodemap_get_named_item */
  154. /* {{{ proto DOMNode dom_namednodemap_set_named_item(DOMNode arg);
  155. URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1025163788
  156. Since:
  157. */
  158. PHP_FUNCTION(dom_namednodemap_set_named_item)
  159. {
  160. DOM_NOT_IMPLEMENTED();
  161. }
  162. /* }}} end dom_namednodemap_set_named_item */
  163. /* {{{ proto DOMNode dom_namednodemap_remove_named_item(string name);
  164. URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D58B193
  165. Since:
  166. */
  167. PHP_FUNCTION(dom_namednodemap_remove_named_item)
  168. {
  169. DOM_NOT_IMPLEMENTED();
  170. }
  171. /* }}} end dom_namednodemap_remove_named_item */
  172. /* {{{ proto DOMNode dom_namednodemap_item(int index);
  173. URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-349467F9
  174. Since:
  175. */
  176. PHP_FUNCTION(dom_namednodemap_item)
  177. {
  178. zval *id;
  179. zend_long index;
  180. int ret;
  181. dom_object *intern;
  182. xmlNodePtr itemnode = NULL;
  183. dom_nnodemap_object *objmap;
  184. xmlNodePtr nodep, curnode;
  185. int count;
  186. if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ol", &id, dom_namednodemap_class_entry, &index) == FAILURE) {
  187. return;
  188. }
  189. if (index >= 0) {
  190. if (ZEND_LONG_INT_OVFL(index)) {
  191. php_error_docref(NULL, E_WARNING, "Invalid index");
  192. RETURN_NULL();
  193. }
  194. intern = Z_DOMOBJ_P(id);
  195. objmap = (dom_nnodemap_object *)intern->ptr;
  196. if (objmap != NULL) {
  197. if ((objmap->nodetype == XML_NOTATION_NODE) ||
  198. objmap->nodetype == XML_ENTITY_NODE) {
  199. if (objmap->ht) {
  200. if (objmap->nodetype == XML_ENTITY_NODE) {
  201. itemnode = php_dom_libxml_hash_iter(objmap->ht, index);
  202. } else {
  203. itemnode = php_dom_libxml_notation_iter(objmap->ht, index);
  204. }
  205. }
  206. } else {
  207. nodep = dom_object_get_node(objmap->baseobj);
  208. if (nodep) {
  209. curnode = (xmlNodePtr)nodep->properties;
  210. count = 0;
  211. while (count < index && curnode != NULL) {
  212. count++;
  213. curnode = (xmlNodePtr)curnode->next;
  214. }
  215. itemnode = curnode;
  216. }
  217. }
  218. }
  219. if (itemnode) {
  220. DOM_RET_OBJ(itemnode, &ret, objmap->baseobj);
  221. return;
  222. }
  223. }
  224. RETVAL_NULL();
  225. }
  226. /* }}} end dom_namednodemap_item */
  227. /* {{{ proto DOMNode dom_namednodemap_get_named_item_ns(string namespaceURI, string localName);
  228. URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getNamedItemNS
  229. Since: DOM Level 2
  230. */
  231. PHP_FUNCTION(dom_namednodemap_get_named_item_ns)
  232. {
  233. zval *id;
  234. int ret;
  235. size_t namedlen=0, urilen=0;
  236. dom_object *intern;
  237. xmlNodePtr itemnode = NULL;
  238. char *uri, *named;
  239. dom_nnodemap_object *objmap;
  240. xmlNodePtr nodep;
  241. xmlNotation *notep = NULL;
  242. if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os!s", &id, dom_namednodemap_class_entry, &uri, &urilen, &named, &namedlen) == FAILURE) {
  243. return;
  244. }
  245. intern = Z_DOMOBJ_P(id);
  246. objmap = (dom_nnodemap_object *)intern->ptr;
  247. if (objmap != NULL) {
  248. if ((objmap->nodetype == XML_NOTATION_NODE) ||
  249. objmap->nodetype == XML_ENTITY_NODE) {
  250. if (objmap->ht) {
  251. if (objmap->nodetype == XML_ENTITY_NODE) {
  252. itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, (xmlChar *) named);
  253. } else {
  254. notep = (xmlNotation *)xmlHashLookup(objmap->ht, (xmlChar *) named);
  255. if (notep) {
  256. itemnode = create_notation(notep->name, notep->PublicID, notep->SystemID);
  257. }
  258. }
  259. }
  260. } else {
  261. nodep = dom_object_get_node(objmap->baseobj);
  262. if (nodep) {
  263. itemnode = (xmlNodePtr)xmlHasNsProp(nodep, (xmlChar *) named, (xmlChar *) uri);
  264. }
  265. }
  266. }
  267. if (itemnode) {
  268. DOM_RET_OBJ(itemnode, &ret, objmap->baseobj);
  269. return;
  270. } else {
  271. RETVAL_NULL();
  272. }
  273. }
  274. /* }}} end dom_namednodemap_get_named_item_ns */
  275. /* {{{ proto DOMNode dom_namednodemap_set_named_item_ns(DOMNode arg);
  276. URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-setNamedItemNS
  277. Since: DOM Level 2
  278. */
  279. PHP_FUNCTION(dom_namednodemap_set_named_item_ns)
  280. {
  281. DOM_NOT_IMPLEMENTED();
  282. }
  283. /* }}} end dom_namednodemap_set_named_item_ns */
  284. /* {{{ proto DOMNode dom_namednodemap_remove_named_item_ns(string namespaceURI, string localName);
  285. URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-removeNamedItemNS
  286. Since: DOM Level 2
  287. */
  288. PHP_FUNCTION(dom_namednodemap_remove_named_item_ns)
  289. {
  290. DOM_NOT_IMPLEMENTED();
  291. }
  292. /* }}} end dom_namednodemap_remove_named_item_ns */
  293. /* {{{ proto int|bool dom_namednodemap_count();
  294. */
  295. PHP_FUNCTION(dom_namednodemap_count)
  296. {
  297. zval *id;
  298. dom_object *intern;
  299. if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &id, dom_namednodemap_class_entry) == FAILURE) {
  300. return;
  301. }
  302. intern = Z_DOMOBJ_P(id);
  303. if(dom_namednodemap_length_read(intern, return_value) == FAILURE) {
  304. RETURN_FALSE;
  305. }
  306. }
  307. /* }}} end dom_namednodemap_count */
  308. #endif
  309. /*
  310. * Local variables:
  311. * tab-width: 4
  312. * c-basic-offset: 4
  313. * End:
  314. * vim600: noet sw=4 ts=4 fdm=marker
  315. * vim<600: noet sw=4 ts=4
  316. */