Deprecated: Assigning the return value of new by reference is deprecated in /home/bluestat/public_html/source/index.php on line 477
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
--
1.7.11.3