Browse Source

add/fix assignments for both nodes and attributes

add a working get_property_ptr construct
migration/unlabaled-1.3.2
Sterling Hughes 23 years ago
parent
commit
cf8a7bd235
  1. 34
      ext/simplexml/simplexml.c

34
ext/simplexml/simplexml.c

@ -100,7 +100,7 @@ sxe_property_read(zval *object, zval *member TSRMLS_DC)
APPEND_PREV_ELEMENT(counter, value);
MAKE_STD_ZVAL(value);
contents = xmlNodeListGetString(sxe->document, attr->children, 1);
contents = xmlNodeListGetString(sxe->document, attr->xmlChildrenNode, 1);
ZVAL_STRING(value, contents, 0);
APPEND_CUR_ELEMENT(counter, value);
@ -148,7 +148,7 @@ change_node_zval(xmlNodePtr node, zval *value)
case IS_NULL:
convert_to_string(value);
case IS_STRING:
xmlNodeSetContentLen(node->xmlChildrenNode, Z_STRVAL_P(value), Z_STRLEN_P(value));
xmlNodeSetContentLen(node, 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");
@ -167,13 +167,27 @@ sxe_property_write(zval *object, zval *member, zval *value TSRMLS_DC)
char *name;
xmlNodePtr node;
xmlNodePtr newnode;
xmlAttrPtr attr;
int counter = 0;
int is_attr = 0;
name = Z_STRVAL_P(member);
sxe = php_sxe_fetch_object(object TSRMLS_CC);
GET_NODE(sxe, node);
attr = node->properties;
while (attr) {
if (!xmlStrcmp(attr->name, name)) {
is_attr = 1;
++counter;
break;
}
attr = attr->next;
}
node = node->xmlChildrenNode;
while (node) {
if (!xmlStrcmp(node->name, name)) {
newnode = node;
@ -184,9 +198,13 @@ sxe_property_write(zval *object, zval *member, zval *value TSRMLS_DC)
}
if (counter == 1) {
change_node_zval(newnode, value);
if (is_attr) {
change_node_zval(attr->xmlChildrenNode, value);
} else {
change_node_zval(newnode->xmlChildrenNode, value);
}
} else if (counter > 1) {
php_error(E_WARNING, "Cannot assign to an array of nodes\n");
php_error(E_WARNING, "Cannot assign to an array of nodes (duplicate subnodes or attr detected)\n");
}
}
@ -197,8 +215,10 @@ sxe_property_write(zval *object, zval *member, zval *value TSRMLS_DC)
static zval **
sxe_property_get_ptr(zval *object, zval *member TSRMLS_DC)
{
/* XXX: Return NULL till I figure this out */
return NULL;
zval *property = sxe_property_read(object, member TSRMLS_CC);
zval_add_ref(&property);
return &property;
}
/* }}} */

Loading…
Cancel
Save