Index: class-dump/src/NSScanner-Extensions.m |
=================================================================== |
--- class-dump/src/NSScanner-Extensions.m (revision 0) |
+++ class-dump/src/NSScanner-Extensions.m (revision 0) |
@@ -0,0 +1,203 @@ |
+// -*- 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 "NSScanner-Extensions.h" |
+ |
+#import "NSString-Extensions.h" |
+ |
+@implementation NSScanner (CDExtensions) |
+ |
+// other: $_:* |
+// start: alpha + other |
+// remainder: alnum + other |
+ |
++ (NSCharacterSet *)cdOtherCharacterSet; |
+{ |
+ static NSCharacterSet *otherCharacterSet = nil; |
+ |
+ if (otherCharacterSet == nil) |
+ otherCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"$_:*"] retain]; |
+ |
+ return otherCharacterSet; |
+} |
+ |
++ (NSCharacterSet *)cdIdentifierStartCharacterSet; |
+{ |
+ static NSCharacterSet *identifierStartCharacterSet = nil; |
+ |
+ if (identifierStartCharacterSet == nil) { |
+ NSMutableCharacterSet *aSet; |
+ |
+ aSet = [[NSCharacterSet letterCharacterSet] mutableCopy]; |
+ [aSet formUnionWithCharacterSet:[NSScanner cdOtherCharacterSet]]; |
+ identifierStartCharacterSet = [aSet copy]; |
+ |
+ [aSet release]; |
+ } |
+ |
+ return identifierStartCharacterSet; |
+} |
+ |
++ (NSCharacterSet *)cdIdentifierCharacterSet; |
+{ |
+ static NSCharacterSet *identifierCharacterSet = nil; |
+ |
+ if (identifierCharacterSet == nil) { |
+ NSMutableCharacterSet *aSet; |
+ |
+ aSet = [[NSCharacterSet alphanumericCharacterSet] mutableCopy]; |
+ [aSet formUnionWithCharacterSet:[NSScanner cdOtherCharacterSet]]; |
+ identifierCharacterSet = [aSet copy]; |
+ |
+ [aSet release]; |
+ } |
+ |
+ return identifierCharacterSet; |
+} |
+ |
++ (NSCharacterSet *)cdTemplateTypeCharacterSet; |
+{ |
+ static NSCharacterSet *templateTypeCharacterSet = nil; |
+ |
+ if (templateTypeCharacterSet == nil) |
+ templateTypeCharacterSet = [[[NSCharacterSet characterSetWithCharactersInString:@"<,>"] invertedSet] retain]; |
+ |
+ return templateTypeCharacterSet; |
+} |
+ |
+- (NSString *)peekCharacter; |
+{ |
+ //[self skipCharacters]; |
+ |
+ if ([self isAtEnd]) |
+ return nil; |
+ |
+ return [[self string] substringWithRange:NSMakeRange([self scanLocation], 1)]; |
+} |
+ |
+- (unichar)peekChar; |
+{ |
+ return [[self string] characterAtIndex:[self scanLocation]]; |
+} |
+ |
+- (BOOL)scanCharacter:(unichar *)value; |
+{ |
+ unichar ch; |
+ |
+ //[self skipCharacters]; |
+ |
+ if ([self isAtEnd]) |
+ return NO; |
+ |
+ ch = [[self string] characterAtIndex:[self scanLocation]]; |
+ if (value != NULL) |
+ *value = ch; |
+ |
+ [self setScanLocation:[self scanLocation] + 1]; |
+ |
+ return YES; |
+} |
+ |
+- (BOOL)scanCharacterFromSet:(NSCharacterSet *)set intoString:(NSString **)value; |
+{ |
+ unichar ch; |
+ |
+ //[self skipCharacters]; |
+ |
+ if ([self isAtEnd]) |
+ return NO; |
+ |
+ ch = [[self string] characterAtIndex:[self scanLocation]]; |
+ if ([set characterIsMember:ch]) { |
+ if (value != NULL) { |
+ *value = [NSString stringWithUnichar:ch]; |
+ } |
+ |
+ [self setScanLocation:[self scanLocation] + 1]; |
+ return YES; |
+ } |
+ |
+ return NO; |
+} |
+ |
+// On 10.3 (7D24) the Foundation scanCharactersFromSet:intoString: inverts the set each call, creating an autoreleased CFCharacterSet. |
+// This cuts the total CFCharacterSet alloctions (when run on Foundation) from 161682 down to 17. |
+ |
+// This works for my purposes, but I haven't tested it to make sure it's fully compatible with the standard version. |
+ |
+- (BOOL)my_scanCharactersFromSet:(NSCharacterSet *)set intoString:(NSString **)value; |
+{ |
+ NSRange matchedRange; |
+ unsigned int currentLocation; |
+ NSCharacterSet *skipSet; |
+ |
+ currentLocation = [self scanLocation]; |
+ |
+ // Skip over characters |
+ skipSet = [self charactersToBeSkipped]; |
+ while ([self isAtEnd] == NO) { |
+ unichar ch; |
+ |
+ ch = [[self string] characterAtIndex:currentLocation]; |
+ if ([skipSet characterIsMember:ch] == NO) |
+ break; |
+ |
+ currentLocation++; |
+ [self setScanLocation:currentLocation]; |
+ } |
+ |
+ matchedRange.location = currentLocation; |
+ matchedRange.length = 0; |
+ |
+ while ([self isAtEnd] == NO) { |
+ unichar ch; |
+ |
+ ch = [[self string] characterAtIndex:currentLocation]; |
+ if ([set characterIsMember:ch] == NO) |
+ break; |
+ |
+ currentLocation++; |
+ [self setScanLocation:currentLocation]; |
+ } |
+ |
+ matchedRange.length = currentLocation - matchedRange.location; |
+ |
+ if (matchedRange.length == 0) |
+ return NO; |
+ |
+ if (value != NULL) { |
+ *value = [[self string] substringWithRange:matchedRange]; |
+ } |
+ |
+ return YES; |
+} |
+ |
+- (BOOL)scanIdentifierIntoString:(NSString **)stringPointer; |
+{ |
+ NSString *start, *remainder; |
+ |
+ if ([self scanString:@"?" intoString:stringPointer]) { |
+ return YES; |
+ } |
+ |
+ if ([self scanCharacterFromSet:[NSScanner cdIdentifierStartCharacterSet] intoString:&start]) { |
+ NSString *str; |
+ |
+ if ([self my_scanCharactersFromSet:[NSScanner cdIdentifierCharacterSet] intoString:&remainder]) { |
+ str = [start stringByAppendingString:remainder]; |
+ } else { |
+ str = start; |
+ } |
+ |
+ if (stringPointer != NULL) |
+ *stringPointer = str; |
+ |
+ return YES; |
+ } |
+ |
+ return NO; |
+} |
+ |
+@end |
Property changes on: class-dump/src/NSScanner-Extensions.m |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |