Hi all,
>>>> I am logging out NSDictionaries that sometimes contain NSData instances as
>>>> values. On MacOSX NSData::description is called to determine a string that
>>>> is used in the output. I don't want to see tons of hex values for large
>>>> NSData objects in the output and therefore wrote the following category:
>>>>
>>>> @implementation NSData (SRDataExtension)
>>>>
>>>> - (NSString *)description
>>>> {
>>>> return [NSString stringWithFormat:@"<data of length %d>", [self length]];
>>>> }
>>>>
>>>> @end
>>>>
>>>> This works great on MacOSX but not under GNUstep. It seems that
>>>> description is not called under GNUstep when a dictionary is logged out
>>>> with
>>>>
>>>> NSLog(@"dic %@", dic);
>>>>
>>>> Any idea?
>>>
>>> GNUstep uses -descriptionWithLocale:
>>>
>>> Perhaps we should change that if it's no longer used in OSX?
>>
>> I have implemented
>>
>> - (NSString *)descriptionWithLocale:(id)locale
>> {
>> return [NSString stringWithFormat:@"<data of length %d>", [self length]];
>> }
>>
>> no in my category, but this method isn't used either by NSLog(@"dic %@",
>> dic)!? :-(
>>
>> I checked core/base/Source/NSData.m but it has no implementation for
>> descriptionWithLocale: either!?
>
> AFAIU, your problem appears to be the implementation of NSDictionary's
> -description method (or really -descriptionWithLocale:indent:). This method
> is implemented by converting the dictionary into a (old-style) property list
> and that code converts NSData instances without invoking their -description
> (or -descriptionWithLocale:) methods (for the obvious reason). So I guess,
> you'll have to override NSDictionary -description for now as well.
The following modification in NSPropertyList.m solved my problem:
else if ([obj isKindOfClass: [NSData class]])
{
if (x == NSPropertyListXMLFormat_v1_0)
{
[dest appendBytes: "<data>\n" length: 7];
encodeBase64(obj, dest);
[dest appendBytes: "</data>\n" length: 8];
}
else
{
NSString *string = [obj description];
[dest appendData:[string dataUsingEncoding:NSASCIIStringEncoding]];
/* the code belows generates all the hey values, quit elog description
const unsigned char *src;
unsigned char *dst;
int length;
int i;
int j;
src = [obj bytes];
length = [obj length];
#define num2char(num) ((num) < 0xa ? ((num)+'0') : ((num)+0x57))
j = [dest length];
[dest setLength: j + 2*length+(length > 4 ? (length-1)/4+2 : 2)];
dst = [dest mutableBytes];
dst[j++] = '<';
for (i = 0; i < length; i++, j++)
{
dst[j++] = num2char((src[i]>>4) & 0x0f);
dst[j] = num2char(src[i] & 0x0f);
if ((i & 3) == 3 && i < length-1)
{
// if we've just finished a 32-bit int, print a space
dst[++j] = ' ';
}
}
dst[j++] = '>';
*/
}
Thanks a lot!!
Andreas
_______________________________________________
Discuss-gnustep mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/discuss-gnustep