diff --git a/ChangeLog b/ChangeLog index 27a383928..ca225d3df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2001-11-12 Richard Frith-Macdonald + + * Source/NSNumber.m: describe char and unsigned char as numbers + rather than ascii characters. Use g format for floats. + Use 'true' and 'false' for boolean output ... for MacOS-X compatibility. + * Source/NSConcreteNumber.m: ditto + * Source/GSFormat.m: Fix bug in formatting short integers - was trying + to treat them as full sized. + 2001-11-09 Richard Frith-Macdonald * Documentation/gsdoc/Base.gsdoc: diff --git a/Source/GSFormat.m b/Source/GSFormat.m index 95d99e329..cba7531dc 100644 --- a/Source/GSFormat.m +++ b/Source/GSFormat.m @@ -1158,7 +1158,8 @@ NSDictionary *locale) { long long int signed_number; - signed_number = args_value[specs[nspecs_done].data_arg].pa_long_long_int; + signed_number + = args_value[specs[nspecs_done].data_arg].pa_long_long_int; is_negative = signed_number < 0; number.longlong = is_negative ? (- signed_number) : signed_number; @@ -1169,10 +1170,24 @@ NSDictionary *locale) { long int signed_number; - if (is_long_num) - signed_number = args_value[specs[nspecs_done].data_arg].pa_long_int; - else + if (is_char) + { + signed_number = args_value[specs[nspecs_done].data_arg].pa_char; + } + else if (is_short) + { + signed_number + = args_value[specs[nspecs_done].data_arg].pa_short_int; + } + else if (is_long_num) + { + signed_number + = args_value[specs[nspecs_done].data_arg].pa_long_int; + } + else + { signed_number = args_value[specs[nspecs_done].data_arg].pa_int; + } is_negative = signed_number < 0; number.word = is_negative ? (- signed_number) : signed_number; @@ -1207,7 +1222,8 @@ NSDictionary *locale) if (is_longlong) { - number.longlong = args_value[specs[nspecs_done].data_arg].pa_u_long_long_int; + number.longlong + = args_value[specs[nspecs_done].data_arg].pa_u_long_long_int; LABEL (longlong_number): if (prec < 0) @@ -1244,16 +1260,16 @@ NSDictionary *locale) } else { - if (is_long_num) - number.word = args_value[specs[nspecs_done].data_arg].pa_u_long_int; - else if (is_char) - number.word = (unsigned char) - args_value[specs[nspecs_done].data_arg].pa_char; - else if (!is_short) - number.word = args_value[specs[nspecs_done].data_arg].pa_u_int; - else - number.word = (unsigned short int) - args_value[specs[nspecs_done].data_arg].pa_u_short_int; + if (is_long_num) + number.word = args_value[specs[nspecs_done].data_arg].pa_u_long_int; + else if (is_char) + number.word = (unsigned char) + args_value[specs[nspecs_done].data_arg].pa_char; + else if (!is_short) + number.word = args_value[specs[nspecs_done].data_arg].pa_u_int; + else + number.word = (unsigned short int) + args_value[specs[nspecs_done].data_arg].pa_u_short_int; LABEL (number): if (prec < 0) diff --git a/Source/NSConcreteNumber.m b/Source/NSConcreteNumber.m index ccd02e0d4..9bf2f1783 100644 --- a/Source/NSConcreteNumber.m +++ b/Source/NSConcreteNumber.m @@ -40,55 +40,42 @@ defined to a number from 0 to 12 cooresponding to each number type */ #if TYPE_ORDER == 0 # define NumberTemplate NSBoolNumber -# define TYPE_FORMAT @"%u" # define TYPE_TYPE BOOL #elif TYPE_ORDER == 1 # define NumberTemplate NSCharNumber -# define TYPE_FORMAT @"%c" # define TYPE_TYPE signed char #elif TYPE_ORDER == 2 # define NumberTemplate NSUCharNumber -# define TYPE_FORMAT @"%c" # define TYPE_TYPE unsigned char #elif TYPE_ORDER == 3 # define NumberTemplate NSShortNumber -# define TYPE_FORMAT @"%hd" # define TYPE_TYPE signed short #elif TYPE_ORDER == 4 # define NumberTemplate NSUShortNumber -# define TYPE_FORMAT @"%hu" # define TYPE_TYPE unsigned short #elif TYPE_ORDER == 5 # define NumberTemplate NSIntNumber -# define TYPE_FORMAT @"%d" # define TYPE_TYPE signed int #elif TYPE_ORDER == 6 # define NumberTemplate NSUIntNumber -# define TYPE_FORMAT @"%u" # define TYPE_TYPE unsigned int #elif TYPE_ORDER == 7 # define NumberTemplate NSLongNumber -# define TYPE_FORMAT @"%ld" # define TYPE_TYPE signed long #elif TYPE_ORDER == 8 # define NumberTemplate NSULongNumber -# define TYPE_FORMAT @"%lu" # define TYPE_TYPE unsigned long #elif TYPE_ORDER == 9 # define NumberTemplate NSLongLongNumber -# define TYPE_FORMAT @"%lld" # define TYPE_TYPE signed long long #elif TYPE_ORDER == 10 # define NumberTemplate NSULongLongNumber -# define TYPE_FORMAT @"%llu" # define TYPE_TYPE unsigned long long #elif TYPE_ORDER == 11 # define NumberTemplate NSFloatNumber -# define TYPE_FORMAT @"%0.7f" # define TYPE_TYPE float #elif TYPE_ORDER == 12 # define NumberTemplate NSDoubleNumber -# define TYPE_FORMAT @"%0.16g" # define TYPE_TYPE double #endif @@ -389,9 +376,31 @@ - (NSString*) descriptionWithLocale: (NSDictionary*)locale { #if TYPE_ORDER == 0 - return (data) ? @"YES" : @"NO"; -#else - return [NSString stringWithFormat: TYPE_FORMAT, data]; + return (data) ? @"true" : @"false"; +#elif TYPE_ORDER == 1 + return [NSString stringWithFormat: @"%i", (int)data]; +#elif TYPE_ORDER == 2 + return [NSString stringWithFormat: @"%u", (unsigned int)data]; +#elif TYPE_ORDER == 3 + return [NSString stringWithFormat: @"%hi", (short int)data]; +#elif TYPE_ORDER == 4 + return [NSString stringWithFormat: @"%hu", (unsigned short int)data]; +#elif TYPE_ORDER == 5 + return [NSString stringWithFormat: @"%i", data]; +#elif TYPE_ORDER == 6 + return [NSString stringWithFormat: @"%u", data]; +#elif TYPE_ORDER == 7 + return [NSString stringWithFormat: @"%li", data]; +#elif TYPE_ORDER == 8 + return [NSString stringWithFormat: @"%lu", data]; +#elif TYPE_ORDER == 9 + return [NSString stringWithFormat: @"%lli", data]; +#elif TYPE_ORDER == 10 + return [NSString stringWithFormat: @"%llu", data]; +#elif TYPE_ORDER == 11 + return [NSString stringWithFormat: @"%0.7g", (double)data]; +#elif TYPE_ORDER == 12 + return [NSString stringWithFormat: @"%0.16g", data]; #endif } diff --git a/Source/NSNumber.m b/Source/NSNumber.m index e9aa146b9..0a58da4d0 100644 --- a/Source/NSNumber.m +++ b/Source/NSNumber.m @@ -679,42 +679,42 @@ static Class doubleNumberClass; switch (info->typeLevel) { case 0: - return [self boolValue] ? @"YES" : @"NO"; + return [self boolValue] ? @"true" : @"false"; case 1: - return [NSString stringWithFormat: @"%c", - [self charValue]]; + return [NSString stringWithFormat: @"%i", + (int)[self charValue]]; case 2: - return [NSString stringWithFormat: @"%c", - [self unsignedCharValue]]; + return [NSString stringWithFormat: @"%u", + (unsigned int)[self unsignedCharValue]]; case 3: - return [NSString stringWithFormat: @"%hd", - [self shortValue]]; + return [NSString stringWithFormat: @"%hi", + (short int)[self shortValue]]; case 4: return [NSString stringWithFormat: @"%hu", - [self unsignedShortValue]]; + (unsigned short int)[self unsignedShortValue]]; case 5: - return [NSString stringWithFormat: @"%d", + return [NSString stringWithFormat: @"%i", [self intValue]]; case 6: return [NSString stringWithFormat: @"%u", [self unsignedIntValue]]; case 7: - return [NSString stringWithFormat: @"%ld", + return [NSString stringWithFormat: @"%li", [self longValue]]; case 8: return [NSString stringWithFormat: @"%lu", [self unsignedLongValue]]; case 9: - return [NSString stringWithFormat: @"%lld", + return [NSString stringWithFormat: @"%lli", [self longLongValue]]; case 10: return [NSString stringWithFormat: @"%llu", [self unsignedLongLongValue]]; case 11: - return [NSString stringWithFormat: @"%f", - [self floatValue]]; + return [NSString stringWithFormat: @"%0.7g", + (double)[self floatValue]]; case 12: - return [NSString stringWithFormat: @"%g", + return [NSString stringWithFormat: @"%0.16g", [self doubleValue]]; default: [NSException raise: NSInvalidArgumentException diff --git a/Testing/values.m b/Testing/values.m index 1649f31e3..0212f518b 100644 --- a/Testing/values.m +++ b/Testing/values.m @@ -17,31 +17,40 @@ int main() NSRange range; NSRect rect; NSValue *v1, *v2; - NSNumber *nc, *ns, *n1, *n2, *n3, *n4, *n5; + NSNumber *nc, *ns, *n1, *n2, *n3, *n4, *n5, *n6, *n7; NSArray *a1, *a2; NSAutoreleasePool *arp = [NSAutoreleasePool new]; // Numbers - nc = [NSNumber numberWithChar:-100]; - ns = [NSNumber numberWithShort:-100]; + nc = [NSNumber numberWithChar: -100]; + ns = [NSNumber numberWithShort: -100]; printf("try %d, %d", [nc charValue], [ns shortValue]); -printf("nc compare:ns is %d\n", [nc compare:ns]); - n1 = [NSNumber numberWithUnsignedShort:30]; - n2 = [NSNumber numberWithDouble:2.7]; - n3 = [NSNumber numberWithDouble:30]; - n4 = [NSNumber numberWithChar:111]; - n5 = [NSNumber numberWithChar:111]; +printf("nc compare: ns is %d\n", [nc compare: ns]); + n1 = [NSNumber numberWithUnsignedShort: 30]; +printf("n1 = %s\n", [[n1 description] cString]); + n2 = [NSNumber numberWithDouble: 2.7]; +printf("n2 = %s\n", [[n2 description] cString]); + n3 = [NSNumber numberWithDouble: 30]; +printf("n3 = %s\n", [[n3 description] cString]); + n4 = [NSNumber numberWithChar: 111]; +printf("n4 = %s\n", [[n4 description] cString]); + n5 = [NSNumber numberWithChar: 111]; +printf("n5 = %s\n", [[n5 description] cString]); + n6 = [NSNumber numberWithFloat: 1.5]; +printf("n6 = %s\n", [[n6 description] cString]); + n7 = [NSNumber numberWithShort: 25]; +printf("n7 = %s\n", [[n7 description] cString]); printf("Number(n1) as int %d, as float %f\n", [n1 intValue], [n1 floatValue]); printf("n1 times n2=%f as int to get %d\n", [n2 floatValue], [n1 intValue]*[n2 intValue]); printf("n2 as string: %s\n", [[n2 stringValue] cString]); - printf("n2 compare:n1 is %d\n", [n2 compare:n1]); - printf("n1 compare:n2 is %d\n", [n1 compare:n2]); - printf("n1 isEqual:n3 is %d\n", [n1 isEqual:n3]); - printf("n4 isEqual:n5 is %d\n", [n4 isEqual:n5]); + printf("n2 compare: n1 is %d\n", [n2 compare: n1]); + printf("n1 compare: n2 is %d\n", [n1 compare: n2]); + printf("n1 isEqual: n3 is %d\n", [n1 isEqual: n3]); + printf("n4 isEqual: n5 is %d\n", [n4 isEqual: n5]); - a1 = [NSArray arrayWithObjects: + a1 = [NSArray arrayWithObjects: [NSNumber numberWithChar: 111], [NSNumber numberWithUnsignedChar: 112], [NSNumber numberWithShort: 121], @@ -53,7 +62,7 @@ printf("nc compare:ns is %d\n", [nc compare:ns]); [NSNumber numberWithFloat: 151], [NSNumber numberWithDouble: 152], nil]; - a2 = [NSArray arrayWithObjects: + a2 = [NSArray arrayWithObjects: [NSNumber numberWithChar: 111], [NSNumber numberWithUnsignedChar: 112], [NSNumber numberWithShort: 121], @@ -65,29 +74,29 @@ printf("nc compare:ns is %d\n", [nc compare:ns]); [NSNumber numberWithFloat: 151], [NSNumber numberWithDouble: 152], nil]; - printf("a1 isEqual:a2 is %d\n", [a1 isEqual:a2]); + printf("a1 isEqual: a2 is %d\n", [a1 isEqual: a2]); // Test values, Geometry rect = NSMakeRect(1.0, 103.3, 40.0, 843.); rect = NSIntersectionRect(rect, NSMakeRect(20, 78., 89., 30)); - v1 = [NSValue valueWithRect:rect]; + v1 = [NSValue valueWithRect: rect]; printf("Encoding for rect is %s\n", [v1 objCType]); rect = [v1 rectValue]; printf("Rect is %f %f %f %f\n", NSMinX(rect), NSMinY(rect), NSMaxX(rect), NSMaxY(rect)); - v2 = [NSValue valueWithPoint:NSMakePoint(3,4)]; - v1 = [NSValue valueWithNonretainedObject:v2]; - [[v1 nonretainedObjectValue] getValue:&p]; + v2 = [NSValue valueWithPoint: NSMakePoint(3,4)]; + v1 = [NSValue valueWithNonretainedObject: v2]; + [[v1 nonretainedObjectValue] getValue: &p]; printf("point is %f %f\n", p.x, p.y); range = NSMakeRange(1, 103); range = NSIntersectionRange(range, NSMakeRange(2, 73)); - v1 = [NSValue valueWithRange:range]; + v1 = [NSValue valueWithRange: range]; printf("Encoding for range is %s\n", [v1 objCType]); range = [v1 rangeValue]; printf("Range is %u %u\n", range.location, range.length); - printf("Try getting a null NSValue, should get a NSLog error message:\n"); - v2 = [NSValue value:NULL withObjCType:@encode(int)]; + printf("Try getting a null NSValue, should get a NSLog error message: \n"); + v2 = [NSValue value: NULL withObjCType: @encode(int)]; [arp release]; return 0; }