Browse Source

fix attribute handling on the root node

simplify node access by defining/using GET_NODE() macro properly
migration/unlabaled-1.3.2
Sterling Hughes 23 years ago
parent
commit
a432df541f
  1. 49
      ext/simplexml/simplexml.c

49
ext/simplexml/simplexml.c

@ -76,6 +76,8 @@ _node_as_zval(php_sxe_object *sxe, xmlNodePtr node, zval *value)
add_next_index_zval(return_value, __v); \
}
#define GET_NODE(__s, __n) (__n) = (__s)->node ? (__s)->node : xmlDocGetRootElement((__s)->document)
/* {{{ sxe_property_read()
*/
static zval *
@ -106,13 +108,9 @@ sxe_property_read(zval *object, zval *member TSRMLS_DC)
return return_value;
}
if (sxe->node) {
node = sxe->node->xmlChildrenNode;
} else {
node = sxe->node = xmlDocGetRootElement(sxe->document)->xmlChildrenNode;
}
GET_NODE(sxe, node);
attr = sxe->node->properties;
attr = node->properties;
while (attr) {
if (!xmlStrcmp(attr->name, name)) {
APPEND_PREV_ELEMENT(counter, value);
@ -126,6 +124,11 @@ sxe_property_read(zval *object, zval *member TSRMLS_DC)
attr = attr->next;
}
node = node->xmlChildrenNode;
if (!sxe->node) {
sxe->node = node;
}
while (node) {
if (!xmlStrcmp(node->name, name)) {
APPEND_PREV_ELEMENT(counter, value);
@ -161,7 +164,7 @@ change_node_zval(xmlNodePtr node, zval *value)
case IS_NULL:
convert_to_string(value);
case IS_STRING:
node->children->content = xmlStrndup(Z_STRVAL_P(value), Z_STRLEN_P(value));
node->xmlChildrenNode->content = xmlStrndup(Z_STRVAL_P(value), Z_STRLEN_P(value));
break;
default:
php_error(E_WARNING, "It is not yet possible to assign complex types to attributes");
@ -170,6 +173,7 @@ change_node_zval(xmlNodePtr node, zval *value)
}
/* }}} */
/* {{{ sxe_property_write()
*/
static void
@ -184,7 +188,8 @@ sxe_property_write(zval *object, zval *member, zval *value TSRMLS_DC)
name = Z_STRVAL_P(member);
sxe = php_sxe_fetch_object(object TSRMLS_CC);
node = sxe->node ? sxe->node->xmlChildrenNode : xmlDocGetRootElement(sxe->document)->xmlChildrenNode;
GET_NODE(sxe, node);
node = node->xmlChildrenNode;
while (node) {
if (!xmlStrcmp(node->name, name)) {
@ -219,7 +224,35 @@ sxe_property_get_ptr(zval *object, zval *member TSRMLS_DC)
static int
sxe_property_exists(zval *object, zval *member, int check_empty TSRMLS_DC)
{
php_sxe_object *sxe;
char *name;
xmlNodePtr node;
xmlAttrPtr attr;
sxe = php_sxe_fetch_object(object TSRMLS_CC);
name = Z_STRVAL_P(member);
GET_NODE(sxe, node);
attr = node->properties;
while (attr) {
if (!xmlStrcmp(attr->name, name)) {
return 1;
}
attr = attr->next;
}
node = node->xmlChildrenNode;
while (node) {
if (!xmlStrcmp(node->name, name)) {
return 1;
}
node = node->next;
}
return 0;
}
/* }}} */

Loading…
Cancel
Save