mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Factor out reading an attribute value
This commit is contained in:
parent
4829b8f2cb
commit
5c69b2e86f
3 changed files with 38 additions and 17 deletions
|
@ -199,4 +199,34 @@ PHP_METHOD(DOMAttr, isId)
|
||||||
}
|
}
|
||||||
/* }}} end dom_attr_is_id */
|
/* }}} end dom_attr_is_id */
|
||||||
|
|
||||||
|
xmlChar *dom_attr_value(const xmlAttr *attr, bool *free)
|
||||||
|
{
|
||||||
|
/* For attributes we can have an optimized fast-path.
|
||||||
|
* This fast-path is only possible in the (common) case where the attribute
|
||||||
|
* has a single text child. Note that if the child or the content is NULL, this
|
||||||
|
* is equivalent to not having content (i.e. the attribute has the empty string as value). */
|
||||||
|
|
||||||
|
*free = false;
|
||||||
|
|
||||||
|
if (attr->children == NULL) {
|
||||||
|
return BAD_CAST "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attr->children->type == XML_TEXT_NODE && attr->children->next == NULL) {
|
||||||
|
if (attr->children->content == NULL) {
|
||||||
|
return BAD_CAST "";
|
||||||
|
} else {
|
||||||
|
return attr->children->content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlChar *value = xmlNodeGetContent((const xmlNode *) attr);
|
||||||
|
if (UNEXPECTED(value == NULL)) {
|
||||||
|
return BAD_CAST "";
|
||||||
|
}
|
||||||
|
|
||||||
|
*free = true;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2273,24 +2273,13 @@ void php_dom_get_content_into_zval(const xmlNode *nodep, zval *return_value, boo
|
||||||
}
|
}
|
||||||
|
|
||||||
case XML_ATTRIBUTE_NODE: {
|
case XML_ATTRIBUTE_NODE: {
|
||||||
/* For attributes we can also have an optimized fast-path.
|
bool free;
|
||||||
* This fast-path is only possible in the (common) case where the attribute
|
xmlChar *value = dom_attr_value((const xmlAttr *) nodep, &free);
|
||||||
* has a single text child. Note that if the child or the content is NULL, this
|
RETURN_STRING_FAST((const char *) value);
|
||||||
* is equivalent to not having content (i.e. the attribute has the empty string as value). */
|
if (free) {
|
||||||
|
xmlFree(value);
|
||||||
if (nodep->children == NULL) {
|
|
||||||
RETURN_EMPTY_STRING();
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
if (nodep->children->type == XML_TEXT_NODE && nodep->children->next == NULL) {
|
|
||||||
if (nodep->children->content == NULL) {
|
|
||||||
RETURN_EMPTY_STRING();
|
|
||||||
} else {
|
|
||||||
RETURN_STRING((const char *) nodep->children->content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ZEND_FALLTHROUGH;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
|
|
|
@ -174,6 +174,8 @@ void dom_document_convert_to_modern(php_libxml_ref_obj *document, xmlDocPtr lxml
|
||||||
dom_object *php_dom_instantiate_object_helper(zval *return_value, zend_class_entry *ce, xmlNodePtr obj, dom_object *parent);
|
dom_object *php_dom_instantiate_object_helper(zval *return_value, zend_class_entry *ce, xmlNodePtr obj, dom_object *parent);
|
||||||
xmlDocPtr php_dom_create_html_doc(void);
|
xmlDocPtr php_dom_create_html_doc(void);
|
||||||
|
|
||||||
|
xmlChar *dom_attr_value(const xmlAttr *attr, bool *free);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
DOM_LOAD_STRING = 0,
|
DOM_LOAD_STRING = 0,
|
||||||
DOM_LOAD_FILE = 1,
|
DOM_LOAD_FILE = 1,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue