xref: /PHP-5.6/ext/dom/processinginstruction.c (revision 49493a2d)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 5                                                        |
4    +----------------------------------------------------------------------+
5    | Copyright (c) 1997-2016 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 /* $Id$ */
21 
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25 
26 #include "php.h"
27 #if HAVE_LIBXML && HAVE_DOM
28 #include "php_dom.h"
29 
30 
31 /* {{{ arginfo */
32 ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_processinginstruction_construct, 0, 0, 1)
33 	ZEND_ARG_INFO(0, name)
34 	ZEND_ARG_INFO(0, value)
35 ZEND_END_ARG_INFO();
36 /* }}} */
37 
38 /*
39 * class DOMProcessingInstruction extends DOMNode
40 *
41 * URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-1004215813
42 * Since:
43 */
44 
45 const zend_function_entry php_dom_processinginstruction_class_functions[] = {
46 	PHP_ME(domprocessinginstruction, __construct, arginfo_dom_processinginstruction_construct, ZEND_ACC_PUBLIC)
47 	PHP_FE_END
48 };
49 
50 /* {{{ proto void DOMProcessingInstruction::__construct(string name, [string value]); */
PHP_METHOD(domprocessinginstruction,__construct)51 PHP_METHOD(domprocessinginstruction, __construct)
52 {
53 
54 	zval *id;
55 	xmlNodePtr nodep = NULL, oldnode = NULL;
56 	dom_object *intern;
57 	char *name, *value = NULL;
58 	int name_len, value_len, name_valid;
59 	zend_error_handling error_handling;
60 
61 	zend_replace_error_handling(EH_THROW, dom_domexception_class_entry, &error_handling TSRMLS_CC);
62 	if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s", &id, dom_processinginstruction_class_entry, &name, &name_len, &value, &value_len) == FAILURE) {
63 		zend_restore_error_handling(&error_handling TSRMLS_CC);
64 		return;
65 	}
66 
67 	zend_restore_error_handling(&error_handling TSRMLS_CC);
68 
69 	name_valid = xmlValidateName((xmlChar *) name, 0);
70 	if (name_valid != 0) {
71 		php_dom_throw_error(INVALID_CHARACTER_ERR, 1 TSRMLS_CC);
72 		RETURN_FALSE;
73 	}
74 
75 	nodep = xmlNewPI((xmlChar *) name, (xmlChar *) value);
76 
77 	if (!nodep) {
78 		php_dom_throw_error(INVALID_STATE_ERR, 1 TSRMLS_CC);
79 		RETURN_FALSE;
80 	}
81 
82 	intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
83 	if (intern != NULL) {
84 		oldnode = dom_object_get_node(intern);
85 		if (oldnode != NULL) {
86 			php_libxml_node_free_resource(oldnode  TSRMLS_CC);
87 		}
88 		php_libxml_increment_node_ptr((php_libxml_node_object *)intern, nodep, (void *)intern TSRMLS_CC);
89 	}
90 }
91 /* }}} end DOMProcessingInstruction::__construct */
92 
93 /* {{{ target	string
94 readonly=yes
95 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-1478689192
96 Since:
97 */
dom_processinginstruction_target_read(dom_object * obj,zval ** retval TSRMLS_DC)98 int dom_processinginstruction_target_read(dom_object *obj, zval **retval TSRMLS_DC)
99 {
100 	xmlNodePtr nodep;
101 
102 	nodep = dom_object_get_node(obj);
103 
104 	if (nodep == NULL) {
105 		php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
106 		return FAILURE;
107 	}
108 
109 	ALLOC_ZVAL(*retval);
110 	ZVAL_STRING(*retval, (char *) (nodep->name), 1);
111 
112 	return SUCCESS;
113 }
114 
115 /* }}} */
116 
117 /* {{{ data	string
118 readonly=no
119 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-837822393
120 Since:
121 */
dom_processinginstruction_data_read(dom_object * obj,zval ** retval TSRMLS_DC)122 int dom_processinginstruction_data_read(dom_object *obj, zval **retval TSRMLS_DC)
123 {
124 	xmlNodePtr nodep;
125 	xmlChar *content;
126 
127 	nodep = dom_object_get_node(obj);
128 
129 	if (nodep == NULL) {
130 		php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
131 		return FAILURE;
132 	}
133 
134 	ALLOC_ZVAL(*retval);
135 
136 
137 	if ((content = xmlNodeGetContent(nodep)) != NULL) {
138 		ZVAL_STRING(*retval, content, 1);
139 		xmlFree(content);
140 	} else {
141 		ZVAL_EMPTY_STRING(*retval);
142 	}
143 
144 	return SUCCESS;
145 }
146 
dom_processinginstruction_data_write(dom_object * obj,zval * newval TSRMLS_DC)147 int dom_processinginstruction_data_write(dom_object *obj, zval *newval TSRMLS_DC)
148 {
149 	zval value_copy;
150 	xmlNode *nodep;
151 
152 	nodep = dom_object_get_node(obj);
153 
154 	if (nodep == NULL) {
155 		php_dom_throw_error(INVALID_STATE_ERR, 0 TSRMLS_CC);
156 		return FAILURE;
157 	}
158 
159 	if (newval->type != IS_STRING) {
160 		if(Z_REFCOUNT_P(newval) > 1) {
161 			value_copy = *newval;
162 			zval_copy_ctor(&value_copy);
163 			newval = &value_copy;
164 		}
165 		convert_to_string(newval);
166 	}
167 
168 	xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
169 
170 	if (newval == &value_copy) {
171 		zval_dtor(newval);
172 	}
173 
174 	return SUCCESS;
175 }
176 
177 /* }}} */
178 
179 #endif
180 
181 /*
182  * Local variables:
183  * tab-width: 4
184  * c-basic-offset: 4
185  * End:
186  * vim600: noet sw=4 ts=4 fdm=marker
187  * vim<600: noet sw=4 ts=4
188  */
189