* Source/NSXMLDocument.m

* Source/NSXMLElement.m: add code to insertChild:atIndex: to
	handle edge cases.



git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/branches/nsxml_using_libxml2@34569 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Gregory John Casamento 2012-01-17 23:32:57 +00:00
parent 14ac5c523f
commit f81a39b90d
3 changed files with 43 additions and 9 deletions

View file

@ -1,3 +1,9 @@
2012-01-17 18:32-EST Gregory John Casamento <greg.casamento@gmail.com>
* Source/NSXMLDocument.m
* Source/NSXMLElement.m: add code to insertChild:atIndex: to
handle edge cases.
2012-01-17 04:05-EST Gregory John Casamento <greg.casamento@gmail.com> 2012-01-17 04:05-EST Gregory John Casamento <greg.casamento@gmail.com>
* Source/NSXMLElement.m * Source/NSXMLElement.m

View file

@ -292,12 +292,18 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
{ {
prevNode = nextNode->prev; prevNode = nextNode->prev;
} }
else if(index > 0)
{
prevNode = (xmlNodePtr)[[self childAtIndex: index - 1] _node];
}
// Make all of the links... // Make all of the links...
/*
if(prevNode != NULL) if(prevNode != NULL)
{ {
prevNode->next = newNode; prevNode = nextNode;
} }
*/
newNode->next = nextNode; newNode->next = nextNode;
newNode->prev = prevNode; newNode->prev = prevNode;
if(nextNode != NULL) if(nextNode != NULL)
@ -310,6 +316,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
MY_DOC->children = newNode; MY_DOC->children = newNode;
} }
((xmlNodePtr)[child _node])->parent = [self _node];
GSIVar(child, parent) = self; GSIVar(child, parent) = self;
} }

View file

@ -247,8 +247,8 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
if(ns) if(ns)
{ {
result = [NSMutableArray array];
xmlNsPtr cur = NULL; xmlNsPtr cur = NULL;
result = [NSMutableArray array];
for(cur = ns; cur != NULL; cur = cur->next) for(cur = ns; cur != NULL; cur = cur->next)
{ {
[result addObject: StringFromXMLStringPtr(cur->prefix)]; [result addObject: StringFromXMLStringPtr(cur->prefix)];
@ -279,17 +279,17 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
- (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index - (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index
{ {
NSXMLNodeKind kind; NSXMLNodeKind kind = [child kind];
NSXMLNode *next = nil; NSXMLNode *next = nil;
xmlNodePtr nextNode = NULL; xmlNodePtr nextNode = NULL;
xmlNodePtr newNode = NULL; xmlNodePtr newNode = NULL;
xmlNodePtr prevNode = NULL; xmlNodePtr prevNode = NULL;
NSUInteger childCount = [self childCount];
// Check to make sure this is a valid addition... // Check to make sure this is a valid addition...
NSAssert(nil != child, NSInvalidArgumentException); NSAssert(nil != child, NSInvalidArgumentException);
NSAssert(index <= [self childCount], NSInvalidArgumentException); NSAssert(index <= childCount, NSInvalidArgumentException);
NSAssert(nil == [child parent], NSInvalidArgumentException); NSAssert(nil == [child parent], NSInvalidArgumentException);
kind = [child kind];
NSAssert(NSXMLAttributeKind != kind, NSInvalidArgumentException); NSAssert(NSXMLAttributeKind != kind, NSInvalidArgumentException);
NSAssert(NSXMLDTDKind != kind, NSInvalidArgumentException); NSAssert(NSXMLDTDKind != kind, NSInvalidArgumentException);
NSAssert(NSXMLDocumentKind != kind, NSInvalidArgumentException); NSAssert(NSXMLDocumentKind != kind, NSInvalidArgumentException);
@ -303,14 +303,35 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
newNode = ((xmlNodePtr)[child _node]); newNode = ((xmlNodePtr)[child _node]);
next = [self childAtIndex: index]; next = [self childAtIndex: index];
nextNode = ((xmlNodePtr)[next _node]); nextNode = ((xmlNodePtr)[next _node]);
prevNode = nextNode->prev; if(nextNode != NULL)
{
prevNode = nextNode->prev;
}
else if(index > 0)
{
prevNode = (xmlNodePtr)[[self childAtIndex: index - 1] _node];
}
// Make all of the links... // Make all of the links...
prevNode->next = newNode; /*
if(prevNode != NULL)
{
prevNode = nextNode;
}
*/
newNode->next = nextNode; newNode->next = nextNode;
newNode->prev = prevNode; newNode->prev = prevNode;
nextNode->prev = newNode; if(nextNode != NULL)
{
nextNode->prev = newNode;
}
if(MY_NODE->children == NULL)
{
MY_NODE->children = newNode;
}
((xmlNodePtr)[child _node])->parent = [self _node];
GSIVar(child, parent) = self; GSIVar(child, parent) = self;
} }