diff --git a/ChangeLog b/ChangeLog index 77ff45e2b..109b52911 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,12 @@ * Source/NSString.m: Added two new MacOS-X initialisers. * Headers/Foundation/NSString.h: ditto + * Source/NSData.m: ([replaceBytesInRange:withBytes:length:) rewrite + to fix crash when new data is smaller than orignal. + * Source/NSNumber.m: ([numberWithBool:]) and ([initWithBool:]) + returns yes value for any non-zero argument. ([boolValue]) returns + either YES or NO. So we are tolerant in what we accept, strict in + what we produce. 2004-01-28 Fred Kiefer diff --git a/Headers/Foundation/NSString.h b/Headers/Foundation/NSString.h index 16d2ee934..5feec7f91 100644 --- a/Headers/Foundation/NSString.h +++ b/Headers/Foundation/NSString.h @@ -117,7 +117,7 @@ enum { #ifndef STRICT_OPENSTEP - (id) initWithBytes: (const void*)bytes length: (unsigned int)length - encoding: (NSStringEncoding)encoding ; + encoding: (NSStringEncoding)encoding; - (id) initWithBytesNoCopy: (const void*)bytes length: (unsigned int)length encoding: (NSStringEncoding)encoding diff --git a/Source/NSData.m b/Source/NSData.m index 75a10c074..898173942 100644 --- a/Source/NSData.m +++ b/Source/NSData.m @@ -1742,37 +1742,45 @@ failure: unsigned size = [self length]; unsigned end = NSMaxRange(aRange); int shift = length - aRange.length; - unsigned need = end + shift; + unsigned need = size + shift; + void *buf; if (aRange.location > size) { [NSException raise: NSRangeException format: @"location bad in replaceByteInRange:withBytes:"]; } - if (length > aRange.length) - { - need += (length - aRange.length); - } if (need > size) { [self setLength: need]; } - if (aRange.length > 0 || aRange.length != length) + buf = [self mutableBytes]; + if (shift < 0) { - void *buf = [self mutableBytes]; - - if (end < size && shift != 0) + if (length > 0) { + // Copy bytes into place. + memmove(buf + aRange.location, bytes, length); + } + // Fill gap + memmove(buf + end + shift, buf + end, size - end); + } + else + { + if (shift > 0) + { + // Open space memmove(buf + end + shift, buf + end, size - end); } if (length > 0) { + // Copy bytes into place. memmove(buf + aRange.location, bytes, length); } } - if (shift < 0) + if (need < size) { - [self setLength: need + shift]; + [self setLength: need]; } } diff --git a/Source/NSNumber.m b/Source/NSNumber.m index b8d536272..b1adebc8f 100644 --- a/Source/NSNumber.m +++ b/Source/NSNumber.m @@ -326,13 +326,13 @@ static Class doubleNumberClass; + (NSNumber*) numberWithBool: (BOOL)value { - if (value == YES) + if (value == NO) { - return boolY; + return boolN; } else { - return boolN; + return boolY; } } @@ -507,13 +507,13 @@ static Class doubleNumberClass; - (id) initWithBool: (BOOL)value { NSDeallocateObject(self); - if (value == YES) + if (value == NO) { - self = boolY; + self = boolN; } else { - self = boolN; + self = boolY; } return RETAIN(self); } @@ -822,98 +822,98 @@ static Class doubleNumberClass; BOOL oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 1: { signed char oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 2: { unsigned char oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 3: { signed short oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 4: { unsigned short oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 5: { signed int oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 6: { unsigned int oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 7: { signed long oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 8: { unsigned long oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 9: { signed long long oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 10: { unsigned long long oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 11: { float oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } case 12: { double oData; (*(info->getValue))(self, @selector(getValue:), &oData); - return oData; + return (oData == 0) ? NO : YES; } default: [NSException raise: NSInvalidArgumentException format: @"unknown number type value for get"]; } } - return 0; + return NO; } - (signed char) charValue