diff --git a/ChangeLog b/ChangeLog index 26076b773..10a1830d8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2012-03-11 Richard Frith-Macdonald + + * Source/NSXMLNamespace.m: New class for namespaces + * Source/GNUmakefile: Build with new class + * Source/NSXMLDocument.m: + * Source/NSXMLPrivate.h: + * Source/NSXMLDTD.m: + * Source/NSXMLNode.m: + * Source/NSXMLDTDNode.m: + * Source/NSXMLElement.m: + Use a new class for namespaces ... just a placeholder/skeleton so far. + Change other classes to know the correct type of their 'node' pointer. + 2012-03-11 Richard Frith-Macdonald * Source/NSXMLNode.m: Avoid crash when trying to get the parent of a diff --git a/Source/GNUmakefile b/Source/GNUmakefile index 191340e33..39ecdca02 100644 --- a/Source/GNUmakefile +++ b/Source/GNUmakefile @@ -286,6 +286,7 @@ NSXMLDocument.m \ NSXMLDTD.m \ NSXMLDTDNode.m \ NSXMLElement.m \ +NSXMLNamespace.m \ NSXMLNode.m \ NSXMLParser.m \ NSZone.m \ diff --git a/Source/NSXMLDTD.m b/Source/NSXMLDTD.m index 79a759d84..9aed3c472 100644 --- a/Source/NSXMLDTD.m +++ b/Source/NSXMLDTD.m @@ -24,7 +24,9 @@ #import "common.h" -#define GSInternal NSXMLDTDInternal +#define GS_XMLNODETYPE xmlDtd +#define GSInternal NSXMLDTDInternal + #import "NSXMLPrivate.h" #import "GSInternal.h" GS_PRIVATE_INTERNAL(NSXMLDTD) @@ -147,7 +149,7 @@ GS_PRIVATE_INTERNAL(NSXMLDTD) - (NSString*) publicID { - xmlDtd *node = MY_DTD; + xmlDtd *node = internal->node; return StringFromXMLStringPtr(node->ExternalID); } @@ -169,21 +171,21 @@ GS_PRIVATE_INTERNAL(NSXMLDTD) - (void) setPublicID: (NSString*)publicID { - xmlDtd *node = MY_DTD; + xmlDtd *node = internal->node; node->ExternalID = XMLStringCopy(publicID); } - (void) setSystemID: (NSString*)systemID { - xmlDtd *node = MY_DTD; + xmlDtd *node = internal->node; node->SystemID = XMLStringCopy(systemID); } - (NSString*) systemID { - xmlDtd *node = MY_DTD; + xmlDtd *node = internal->node; return StringFromXMLStringPtr(node->SystemID); } diff --git a/Source/NSXMLDTDNode.m b/Source/NSXMLDTDNode.m index 799409a43..a2bc6bfd4 100644 --- a/Source/NSXMLDTDNode.m +++ b/Source/NSXMLDTDNode.m @@ -24,7 +24,9 @@ #import "common.h" -#define GSInternal NSXMLDTDNodeInternal +#define GS_XMLNODETYPE xmlDtd +#define GSInternal NSXMLDTDNodeInternal + #import "NSXMLPrivate.h" #import "GSInternal.h" GS_PRIVATE_INTERNAL(NSXMLDTDNode) @@ -85,12 +87,12 @@ GS_PRIVATE_INTERNAL(NSXMLDTDNode) - (NSString*) notationName { - return StringFromXMLStringPtr(MY_DTD->name); + return StringFromXMLStringPtr(internal->node->name); } - (NSString*) publicID { - return StringFromXMLStringPtr(MY_DTD->ExternalID); + return StringFromXMLStringPtr(internal->node->ExternalID); } - (void) setDTDKind: (NSXMLDTDNodeKind)kind @@ -100,22 +102,22 @@ GS_PRIVATE_INTERNAL(NSXMLDTDNode) - (void) setNotationName: (NSString*)notationName { - MY_DTD->name = XMLSTRING(notationName); + internal->node->name = XMLSTRING(notationName); } - (void) setPublicID: (NSString*)publicID { - MY_DTD->ExternalID = XMLSTRING(publicID); + internal->node->ExternalID = XMLSTRING(publicID); } - (void) setSystemID: (NSString*)systemID { - MY_DTD->ExternalID = XMLSTRING(systemID); + internal->node->ExternalID = XMLSTRING(systemID); } - (NSString*) systemID { - return StringFromXMLStringPtr(MY_DTD->SystemID); + return StringFromXMLStringPtr(internal->node->SystemID); } @end diff --git a/Source/NSXMLDocument.m b/Source/NSXMLDocument.m index fd238f4cd..0e00a30d4 100644 --- a/Source/NSXMLDocument.m +++ b/Source/NSXMLDocument.m @@ -25,7 +25,9 @@ #import "common.h" -#define GSInternal NSXMLDocumentInternal +#define GS_XMLNODETYPE xmlDoc +#define GSInternal NSXMLDocumentInternal + #import "NSXMLPrivate.h" #import "GSInternal.h" @@ -55,8 +57,8 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) - (NSString*) characterEncoding { - if (MY_DOC->encoding) - return StringFromXMLStringPtr(MY_DOC->encoding); + if (internal->node->encoding) + return StringFromXMLStringPtr(internal->node->encoding); else return nil; } @@ -193,7 +195,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) - (BOOL) isStandalone { - return (MY_DOC->standalone == 1); + return (internal->node->standalone == 1); } - (NSString*) MIMEType @@ -203,13 +205,13 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) - (NSXMLElement*) rootElement { - xmlNodePtr rootElem = xmlDocGetRootElement(MY_DOC); + xmlNodePtr rootElem = xmlDocGetRootElement(internal->node); return (NSXMLElement *)[NSXMLNode _objectForNode: rootElem]; } - (void) setCharacterEncoding: (NSString*)encoding { - MY_DOC->encoding = XMLStringCopy(encoding); + internal->node->encoding = XMLStringCopy(encoding); } - (void) setDocumentContentKind: (NSXMLDocumentContentKind)kind @@ -221,7 +223,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) { NSAssert(documentTypeDeclaration != nil, NSInvalidArgumentException); ASSIGNCOPY(internal->docType, documentTypeDeclaration); - MY_DOC->extSubset = [documentTypeDeclaration _node]; + internal->node->extSubset = [documentTypeDeclaration _node]; } - (void) setMIMEType: (NSString*)MIMEType @@ -247,7 +249,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) // FIXME: Should remove all sub nodes - xmlDocSetRootElement(MY_DOC, [root _node]); + xmlDocSetRootElement(internal->node, [root _node]); // Do our subNode housekeeping... [self _removeSubNode: oldElement]; @@ -256,14 +258,14 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) - (void) setStandalone: (BOOL)standalone { - MY_DOC->standalone = standalone; + internal->node->standalone = standalone; } - (void) setVersion: (NSString*)version { if ([version isEqualToString: @"1.0"] || [version isEqualToString: @"1.1"]) { - MY_DOC->version = XMLStringCopy(version); + internal->node->version = XMLStringCopy(version); } else { @@ -274,8 +276,8 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) - (NSString*) version { - if (MY_DOC->version) - return StringFromXMLStringPtr(MY_DOC->version); + if (internal->node->version) + return StringFromXMLStringPtr(internal->node->version); else return @"1.0"; } @@ -369,7 +371,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) xmlChar *buf = NULL; int length; - xmlDocDumpFormatMemoryEnc(MY_DOC, &buf, &length, "utf-8", + xmlDocDumpFormatMemoryEnc(internal->node, &buf, &length, "utf-8", ((options & NSXMLNodePrettyPrint) ? 1 : 0)); if (buf != 0 && length > 0) @@ -409,7 +411,8 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) } // Apply the stylesheet and get the result... - resultDoc = xsltApplyStylesheet(stylesheet, MY_DOC, (const char **)params); + resultDoc + = xsltApplyStylesheet(stylesheet, internal->node, (const char **)params); // Cleanup... xsltFreeStylesheet(stylesheet); @@ -451,7 +454,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) xmlValidCtxtPtr ctxt = xmlNewValidCtxt(); // FIXME: Should use xmlValidityErrorFunc and userData // to get the error - BOOL result = (BOOL)(xmlValidateDocument(ctxt, MY_DOC)); + BOOL result = (BOOL)(xmlValidateDocument(ctxt, internal->node)); xmlFreeValidCtxt(ctxt); return result; } diff --git a/Source/NSXMLElement.m b/Source/NSXMLElement.m index 8b90740b9..26b997bcf 100644 --- a/Source/NSXMLElement.m +++ b/Source/NSXMLElement.m @@ -24,7 +24,9 @@ #import "common.h" -#define GSInternal NSXMLElementInternal +#define GSInternal NSXMLElementInternal +#define GS_XMLNODETYPE xmlNode + #import "NSXMLPrivate.h" #import "GSInternal.h" GS_PRIVATE_INTERNAL(NSXMLElement) @@ -133,7 +135,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement) NSMutableArray *results = [NSMutableArray arrayWithCapacity: 10]; xmlNodePtr cur = NULL; - for (cur = MY_NODE->children; cur != NULL; cur = cur->next) + for (cur = internal->node->children; cur != NULL; cur = cur->next) { NSString *n = StringFromXMLStringPtr(cur->name); if ([n isEqualToString: name]) @@ -154,7 +156,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement) - (void) addAttribute: (NSXMLNode*)attribute { - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; xmlAttrPtr attr = (xmlAttrPtr)[attribute _node]; xmlAttrPtr oldAttr = xmlHasProp(node, attr->name); @@ -194,7 +196,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement) - (void) removeAttributeForName: (NSString*)name { - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; xmlAttrPtr attr = xmlHasProp(node, XMLSTRING(name)); NSXMLNode *attrNode = nil; @@ -242,7 +244,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement) - (NSArray*) attributes { NSMutableArray *attributes = [NSMutableArray array]; - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; xmlAttrPtr attributeNode = node->properties; while (attributeNode) @@ -259,7 +261,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement) - (NSXMLNode*) attributeForName: (NSString*)name { NSXMLNode *result = nil; - xmlAttrPtr attributeNode = xmlHasProp(MY_NODE, XMLSTRING(name)); + xmlAttrPtr attributeNode = xmlHasProp(internal->node, XMLSTRING(name)); if (NULL != attributeNode) { @@ -280,13 +282,13 @@ GS_PRIVATE_INTERNAL(NSXMLElement) { xmlNsPtr ns = (xmlNsPtr)[aNamespace _node]; - if (MY_NODE->ns == NULL) + if (internal->node->ns == NULL) { - MY_NODE->ns = ns; + internal->node->ns = ns; } else { - xmlNsPtr cur = MY_NODE->ns; + xmlNsPtr cur = internal->node->ns; const xmlChar *prefix = ns->prefix; while (xmlStrcmp(prefix, cur->prefix) != 0) @@ -313,14 +315,14 @@ GS_PRIVATE_INTERNAL(NSXMLElement) xmlNsPtr cur = NULL; // FIXME: Remove old namespaces - // xmlFreeNsList(MY_NODE->ns); - // MY_NODE->ns = NULL; + // xmlFreeNsList(internal->node->ns); + // internal->node->ns = NULL; while ((namespace = (NSXMLNode *)[en nextObject]) != nil) { xmlNsPtr ns = (xmlNsPtr)[namespace _node]; - if (MY_NODE->ns == NULL) + if (internal->node->ns == NULL) { - MY_NODE->ns = ns; + internal->node->ns = ns; cur = ns; } else @@ -335,7 +337,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement) { // FIXME: Should use xmlGetNsList() NSMutableArray *result = nil; - xmlNsPtr ns = MY_NODE->ns; + xmlNsPtr ns = internal->node->ns; if (ns) { @@ -353,7 +355,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement) - (NSXMLNode*) namespaceForPrefix: (NSString*)name { // FIXME: Should use xmlSearchNs() - xmlNsPtr ns = MY_NODE->ns; + xmlNsPtr ns = internal->node->ns; if (ns) { const xmlChar *prefix = XMLSTRING(name); @@ -385,7 +387,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement) - (NSString*) resolvePrefixForNamespaceURI: (NSString*)namespaceURI { // FIXME Should use xmlSearchNsByHref() - xmlNsPtr ns = MY_NODE->ns; + xmlNsPtr ns = internal->node->ns; if (ns) { diff --git a/Source/NSXMLNamespace.m b/Source/NSXMLNamespace.m new file mode 100644 index 000000000..d699fd853 --- /dev/null +++ b/Source/NSXMLNamespace.m @@ -0,0 +1,280 @@ +/* Implementation for NSXMLNamespace for GNUStep + Copyright (C) 2008 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Created: September 2008 + + This file is part of the GNUstep Base Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02111 USA. +*/ + +#import "common.h" + +#define GSInternal NSXMLNamespaceInternal +#define GS_XMLNODETYPE xmlNs + +#import "NSXMLPrivate.h" + +@interface NSXMLNamespace : NSXMLNode +{ +@public GS_NSXMLNamespace_IVARS + /* The pointer to private additional data used to avoid breaking ABI + * when we don't have the non-fragile ABI available is inherited from + * NSXMLNode. See Source/GSInternal.h for details. + */ +} +@end + +#import "GSInternal.h" +GS_PRIVATE_INTERNAL(NSXMLNamespace) + +#if defined(HAVE_LIBXML) + + + +static void +clearPrivatePointers(xmlNodePtr aNode) +{ + if (!aNode) + return; + aNode->_private = NULL; + clearPrivatePointers(aNode->children); + clearPrivatePointers(aNode->next); + if (aNode->type == XML_ELEMENT_NODE) + clearPrivatePointers((xmlNodePtr)(aNode->properties)); + // FIXME: Handle more node types +} + +@implementation NSXMLNamespace + +- (NSString*) canonicalXMLStringPreservingComments: (BOOL)comments +{ + return [self notImplemented: _cmd]; // FIXME ... generate from libxml +} + +- (NSXMLNode*) childAtIndex: (NSUInteger)index +{ + return nil; +} + +- (NSUInteger) childCount +{ + return 0; +} + +- (NSArray*) children +{ + return nil; +} + +- (id) copyWithZone: (NSZone*)zone +{ + NSXMLNamespace *c = [[self class] allocWithZone: zone]; + +// FIXME + + GSIVar(c, options) = internal->options; + if (nil != internal->objectValue) + { + /* + Only copy the objectValue when externally set. + The problem here are nodes created by parsing XML. + There the stringValue may be set, but the objectValue isn't. + This should rather be solved by creating a suitable objectValue, + when the node gets instantiated. + */ + [c setObjectValue: internal->objectValue]; + } + [c setURI: [self URI]]; +// [c setName: [self name]]; +// [c setStringValue: [self stringValue]]; + + return c; +} + +- (NSString*) description +{ + return [NSString stringWithFormat:@"<%@ %@ %d>%@\n", + NSStringFromClass([self class]), + [self name], [self kind], [self XMLString]]; +} + +- (void) dealloc +{ + if (GS_EXISTS_INTERNAL) + { + xmlNs *old = internal->node; +// FIXME + if (old) + { + old->_private = NULL; + xmlFreeNs(old); + } + GS_DESTROY_INTERNAL(NSXMLNode); + } + [super dealloc]; +} + +- (void) detach +{ + xmlNsPtr ns = internal->node; + + if (ns) + { +// FIXME + } +} + +- (NSUInteger) hash +{ + return [[self name] hash]; +} + +- (NSUInteger) index +{ + return 0; +} + +- (id) init +{ + return [self initWithKind: NSXMLNamespaceKind]; +} + +- (NSUInteger) level +{ + return 0; +} + +- (NSString*) localName +{ + return [[self class] localNameForName: [self name]]; +} + +- (NSString*) name +{ + return nil; +} + +- (NSXMLNode*) nextNode +{ + return nil; +} + +- (NSXMLNode*) nextSibling +{ + return nil; +} + +- (id) objectValue +{ + return nil; +} + +- (NSXMLNode*) parent +{ + return nil; +} + +- (NSString*) prefix +{ + return StringFromXMLStringPtr(internal->node->prefix); +} + +- (NSXMLNode*) previousNode +{ + return nil; +} + +- (NSXMLNode*) previousSibling +{ + return nil; +} + +- (NSXMLDocument*) rootDocument +{ + return nil; +} + +- (NSString*) stringValue +{ + return StringFromXMLStringPtr(internal->node->href); +} + +- (void) setObjectValue: (id)value +{ + return; +} + +- (void) setName: (NSString *)name +{ + return; +} + +- (void) setStringValue: (NSString*)string +{ + [self setStringValue: string resolvingEntities: NO]; +} + +- (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve +{ + return; +} + +- (void) setURI: (NSString*)URI +{ + //xmlNodeSetBase(internal->node, XMLSTRING(URI)); +} + +- (NSString*) URI +{ + return StringFromXMLStringPtr(internal->node->href); +} + +- (NSString*) XMLString +{ + return [self XMLStringWithOptions: NSXMLNodeOptionsNone]; +} + +- (NSString*) XMLStringWithOptions: (NSUInteger)options +{ + return nil; +} + +- (NSString*) XPath +{ + return nil; +} + +- (NSArray*) nodesForXPath: (NSString*)anxpath error: (NSError**)error +{ + return nil; +} + + - (NSArray*) objectsForXQuery: (NSString*)xquery + constants: (NSDictionary*)constants + error: (NSError**)error +{ + return nil; +} + +- (NSArray*) objectsForXQuery: (NSString*)xquery error: (NSError**)error +{ + return nil; +} +@end + +#endif diff --git a/Source/NSXMLNode.m b/Source/NSXMLNode.m index 98e10787c..09c0ef8b6 100644 --- a/Source/NSXMLNode.m +++ b/Source/NSXMLNode.m @@ -24,15 +24,16 @@ #import "common.h" -#define GSInternal NSXMLNodeInternal +#define GSInternal NSXMLNodeInternal +#define GS_XMLNODETYPE xmlNode + #import "NSXMLPrivate.h" #import "GSInternal.h" GS_PRIVATE_INTERNAL(NSXMLNode) #if defined(HAVE_LIBXML) -@interface NSXMLNamespaceNode : NSXMLNode -@end +@class NSXMLNamespace; static int countAttributes(xmlNodePtr node) @@ -209,26 +210,10 @@ isEqualTree(xmlNodePtr nodeA, xmlNodePtr nodeB) return NO; } -/* FIXME ... the libxml2 data structure representing a namespace has a - * completely different layout from that of almost all other nodes, so - * the generix NSXMLNode code won't work and we need to override every - * method we use! - */ -@implementation NSXMLNamespaceNode -- (NSUInteger) level -{ - return 0; -} -- (NSXMLNode*) parent -{ - return nil; -} -@end - @implementation NSXMLNode (Private) - (void *) _node { - return MY_NODE; + return internal->node; } - (void) _setNode: (void *)_anode @@ -379,7 +364,7 @@ isEqualTree(xmlNodePtr nodeA, xmlNodePtr nodeB) - (xmlNodePtr) _childNodeAtIndex: (NSUInteger)index { NSUInteger count = 0; - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; xmlNodePtr children = node->children; if (!children) @@ -403,7 +388,7 @@ isEqualTree(xmlNodePtr nodeA, xmlNodePtr nodeB) */ // Get all of the nodes... - xmlNodePtr parentNode = MY_NODE; // we are the parent + xmlNodePtr parentNode = internal->node; // we are the parent xmlNodePtr childNode = (xmlNodePtr)[child _node]; xmlNodePtr curNode = [self _childNodeAtIndex: index]; BOOL mergeTextNodes = NO; // is there a defined option for this? @@ -857,7 +842,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) { NSUInteger count = 0; xmlNodePtr children = NULL; - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; if (!node) { @@ -883,7 +868,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) else { xmlNodePtr children = NULL; - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; if ((node == NULL) || (node->children == NULL)) { @@ -938,7 +923,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) { if (GS_EXISTS_INTERNAL) { - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; NSArray *subNodes = [internal->subNodes copy]; NSEnumerator *enumerator = [subNodes objectEnumerator]; NSXMLNode *subNode; @@ -968,7 +953,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) - (void) detach { - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; if (node) { @@ -992,7 +977,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) - (NSUInteger) index { - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; int count = 0; while ((node = node->prev)) @@ -1046,7 +1031,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) break; case NSXMLNamespaceKind: - theSubclass = [NSXMLNamespaceNode class]; + theSubclass = [NSXMLNamespace class]; break; case NSXMLAttributeKind: @@ -1145,7 +1130,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) NSLog(@"s sV '%@' oV '%@', other sV '%@' oV '%@'", [self stringValue], [self objectValue], [other stringValue], [other objectValue]); */ - return isEqualTree(MY_NODE, (xmlNodePtr)[other _node]); + return isEqualTree(internal->node, (xmlNodePtr)[other _node]); } - (NSXMLNodeKind) kind @@ -1158,12 +1143,12 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) NSUInteger level = 0; xmlNodePtr tmp; - if (!MY_NODE) + if (!internal->node) { return 0; } - tmp = MY_NODE->parent; + tmp = internal->node->parent; while (tmp != NULL) { level++; @@ -1183,7 +1168,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) { return nil; } - return StringFromXMLStringPtr(MY_NODE->name); + return StringFromXMLStringPtr(internal->node->name); } - (NSXMLNode*) _nodeFollowingInNaturalDirection: (BOOL)forward @@ -1242,7 +1227,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) - (NSXMLNode*) nextSibling { - return [NSXMLNode _objectForNode: MY_NODE->next]; + return [NSXMLNode _objectForNode: internal->node->next]; } - (id) objectValue @@ -1252,7 +1237,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) - (NSXMLNode*) parent { - return [NSXMLNode _objectForNode: MY_NODE->parent]; + return [NSXMLNode _objectForNode: internal->node->parent]; } - (NSString*) prefix @@ -1267,18 +1252,18 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) - (NSXMLNode*) previousSibling { - return [NSXMLNode _objectForNode: MY_NODE->prev]; + return [NSXMLNode _objectForNode: internal->node->prev]; } - (NSXMLDocument*) rootDocument { return - (NSXMLDocument *)[NSXMLNode _objectForNode: (xmlNodePtr)(MY_NODE->doc)]; + (NSXMLDocument *)[NSXMLNode _objectForNode: (xmlNodePtr)(internal->node->doc)]; } - (NSString*) stringValue { - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; xmlChar *content = xmlNodeGetContent(node); NSString *result = nil; @@ -1321,7 +1306,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) return; } - xmlNodeSetName(MY_NODE, XMLSTRING(name)); + xmlNodeSetName(internal->node, XMLSTRING(name)); } - (void) setStringValue: (NSString*)string @@ -1331,7 +1316,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) - (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve { - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; if (resolve == NO) { @@ -1355,7 +1340,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) return; } ASSIGNCOPY(internal->URI, URI); - //xmlNodeSetBase(MY_NODE, XMLSTRING(URI)); + //xmlNodeSetBase(internal->node, XMLSTRING(URI)); } - (NSString*) URI @@ -1365,7 +1350,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) return nil; } return internal->URI; - //return StringFromXMLStringPtr(xmlNodeGetBase(NULL, MY_NODE)); + //return StringFromXMLStringPtr(xmlNodeGetBase(NULL, internal->node)); } - (NSString*) XMLString @@ -1399,7 +1384,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces) - (NSString*) XPath { - xmlNodePtr node = MY_NODE; + xmlNodePtr node = internal->node; return StringFromXMLStringPtr(xmlGetNodePath(node)); } diff --git a/Source/NSXMLPrivate.h b/Source/NSXMLPrivate.h index 5400cb695..f7eb43feb 100644 --- a/Source/NSXMLPrivate.h +++ b/Source/NSXMLPrivate.h @@ -81,29 +81,12 @@ StringFromXMLString(const unsigned char *bytes, unsigned length) return AUTORELEASE(str); } -#define MY_DOC ((xmlDoc *)internal->node) -#define MY_NODE ((xmlNode *)internal->node) -#define MY_ATTR ((xmlAttr *)internal->node) -#define MY_ELEM ((xmlElement *)internal->node) -#define MY_DTD ((xmlDtd *)internal->node) - /* Instance variables for NSXMLNode. This macro needs to be defined before * the NSXMLNode.h header is imported and before GSInternal.h is imported. - * - * Description of internal ivars: - * - `children': The primary storage for the descendant nodes. We use an NSArray - * here until somebody finds out it's not fast enough. - * - `childCount': For efficiency, we cache the count. This means we need to - * update it whenever the children change. - * - `previousSibling', `nextSibling': Tree walking is a common operation for - * XML. [parent->children objectAtIndex: index + 1] would be a - * straightforward way to obtain the next sibling of the node, but it hurts - * performance quite a bit. So we cache the siblings and update them when the - * nodes are changed. */ #define GS_NSXMLNode_IVARS \ NSUInteger kind; \ - void *node; \ + GS_XMLNODETYPE *node; \ NSUInteger options; \ id objectValue; \ NSString *URI; \ @@ -163,6 +146,14 @@ StringFromXMLString(const unsigned char *bytes, unsigned length) */ #define GS_NSXMLElement_IVARS SUPERIVARS(GS_NSXMLNode_IVARS) +/* Instance variables for NSXMLNamespace with/without the instance + * variable 'inherited' from NSXMLNode. + * This macro needs to be defined before the NSXMLNamespace interface + * is declared and before GSInternal.h is imported. + */ +#define GS_NSXMLNamespace_IVARS SUPERIVARS(GS_NSXMLNode_IVARS) + + #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSDebug.h" @@ -208,9 +199,9 @@ StringFromXMLString(const unsigned char *bytes, unsigned length) - (void *) _node; - (void) _setNode: (void *)_anode; + (NSXMLNode *) _objectForNode: (xmlNodePtr)node; -- (void) _addSubNode:(NSXMLNode *)subNode; -- (void) _removeSubNode:(NSXMLNode *)subNode; -- (id) _initWithNode:(xmlNodePtr)node kind:(NSXMLNodeKind)kind; +- (void) _addSubNode: (NSXMLNode *)subNode; +- (void) _removeSubNode: (NSXMLNode *)subNode; +- (id) _initWithNode: (xmlNodePtr)node kind: (NSXMLNodeKind)kind; - (xmlNodePtr) _childNodeAtIndex: (NSUInteger)index; - (void) _insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index; - (void) _invalidate;