Index: class-dump/src/CDBalanceFormatter.m |
=================================================================== |
--- class-dump/src/CDBalanceFormatter.m (revision 0) |
+++ class-dump/src/CDBalanceFormatter.m (revision 0) |
@@ -0,0 +1,107 @@ |
+// -*- mode: ObjC -*- |
+ |
+// This file is part of class-dump, a utility for examining the Objective-C segment of Mach-O files. |
+// Copyright (C) 1997-1998, 2000-2001, 2004-2010 Steve Nygard. |
+ |
+#import "CDBalanceFormatter.h" |
+ |
+#import "NSString-Extensions.h" |
+ |
+static BOOL debug = NO; |
+ |
+@implementation CDBalanceFormatter |
+ |
+- (id)initWithString:(NSString *)str; |
+{ |
+ if ([super init] == nil) |
+ return nil; |
+ |
+ scanner = [[NSScanner alloc] initWithString:str]; |
+ openCloseSet = [[NSCharacterSet characterSetWithCharactersInString:@"{}<>()"] retain]; |
+ |
+ result = [[NSMutableString alloc] init]; |
+ |
+ return self; |
+} |
+ |
+- (void)dealloc; |
+{ |
+ [scanner release]; |
+ [openCloseSet release]; |
+ |
+ [result release]; |
+ |
+ [super dealloc]; |
+} |
+ |
+- (void)parse:(NSString *)open index:(NSUInteger)openIndex level:(NSUInteger)level; |
+{ |
+ NSArray *pairs; |
+ NSString *pre; |
+ NSString *opens[] = { @"{", @"<", @"(", nil}; |
+ NSString *closes[] = { @"}", @">", @")", nil}; |
+ NSUInteger index; |
+ BOOL foundOpen = NO; |
+ BOOL foundClose = NO; |
+ |
+ pairs = [[NSArray alloc] initWithObjects:@"{}", @"<>", @"()", nil]; |
+ |
+ while ([scanner isAtEnd] == NO) { |
+ if ([scanner scanUpToCharactersFromSet:openCloseSet intoString:&pre]) { |
+ if (debug) NSLog(@"pre = '%@'", pre); |
+ [result appendFormat:@"%@%@\n", [NSString spacesIndentedToLevel:level], pre]; |
+ } |
+ if (debug) NSLog(@"remaining: '%@'", [[scanner string] substringFromIndex:[scanner scanLocation]]); |
+ |
+ foundOpen = foundClose = NO; |
+ for (index = 0; index < 3; index++) { |
+ if (debug) NSLog(@"Checking open %u: '%@'", index, opens[index]); |
+ if ([scanner scanString:opens[index] intoString:NULL]) { |
+ if (debug) NSLog(@"Start %@", opens[index]); |
+ [result appendSpacesIndentedToLevel:level]; |
+ [result appendString:opens[index]]; |
+ [result appendString:@"\n"]; |
+ |
+ [self parse:opens[index] index:[scanner scanLocation] - 1 level:level + 1]; |
+ |
+ [result appendSpacesIndentedToLevel:level]; |
+ [result appendString:closes[index]]; |
+ [result appendString:@"\n"]; |
+ foundOpen = YES; |
+ break; |
+ } |
+ |
+ if (debug) NSLog(@"Checking close %u: '%@'", index, closes[index]); |
+ if ([scanner scanString:closes[index] intoString:NULL]) { |
+ if ([open isEqualToString:opens[index]]) { |
+ if (debug) NSLog(@"End %@", closes[index]); |
+ } else { |
+ NSLog(@"ERROR: Unmatched end %@", closes[index]); |
+ } |
+ foundClose = YES; |
+ break; |
+ } |
+ } |
+ |
+ if (foundOpen == NO && foundClose == NO) { |
+ if (debug) NSLog(@"Unknown @ %u: %@", [scanner scanLocation], [[scanner string] substringFromIndex:[scanner scanLocation]]); |
+ break; |
+ } |
+ |
+ if (foundClose) |
+ break; |
+ } |
+ |
+ [pairs release]; |
+} |
+ |
+- (NSString *)format; |
+{ |
+ [self parse:nil index:0 level:0]; |
+ |
+ if (debug) NSLog(@"result:\n%@", result); |
+ |
+ return [NSString stringWithString:result]; |
+} |
+ |
+@end |
Property changes on: class-dump/src/CDBalanceFormatter.m |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |