Index: src/OFXMLAttribute.m ================================================================== --- src/OFXMLAttribute.m +++ src/OFXMLAttribute.m @@ -17,10 +17,12 @@ #include "config.h" #import "OFXMLAttribute.h" #import "OFString.h" #import "OFAutoreleasePool.h" + +#import "macros.h" @implementation OFXMLAttribute + attributeWithName: (OFString*)name namespace: (OFString*)ns stringValue: (OFString*)value @@ -88,6 +90,41 @@ if (![other->stringValue isEqual: stringValue]) return NO; return YES; } + +- (uint32_t)hash +{ + uint32_t hash, tmp; + + OF_HASH_INIT(hash); + + tmp = [name hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [name hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [ns hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [stringValue hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + OF_HASH_FINALIZE(hash); + + return hash; +} @end Index: src/OFXMLElement.m ================================================================== --- src/OFXMLElement.m +++ src/OFXMLElement.m @@ -30,10 +30,12 @@ #import "OFInvalidArgumentException.h" #import "OFMalformedXMLException.h" #import "OFNotImplementedException.h" #import "OFUnboundNamespaceException.h" + +#import "macros.h" @interface OFXMLElement_OFXMLElementBuilderDelegate: OFObject { @public OFXMLElement *element; @@ -791,10 +793,75 @@ if (other->comment != comment && ![other->comment isEqual: comment]) return NO; return YES; } + +- (uint32_t)hash +{ + uint32_t hash, tmp; + + OF_HASH_INIT(hash); + + tmp = [name hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [ns hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [defaultNamespace hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [attributes hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [namespaces hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [children hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [characters hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [cdata hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [comment hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + OF_HASH_FINALIZE(hash); + + return hash; +} - (void)dealloc { [name release]; [ns release];