mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-25 01:31:08 +00:00
added subNodes ivar to track ownership of nodes in a tree
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/branches/nsxml_using_libxml2@34513 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
3464a615f5
commit
f7aff866ac
3 changed files with 20 additions and 1 deletions
|
@ -219,7 +219,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
|
||||||
[children release];
|
[children release];
|
||||||
internal->rootElement = (NSXMLElement*)root;
|
internal->rootElement = (NSXMLElement*)root;
|
||||||
*/
|
*/
|
||||||
xmlElementPtr newrootnode;
|
xmlNodePtr newrootnode;
|
||||||
NSAssert(root != nil, NSInvalidArgumentException);
|
NSAssert(root != nil, NSInvalidArgumentException);
|
||||||
// Set
|
// Set
|
||||||
xmlDocSetRootElement(MY_DOC,[root _node]);
|
xmlDocSetRootElement(MY_DOC,[root _node]);
|
||||||
|
|
|
@ -34,6 +34,7 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
|
||||||
- (void *) _node;
|
- (void *) _node;
|
||||||
- (void) _setNode: (void *)_anode;
|
- (void) _setNode: (void *)_anode;
|
||||||
+ (NSXMLNode *) _objectForNode: (xmlNodePtr)node;
|
+ (NSXMLNode *) _objectForNode: (xmlNodePtr)node;
|
||||||
|
- (void) _addSubNode:(NSXMLNode *)subNode;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation NSXMLNode (Private)
|
@implementation NSXMLNode (Private)
|
||||||
|
@ -50,6 +51,9 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
|
||||||
|
|
||||||
+ (NSXMLNode *) _objectForNode: (xmlNodePtr)node
|
+ (NSXMLNode *) _objectForNode: (xmlNodePtr)node
|
||||||
{
|
{
|
||||||
|
if (!node)
|
||||||
|
return nil;
|
||||||
|
|
||||||
xmlElementType type = node->type;
|
xmlElementType type = node->type;
|
||||||
NSXMLNode *result = (id)node->_private;
|
NSXMLNode *result = (id)node->_private;
|
||||||
xmlChar *name = NULL;
|
xmlChar *name = NULL;
|
||||||
|
@ -57,6 +61,7 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
|
||||||
|
|
||||||
if(result == NULL)
|
if(result == NULL)
|
||||||
{
|
{
|
||||||
|
NSXMLNode *parent = nil;
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case(XML_ELEMENT_NODE):
|
case(XML_ELEMENT_NODE):
|
||||||
|
@ -73,10 +78,22 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
|
||||||
}
|
}
|
||||||
node->_private = result;
|
node->_private = result;
|
||||||
AUTORELEASE(result);
|
AUTORELEASE(result);
|
||||||
|
if (node->parent)
|
||||||
|
parent = [self _objectForNode:node->parent];
|
||||||
|
[parent _addSubNode:result];
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) _addSubNode:(NSXMLNode *)subNode
|
||||||
|
{
|
||||||
|
if (!internal->subNodes)
|
||||||
|
internal->subNodes = [[NSMutableArray alloc] init];
|
||||||
|
if ([internal->subNodes indexOfObjectIdenticalTo:subNode] == NSNotFound)
|
||||||
|
[internal->subNodes addObject:subNode];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation NSXMLNode
|
@implementation NSXMLNode
|
||||||
|
@ -323,6 +340,7 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
|
||||||
[internal->children release];
|
[internal->children release];
|
||||||
[internal->objectValue release];
|
[internal->objectValue release];
|
||||||
[internal->stringValue release];
|
[internal->stringValue release];
|
||||||
|
[internal->subNodes release];
|
||||||
GS_DESTROY_INTERNAL(NSXMLNode);
|
GS_DESTROY_INTERNAL(NSXMLNode);
|
||||||
}
|
}
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
|
|
|
@ -112,6 +112,7 @@ StringFromXMLString(const unsigned char *bytes, unsigned length)
|
||||||
NSXMLNode *nextSibling;\
|
NSXMLNode *nextSibling;\
|
||||||
NSUInteger options; \
|
NSUInteger options; \
|
||||||
void *node; \
|
void *node; \
|
||||||
|
NSMutableArray *subNodes; \
|
||||||
|
|
||||||
|
|
||||||
/* When using the non-fragile ABI, the instance variables are exposed to the
|
/* When using the non-fragile ABI, the instance variables are exposed to the
|
||||||
|
|
Loading…
Reference in a new issue