30
30
* Since:
31
31
*/
32
32
33
+ zend_string * dom_node_concatenated_name_helper (size_t name_len , const char * name , size_t prefix_len , const char * prefix )
34
+ {
35
+ if (UNEXPECTED (prefix_len > ZSTR_MAX_LEN / 2 - 1 || name_len > ZSTR_MAX_LEN / 2 - 1 )) {
36
+ return zend_empty_string ;
37
+ }
38
+ zend_string * str = zend_string_alloc (prefix_len + 1 + name_len , false);
39
+ memcpy (ZSTR_VAL (str ), prefix , prefix_len );
40
+ ZSTR_VAL (str )[prefix_len ] = ':' ;
41
+ memcpy (ZSTR_VAL (str ) + prefix_len + 1 , name , name_len + 1 /* include \0 */ );
42
+ return str ;
43
+ }
44
+
45
+ zend_string * dom_node_get_node_name_attribute_or_element (const xmlNode * nodep )
46
+ {
47
+ size_t name_len = strlen ((const char * ) nodep -> name );
48
+ if (nodep -> ns != NULL && nodep -> ns -> prefix != NULL ) {
49
+ return dom_node_concatenated_name_helper (name_len , (const char * ) nodep -> name , strlen ((const char * ) nodep -> ns -> prefix ), (const char * ) nodep -> ns -> prefix );
50
+ } else {
51
+ return zend_string_init ((const char * ) nodep -> name , name_len , false);
52
+ }
53
+ }
54
+
33
55
/* {{{ nodeName string
34
56
readonly=yes
35
57
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68D095
36
58
Since:
37
59
*/
38
60
int dom_node_node_name_read (dom_object * obj , zval * retval )
39
61
{
40
- xmlNode * nodep ;
41
- xmlNsPtr ns ;
42
- char * str = NULL ;
43
- xmlChar * qname = NULL ;
44
-
45
- nodep = dom_object_get_node (obj );
62
+ xmlNode * nodep = dom_object_get_node (obj );
46
63
47
64
if (nodep == NULL ) {
48
65
php_dom_throw_error (INVALID_STATE_ERR , 1 );
@@ -52,66 +69,49 @@ int dom_node_node_name_read(dom_object *obj, zval *retval)
52
69
switch (nodep -> type ) {
53
70
case XML_ATTRIBUTE_NODE :
54
71
case XML_ELEMENT_NODE :
55
- ns = nodep -> ns ;
56
- if (ns != NULL && ns -> prefix ) {
57
- qname = xmlStrdup (ns -> prefix );
58
- qname = xmlStrcat (qname , (xmlChar * ) ":" );
59
- qname = xmlStrcat (qname , nodep -> name );
60
- str = (char * ) qname ;
61
- } else {
62
- str = (char * ) nodep -> name ;
63
- }
72
+ ZVAL_STR (retval , dom_node_get_node_name_attribute_or_element (nodep ));
64
73
break ;
65
- case XML_NAMESPACE_DECL :
66
- ns = nodep -> ns ;
74
+ case XML_NAMESPACE_DECL : {
75
+ xmlNsPtr ns = nodep -> ns ;
67
76
if (ns != NULL && ns -> prefix ) {
68
- qname = xmlStrdup ((xmlChar * ) "xmlns" );
77
+ xmlChar * qname = xmlStrdup ((xmlChar * ) "xmlns" );
69
78
qname = xmlStrcat (qname , (xmlChar * ) ":" );
70
79
qname = xmlStrcat (qname , nodep -> name );
71
- str = (char * ) qname ;
80
+ ZVAL_STRING (retval , (const char * ) qname );
81
+ xmlFree (qname );
72
82
} else {
73
- str = ( char * ) nodep -> name ;
83
+ ZVAL_STRING ( retval , ( const char * ) nodep -> name ) ;
74
84
}
75
85
break ;
86
+ }
76
87
case XML_DOCUMENT_TYPE_NODE :
77
88
case XML_DTD_NODE :
78
89
case XML_PI_NODE :
79
90
case XML_ENTITY_DECL :
80
91
case XML_ENTITY_REF_NODE :
81
92
case XML_NOTATION_NODE :
82
- str = (char * ) nodep -> name ;
93
+ ZVAL_STRING ( retval , (char * ) nodep -> name ) ;
83
94
break ;
84
95
case XML_CDATA_SECTION_NODE :
85
- str = "#cdata-section" ;
96
+ ZVAL_STRING ( retval , "#cdata-section" ) ;
86
97
break ;
87
98
case XML_COMMENT_NODE :
88
- str = "#comment" ;
99
+ ZVAL_STRING ( retval , "#comment" ) ;
89
100
break ;
90
101
case XML_HTML_DOCUMENT_NODE :
91
102
case XML_DOCUMENT_NODE :
92
- str = "#document" ;
103
+ ZVAL_STRING ( retval , "#document" ) ;
93
104
break ;
94
105
case XML_DOCUMENT_FRAG_NODE :
95
- str = "#document-fragment" ;
106
+ ZVAL_STRING ( retval , "#document-fragment" ) ;
96
107
break ;
97
108
case XML_TEXT_NODE :
98
- str = "#text" ;
109
+ ZVAL_STRING ( retval , "#text" ) ;
99
110
break ;
100
111
EMPTY_SWITCH_DEFAULT_CASE ();
101
112
}
102
113
103
- if (str != NULL ) {
104
- ZVAL_STRING (retval , str );
105
- } else {
106
- ZVAL_EMPTY_STRING (retval );
107
- }
108
-
109
- if (qname != NULL ) {
110
- xmlFree (qname );
111
- }
112
-
113
114
return SUCCESS ;
114
-
115
115
}
116
116
117
117
/* }}} */
0 commit comments