From d27b7e423e7a162fda62a05c3d61cbb7750f4258 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sun, 1 May 2011 14:06:06 -0400 Subject: [PATCH] In |-[NSXMLElement(GDBpAdditions) base64DecodedValue]|, recursively print objects. This fixes #168. --- CHANGES | 1 + Source/NSXMLElementAdditions.m | 68 +++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 24596dd..664516f 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ MacGDBp CHANGE LOG - Fix: #128 Clicking on the line number will now always set the correct breakpoint - New: #190 Evaluation of arbitrary script/code fragments +- New: #168 Recursively display objects and arrays in the variable inspector 1.4.1 diff --git a/Source/NSXMLElementAdditions.m b/Source/NSXMLElementAdditions.m index 070e18e..65b915f 100644 --- a/Source/NSXMLElementAdditions.m +++ b/Source/NSXMLElementAdditions.m @@ -19,6 +19,13 @@ #import "AppDelegate.h" #include "modp_b64.h" +@interface NSXMLElement (GDBpAdditions_Private) +- (NSString*)internalName; +- (NSString*)internalBase64DecodedValue; +- (void)recursiveBase64DecodedValue:(NSMutableString*)stringBuilder + depth:(NSUInteger)depth; +@end + @implementation NSXMLElement (GDBpAdditions) /** @@ -30,16 +37,18 @@ } /** - * Returns the value of the property + * Returns the "name" attribute. */ -- (NSString*)base64DecodedValue +- (NSString*)internalName +{ + return [[self attributeForName:@"name"] stringValue]; +} + +/** + * Does the actual work of decoding base64. + */ +- (NSString*)internalBase64DecodedValue { - // Non-leaf nodes do not have a value: - // https://www.bluestatic.org/bugs/showreport.php?bugid=168 - if (![self isLeaf]) { - return @"..."; - } - // The value of the node is base64 encoded. if ([[[self attributeForName:@"encoding"] stringValue] isEqualToString:@"base64"]) { const char* src = [[self stringValue] UTF8String]; @@ -56,12 +65,51 @@ ret = [NSString stringWithUTF8String:dest]; free(dest); } - return ret; } - + // The value is just a normal string. return [self stringValue]; } +/** + * Returns the value of the property + */ +- (NSString*)base64DecodedValue +{ + if (![self isLeaf]) { + // For non-leaf nodes, display the object structure by recursively printing + // the base64-decoded values. + NSMutableString* mutableString = [[NSMutableString alloc] initWithString:@"(\n"]; + [self recursiveBase64DecodedValue:mutableString depth:1]; + [mutableString appendString:@")"]; + return [mutableString autorelease]; + } + + return [self internalBase64DecodedValue]; +} + +/** + * Recursively builds a print_r()-style output by attaching the data to + * |stringBuilder| with indent level specified by |depth|. + */ +- (void)recursiveBase64DecodedValue:(NSMutableString*)stringBuilder + depth:(NSUInteger)depth +{ + // Create the indention string for this level. + NSString* indent = [@"" stringByPaddingToLength:depth withString:@"\t" startingAtIndex:0]; + + if ([self isLeaf]) { + // If this is a leaf node, simply append the key=>value pair. + [stringBuilder appendFormat:@"%@%@\t=>\t%@\n", indent, [self internalName], [self internalBase64DecodedValue]]; + } else { + // If this node has children, increase the depth and recurse. + [stringBuilder appendFormat:@"%@%@\t=>\t(\n", indent, [self internalName]]; + for (NSXMLElement* elm in [self children]) { + [elm recursiveBase64DecodedValue:stringBuilder depth:depth + 1]; + } + [stringBuilder appendFormat:@"%@)\n", indent]; + } +} + @end -- 2.22.5